SpringBoot

[Spring Boot 3] CRUD

하루이2222 2024. 7. 9. 02:53

CRUD 란

DB와 상호작용 하기 위한 Repository의 4가지 동작 을 의미한다

C -> Create
R -> Read
U -> Udate
D -> Delete

Create

말 그대로 db에 새로운 테이블을 생성 시키고 엔티티 데이터를 삽입 시키는 명령이다 .

바로 예시를 보자

 @PostMapping("/articles/create")
    public String createArticles(ArticlesForm form) {
        log.info(form.toString());

        Article article = form.toEntity();
        log.info(article.toString());

        Article saved = articleRepository.save(article);
        log.info(saved.toString());

        return "redirect:/articles/" + saved.getId();
    }

Repository를 생성하고 DI를 통해 상속받는 과정은 앞선 포스트 에서 설명했으니 이 포스트에서는 생략한다.

article 매개 변수에 담긴 엔티티 데이터를 .save() 메소드의 파라미터 데이터로 넘겨주면 jpa에 의 해 h2 데이터 베이스에 잘 들어간것을 확인할수 있다.

jpa 모듈을 사용한다면 /h2-console 로 접근하여 확인하여 보자.
콘솔의 JDBC URL 은 실행 콘솔 에서 cmd +f 를 눌러 jdbc를 검색하면 url을 확인할수 있다.

추가적인 설정을 거치면 해당 url을 고정 시킬 수도 있는데 추후 포스트 에서 알아보자.

READ

데이터 베이스에서 데이터를 조회하는 명령이다.

  @GetMapping("/articles/{id}")
    public String show(@PathVariable Long id, Model model) {
        log.info("id = " + id);
        Article articleEntity = articleRepository.findById(id).orElse(null);
        model.addAttribute("article", articleEntity);

        return "articles/show";
    }

데이터를 조회하는 과정에는 데이터의 기본키를 가지고 해당하는 레코드 또는 필드 를 조회할수 있다. 테이블의 데이터 타입과 기본키 구조는 엔티티를 생성하는 과정해서 정해줄수있는데 추후 포스트에서 자세히 다뤄 보겠다.

Article articleEntity = articleRepository.findById(id)
사실 이론적으로 여기까지만 써도 조회가 되야 하지만 이렇게 만 쓰면 에러가 난다.

타입이 일치 하지 않는다는 에러이다. findById를 통해 받아온 데이터는 Optional타입 인데 데이터를 받는 articleEntity 변수는 Article 타입 이기 때문이다.

해결방안이 2가지가 있다.

첫번째는 매개변수의 타입 차제를 Optional'<'Article>의 형태로 주는것이다 . <- 자바 8버전 부터가능

두번쨰는 위 코드 에서 볼수 있다 시피 .orElse(null); 을 사용하여 Opntional 의 역활을 대체 할수 있다.

그외 조회 할수 방법은 다양하다.

findAll(): 모든 엔티티를 조회
findBy'<'Property>: 엔티티의 특정 속성을 기반으로 조회한다.
예를 들어, findByTitle(String title)은 title 속성을 기반으로 엔티티를 조회한다.

Update

데이터 베이스에서 데이터를 업데이트 하는 과정 이다.

  @PostMapping("/articles/update")
    public String update(ArticlesForm form){
        log.info(form.toString());

        Article article = form.toEntity();
        Article saved = articleRepository.save(article);

        return "redirect:/articles/" + saved.getId();
    }

테이블을 업데이트 하는 과정은 테이블 생성과정 과 동일하다.

1.수정페이지 를 만들고 데이터를 데이터를 조회 해서 띄운다.
2.수정된 데이터를 Controller로 넘긴다.
3.엔티티로 변환 된 데이터를 db에 삽입한다.<- 단 테이블명은 동일할것.

Delete

CRUD 과정의 마지막 데이터 삭제 이다.

 @GetMapping("/articles/{id}/delete")
    public String delete(@PathVariable Long id, RedirectAttributes rttr){
        Article Target = articleRepository.findById(id).orElse(null);

        if(Target != null) {
            articleRepository.delete(Target);
            rttr.addFlashAttribute("msg", "삭제 완료");
        }
        return "redirect:/articles";
    }

먼저 기본키를 가지고 해당 기본키를 가진 레코드 가 있는지 조회 한 후
해당 데이터가 존재하면 데이터 삭제 명령을 한다.

회고

앞선 포스트에서 개념들을 전부 설명을 끝낸 터라 CRUD 는 비교적 쉽게 마무리가 된거같다.

CRUD 에 대해 작성하면서 항상 메소드 들 위에 @GetMapping 이나 @PostMapping 이 있는데 이것이 api 요청 url이다.

근데 REST api 에 대해서는 진짜 할말이 많기에 이번 포스트 에서 굳이 언급 하지 않았다.

추후 각잡고 시리즈로 올려봐야지...

스프링을 다룬지 어언 2주차.... 확실히 기존에 node.js 를 다룰때의 지식이 있어서 인지 기본적인 구조의 이해 자체는 어렵지 않았다. 다만 추가적으로 배워야 하는것이 많았고 그것들이 너무 어려운 개념들이 많았다. aop라던가..di라던가..psa...등등 특히 자바에 익숙 하지 않다보니 모던 자바의 구조에 대해 익숙해지는데도 시간이 좀 필요했다.

단순히 책을 따라하는건 의미가 없다고 판단했고 기능과 파일구조만 확인한 후에 내 생각으로 먼저 구현 했다. 그리고 책을 확인하는 과정으로 공부했다.

이 방식은 시간이 배로 들었지만 나쁘지않은 선택 이었다. 확실히 그냥 책을 따라 하는거보다 개념에 대한 이해도가 올라갔다.

또한 나의 무지로 인한 무한 질문에 친철히 답변해준 우리 스터디원 들에게 감사를.......

또한 데이터를 다루는 새로운 방식에 대해 많이 알게 되었는데 굉장히 좋은 경험이었다. 지금 하는 프로젝트에 데이터 구조가 살짝 이상 했는데 이거 하면서 좀 힌트를 얻었다.

드디어 CRUD 까지 마무리.. 끝까지 가봐야지...백엔드 개발자가 되는 그날까지...

다음 포스트는 롬북&리팩터링 이다.