Kim VamPa

[Spring][쇼핑몰 프로젝트][46] 댓글 체크 - 1 본문

스프링 프레임워크/쇼핑몰 프로젝트

[Spring][쇼핑몰 프로젝트][46] 댓글 체크 - 1

Kim VamPa 2022. 1. 7. 17:47
728x90
반응형
프로젝트 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);

 

그림 2-1

 

 

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>

 

그림 2-2

 

 

 

3. Service

 

ReplyService 인터페이스

 

com.vam.service 패키지의 ReplyService 인터페이스에 댓글 체크 Service 메서드 선언 부를 작성합니다.

 

 - 반환 타입은 String으로 지정했습니다.  댓글이 존재할 경우 "1"을 존재하지 않을 경우 "0"을 반환하도록 만들어 주기 위함입니다. 

 

	/* 댓글 존재 체크 */
	public String checkReply(ReplyDTO dto);

 

그림 3-1

 

 

 

ReplyServiceImpl

 

 com.vam.service 피키지의 ReplyServiceImpl 클래스에 앞서 인터페이스에서 선언한 메서드를 오버라이딩 합니다.

 

그림 3-2

 

 

 구현부에는 앞서 작성한 댓글 체크 Mapper 메서드를 호출하여 결과 값을 Integer 타입의 변수에 저장 후, 저장된 변수의 값에 따라 문자열 0 혹은 1을 반환하도록 코드를 작성했습니다. (댓글 존재할 경우 "1", 없을 경우 "0")

 

		Integer result = replyMapper.checkReply(dto);
		
		if(result == null) {
			return "0";
		} else {
			return "1";
		}

 

그림 3-3

 

 

 

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);
	}

 

그림 3-4

 

 

REFERENCE

  •  

 

 

DATE

  • 2020.01.07

 

728x90
반응형
Comments