๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป๐Ÿ“/ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

[Trouble Shooting] ๋Œ“๊ธ€, ๊ฒŒ์‹œ๊ธ€ ๊ด€๊ณ„ ๊ฒ€์ฆ ๋ฌธ์ œ ํ•ด๊ฒฐ

_silver 2024. 11. 24. 00:35

๋‚˜์˜ ์ฒซ ๋ฒˆ์งธ [BugFixHub] ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.
BugFixHub๋Š” "Stack Overflow"๋ฅผ ๋ชจํ‹ฐ๋ธŒ ํ•˜์—ฌ ๊ฐœ๋ฐœ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ €์žฅ์†Œ์ด๋‹ค.
 
โ–ถ [GitHub ๋งํฌ]

[BugFixHub] ERD DIAGRAM

์šฐ๋ฆฌ๋Š” ๊ฐ ํŒŒํŠธ๋“ค์„ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ ํ–ˆ๊ณ , ๊ทธ์ค‘ ๋‚˜๋Š” Friend, Comment Like ํŒŒํŠธ๋ฅผ ๋งก๊ฒŒ ๋˜์—ˆ๋‹ค.
๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ Comment Like ๋ถ€๋ถ„์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ๋˜์–ด ๊ด€๋ จ ๋‚ด์šฉ์„ Trouble Shooting์„ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.


 
โ–ถ Postman API ํ˜ธ์ถœ ๋ฆฌ์ŠคํŠธ

์š”์ฒญ URL ๊ตฌ๋ถ„ ์š”์ฒญ์‚ฌํ•ญ API ํ˜ธ์ถœ ๊ฒฐ๊ณผ ์ƒํƒœ ์ฝ”๋“œ
/posts/postId/comments/commentId/like ๋Œ“๊ธ€
์ข‹์•„์š”
์ข‹์•„์š” ์™„๋ฃŒ ๋Œ“๊ธ€ ์ข‹์•„์š”ID, UserId, CommentId ๋ฐ˜ํ™˜ 201, CREATED
์ด๋ฏธ ์ „์†ก๋œ ์š”์ฒญ ์ด๋ฏธ ์ข‹์•„์š”๋ฅผ ๋‚จ๊ธด ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค. 400, BAD REQUEST
๋Œ“๊ธ€์ด ์กด์žฌํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋Œ“๊ธ€์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 404, NOT FOUND
๋Œ“๊ธ€๊ณผ ๊ฒŒ์‹œ๊ธ€์˜ ๊ด€๊ณ„ ์˜ค๋ฅ˜ ๋Œ“๊ธ€ID์™€ ๊ฒŒ์‹œ๊ธ€ID์˜ ๊ด€๊ณ„๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 400, BAD REQUEST
๋Œ“๊ธ€
์ข‹์•„์š” ์ทจ์†Œ
์ข‹์•„์š” ์ทจ์†Œ  -
204 NO CONTENT
์ข‹์•„์š”๋ฅผ ์•ˆํ•œ ๊ฒฝ์šฐ ์ข‹์•„์š”๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š์€ ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค. 400, BAD REQUEST

 

1. ๋ฐฐ๊ฒฝ

 1) ๋ฌธ์ œ ์ƒํ™ฉ:

  โ‘  Comment Like(๋Œ“๊ธ€ ์ข‹์•„์š”) ์ฝ”๋“œ ๊ตฌํ˜„ ํ›„ Postman์œผ๋กœ API ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋˜ ์ค‘,
๊ฒŒ์‹œ๊ธ€์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ๋Œ“๊ธ€์— ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅผ ๋•Œ "์ด๋ฏธ ์ข‹์•„์š”๋ฅผ ๋‚จ๊ธด ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ์ž˜๋ชป๋œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ˜ํ™˜๋จ.
  โ‘ก ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋Œ“๊ธ€๊ณผ ๊ฒŒ์‹œ๊ธ€์˜ ๊ด€๊ณ„๋ฅผ ๊ฒ€์ฆํ•˜๋Š” "validateCommentAndPostRelation" ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์œผ๋‚˜,
์ถ”๊ฐ€์ ์ธ ๋ฌธ์ œ ๋ฐœ์ƒ.
       -> ๋Œ“๊ธ€์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ "๊ฒŒ์‹œ๊ธ€ ID์™€ ๋Œ“๊ธ€ ID์˜ ๊ด€๊ณ„๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. " ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์šฐ์„ ์ ์œผ๋กœ ํ‘œ์‹œ๋จ.
 
โ–ถ ์ˆ˜์ • ์ „ ๋กœ์ง

// ๊ฒŒ์‹œ๊ธ€๊ณผ ๋Œ“๊ธ€ ๊ด€๊ณ„ ๊ฒ€์ฆ ๋กœ์ง ์ถ”๊ฐ€

private void validateCommentAndPostRelation(Long commentId, Long postId) {
    if (!commentRepository.existsByIdAndPostId(commentId, postId)) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "๊ฒŒ์‹œ๊ธ€ ID์™€ ๋Œ“๊ธ€ ID์˜ ๊ด€๊ณ„๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
    }
}
// ๋Œ“๊ธ€ ์ข‹์•„์š”
@Override
@Transactional
public CommentLikeResDto likeComment(Long commentId, Long postId, Long userId) {
    // ๊ฒŒ์‹œ๊ธ€๊ณผ ๋Œ“๊ธ€ ๊ด€๊ณ„ ๊ฒ€์ฆ
    validateCommentAndPostRelation(commentId, postId);


    Comment comment = commentRepository.findByIdAndDeletedFalse(commentId)
            .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "๋Œ“๊ธ€์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));

    
    if (comment.getUser().getId().equals(userId)) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "๋ณธ์ธ ๋Œ“๊ธ€์—๋Š” ์ข‹์•„์š”๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค");
    }


    if (commentLikeRepository.existsByCommentIdAndUserId(commentId, userId)) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "์ด๋ฏธ ์ข‹์•„์š”๋ฅผ ๋‚จ๊ธด ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค.");
    }


    User user = userRepository.findById(userId)
            .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));



    CommentLike commentLike = new CommentLike(user, comment);
    commentLikeRepository.save(commentLike);

    return new CommentLikeResDto(commentLike);

}

 

2) ์›์ธ ๋ถ„์„

์œ„ ๋Œ“๊ธ€ ์ข‹์•„์š” ๋กœ์ง์—์„œ ๋Œ“๊ธ€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ๋„ ์ „์— ๊ฒŒ์‹œ๊ธ€๊ณผ ๋Œ“๊ธ€ ๊ด€๊ณ„๋ฅผ ๊ฒ€์ฆํ•˜๋Š” "validateCommentAndPostRelation" ๋ฉ”์„œ๋“œ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๋ฉด์„œ, ๋Œ“๊ธ€์ด ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ๋ฉ”์„œ๋“œ์˜ ํ๋ฆ„์„ ์ข…๋ฃŒํ•˜๊ณ  ์˜ˆ์™ธ๋ฅผ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฐ˜ํ™˜๋จ.

๋”๋ณด๊ธฐ

โ€ป throw new ๋ฐฉ์‹์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

- ํ˜ธ์ถœ๋˜๋Š” ์ฆ‰์‹œ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ฉ”์„œ๋“œ์˜ ํ๋ฆ„์„ ์ข…๋ฃŒํ•˜๊ณ  ์˜ˆ์™ธ๋ฅผ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค.

- ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰ ์ˆœ์„œ๋ณด๋‹ค ์•ž์— ์žˆ๋‹ค๋ฉด, ์ดํ›„์˜ ์ค‘์š”ํ•œ ๊ฒ€์ฆ ๋กœ์ง์€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

 
- Postman ํ˜ธ์ถœ ์˜ˆ์‹œ:
/posts/11/comments/commentId/like

 


2. ์ ˆ์ •

์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฒŒ์‹œ๊ธ€์— ๋Œ“๊ธ€ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ ํ›„, ๊ฒŒ์‹œ๊ธ€๊ณผ ๋Œ“๊ธ€๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ–ˆ๋‹ค.
 


3. ๊ฒฐ๊ณผ

- ๋Œ“๊ธ€ ์กด์žฌ๋ฅผ ๋จผ์ € ํ™•์ธํ•˜์—ฌ, ๋Œ“๊ธ€๊ณผ ๊ฒŒ์‹œ๊ธ€ ๊ด€๊ณ„๊ฒ€์ฆ์€ ๋Œ“๊ธ€์ด ์œ ํšจํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์ˆœ์„œ ๋ณ€๊ฒฝ

 
โ–ถ ์ˆ˜์ • ํ›„ ๋กœ์ง

// ๊ฒŒ์‹œ๊ธ€๊ณผ ๋Œ“๊ธ€ ๊ด€๊ณ„ ๊ฒ€์ฆ(์ถ”๊ฐ€)
private void validateCommentAndPostRelation(Long commentId, Long postId) {
    if (!commentRepository.existsByIdAndPostId(commentId, postId)) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "๊ฒŒ์‹œ๊ธ€ ID์™€ ๋Œ“๊ธ€ ID์˜ ๊ด€๊ณ„๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
    }
}


// ๋Œ“๊ธ€ ์ข‹์•„์š”
@Override
@Transactional
public CommentLikeResDto likeComment(Long commentId, Long postId, Long userId) {


    1. ๋Œ“๊ธ€ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
    Comment comment = commentRepository.findByIdAndDeletedFalse(commentId)
            .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "๋Œ“๊ธ€์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."));

    2. ๊ฒŒ์‹œ๊ธ€๊ณผ ๋Œ“๊ธ€ ๊ด€๊ณ„ ๊ฒ€์ฆ
    validateCommentAndPostRelation(commentId, postId);

    if (comment.getUser().getId().equals(userId)) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "๋ณธ์ธ ๋Œ“๊ธ€์—๋Š” ์ข‹์•„์š”๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค");
    }


    if (commentLikeRepository.existsByCommentIdAndUserId(commentId, userId)) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "์ด๋ฏธ ์ข‹์•„์š”๋ฅผ ๋‚จ๊ธด ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค.");
    }
    .
    .
    .
    .
    .

 
์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ ์ˆ˜์ • ํ›„ IntelliJ ์žฌ ์‹คํ–‰ํ–ˆ๊ณ  Postman์„ ํ˜ธ์ถœํ–ˆ๋‹ค.
๊ฒ€์ฆ ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ•œ ํ›„ ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.
 
1. ๋Œ“๊ธ€์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

 
2. ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ๊ฒŒ์‹œ๊ธ€์— ๋Œ“๊ธ€ ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅด๋Š” ๊ฒฝ์šฐ