영속성 컨텍스트 알아보기

영속성 컨텍스트란 영속성 컨텍스트(Persistence Context) 는 JPA(Java Persistence API)에서 엔티티를 관리하는 환경을 말한다. 영속성 컨텍스트는 엔티티를 관리하고, 엔티티와 데이터베이스 간의 상태 변화를 추적한다. 영속성 컨텍스트는 엔티티 매니저(Entity Manager)에 의해 관리된다. 영속성 컨텍스트의 주요 기능 엔티티 관리: EntityManager가 엔티티를 관리한다. 영속성 컨텍스트가 엔티티의 초기 상태를 저장한다. 트랜잭션 연계: 영속성 컨텍스트는 트랜잭션과 생명 주기를 같이 한다. 트랜잭션이 커밋되면, 영속성 컨텍스트가 관리하는 엔티티의 변경 사항이 데이터베이스에 반영된다. 변경 감지(Dirty Checking): 영속성 컨텍스트는 엔티티의 변경 사항을 추적한다. 트랜잭션이 커밋되기 전에, JPA는 엔티티의 현제 상태와 초기 상태를 비교한다. 변경 사항이 감지되면, JPA는 자동으로 데이터베이스 업데이트 쿼리를 생성하고 실행한다. 영속성 컨텍스트의 동작 방식 엔티티 관리: ...

6월 8, 2024 · 1 분 · 197 단어 · In-Jun Hwang

Dirty Checking 알아보기

Dirty Checking이란 Dirty Checking은 JPA(Java Persistence API)에서 엔티티의 변경 사항을 자동으로 감지하고, 이를 데이터베이스에 반영하는 방식이다. Dirty Checking을 통해 개발자는 명시적으로 데이터베이스 업데이트 쿼리를 작성할 필요 없이, 객체의 상태만 변경하면 된다. 또한 Dirty Checking은 영속성 컨텍스트(Persistence Context)가 관리하는 엔티티만 적용된다. Dirty Checking 동작 방식 엔티티 관리: EntityManager가 엔티티를 관리한다. 영속성 컨텍스트(Persistence Context)가 엔티티의 초기 상태를 저장한다. 변경 감지: 트랜잭션이 커밋되기 전에, JPA는 엔티티의 현제 상태와 초기 상태를 비교한다. 변경 사항 적용: 변경 사항이 감지되면, JPA는 자동으로 데이터베이스 업데이트 쿼리를 생성하고 실행한다. 트랜잭션이 커밋되면, 변경 사항이 데이터베이스에 반영된다. 예시 1 2 3 4 5 6 7 8 9 10 11 12 13 // 엔티티 저장 Member member = new Member("Alice"); memberRepository.save(member); // 엔티티 조회 Member findMember = memberRepository.findById(member.getId()).get(); // 엔티티 변경 findMember.setName("Bob"); // 변경 사항 감지 // Dirty Checking이 동작하여 자동으로 데이터베이스 업데이트 쿼리를 생성하고 실행한다. // UPDATE member SET name = 'Bob' WHERE id = 1; 장점 편의성: 개발자가 데이터베이스 업데이트 쿼리를 작성할 필요 없이, 객체의 상태만 변경하면 된다. 일관성: 변경 사항이 자동으로 데이터베이스에 반영되므로, 데이터 일관성을 유지할 수 있다. 생산성: 개발자가 비즈니스 로직에 집중할 수 있으므로, 생산성이 향상된다.

6월 8, 2024 · 1 분 · 179 단어 · In-Jun Hwang

N+1 문제 알아보기

N+1 문제란 N+1 문제는 ORM(Object-Relational Mapping)에서 자주 발생하는 성능 문제 중 하나로, 연관된 엔티티를 조회할 때, 연관된 엔티티의 수(N)만큼 추가로 쿼리가 실행되는 문제이다. 그 결과, 쿼리의 수가 N+1개가 된다. 쿼리의 수가 많아지면 데이터베이스와의 통신이 늘어나고, 성능이 저하될 수 있다. 그렇기 때문에 N+1 문제는 성능 최적화를 위해 주의해야 하는 문제이다. 동작 원리 첫 번째 쿼리로 엔티티를 조회한다. 1 List<Member> members = memberRepository.findAll(); 조회된 엔티티를 사용할 때마다 추가로 쿼리가 실행된다. 1 2 3 for (Member member : members) { System.out.println(member.getTeam().getName()); } 연관된 엔티티의 수만큼 추가로 쿼리가 실행된다. 1 2 3 4 SELECT * FROM Team WHERE team_id = 1; SELECT * FROM Team WHERE team_id = 2; SELECT * FROM Team WHERE team_id = 3; ... 해결 방법 Eager Loading으로 N+1 문제를 해결하려고 하면 성능이 저하될 수 있다. 따라서 Fetch Join, Batch Fetch, EntityGraph 등을 사용하여 해결하는 것이 좋다. ...

6월 8, 2024 · 2 분 · 247 단어 · In-Jun Hwang

Lazy Loading VS Eager Loading

Lazy Loading Lazy Loading이란 Lazy Loading은 지연 로딩이라고도 하며, 연관된 엔티티를 실제로 사용할 때 로딩하는 방식이다. 특징 연관된 데이터를 바로 가져오지 않고, 실제로 사용할 때 가져온다. 성능 최적화와 메로리 사용량을 줄이기 위해 사용된다. 연관된 엔티티가 많은 경우 초기 로딩 시간이 단축된다. 예시 1 2 @OneToMany(fetch = FetchType.LAZY) private List<Order> orders; 장점 초기 로딩 시간이 단축된다. 연관된 엔티티가 많은 경우 메모리 사용량을 줄일 수 있다. 단점 연관된 엔티티를 사용할 때마다 쿼리가 실행되어 성능 저하가 발생할 수 있다. Eager Loading Eager Loading이란 Eager Loading은 즉시 로딩이라고도 하며, 엔티티를 조회할 때 연관된 엔티티를 함께 로딩하는 방식이다. ...

6월 8, 2024 · 1 분 · 188 단어 · In-Jun Hwang

엔티티 생명주기 알아보기

엔티티 생명주기 JPA(Java Persistence API)에서 엔티티의 생명주기는 엔티티가 생성되고 소멸할 때까지의 과정을 의미한다. 엔티티 생명주기의 4가지 상태 비영속(new/transient): 새로운 엔티티가 생성되었지만, 아직 EntityManager에 의해 관리되지 않은 상태이다. 데이터베이스에 저장되지 않은 상태이며, 영속성 컨텍스트에 관리되지 않는다. new 키워드로 생성된 엔티티는 비영속 상태이다. 영속(managed): EntityManager에 의해 관리되는 상태로, 영속성 컨텍스트에 저장된 상태이다. 엔티티는 데이터베이스와 동기화되어 있으며, 영속성 컨텍스트에 의해 관리된다. persist() 메서드를 사용하여 엔티티를 영속 상태로 만들 수 있다. 준영속(detached): 영속성 컨텍스트에 의해 관리되지 않는 상태이다. 영속 상태에서 분리된 상태로, 영속성 컨텍스트에 의해 관리되지 않는다. detach() 메서드를 사용하여 엔티티를 준영속 상태로 만들 수 있다. 삭제(removed): ...

6월 8, 2024 · 1 분 · 137 단어 · In-Jun Hwang