일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- oracle 설치방법
- 인증번호 전송
- ResponseEntity
- BCrypt 적용
- arraylist
- 스프링 게시판 구현
- 스프링 쇼핑몰
- 스프링 게시판
- 스프링 프로젝트 설정
- 로그아웃 기능 구현
- 스프링 업로드
- 스프링 파일 삭제
- 스프링 쇼핑몰 프로젝트
- 정규표현식
- 파일 업로드
- 스프링 프로젝트 기본 설정
- 회원가입 기능
- 쇼핑몰 포트폴리오
- 로그인 기능
- Bcrypt
- spring 프로젝트
- 쇼핑몰 프로젝트
- 스프링 HikariCP
- spring 쇼핑몰
- 삭제 구현
- 스프링 프로젝트
- 이미지 출력
- 스프링 이미지
- 스프링 포트폴리오
- 스프링 메일 전송
- Today
- Total
Kim VamPa
[Spring][쇼핑몰 프로젝트][46] 댓글 체크 - 1 본문
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188
목표
댓글 체크 기능 구현
댓글 등록 전 회원이 이전에 등록한 댓글이 있는지 확인하는 기능 구현을 목표로 합니다.
순서
1. 개요
2. Mapper
3. Service
4. Controller
1. 개요
이전 댓글 테이블(vam_reply) 생성했을 때 회원이 하나의 상품에 대해서 한 번의 댓글을 달 수 있도록 memberId, bookId 두 컬럼을 대상으로 UNIQUE 제약 조건을 걸었습니다. 그렇기 때문에 회원이 이미 등록한 댓글이 있는 상태에서 댓글을 한 번 더 등록을 한다면 에러가 발생합니다. 따라서 이러한 에러가 발생하지 않도록 회원이 댓글을 등록하기 전에 댓글을 등록했는지 체크를 하여, 했을 경우 경고창을 띄우는 기능을 구현하는 것이 목표입니다.
댓글 등록의 흐름은 크게 "댓글 등록 버튼 클릭" => "팝업창 댓글 & 평점 작성" =>"등록 버튼 클릭" => "댓글 등록"의 흐름을 가지는데 제일 첫 단계인 "댓글 등록 버튼 클릭"을 했을 때 등록된 댓글이 있는지 확인하고, 있는 경우는 경고창을, 없는 경우에는 정상적으로 등록 팝업창을 띄우도록 만들 것입니다.
댓글 체크의 동작 흐름은 뷰에서 서버로 댓글 존재 체크 요청할 때 memberId, bookId 데이터를 함께 보냅니다. 서버에서는 DB에 memberId, bookId를 조건으로 하는 vam_reply 테이블의 행이 있는지 확인 후 존재 여부 결과 값을 뷰로 전송합니다. 다시 뷰에선 전달받은 값에 따라 경고 문구 혹은 등록 팝업창 뜹니다.
이번 포스팅에서는 서버 측 구현을 하고 다음 포스팅에서는 뷰 측 구현을 하겠습니다.
2. Mapper
ReplyMapper 인터페이스
com.vam.mapper 패키지의 ReplyMapper 인터페이스에 memberId, bookId를 조건을 만족하는 vam_reply 테이블의 행을 검색하는 쿼리를 실행하는 Mapper 메서드 선언부를 작성합니다.
- memberId와 bookId를 담을 수 있는 ReplyDTO를 파라미터로 지정하였습니다.
(memberId, bookId만을 담을 수 있는 DTO 클래스를 만드는 것이 더 좋습니다. 왜냐하면 프로젝트는 결국 유지/보수를 반드시 동반하는데 시간이 지나서 프로그래머가 해당 코드를 봤을 때 이 메서드는 어떠한 데이터만을 필요하다는 것을 명확하게 알 수 있게 해 주기 때문입니다. 하지만 공부용이기도 하고 작은 프로젝트기 때문에 ReplyDTO를 그대로 사용했습니다.)
- 반환 타입을 int가 아닌 Integer를 지정해주었습니다. memberId와 bookId를 조건으로 하는 행이 없을 경우 MyBatis는 null을 반환해줍니다. 그런데 int 타입은 null 값이 없기 때문에 반환 타입이 int일 경우 에러가 발생하게 됩니다. 따라서 null 값도 가질 수 있는 Integer를 반환 타입으로 지정하였습니다.
/* 댓글 존재 체크 */
public Integer checkReply(ReplyDTO dto);
ReplyMapper.xml
src/main/resources/com/vam/mapper 경로에 있는 ReplyMapper.xml 파일에 인터페이스에서 선언한 메서드가 실행할 쿼리문을 작성합니다.
<select id="checkReply" resultType="integer">
select replyId from vam_reply
where memberId = #{memberId} and bookId = #{bookId}
</select>
3. Service
ReplyService 인터페이스
com.vam.service 패키지의 ReplyService 인터페이스에 댓글 체크 Service 메서드 선언 부를 작성합니다.
- 반환 타입은 String으로 지정했습니다. 댓글이 존재할 경우 "1"을 존재하지 않을 경우 "0"을 반환하도록 만들어 주기 위함입니다.
/* 댓글 존재 체크 */
public String checkReply(ReplyDTO dto);
ReplyServiceImpl
com.vam.service 피키지의 ReplyServiceImpl 클래스에 앞서 인터페이스에서 선언한 메서드를 오버라이딩 합니다.
구현부에는 앞서 작성한 댓글 체크 Mapper 메서드를 호출하여 결과 값을 Integer 타입의 변수에 저장 후, 저장된 변수의 값에 따라 문자열 0 혹은 1을 반환하도록 코드를 작성했습니다. (댓글 존재할 경우 "1", 없을 경우 "0")
Integer result = replyMapper.checkReply(dto);
if(result == null) {
return "0";
} else {
return "1";
}
4. Controller
com.vam.controller 패키지의 ReplyController 클래스에 댓글 체크 요청을 수행하는 URL 매핑 메서드를 작성합니다.
- URL은 "/reply/check"로 지정했습니다.
- memberId, bookId를 전달받기 위해 파라미터로 ReplyDTO를 지정했습니다.
- HTTP 바디에 문자열을 바로 반환하도록 반환 타입은 String으로 지정했습니다.
- 구현부에는 댓글 체크 Service 메서드를 호출하고 반환받은 값을 바로 반환하도록 댓글을 작성했습니다.
/* 댓글 체크 */
/* memberId, bookId 파라미터 */
/* 존재 : 1 / 존재x : 0 */
@PostMapping("/check")
public String replyCheckPOST(ReplyDTO dto) {
return replyService.checkReply(dto);
}
REFERENCE
DATE
- 2020.01.07
'스프링 프레임워크 > 쇼핑몰 프로젝트' 카테고리의 다른 글
[Spring][쇼핑몰 프로젝트][47] 댓글 페이징 - 1 (0) | 2022.01.11 |
---|---|
[Spring][쇼핑몰 프로젝트][46] 댓글 체크 - 2 (0) | 2022.01.10 |
[Spring][쇼핑몰 프로젝트][46] 댓글 등록 - 3 (0) | 2022.01.06 |
[Spring][쇼핑몰 프로젝트][46] 댓글 등록 - 2 (0) | 2022.01.05 |
[Spring][쇼핑몰 프로젝트][46] 댓글 등록 - 1 (0) | 2022.01.03 |