2023.07.20.목.TIL

heeh·2023년 7월 24일

TIL

목록 보기
47/82
post-thumbnail

2023.07.20.목

좋아요 기능

  • 게시물 및 댓글 좋아요/좋아요 취소 기능
  • 사용자가 게시물이나 댓글에 좋아요를 남기거나 취소할 수 있어야 합니다.
  • 이 때, 본인이 작성한 게시물과 댓글에 좋아요는 남길 수 없도록 해봅니다!
  • Review의 Controller, Service 로직 추가
  • repository Class, ReviewLike < entity Class
  • 좋아요 “생성”에 왜 트랜잭셔널이 걸려야 할까?
    @Transactional
        public void likeReview(Long id, User user) {
            Review review = findReview(id);
    
            if (reviewLikeRepository.existsByUserAndReview(user, review)) {
                throw new DuplicateRequestException("이미 좋아요 한 댓글 입니다.");
            } else {
                ReviewLike reviewLike = new ReviewLike(user, review);
                reviewLikeRepository.save(reviewLike);
            }
        }
    • 트랜잭션 범위 설정
      • 메소드 안에서 수행되는 모든 데이터베이스 관련 작업은 하나의 트랜잭션으로 묶임
      • 메소드 내에서 실행되는 데이터베이스 작업은 모두 성공하거나 실패할 때 롤백되는 것이 보장
    • 데이터 무결성 보장
      • 좋아요를 누른 데이터를 데이터베이스에 저장하고, 해당 게시글의 좋아요 개수를 증가시키는 두 가지 작업이 함께 수행
      • 두 개의 작업이 하나의 트랜잭션 범위 안에서 실행되면 데이터의 일관성과 무결성을 보장
      • ex 좋아요 데이터를 저장하는데 성공했지만 좋아요 개수 증가 작업에서 실패하는 경우에는 데이터베이스가 일관성을 유지 불가
      • @Transactional 어노테이션을 사용하면 이런 상황을 방지
    • 예외 처리와 롤백
      • 메소드에서 발생하는 예외가 있는 경우 @Transactional 어노테이션을 통해 롤백 처리
      • ex ”이미 좋아요 한 댓글 입니다."라는 예외가 발생하면 해당 트랜잭션은 롤백되어 이전 상태로 돌아
    • 결론
      • @Transactional 어노테이션은 해당 메소드를 하나의 트랜잭션 범위로 설정하여 데이터베이스 작업을 원자적으로 처리하고, 데이터의 무결성과 일관성을 보장하기 위해 사용
  • 영속성 컨텍스트는 JPA에서 엔티티(Entity)들을 관리하는 논리적인 영역
    • likeReview 메소드에서 사용하는 엔티티들은 영속성 컨텍스트 상태가 됨
  • ikeReview 메소드에서 findReview(id)를 통해 조회한 Review 엔티티와 ReviewLike 엔티티는 메소드 내에서 데이터베이스와 상호작용하게 됨
  • @Transactional 어노테이션이 걸려있기 때문에 이들 엔티티들은 영속성 컨텍스트에 관리되면서 데이터베이스 트랜잭션과 관련된 작업이 이루어짐
  • Review와 ReviewLik의 entity가 영속성 컨텍스트으로 부터 받는 영향
    • Review와 ReviewLike 엔티티들은 영속성 컨텍스트에 의해 추적되며, 만약 수정 사항이 발생하면 트랜잭션이 커밋되는 시점에 데이터베이스에 반영
    • 트랜잭션 롤백이 발생하면 이전 상태로 복구되도록 해주기 때문에 데이터의 일관성을 보장
  • 다시!
    • ReviewResponseDto 확인해주기
    • Review에서 ReviewLike 연관관계 맺어주기
  • 포스트맨… **"menuTitle" : "김치찌개" ,
    "menuCategory" : "한식",
    "content" : "맛있어요" ,
    "menuImage" : "https://gregor77.github.io/2021/05/18/spring-security-03/"
    } {
    "content" : "맛있다.",
    "imageUrl" : "https://gregor77.github.io/2021/05/18/spring-security-03/",
    } {
    "shopName" : "전통",
    "shopContent" : "good",
    "userName" : "a"
    }**
profile
공부하자개발하자으쌰으쌰

0개의 댓글