[Spring] 댓글 조회, 삭제 기능 구현하기(+트랜잭션)

2024. 9. 6. 02:25·Back-End/Back-End

[작성일: 2023. 05. 14]

 

2024.08.24 - [WEB/Back-End] - [Spring] 댓글창 목록 구현하기

 

[Spring] 댓글창 목록 구현하기

[작성일: 2023. 05. 13] Reply 목록 구현기존 게시물 페이징 처리 + 특정 게시물 번호MyBatis는 두 개 이상의 데이터를 파라미터로 전달하기 위해서 별도 객체를 구성하거나, Map을 이용하거나, @Param을

eenzhd.tistory.com

 

 

댓글 조회 기능 구현하기

getList, get, modify

  • @RequestBody : POST 등 데이터 부분으로 전달되는 내용
  • @PathVariable : Path에 들어오는 값을 변수로 사용할 경우
  • curl 중 PUT/PATCH
  • 외부에서 데이터가 전달될 때 일부분만 전달될 경우를 위해 {"/{rno}, "/{rno}/{replier}"} 와 같이 구분함.
  • 원래 JSON 데이터 중 REPLIER가 전달되지 않았을 경우 검증단계 (Validate, Validated, Valid)를 거쳐야 함.
  • null인지 아닌지 검사하기 위해 객체 안의 필드를 매개변수로 따로 설정하여 null도 가능하도록 설정함. (required=false)
  • modify에 replier가 있거나 없거나 둘 다 처리하기 위한 로직 추가
@RestController   
// ViewResolver를 사용하지 않고 리턴 값을 그대로 데이터로 사용
// 내부 메서드는 REST 방식으로만 사용 가능함.
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/replies/*")
public class ReplyController {
	private final ReplyService replyService;
	
	... 생략
	
	// 게시글 댓글 전체 조회
	@GetMapping("pages/{bno}/{page}")
	public List<ReplyVO> getList(@PathVariable("bno") Long bno, @PathVariable("page") int page) {
		log.info("getList------------------------------>");
		Criteria cri = new Criteria(page,10);
		log.info(cri.toString());
		return replyService.getList(cri, bno);
	}
	
	// 게시글 댓글 조회
	@GetMapping("{rno}")
	public ReplyVO get(@PathVariable("rno") Long rno) {
		log.info("get ------------------------------->" + rno);
		
		return replyService.get(rno);
	}
	
	// 댓글 수정
	// PUT : 자원의 전체 수정, 자원의 모든 필드를 전송해야 함, 일부만 전송하면 오류
	// PATCH : 자원의 일부 수정, 수정할 필드만 전송
	// PATCH가 PUT을 포함하므로 전체를 전달받아 수정하거나 부분만 수정하거나 모두 PATCH가 유리함.
	@RequestMapping(method= {RequestMethod.PATCH}, value= {"/{rno}", "/{rno}/{replier}"}, consumes="application/json", produces="text/plain; charset=utf-8")
	public ResponseEntity<String> modify(
				@RequestBody ReplyVO replyVO, 
				@PathVariable(value = "replier", required = false) String replier, 
				@PathVariable("rno") Long rno)
	throws UnsupportedEncodingException {
		replyVO.setRno(rno);
		
		int replyCount = 0;
		log.info("modify -----------------------------------> " + rno);
		log.info("modify : " + replyVO);
		if(replyVO.getReplier() == null) {
			replyVO.setReplier(Optional.ofNullable(replier).orElse("anonymous"));
		}
		
		replyCount = replyService.modify(replyVO);
		
		if(replyCount == 1) {
			return new ResponseEntity<>(new String("댓글 수정 성공".getBytes(), "UTF-8"), HttpStatus.OK);
		} else {
			return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}

 

 

 

modify SQL에 replier부분 수정

  • REPLIER = #{replier} 추가
<update id="update">
    UPDATE TBL_REPLY
    SET REPLY = #{reply}, REPLIER =#{replier}, UPDATEDATE = SYSDATE()
    WHERE RNO = #{rno}
</update>

 

 

Test(Talend API Tester)

  • Method : PATCH
  • Scheme : http://localhost:포트번호/replies/4
  • Header : Content-Type - application/json
  • Body : {"reply" : "Modified Reply"}

변경된 댓글 내용

 

 

 

댓글 삭제 기능 구현하기

delete 로직 구현

// 댓글 삭제
@DeleteMapping(value="{rno}", produces="text/plain; charset=utf-8")
public String remove(@PathVariable("rno") Long rno) {
    log.info("remove -----------------------------------> " + rno);

    return replyService.remove(rno) == 1 ? "댓글 삭제 성공" : "댓글 삭제 실패";
}

 

 

Test(Talend API Tester)

  • Method : DELETE
  • Scheme : http://localhost:포트번호/replies/3

기존에 있던 3번 댓글 삭제 성공

 

 

 

 

 

 

Javascript에 기능 추가(reply.js)

reply.js

  1. template/static/js에 reply.js 생성
  2. get.html에 <script src="/js/reply.js></script>문 추가
  3. reply.js에 console log 한 줄 추가
  4. http://localhost:포트넘버/board/list에서 글 클릭하면 console log에 로그가 출력되는지 확인할 수 있음.
  5. update, delete, getList, get  등 메서드 구현
  6. 각 기능을 get.html에서 document readey 시에 구동되도록 하는 방식을 테스트

 

 

 

 

HTML에서 각 댓글 가져오기

  1. get.html에서 showList() 함수 구현하기

 

 

 

댓글 등록하기

  1. get.html의 reply display(UL) 윗 부분에 UI 추가
  2. remove 구현
  3. modify 구현(수정, 수정완료 버튼 링크 컨트롤)
    • 각 댓글의 링크를 보여줄 때 각 댓글마다 고유한 class 또는 id 부여한 내용으로 같은지를 비교하여 설정

 

 

 

 

 

트랜잭션

  • 하나의 트랜잭션만 사용한다면 DB에는 별 문제가 없음.
  • 여러 개의 트랜잭션 순차 수행 후 문제가 생기면 성공한 트랜잭션은 반영되고 나머지는 실패이므로 다시 복구해야 하는 문제가 발생함.
    • ex) A와 B 트랜잭션을 실행한 후, B에서 오류가 발생하면 A를 복구해야 함.
    • 이러한 문제를 막기 위해 Spring에서 @Transactional이라는 애노테이션을 사용함.
    • 한 개의 트랜잭션 문제 발생 시 콜백을 통해 전체 트랜잭션이 모두 DB에 반영되지 못하게 막음.

 

 

 

 

 

 

 

 

 

 


🐣 해당 게시글은 입문 개발자가 요약/정리한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.

 

저작자표시 비영리 변경금지
'Back-End/Back-End' 카테고리의 다른 글
  • [Spring] File Upload
  • [Spring] 댓글창 목록 구현하기
  • [Spring] 댓글창 기능 구현하기
  • [Spring] 검색처리
뚜비
뚜비
1년차 백엔드&iOS 개발자의 감자 탈출 블로그 🥔🥔
  • 뚜비
    뚜비의 개발로그
    뚜비
  • 전체
    오늘
    어제
  • 글쓰기     관리
    • Devlog
      • Back-End
        • Java
        • Spring
        • JPA
        • HTTP
        • Security
        • Back-End
        • Front-End
      • 알고리즘
      • iOS
        • Swift
      • Database
      • Tips
        • Git & GitHub
        • A to Z
      • 프로젝트
      • 생각정리
  • 태그

    DB
    JPA
    최주호
    백준
    spring
    스프링
    성능최적화
    게시판만들기
    김영한
    Database
    프로그래머스
    Spring Security
    Java
    생성자
    다형성
    javascript
    Security
    sql
    MVC
    jsp
    자바스크립트
    html
    객체
    알고리즘
    자바
    Swift
    데이터베이스
    의존성주입
    HTTP
    변수
  • hELLO· Designed By정상우.v4.10.0
뚜비
[Spring] 댓글 조회, 삭제 기능 구현하기(+트랜잭션)
상단으로

티스토리툴바