목록스프링 (3)
우주에서 글을 적어본다
프로젝트에서 수정과 삭제 구현 중 쿼리를 옳바르게 작성했는데 오류가 떴었다. 찾아보니 수정과 삭제를 할 때는 @Transactional과 @Modifying를 붙여야 한다. @Transactional @Modifying @Query("delete from Likes l where l.poll.id=:pollId and l.member.id=:memberId") void deleteLike(@Param("pollId") Long pollId, @Param("memberId") Long memberId); 근데 굳이 저렇게 쿼리를 작성하지 않아도 된다는 것을 중간에 깨달았다. 이런 식으로 작성해도 되는 것이었다. JPA는 생각보다도 훨씬 편리한 기능을 "많이" 제공하고 있음을 깨달았다. @Transactio..
현재 진행 중인 프로젝트 구현을 완료하였다. 이번에 처음으로 JPA를 이용하여 개발을 진행해서 궁금했던 것들을 기록&복습용으로 블로그에 정리해 나가도록 하겠다. 테이블을 조인할 때 fetch를 사용하는데 우선 fetch의 의미는 "가지고 오다(to go to another place to get something or someone)"라는 의미다. 즉 테이블을 조회할 때 사용한다. JPA에서는 테이블을 언제 조회할 것인가에 대한 시점을 2가지를 지원한다. 그 내용을 간략히 아래에 적어 보았다. 즉시 로딩 엔티티를 조회할 때 연관된 엔티티도 함께 조회함 예) @ManyToOne(fetch = FetchType.EAGER) → 즉시 로딩 최적화를 위해 가능하면 조인 쿼리를 사용 지연 로딩 연관된 엔티티를 실..
프로젝트를 진행 중에 Poll 엔티티와 Choice 엔티티의 저장에서 오류가 발생했다. 문제 상황) 1. Poll은 Choice를 OneToMany로 연결 2. Choice는 Poll을 ManyToOne으로 연결 문제는 바로 순환 참조였다. 순환 참조는 아래를 의미한다. JPA에서 양방향으로 연결된 엔티티를 JSON 형태로 직렬화하는 과정에서, 서로의 정보를 계속 순환하며 참조하여 StackOverflowError 를 발생시키는 현상 검색해 보니 다양한 해결방법이 있지만 간단하게 애노테이션을 사용하여 해결하였다. 바로 @JsonManagedReference 과 @JsonBackReference 를 사용하면 된다. 연관관계의 주인 엔티티의 반대에 Managed를 사용해서 직렬화를 수행하고 연관관계의 주인 ..