java, spring

[Spring] 댓글 처리, 서비스 영역과 Controller 처리 (feat. @RestController)

isaac.kim 2021. 8. 3. 23:33
728x90
반응형

[Spring] 댓글 처리, 서비스(Service) 영역과 Controller 처리 (feat. @RestController)

 

이전 글

2021.08.01 - [Spring] - [Spring] 댓글 처리를 위한 영속 속성

2021.07.31 - [Datebase/mariaDB, MySQL] - [MariaDB] 댓글 처리 테이블 : 외래 키에 대해 테이블 다뤄보기

2021.07.29 - [Spring] - [Spring] REST 방식

 

 

서비스 Service

이전 글의 댓글 처리를 위한 영속 속성 구성이 되었다고 보고, 서비스 영역을 작성합니다.

 

com.project.service 패키지에 ReplyService 인터페이스와 ReplyServiceImpl 클래스를 작성합니다.

 

ReplyService 인터페이스

ReplyServiceImpl 클래스

ReplyServiceImpl은 ReplyMapper에 의존적인 관계이기 때문에 위의 코드와 같이 @Setter를 이용해서 처리하거나 스프링 4.3의 생성자와 자동주입을 이용해서 아래와 같이 처리할 수 있습니다.

 

스프링 4.3을 이용하는 경우 ReplyServiceImpl의 일부

 

컨트롤러 Controller

ReplyController의 설계

 

@RestController 어노테이션을 이용하여 다음과 같은 URL을 기준으로 동작할 수 있게 작성합니다.

작업 URL HTTP 전송방식
등록 /replies/new POST
조회 /replies/:seq_rno GET
삭제 /replies/:seq_rno DELETE
수정 /replies/:seq_rno PUT or PATCH
페이지 /replies/pages/:seq_bno/:page GET

REST 방식으로 동작하는 URL을 설계할 때는 PK를 기준으로 작성하는 것이 좋습니다. PK만으로 조회, 수정, 삭제가 가능하기 때문입니다. 다만 댓글의 목록은 PK를 사용할 수 없기 때문에 파라미터로 필요한 게시물의 번호(seq_bno)와 페이지 번호(page) 정보들을 URL에서 표현하는 방식을 사용합니다.

 

ReplyController는 ReplyService 타입의 객체인 ReplyServiceImpl 객체를 주입받도록 설계합니다.

ReplyController 클래스

@Setter주입을 이용하거나 @AllArgsConstructor를 이용해서 ReplyService 타입의 객체를 필요로 하는 생성자를 만들어서 사용합니다.

 

등록 작업과 테스트

REST 방식으로 처리할 때 주의해야 하는 점은 브라우저나 외부에서 서버를 호출할 때 데이터의 포맷과 서버에서 보내주는 데이터의 타입을 명확히 설계해야 하는 것입니다.

 

브라우저에서는 JSON 타입으로 된 댓글 데이터를 전송하고, 서버에서는 댓글의 처리 결과가 정상적으로 되었는지 문자열로 결과를 알려주도록 합니다.

 

ReplyController 클래스

create( )는 @PostMapping으로 POST 방식으로만 동작하도록 설계하고, consumes와 produces를 이용해서 JSON 방식의 데이터만 처리하도록 하고, 문자열을 반환하도록 설계합니다. create( )의 파라미터는 @RequestBody를 적용해서 JSON 데이터를 ReplyVO 타입으로 변환하도록 지정합니다.

 

create( )는 내부적으로 ReplyServiceImpl을 호출해서 register( )를 호출하고, 댓글이 추가된 숫자를 확인해서 브라우저에서 '200 OK' 혹은 '500 Internal Server Error'를 반환하도록 합니다. 

 

테스트 시에는 POST 방식으로 전송하고, 'Content-Type'은 'application/json'으로 지정해야 합니다.

게시물 번호(seq_bno)는 기존 게시물 번호로 존재하는 번호여야 하고, JSON 문법에 맞게 작성하도록 주의합니다.

 

{"seq_bno" : 748, "reply" : "Hello Reply", "replyer":"user"}

 

ARC 크롬 확장 프로그램에서 테스트

Controller Log

작성한 댓글은 데이터베이스 tb_reply 테이블 데이터에 정상적으로 추가되었는지 확인합니다.

기존 데이터(왼쪽) 와 신규 추가된 데이터(오른쪽)

 

특정 게시물의 댓글 목록 확인

특정 게시물의 댓글 목록을 확인하는 작업은 아래와 같이 작성합니다.

ReplyController 클래스

ReplyController의 getList( )는 Criteria를 이용해서 파라미터를 수집하는데, '/{seq_bno}/{page}'의 'page' 값은 Criteria를 생성해서 직접 처리해야 합니다. 게시물의 번호는 @PathVariable을 이용해서 파라미터로 처리하고 브라우저에서 아래와 같이 테스트 해봅니다.

 

http://localhost:8080/replies/pages/748/1

 

테스트 url 실행결과

XML 결과와 JSON 결과

[Tip] 링크 뒤에 '.json' 을 추가하면 JSON 형태의 데이터로 얻을 수 있습니다.

XML결과, JSON결과

 

댓글 조회/삭제

RestController의 댓글의 수정/삭제/조회는 위와 유사한 방식으로 JSON이나 문자열을 반환하도록 설계합니다.

 

[조회]

ReplyController 클래스의 일부

[삭제]

ReplyController 클래스의 일부

 

댓글 수정

댓글 수정은 JSON 형태로 전달되는 데이터와 파라미터로 전달되는 댓글 번호(seq_rno)를 처리합니다.

[수정]

ReplyController 클래스의 일부

댓글 수정은 PUT, PATCH 방식을 이용하고, 실제 수정되는 데이터는 JSON 포맷이므로 @RequestBody를 이용해서 처리합니다. @RequestBody로 처리되는 데이터는 일반 파라미터나 @PathVariable 파라미터를 처리할 수 없기 때문에 직접 처리해 주는 부분을 주의해야 합니다.

 


REST 조회/삭제/수정 테스트

 

조회 테스트

삭제 테스트

수정 테스트


이렇게 해서 서비스와 REST API를 사용하는 방법으로 RestController를 구성하고 테스트까지 마쳤습니다.

다음에 작성할 내용은 RestController와 메서드를 활용하여 Front-End 에서의 처리입니다.

728x90
반응형