제 7장. 게시글 수정하기: Update

강연주·2023년 10월 13일
0

데이터 수정 과정

게시판에 작성한 글을 수정하려면 다음과 같은 단계를 거쳐야합니다.

  1. 수정 페이지에서 기존 데이터 불러오기
    1-1. 상세 페이지에서 수정 버튼을 클릭합니다.
    1-2. 요청을 받은 컨트롤러는 경로 변수로 들어온 ID를 이용해 DB에서 게시글의 데이터를 가져옵니다.
    1-3. 컨트롤러는 모델에 데이터를 등록합니다.
    1-4. 뷰는 모델에 등록된 데이터를 통해 수정 페이지를 보여줍니다.
  2. 수정된 데이터를 DB에 적용하고 상세 페이지로 리다이렉트
    2-1. 폼 데이터를 DTO에 담아 컨트롤러에서 받습니다.
    2-2. DTO를 엔티티로 변환합니다.
    2-3. DB에서 기존 데이터를 수정 데이터로 갱신합니다.
    2-4. 수정 데이터를 바탕으로 상세 페이지로 리다이렉트합니다.

PATCH가 아닌 POST를 쓰는 이유
수정 시 요청 메소드는 PATCH이다. 해당 예제에서 POST를 쓰는 이유는 form 태그가 GET과 POST 메소드만 지원하기 때문이다. 따라서 CRUD의 모든 요청을 GET과 POST만 사용한다. 뒤에서 REST API 개발 시에는 GET,POST,PUT,PATCH,DELETE 메소드를 사용하여 요청은 보낸다.

JPA 변경 감지

JPA를 이용한 수정 기능은 두 가지 방법이 있다.

  1. 변경 감지를 이용
    DB와 1차 캐시 내용이 다르면 자동으로 업데이트 쿼리를 날려서 동기화를 진행해준다.

    즉, Spring의 변경 감지 메커니즘을 활용하면, 트랜잭션이 커밋될 때 변경 사항이 데이터베이스에 반영된다!
  2. 병합(merge) 이용
    병합은 준영속 상태의 엔티티를 영속 상태로 변경할 때 사용하는 기능이다.

    이 또한 트랜잭션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행된다.(단, 모든 필드 변경 시 이용)

save() 메서드는 식별자 값이 없으면 새로운 엔티티로 저장(영속화)하고 식별자 값이 있으면 한번 영속화 되었던 엔티티로 판단해서 merge()로 수정한다. 즉, save를 사용하는 클라이언트는 저장과 수정을 구분하지 않아도 된다!

컨트롤러 수정 기능

save 메서드를 이용해서 간단하게 수정 기능을 이용해보자.

**실무에서는 변경 감지를 이용해서 필요한 필드만 수정하도록 하자!

ArticleDto 분리

게시글 수정 폼에 데이터를 넘기기 위해서는 dto에 id이 필요하다.
게시글 생성과 수정 시 들어오는 파라미터 값에 id 값 유무 차이가 존재하므로 ArticleCreateDto랑 ArticleUpdateDto로 분리해주자.

profile
백엔드 개발자 준비중

0개의 댓글