일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- MVC설정
- mybatis
- 게시판만들기
- update
- Controller
- service
- Oracle
- delete
- MVC CRUD
- log4jdbc
- CRUD
- 환경설정
- MVC 게시판
- Oracle 연결
- log4j
- 게시판
- spring
- MVC
- 서비스계층
- jdbc
- hikaricp
- Connection pool
- 게시판 List
- Today
- Total
yahayaha
21. 댓글 처리하기 (Controller 처리) 본문
서비스 영역과 Controller의 처리는 기본 BoardService와 동일하게 진행.
import java.util.List;
import org.zerock.domain.Criteria;
import org.zerock.domain.ReplyVO;
public interface ReplyService {
public int register(ReplyVO reply);
public ReplyVO get(Long rno);
public int modify(ReplyVO reply);
public int remove(Long rno);
public List<ReplyVO> getList(Criteria cri, Long bno);
}
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.zerock.domain.Criteria;
import org.zerock.domain.ReplyVO;
import org.zerock.mapper.ReplyMapper;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
// @service 스프링에 해당 클래스가 Service Component라고 알려주는것.
// 해당 클래스를 root-context에 빈객체로 등록해줌.
@Service
@Log4j
public class ReplyServiceImpl implements ReplyService{
// Setter 주입 해당 변수에 자동으로 의존성을 주입
@Setter(onMethod_ = @Autowired)
private ReplyMapper mapper;
@Override
public int register(ReplyVO reply) {
log.info("register..." + reply);
return mapper.insert(reply);
}
@Override
public ReplyVO get(Long rno) {
log.info("get...." + rno);
return mapper.read(rno);
}
@Override
public int modify(ReplyVO reply) {
log.info("modify..." + reply);
return mapper.update(reply);
}
@Override
public int remove(Long rno) {
log.info("remove...." + rno);
return mapper.delete(rno);
}
@Override
public List<ReplyVO> getList(Criteria cri, Long bno) {
log.info("get Reply List of a Board" + bno);
return mapper.getListWithPaging(cri, bno);
}
}
ReplyController 설계
@RestController 어노테이션을 이용해서 설계, 다음과 같은 URL을 기준으로 동작할 수 있도록 작성.
작업 | URL | HTTP 전송방식 |
등록 | /replies/new | POST |
조회 | /replies/:rno | GET |
삭제 | /replies/:rno | DELETE |
수정 | /replies/:rno | PUT or PATCH |
페이지 | /replies/pages/:bno/:page | GET |
REST 방식으로 동작하는 URL을 설계할 때는 PK를 기준으로 작성하는 것이 좋음.
PK만으로 조회, 수정, 삭제가 가능하기 떄문. 하지만 댓글의 목록은 PK를 사용할 수 없기에
파라미터로 필요한 게시물의 번호와 페이지 번호 정보들을 URL에 표현하는 방식 사용
ReplyController는 ReplyService 타입의 객체인 ReplyServiceImpl 객체를 주입받도록 설계.
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.zerock.service.ReplyService;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;
@RequestMapping("/replies/")
@RestController
@Log4j
@AllArgsConstructor
public class ReplyController {
private ReplyService service;
}
@Setter주입을 이용해도 상관없지만 @AllArgsConstructor를 이용해서 ReplyService 타입의 객체를 필요로 하는 생성자를 만들어서 사용.
@RequestMapping | @RestController | @AllArgsConstructor |
클라이언트 요청에 맞는 클래스나 메서드를 연결시켜주는 어노테이션. | @RestController의 주용도는 Json 형태로 객체 데이터를 반환 받으려고 사용. | 클래스의 모든 필드 값을 파라미터로 받는 생성자를 자동으로 생성. 이 어노테이션을 사용하면, 클래스의 모든 필드를 한 번에 초기화할 수 있음. |
등록 작업 / 테스트
REST 방식으로 주의해야 하는 점은 브라우저나 외부에서 서버를 호출할 때 데이터의 포맷과 서버에서 보내주는 데이터 타입을 명확히 설계해야함.
@RequestMapping("/replies/")
@RestController
@Log4j
@AllArgsConstructor
public class ReplyController {
private ReplyService service;
@PostMapping(value = "/new",
consumes = "application/json",
produces = { MediaType.TEXT_PLAIN_VALUE})
public ResponseEntity<String> create(@RequestBody ReplyVO reply){
log.info("ReplyVO: " + reply);
int insertCount = service.register(reply);
log.info("Reply INSERT COUNT: " + insertCount);
//삼항연산자 처리.
return insertCount == 1
? new ResponseEntity<>("success", HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
create()는 @PostMapping으로 POST 방식으로만 동작하도록 설계
consumes와 produces를 이용해서 JSON 방식의 데이터만 처리하도록 하고, 문자열을 반환하도록 설계.
create()의 파라미터는 @RequestBody를 적용해서 JSON 데이터를 ReplyVO 타입으로 변환하도록 지정.
create()는 내부적으로 ReplyServiceImpl을 호출해서 register()을 호출.
댓글이 추가된 숫자를 확인해서 브라우저에 '200 OK' 혹은 '500 Internal Server Error'를 반환하도록 함.
테스트는 크롬 확장 프로그램 yet another rest client를 통해 테스트 가능.
Yet Another REST Client
YARC (Yet Another REST Client) is an easy-to-use REST Client. Use it to develop, test and debug RESTful APIs.
chrome.google.com
테스트 시에는 POST 방식으로 전송.


요청을 했을때 200이 떠야 정상적으로 된것. 혹은 500이 뜬다면 에러가 뜨도록 삼항연산자로 처리를 해두었기때문.
그럼 데이터베이스에도 정상적으로 추가되었는지 확인.

특정 게시물 댓글 목록
@GetMapping(value = "/page/{bno}/{page}",
produces = {
MediaType.APPLICATION_XML_VALUE,
MediaType.APPLICATION_JSON_UTF8_VALUE })
public ResponseEntity<List<ReplyVO>> getList(
@PathVariable("page") int page,
@PathVariable("bno") Long bno){
log.info("getList............");
Criteria cri = new Criteria(page,10);
log.info(cri);
return new ResponseEntity<>(service.getList(cri, bno), HttpStatus.OK);
}
ReplyController의 getList()는 Criteria를 이용해서 파라미터를 수집하는데, '/{bno}/{page}의 'page' 값은 Criteria를 생성해서 직접 처리 해야함.
--------------------------------------------- --------------------------------------------- ---------------------------------------------
https://yayayahaha.tistory.com/51
Deprecated MediaType.APPLICATION_JSON_UTF8 해결
게시판 댓글 작업을 하는 도중 코드에서 뭔가 이상한게 발견됨. @GetMapping(value = "/page/{bno}/{page}", produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE }) public ResponseEntity getList( @PathVariab
yayayahaha.tistory.com
MediaType.APPLICATION_JSON_UTF8_VALUE 문제 해결.
--------------------------------------------- --------------------------------------------- ---------------------------------------------
게시물의 번호는 @PathVariable을 이용해서 파라미터로 처리. 그리고 브라우저에서 테스트를 실행.
http://localhost:8080/replies/pages/2461/1


조회가 되는것을 확인.
댓글 수정
댓글 수정은 JSON 형태로 전달되는 데이터와 파라미터로 전달되는 댓글 번호(rno)를 처리.
@RequestMapping(method = { RequestMethod.PUT,RequestMethod.PATCH },
value = "/{rno}",
consumes = "application/json",
produces = { MediaType.TEXT_PLAIN_VALUE })
public ResponseEntity<String> modify(
@RequestBody ReplyVO reply,
@PathVariable("rno") Long rno){
reply.setRno(rno);
log.info("rno : " + rno);
return service.modify(reply) == 1
? new ResponseEntity<>("success", HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
댓글 수정은 PUT 방식이나 PATCH 방식을 이용하도록 처리, 실제 수정되는 데이터는 JSON 포맷이므로 @ReQuestBody를 이용해서 처리. @RequestBody로 처리되는 데이터는 일반 파라미터나 @PathVariable 파라미터를 처리할 수 없기 때문에 직접 처리해 주는 부분은 주의 해야함.


댓글 삭제 / 조회
//댓글 조회
@GetMapping(value = "/{rno}",
produces = {
MediaType.APPLICATION_XML_VALUE,
MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<ReplyVO> get(@PathVariable("rno") Long rno){
log.info("get : " + rno);
return new ResponseEntity<>(service.get(rno), HttpStatus.OK);
}
// 댓글 삭제
@DeleteMapping(value = "/{rno}" , produces = {MediaType.TEXT_PLAIN_VALUE})
public ResponseEntity<String> remove(@PathVariable("rno") Long rno){
log.info("remove:" + rno);
return service.remove(rno) == 1
? new ResponseEntity<>("success", HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
댓글 조회부터 테스트


마지막으로 댓글 삭제.




12번 댓글이 삭제된걸 확인.
'spring > 프로젝트' 카테고리의 다른 글
23. 댓글 기능( 이벤트 , view 처리) (2) | 2024.02.11 |
---|---|
22. ajax 댓글 처리 (0) | 2024.02.09 |
20. 댓글 처리하기 (CRUD) (1) | 2024.02.05 |
19. 검색처리 (JSP수정) (0) | 2024.02.04 |
18. 검색 처리 (동적 쿼리) (0) | 2024.01.29 |