본 포스팅은 코드로 배우는스프링 웹프로젝트를 참조하여 작성한 내용입니다. 개인적으로 학습한 내용을 복습하기 위한 내용이기 때문에 내용상 오류가 있을 수 있습니다. 기존의 Spring MVC 관련 포스팅들이 제대로 정리되지 않은 것 같아 처음부터 차분히 정리하면서 포스팅을 진행하고 있습니다.
그리고 본 포스팅의 예제는 STS 또는 Eclipse를 사용하지 않고 IntelliJ를 통해 구현하고 있습니다. 그래서 기존의 STS에서 생성된 Spring 프로젝트의 스프링관련 설정 파일명과 프로젝트 구조가 약간 다를 수 있습니다. IntelliJ를 통한 Spring MVC 프로젝트 생성 포스팅을 참고해주시면 감사하겠습니다.
포스팅하고 있는 현재 프로젝트의 예제가 혹시 필요하신 분은 깃주소(https://github.com/walbatrossw/spring-mvc-ex)를 통해 얻으실 수 있습니다.
Spring MVC 기본 개념 및 테스트 정리 포스팅 링크
Spring-MVC 게시판 예제 이전 포스팅 링크
Spring MVC - 댓글처리 : 영속, 비지니스, 컨트롤 계층 구현
1. 댓글처리를 위한 준비
# 전달방식과 처리방식 결정
Rest방식을 이용할 것이라면 해당 컨트롤러를 먼저 작성하고, 그에 맞는 URI를 결정하는 것이 첫단계이다. 댓글처리는 아래와 같은 방식으로 호출하도록 한다.
URI | 전송방식 | 설명 |
---|---|---|
/replies/all/123 | GET | 123번게시글의 모든댓글 리스트 |
/replies/+데이터 | POST | 새로운데이터추가 |
/replies/200 + 데이터 | PUT/PATCH | 200 댓글수정 |
/replies/200 | DELETE | 200 댓글삭제 |
# 댓글을 위한 테이블 생성
하나의 게시글은 여러개의 댓글을 가지는 1:N관계이므로 게시글 테이블과 댓글 테이블의 구조는 아래와 같은 형태가 된다.
아래와 같이 댓글 테이블을 생성하고, 댓글 참조키를 설정해준다.
# 댓글을 위한 도메인 객체 설계
src/main/java/기본패키지/reply/domain
패키지를 생성하고 아래와 같이 클래스를 작성해준다.
# 댓글 영속 계층 구현
/src/java/main/기본패키지/reply/Persistence
패키지를 생성하고, ReplyDAO
인터페이스에 추상메서드를 정의해준다. 그리고 ReplyDAO
인테피이스를 구현한 ReplyDAOImpl
클래스를 만들고, 메서드 오버라이드하여 구현을 해준다. 마지막으로 replyMapper.xml
에서 댓글 목록, 입력, 수정, 삭제 SQL을 작성해준다.
ReplyDAO
ReplyDAOImpl
replyMapper.xml
mybatis-config.xml
replyMapper.xml
에서 resultMap
이나 resultType
을 패키지 경로와 클래스명을 길게 쓰지 않고, 짧게 쓰기 위해 ReplyVO
를 alias
설정해준다.
ReplyDAO
테스트 코드 작성
댓글 영속 계층을 구현을 완료했으니 제대로 작동하는지 확인하기 위해 아래와 같이 테스트 코드를 작성하고, 테스트를 진행한다.
# 댓글 비지니스 계층 구현
/src/main/java/기본패키지/reply/service
패키지에 ReplyService
인터페이스와 ReplyServiceImpl
클래스를 생성해 아래와 같이 작성해준다.
ReplyService
ReplyServiceImpl
2. Rest방식의 ReplyController
작성하기
# REST방식에서 쓰이는 주요 애너테이션들
@PathVariable
: URI의 경로에서 원하는 데이터를 추출하는 용도로 사용한다.@RequestBody
: 전송된 JSON데이터를 객체로 변환해주는 애너테이션으로 @ModelAttribute와 유사한 역할을 하지만 JSON에서 사용한다는 점이 차이점이다.
# Overloaded POST
: 브라우저에서 PUT
, PATCH
, DELETE
방식을 지원하기 위한 필터 추가
브라우저에 따라 GET
과 POST
방식을 지원하고, PUT
, PATCH
, DELETE
방식은 지원하지 않는 경우가 발생할 수 있다. 해결책은 브라우저에서 POST
방식으로 전송하고, 추가적인 정보를 이용해 PUT
, PATCH
, DELETE
와 같은 정보를 함께 전송하는 것이다. 이것을 Overloaded POST
라고 한다. <form>
태그를 이용해 데이터를 전송할 때, POST
방식으로 전송하되 _method
라는 추가적인 정보를 이용한다.
스프링은 이를 위해 HiddenHttpMethodFilter
라는 것을 제공한다. <form>
태그 내에 <input type="hidden" name="_method" value="PUT">
와 같은 형태로 사용한다. 이렇게 설정함으로써 GET
, POST
방식만을 지원하는 브라우저에서 REST방식을 사용할 수 있게 된다. 이렇게 사용하기 위해서는 아래와 같이 web.xml
에 필터를 추가해주면 된다.
web.xml
# ReplyController
클래스 생성 및 작성
/src/main/java/기본패키지/reply/controller
패키지에 클래스를 생성하고, 아래와 같이 작성해준다.
# 댓글 등록처리 메서드 작성
# 댓글 목록 메서드 작성
# 댓글 수정 처리 메서드 작성
# 댓글 삭제 처리 메서드 작성
# Postman을 이용한 컨트롤러 테스트
댓글 등록 테스트
댓글 목록 테스트
댓글 수정 테스트
댓글 삭제 테스트
3. 댓글 페이징 처리하기
게시글과 마찬가지로 댓글도 페이징 처리를 해준다. 이전에 게시글 페이징처리에 사용했던 Criteria
클래스를 재사용하여 구현해보자.
# ReplyDAO
메서드 추가 / ReplyDAOImpl
메서드 구현
ReplyDAO
ReplyDAOImpl
# replyMapper.xml
페이징처리 / 댓글 갯수 SQL 작성
# 댓글 페이징 처리 테스트
영속 계층에서 댓글 페이징 처리가 제대로 구현되었는지 확인하기 위해 아래와 같이 테스트 코드를 작성하고, 테스트 실행 해보자.
# 댓글 페이징 처리 비지니스 계층 구현
ReplyService
ReplyService
# 댓글 페이징 처리 컨트롤러 작성
ReplyController
댓글 페이징 컨트롤러 테스트