Closed wongakim-99 closed 1 month ago
게시판에 작성한 글을 수정하려면 해당 글을 불러와 수정할 수 있는 입력 상태로 만들어야 됨. 그 다음 내용을 입력하고 다시 전송하면 DB에 반영돼 최종적으로 수정됨.
<수정 페이지> 만들고 기존 데이터 불러오기
데이터를 수정해 DB에 반영한 후 결과를 볼 수 있게 <상세 페이지>로 리다이렉트
▲데이터를 수정하기 위해 기존 글을 불러오는 과정
▲수정 폼의 데이터가 DB로 갱신되는 과정
show.mustache 파일에 아래의 코드 추가
<a href="/articles/{{article.id}}/edit">Edit</a>
수정 요청을 받아 처리할 edit() 메서드를 작성하고 반환할 수정 페이지를 articles 디렉터리 안에 edit.mustache 파일로 설정
URL 요청을 받는 @GetMapping() 을 작성. /articles/{{article.id}}/edit 주소로 연결 요청했으므로 이 URL인 "/articles/{id}/edit" 를 작성.(※이때 변수id는 {{id}}가 아니라 {id}라고 작성한다는 사실을 유의. 뷰 페이지에서 변수를 사용할 때는 중괄호 두 개를 쓰지만, 컨트롤러에서 URL 변수를 사용할 때는 하나{}만 쓴다.)
DB에서 데이터를 가져올 때는 리파지터리 이용. articleRepository의 findById(id) 메서드로 데이터를 찾아 가져옴. 만약 데이터를 찾지 못하면 null 반환, 데이터를 찾았다면 Article 타입의 articleEntity로 저장
findById(id) 에서 괄호 안의 id가 빨간색으로 표시되는건. 메서드에서 id라는 변수가 선언되지 않았기 때문. id는 메서드의 매개변수로 받아 오고 자료형은 Long으로 작성. 그리고 GetMapping() 어노테이션의 URL 주소에 있는 id를 받아 오는 것이므로 데이터 타입 앞에 @PathVariable 어노테이션 추가
DB에서 데이터를 가져온 후 뷰 페이지에서 사용할 수 있도록 모델에 데이터 등록. addAttribute() 메서드로 모델에 데이터 등록. article이라는 이름으로 앞에서 가져온 articleEntity를 등록. 이렇게 하면 DB에서 가져온 데이터를 article이라는 이름으로 뷰 페이지에서 사용할 수 있음.
▲여기까지 실습 내용 도식화
확인 췤
수정 페이지가 나올 때까지 처리 흐름을 순서대로 작성
24.8.9 오늘 백엔드는 여기까지 :) 👍
데이터 수정 2단계는 데이터 수정해 DB에 반영한 후 결과를 볼 수 있게 상세 페이지로 리다이렉트하는 것.
▲수정 폼의 데이터가 DB로 갱신되는 과정
클라이언트와 서버 간 처리 흐름을 크게 4가지 기술로 나누어 보면 된다.
▲클라이언트-서버 간 데이터 처리를 위한 4가지 기술
이 중에서 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 |
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
추가
수정 페이지의 코드는 edit.mustache 파일에 있다. 파일을 열면
update() 매서드 기본 틀 만들기
메서드 이름은 update() 로 하고 기본 틀을 작성
URL 요청을 접수. 데이터 수정 요청을 처리하는 메서드이므로 @PatchMapping() 을 사용해야 하지만, 여기서는 post 방식으로 요청을 받았기 때문에 @PostMapping() 을 사용. 괄호 안에는 수정 폼의 action 속성에서 정의한 "/articles/update"를 작성
수정 데이터를 DTO에 담기
public String update(ArticleForm form)
데이터를 DTO에 담았다면 최종적으로 DB에 저장해야 한다.
2번을 보면 데이터를 새로 생성하는 게 아니라 수정하려고 한다. 기존 데이터를 바꾼다는 말이다. 따라서 DB에서 기존 데이터를 가져와야 한다. 이때는 리파지터리를 이용해 아래의 코드 (메서드)를 호출
articleRepository.findById(articleEntity.getId()).orElse(null);
마지막으로 컨트롤러에서 마지막 return 값으로 해당 id의 상세 페이지로 이동할 수 있는 URL을 써준다. URL의 id 부분은 엔티티에 따라 매번 바뀌어야 하므로 articleEntity의 getId() 메서드를 호출해 얻고 앞의 URL과 +연산자로 연결
return "redirect:/articles/" + articleEntity.getId();
게시글을 수정하고 DB에 반영하는 예제 실습. 수정 폼에 작성된 데이터를 서버로 보내는 과정이였다. 아쉽게도
3-1. POST: 데이터 생성 요청 3-2. GET : 데이터 조회 요청 3-3. PATCH(PUT) : 데이터 수정 요청 3-4. DELETE : 데이터 삭제 요청
UPDATE 테이블명 SET 속성명=변경할 값 WHERE 조건;
다음 챕터에서는 게시글 삭제하기 : Delete 에 대해서 공부
게시판에 작성한 글을 수정하기 위해 기존 글을 수정 페이지로 불러오고 이를 변경해 다시 DB에 저장