wongakim-99 / Spring-study

스프링 공부방 (백엔드 공부)
0 stars 0 forks source link

게시글 수정하기 : Update #8

Closed wongakim-99 closed 1 month ago

wongakim-99 commented 1 month ago

게시판에 작성한 글을 수정하기 위해 기존 글을 수정 페이지로 불러오고 이를 변경해 다시 DB에 저장

wongakim-99 commented 1 month ago

데이터 수정 과정

게시판에 작성한 글을 수정하려면 해당 글을 불러와 수정할 수 있는 입력 상태로 만들어야 됨. 그 다음 내용을 입력하고 다시 전송하면 DB에 반영돼 최종적으로 수정됨.

  1. <수정 페이지> 만들고 기존 데이터 불러오기

    • <상세 페이지> 에서 Edit 버튼을 클릭
    • 요청을 받은 컨트롤러는 해당 글의 id로 DB에서 데이터를 찾아 가져옴
    • 컨트롤러는 가져온 데이터를 뷰에서 사용할 수 있도록 모델에 등록
    • 모델에 등록된 데이터를 <수정 페이지> 에서 보여줌. 그러면 사용자가 내용을 수정할 수 있는 상태가 된다.

  2. 데이터를 수정해 DB에 반영한 후 결과를 볼 수 있게 <상세 페이지>로 리다이렉트

    • 폼 데이터(수정 요청 데이터) 를 DTO에 담아 컨트롤러에서 받음
    • DTO를 엔티티로 변환
    • DB에서 기존 데이터를 수정 데이터로 갱신
    • 수정 데이터를 <상세 페이지>로 리다이렉트

Image

▲데이터를 수정하기 위해 기존 글을 불러오는 과정

Image

▲수정 폼의 데이터가 DB로 갱신되는 과정

wongakim-99 commented 1 month ago

<상세 페이지>에 Edit 버튼 만들기

show.mustache 파일에 아래의 코드 추가

<a href="/articles/{{article.id}}/edit">Edit</a>
wongakim-99 commented 1 month ago

Edit 요청을 받아 데이터 가져오기

  1. 수정 요청을 받아 처리할 edit() 메서드를 작성하고 반환할 수정 페이지를 articles 디렉터리 안에 edit.mustache 파일로 설정

  2. URL 요청을 받는 @GetMapping() 을 작성. /articles/{{article.id}}/edit 주소로 연결 요청했으므로 이 URL인 "/articles/{id}/edit" 를 작성.(※이때 변수id는 {{id}}가 아니라 {id}라고 작성한다는 사실을 유의. 뷰 페이지에서 변수를 사용할 때는 중괄호 두 개를 쓰지만, 컨트롤러에서 URL 변수를 사용할 때는 하나{}만 쓴다.)

  3. DB에서 데이터를 가져올 때는 리파지터리 이용. articleRepository의 findById(id) 메서드로 데이터를 찾아 가져옴. 만약 데이터를 찾지 못하면 null 반환, 데이터를 찾았다면 Article 타입의 articleEntity로 저장

  4. findById(id) 에서 괄호 안의 id가 빨간색으로 표시되는건. 메서드에서 id라는 변수가 선언되지 않았기 때문. id는 메서드의 매개변수로 받아 오고 자료형은 Long으로 작성. 그리고 GetMapping() 어노테이션의 URL 주소에 있는 id를 받아 오는 것이므로 데이터 타입 앞에 @PathVariable 어노테이션 추가

  5. DB에서 데이터를 가져온 후 뷰 페이지에서 사용할 수 있도록 모델에 데이터 등록. addAttribute() 메서드로 모델에 데이터 등록. article이라는 이름으로 앞에서 가져온 articleEntity를 등록. 이렇게 하면 DB에서 가져온 데이터를 article이라는 이름으로 뷰 페이지에서 사용할 수 있음.

wongakim-99 commented 1 month ago

Image

▲여기까지 실습 내용 도식화

wongakim-99 commented 1 month ago

확인 췤

수정 페이지가 나올 때까지 처리 흐름을 순서대로 작성

  1. 클라이언트로부터 데이터 수정 요청이 들어옴
  2. 수정 요청 데이터를 DB에서 찾는다.
  3. 수정 요청 데이터를 모델에 등록한다.
  4. 뷰 페이지에 수정할 데이터를 함께 보여준다.
wongakim-99 commented 1 month ago

24.8.9 오늘 백엔드는 여기까지 :) 👍

wongakim-99 commented 1 month ago

수정 데이터를 DB에 갱신

데이터 수정 2단계는 데이터 수정해 DB에 반영한 후 결과를 볼 수 있게 상세 페이지로 리다이렉트하는 것.

image

▲수정 폼의 데이터가 DB로 갱신되는 과정

클라이언트와 서버 간 처리 흐름을 크게 4가지 기술로 나누어 보면 된다.

  1. MVC(Model View Controller) : 서버 역할을 분담해 처리하는 기법
  2. JPA(Java Persistence API) : 서버와 DB간 소통에 관여하는 기술
  3. SQL(Structure Query Language) : DB 데이터를 관리하는 언어
  4. HTTP(HyperText Transfer Protocol) : 데이터를 주고받기 위한 통신 규약

image

▲클라이언트-서버 간 데이터 처리를 위한 4가지 기술

이 중에서 HTTP에 대해서 자세히 알아보자.

wongakim-99 commented 1 month ago

HTTP 메서드

클라이언트와 서버 간 데이터를 전송할 때 다양한 통신 규약, 즉 프로토콜을 따른다. 프로토콜(Protocol) 은 컴퓨터 간에 원할하게 통신하기 위해 사용하는 전 세계 표준이다. 기기 간에 각종 신호 처리 방법, 오류 처리, 암호, 인증 방식 등을 규정하고 있어 이를 따라야만 오류나 지연 없이 원활하게 통신할 수 있다.

프로토콜의 종류는 다양하다. 친구와 연락할 때 전화, 메신저, 이메일, 쪽지 등 다양한 방식을 사용하는 것처럼 프로토콜도 파일 전송을 위한 FTP(File Transfer Protocol), 이메일 전송을 위한 SMTP(Simple Mail Transfer Protocol)등 기기와 목적에 따라 구분해 사용한다.

HTTP는 그중에서도 웹 서비스에 사용하는 프로토콜이다. HTTP의 대표적인 메서드로는 POST, GET, PATCH(PUT), DELETE가 있다.

데이터의 생성, 조회, 수정, 삭제는 데이터 관리에서 가장 기본이 되는 동작이다. 이를 간단히 CRUD(Create Read Update Delete)라고 한다.

데이터 관리 SQL HTTP
데이터 생성(Create) INSERT POST
데이터 조회(Read) SELECT GET
데이터 수정(Update) UPDATE PATCH(PUT)
데이터 삭제(Delete) DELETE DELETE
wongakim-99 commented 1 month ago

더미 데이터 생성

src>main>resource 파일에 data.sql 파일 생성하고

INSERT INTO article(id, title, content) VALUES(1, '가가가가', '1111');
INSERT INTO article(id, title, content) VALUES(2, '나나나나', '2222');
INSERT INTO article(id, title, content) VALUES(3, '다다다다', '3333');

생성

그 다음 application.properties에 가서

spring.jpa.defer-datasource-initialization=true

추가

wongakim-99 commented 1 month ago

<수정 페이지> 변경하기

수정 페이지의 코드는 edit.mustache 파일에 있다. 파일을 열면

태그가 있다. 여기서 눈여겨 볼 것은 action과 method 속성. 여기서 눈여겨 볼 것은 action과 method 속성. action 속성은 폼 데이터를 어디로 보낼지 URL을 지정하고, method 속성은 어떻게 보낼지 방식을 지정.

※앞서 HTTP 메서드의 종류와 역할에 대해서 공부했다. HTTP메서드를 활용하면 데이터를 조회할지(GET), 새로 만들지(POST), 수정할지(PATCH), 삭제할지(DELETE) 등의 요청을 서버에 전송할 수 있다고 했다. 그럼에도 불구하고 PATCH가 아닌 POST를 사용함. 그 이유는 무엇일까?

그 이유는 태그가 옛날에 만들어진 규격이라 PATCH 메서드를 지원하지 않기 때문. 태그는 GET과 POST 메서드만 지원. PATCH 메서드를 지정할 수 있는 다른 방법이 있긴 하지만, 여기서는 POST 그대로 둔 채 데이터 수정

수정 폼에서 서버로 보낼 데이터가 하나 더 있다. 바로 id 이다. id가 몇 번인 article을 수정하는지 알려줘야 하므로 태그를 만들어 value="{{id}}" 속성을 추가한다. 이때 id는 화면에 표시할 필요가 없으므로 type="hidden"속성을 추가해 보이지 않게 숨긴다.

wongakim-99 commented 1 month ago

수정 데이터 받아 오기

update() 매서드 기본 틀 만들기

  1. 메서드 이름은 update() 로 하고 기본 틀을 작성

  2. URL 요청을 접수. 데이터 수정 요청을 처리하는 메서드이므로 @PatchMapping() 을 사용해야 하지만, 여기서는 post 방식으로 요청을 받았기 때문에 @PostMapping() 을 사용. 괄호 안에는 수정 폼의 action 속성에서 정의한 "/articles/update"를 작성

  3. 수정 데이터를 DTO에 담기

    • update() 메서드는 클라이언트의 데이터 수정 요청을 받아 수행한다. 수정 폼에서 전송한 데이터는 DTO로 받는다. DTO는 메서드의 매개변수로 받아 오고, 다음과 같이 매개변수를 추가한다.
public String update(ArticleForm form)
  1. 수정 폼에 태그로 id를 추가했으므로 DTO를 정의하는 ArticleForm에도 id를 추가해야 합니다. dto > ArticleForm 을 찾아 연다.
    • 파일이 열리면 id 필드를 추가한다.
    • 그 아래 toEntity() 메서드를 보면, 그 전에는 id 필드가 없었기 때문에 null 값으로 생성자를 호출했다. 이제 id 필드를 추가했기 때문에 생성자에더 id를 작성해준다.
wongakim-99 commented 1 month ago

DB에 저장하고 결과 페이지로 리다이렉트하기

데이터를 DTO에 담았다면 최종적으로 DB에 저장해야 한다.

  1. DTO를 엔티티로 변환하기
  2. 엔티티를 DB에 저장하기
  3. 수정 결과 페이지로 리다이렉트하기

2번을 보면 데이터를 새로 생성하는 게 아니라 수정하려고 한다. 기존 데이터를 바꾼다는 말이다. 따라서 DB에서 기존 데이터를 가져와야 한다. 이때는 리파지터리를 이용해 아래의 코드 (메서드)를 호출

articleRepository.findById(articleEntity.getId()).orElse(null);

마지막으로 컨트롤러에서 마지막 return 값으로 해당 id의 상세 페이지로 이동할 수 있는 URL을 써준다. URL의 id 부분은 엔티티에 따라 매번 바뀌어야 하므로 articleEntity의 getId() 메서드를 호출해 얻고 앞의 URL과 +연산자로 연결

return "redirect:/articles/" + articleEntity.getId();
wongakim-99 commented 1 month ago

정리

게시글을 수정하고 DB에 반영하는 예제 실습. 수정 폼에 작성된 데이터를 서버로 보내는 과정이였다. 아쉽게도 태그는 PATCH 메서드를 제공하지 않아 POST 메서드를 임시로 사용했다.

수정 데이터는 ArticleController의 update() 메서드가 ArticleForm 이라는 DTO로 받은 다음 엔티티로 변환했다. 그리고 이 엔티티를 가지고 DB에서 해당 데이터를 찾아 수정 내용으로 갱신한 후, 마지막으로 바뀐 페이지로 리다이렉트하는것 까지 연습했다.

wongakim-99 commented 1 month ago

마무리

  1. 데이터 수정 1단계
    • 수정 페이지를 만들고 기존 데이터를 불러온다.

image

  1. 데이터 수정 2단계
    • 데이터를 수정해 DB에 반영한 후 결과를 볼 수 있게 상세 페이지로 리다이렉트한다.

image

  1. HTTP 메서드
    • HTTP는 클라이언트의 다양한 요청을 메서드를 통해 서버로 보내는 역할을 한다. 대표적인 메서드로는 POST, GET, PATCH(PUT), DELETE가 있다.

3-1. POST: 데이터 생성 요청 3-2. GET : 데이터 조회 요청 3-3. PATCH(PUT) : 데이터 수정 요청 3-4. DELETE : 데이터 삭제 요청

  1. UPDATE 문
    • 데이터를 수정할 때 사용하는 SQL문으로, 형식은 다음과 같다.
UPDATE 테이블명 SET 속성명=변경할 값 WHERE 조건;
wongakim-99 commented 1 month ago

다음 챕터에서는 게시글 삭제하기 : Delete 에 대해서 공부