[Spring][쇼핑몰 프로젝트][46] 댓글 등록 - 1
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188
목표
댓글 등록 기능 구현
'상품 상세 페이지(goodsDetail.jsp)'에서 댓글 등록 기능 구현을 목표로 합니다.
순서
1. 개요
2. DTO클래스
3. Mapper 메서드
4. Service 메서드
5. Controller
1. 개요
Create
- 로그인한 회원이 '상품 상세 페이지'로 이동했을 때 "댓글 등록" 버튼이 보인다.
- 댓글 등록 버튼을 누르면 댓글을 작성할 수 있는 팝업창이 뜬다.
- 팝업창에서는 평점을 select 방식으로 선택할 수 있고, 댓글은 <textarea>에 작성할 수 있다.
- 다 작성 후 '등록' 버튼을 누르면 DB에 댓글 등록이 완료된다.
- 댓글 등록 동작 과정에서 상품 테이블(vam_book)의 평점(평균 평점)이 최신화된다.
- 댓글이 등록되면 팝업창이 닫히고 '상품 상세 페이지' 에는 등록한 댓글을 볼 수 있다.
이전 포스팅에서 작성했던 등록의 흐름입니다. 위의 작업을 수행하는 기능 구현을 하겠습니다.
구현은 서버, 뷰 순으로 작업을 진행합니다.
2. DTO클래스
본격적으로 작업을 하기전 댓글 정보 관련 데이터를 담을 수 있는 DTO클래스를 먼저 만들겠습니다.
com.vam.model 패키지에 ReplyDTO 클래스를 생성합니다.
DTO의 속성(변수) 들은 댓글 테이블(vam_reply) 속성들과 동일하게 줄 것입니다. 아래의 변수 들을 추가 해줍니다.
private int replyId;
private int bookId;
private String memberId;
private Date regDate;
private String content;
private double rating;
추가한 변수 들을 getter/setter/toString 메서드를 추가해줍니다.
3. Mapper 메서드
댓글 테이블(vam_reply)에 정보를 등록하는 Mapper 메서드를 만들어 보겠습니다.
ReplyMapper 인터페이스
com.vam.mapper 패키지에 ReplyMapper 인터페이스를 생성합니다.
댓글 테이블에 데이터를 등록하는 Mapper 메서드를 선언부를 추가합니다. 데이터 등록 쿼리 성공 시 1을 반환하도록 반환 타입은 int를 지정하였습니다. 등록할 댓글 정보가 담길 수 있는 ReplyDTO타입을 파라미터로 지정하였습니다.
/* 댓글 등록 */
public int enrollReply(ReplyDTO dto);
ReplyMapper.xml
src/main/resources/com/vam/mapper 디렉토리 경로에 ReplyMapper.xml 파일을 생성합니다.
추가한 xml 파일에 mybatis를 사용할 수 있도록 기본적인 세팅 코드를 추가합니다.
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vam.mapper.ReplyMapper">
</mapper>
ReplyMapper 인터페이스에서 선언한 메서드가 수행할 쿼리를 작성합니다.
- replyId는 DB의 자동 기본키 추가 기능을 사용했습니다.
- regDate는 테이블 생성 시 기본값을 등록되는 현재의 시간으로 했습니다.
<!-- 댓글등록 -->
<insert id="enrollReply">
insert into vam_reply(bookId, memberId, content, rating) values(#{bookId}, #{memberId}, #{content}, #{rating})
</insert>
ReplyMapperTests
새로 작성하 Mapper메서드가 정상적으로 쿼리문을 실행하는지 테스트해보겠습니다.
src/test/java 경로의 com.vam.mapper에 ReplyMapperTests 클래스를 생성합니다.
Junit 테스트를 위한 기본적인 코드를 추가하고, ReplyMapper 객체를 주입해줍니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Autowired
private ReplyMapper mapper;
아래의 코딩을 작성하여 테스트를 합니다.
@Test
public void replyEnrollTest() {
String id = "admin";
int bookId = 95;
double rating = 3.5;
String content = "댓글 테스트";
ReplyDTO dto = new ReplyDTO();
dto.setBookId(bookId);
dto.setMemberId(id);
dto.setRating(rating);
dto.setContent(content);
mapper.enrollReply(dto);
}
4. Service 메서드
댓글 등록 Service 메서드를 만들겠습니다. 지금 작업할 댓글 등록 Service 메서드는 단순히 Mapper 메서드를 호출하는 역할만 할 것입니다.
ReplyService 인터페이스
com.vam.service 패키지에 ReplyService 클래스를 생성합니다.
댓글 등록을 수행할 메서드 선언부를 작성해줍니다.
/* 댓글 등록 */
public int enrollReply(ReplyDTO dto);
ReplyServiceImpl.java
com.vam.service 패키지에 ReplySerivceImpl 클래스를 생성합니다.
클래스 선언부 implements ReplyService 키워드와, @Service 어노테이션을 추가해주고 ReplyMapper 객체를 주입해줍니다.
인터페이스에서 선언한 메서드를 오버 라이딩하여 구현부를 완성해줍니다. 구현부에는 댓글 등록 Mapper 메서드를 호출하여 반환받은 값을 반환하는 코드를 작성하였습니다.
/* 댓글등록 */
@Override
public int enrollReply(ReplyDTO dto) {
int result = replyMapper.enrollReply(dto);
return result;
}
5. Controller
com.vam.controller 패키지에 ReplyController 클래스를 생성합니다.
댓글 요청 처리의 경우 정부 뷰를 만들지 않고 http body 바로 데이터를 담아 반환할 것이기 때문에 클래스 선언부에 @RestController 어노테이션을 추가합니다.
ReplyController의 모든 매핑 메서드들이 선언하는 URL 앞에 "/reply"이 붙도록 @RequestMapping 어노테이션을 추가합니다.
ReplyService 객체를 의존성 주입해줍니다.
댓글 등록 요청을 처리하는 URL 매핑 메서드를 작성합니다.
- URL의 경로는 "/enroll"로 지정하였습니다.
- 반환 값이 없도록 void를 지정하였습니다. (성공 여부를 알리는 반환 값을 주는 게 더 좋은 판단이겠지만 단순한 구현을 위해 void로 지정하였습니다.)
- 댓글 등록 관련 데이터를 모두 속성으로 가지고 있는 ReplyDTO를 파라미터로 지정하였습니다.
- 댓글 등록 Service 메서드를 구현부에 호출합니다.
/* 댓글 등록 */
@PostMapping("/enroll")
public void enrollReplyPOST(ReplyDTO dto) {
replyService.enrollReply(dto);
}
REFERENCE
DATE
- 2020.01.03