🤔 문제 상황JPA를 사용하며 객체를 설계할 때, 직접 참조와 간접 참조 각각 어느때에 사용하면 적절할지에 대한 고민이 생겼다.더불어 회사에서 코드 리뷰를 하다가 간접 참조로 설계를 한 팀원의 코드에 왜 여기서 간접 참조를 했나요? or 왜 여기는 직접 참조를 했나요? 등의 리뷰를 보고 나도 아무 생각없이 객체간 설계를 하고 있던 것은 아닌가 하는 생각이 들었다.🕊️ 나의 생각우선 각 용어의 뜻을 보자면직접 참조 : 말 그대로 Entity간의 참조를 직접적으로 하는 것이다. 구체적인 방법으로는 JPA 사용시 @OneToOne / @ManyToOne등의 어노테이션을 써서 매핑(참조)를 하는 것을 말한다.간접 참조 : 직접 참조의 반대의 의미로, 외래키(FK)를 맺지 않고 다른 Entity의 (더 나아가..
🤔 문제 상황JPA에서 엔티티 간 연관 관계를 Lazy Loading으로 설정했을 때, 이 엔티티를 사용하는 메서드에 @Transactional 어노테이션이 없다면 LazyInitializationException이 발생할 수 있다.예시 코드로 보자면@Entitypublic class User { @Id private Long id; @OneToMany(fetch = FetchType.LAZY) private List orders;}public class UserService { public void processUserOrders(Long userId) { User user = userRepository.findById(userId).orElseThrow(); ..
서론 N+1 문제란 Spring Data JPA를 사용하다보면 N+1 문제에 대해서 많이들 겪곤 한다. N+1 문제란 관계형 데이터베이스에서 일반적으로 발생하는 성능 이슈다. 예를 들어, 게시물(Post)과 사용자(User) 그리고 댓글(Comment)이라는 엔티티가 있다고 가정해 보자. 게시물 목록을 가져올 때, 각 게시물에 대한 사용자 정보와 댓글 정보를 함께 가져와야 하는 경우 N+1 문제가 발생할 수 있다. Fetch Join 이러한 문제를 해결하기 위해 Fetch Join을 사용하여 연관된 엔티티를 한 번의 쿼리로 함께 로드할 수 있다. 즉 Fetch Join은 관계형 데이터베이스에서 조인을 통해 필요한 데이터를 한 번에 가져오는 방식이다. Fetch Join 사용 X - 연관된 테이블에 등록..
본 게시물은 인프런 김영한님의 JPA강의를 보고 정리한 글입니다 영속성 컨텍스트 JPA를 이해하는데 가장 중요한 용어 엔티티를 영구 저장하는 환경이라는 뜻 EntityManager.persist(entity); 영속성 컨텍스트의 생명주기 비영속 (new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 영속 (managed) 영속성 컨텍스트에 관리되는 상태 준영속 (detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 삭제 (removed) 삭제된 상태 영속성 컨텍스트의 이점 1차 캐시 동일성(identity) 보장 영속성 컨텍스트 안에 있는 1차 캐시 부터 조회하여 찾는다 트랜잭션을 지원하는 쓰기 지연(transactional write-behind) 영속성 컨텍스트 안의 쓰기..