개요OneToOne 양방향 관계로 설정한 엔티티에서 의도치 않게 N+1 이슈가 발생하였다. 관련된 개념인 프록시 객체와 즉시 로딩 & 지연 로딩에 대해 정리하고, 이슈를 공유하려 한다. 프록시 객체실제 엔티티 객체 대신 사용되는 가짜 객체이다. 프록시 객체는 엔티티를 상속받고 위임 패턴으로 구현된다. //실제 엔티티//DB 조회 쿼리 발생Member member = em.find(Member.class, member.getId());//프록시 객체//DB 조회 쿼리 발생되지 않음Member proxyMember = em.getReference(Member.class, member2.getId());//이 때, DB 조회 쿼리 발생proxyMember.getName();//다시 한 번 조회할 때는 쿼리 ..
개요최근 영속성 컨텍스트 내에서 flush 시점에 대해 잘못 짚고 있던 부분이 있어서, 영속성 컨텍스트와 flush 시점에 대해서 정리해보고 트러블 슈팅을 공유하려 한다. 엔티티와 생명 주기JPA에서 엔티티는 DB 테이블과 매핑되는 자바 객체를 말한다.엔티티는 다음과 같은 생명 주기를 갖는다. 1. 비영속Member member = new Member();member.setId(100L);member.setName("HelloJPA");엔티티가 처음 만들어졌을 때 상태이다. 2. 영속EntityManager em = emf.createEntityManager();//비영속Member member = new Member();member.setId(100L);member.setName("HelloJPA"..
개요프로젝트가 한창이다. 프로젝트하며, 테스트 환경에서 JPA와 관련하여 발생한 이슈에 대해 글로 작성하면 좋을 것 같아 정리하였다. 이슈 1. 더티 체킹 (Dirty Checking)바로 코드로 간다.다음은 예제 코드로 시나리오는 다음과 같다.user 정보를 더티 체킹을 통해 업데이트 한다업데이트가 잘 되었는지 검증한다.@SpringBootTest@AutoConfigureMockMvcpublic class ExampleTest extends TestContainerSupport { @Autowired private UserRepository userRepository; @Autowired private TokenProvider tokenProvider; @Autowired ..