250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- cluster index
- 오블완
- 혼공자바
- dotnet
- types
- Functional Interfaces
- Access Modifier
- 나도코딩
- 혼공컴운
- 접근 제어자
- 네트워크
- 티스토리챌린지
- java
- noncluster index
- literal
- 스프링 부트 3
- Wildcard
- Lazy loading
- 인터페이스
- Interface
- 혼공
- 접근제어자
- HashMap
- Proxy Object
- 혼공학습단
- entrySet
- Spring Data JPA
- 자율학습
- 0 시작
- 인프런
Archives
- Today
- Total
지금을 사는 사람
[Spring] Spring Data JPA의 동작 방식과 프록시 객체 본문
728x90
Spring Data JPA는 자바 표준인 JPA(Java Persistence API)를 기반으로 한 데이터 액세스 계층을 제공하는 스프링 프레임워크의 일부입니다. Spring Data JPA는 JPA를 더 쉽게 사용할 수 있도록 도와주는 도구 및 기능을 제공합니다.
Spring Data JPA의 동작 방식:
- Entity 클래스 정의: 데이터베이스의 테이블과 매핑될 엔터티 클래스를 정의합니다. 이 클래스는 JPA 애노테이션을 사용하여 엔터티와 관계를 매핑합니다.
import javax.persistence.Entity; import javax.persistence.Id; @Entity public class MyEntity { @Id private Long id; // 다른 필드들... }
- Repository 인터페이스 생성:
CrudRepository
나JpaRepository
등의 Spring Data JPA에서 제공하는 인터페이스를 상속하여 리포지토리 인터페이스를 생성합니다. import org.springframework.data.repository.CrudRepository; public interface MyEntityRepository extends CrudRepository<MyEntity, Long> { // 여기에 사용자 정의 메서드 추가 가능 }
- 프록시 객체 생성: Spring Data JPA는
MyEntityRepository
인터페이스에 대한 구현을 자동으로 생성하고, 이를 프록시 객체로 감싸서 스프링 애플리케이션 컨텍스트에 빈으로 등록합니다. - 메서드 호출 처리: 개발자가
MyEntityRepository
를 주입받아 사용할 때, 실제로는 해당 리포지토리의 프록시 객체를 주입받게 됩니다. 메서드를 호출할 때 프록시 객체는 호출된 메서드에 대한 구현체를 찾아 실행합니다.
프록시 객체(Proxy Object):
프록시 객체는 다른 객체를 대신해서 특정 동작을 수행하는 객체입니다. Spring Data JPA에서는 인터페이스에 대한 구현을 런타임에 동적으로 생성하여 이를 프록시 객체로 사용합니다.
프록시 객체의 주요 역할은 다음과 같습니다:
- 실제 객체의 호출을 전담: 프록시 객체는 실제 객체의 호출을 전담하여 호출 전후에 추가적인 로직을 수행할 수 있습니다.
- 지연 로딩(Lazy Loading): JPA에서는 프록시 객체를 사용하여 연관된 엔터티를 지연 로딩할 수 있습니다. 필요한 시점에 연관된 엔터티를 로딩하여 성능을 최적화할 수 있습니다.
Spring Data JPA가 생성한 프록시 객체는 리포지토리 인터페이스의 메서드를 호출할 때 적절한 JPA 쿼리를 생성하고 실행하여 데이터베이스와 상호 작용합니다.
Q1: 프록시 객체의 지연 로딩은 어떻게 동작하는지 자세히 설명할 수 있을까요?
Q2: Spring Data JPA에서 프록시 객체를 커스터마이징하거나 확인하는 방법이 있을까요?
Q3: 프록시 객체가 실제 객체의 호출을 전담하는 과정에서 발생할 수 있는 주요 이슈는 무엇인가요?
지연 로딩(Lazy Loading)과 프록시 객체의 동작:
- 지연 로딩 개념: 지연 로딩은 연관된 엔터티를 실제로 사용하는 시점까지 로딩을 미루는 방식입니다. 이는 연관된 엔터티의 데이터를 필요한 시점에 로딩하여 성능을 최적화할 수 있게 해줍니다.
- 프록시 객체와 지연 로딩의 연계: Spring Data JPA는 프록시 객체를 사용하여 지연 로딩을 구현합니다. 예를 들어, 엔터티
Parent
가 자식 엔터티Child
와 일대다 관계일 때, 다음과 같은 코드를 고려해봅시다: @Entity public class Parent { @Id private Long id; @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) private List<Child> children; // 다른 필드들... } @Entity public class Child { @Id private Long id; @ManyToOne @JoinColumn(name = "parent_id") private Parent parent; // 다른 필드들... }
- 프록시 객체 생성 및 호출 시 동작:
Parent
를 조회할 때children
필드는 프록시 객체로 대체됩니다.children
에 실제로 접근할 때(예:parent.getChildren().size()
), JPA는 실제 데이터베이스에서 연관된 엔터티를 로딩합니다.- 이로써
children
이 실제로 사용되는 시점에 데이터베이스 쿼리가 실행되어 성능을 향상시킵니다.
- 주의사항과 이슈:
- 지연 로딩을 남용하면 N+1 쿼리 문제가 발생할 수 있으므로 사용 상황을 신중하게 고려해야 합니다.
- 트랜잭션 컨텍스트에서 외부로 나갈 때 지연 로딩을 사용하는 경우, 영속성 컨텍스트가 닫혀서
LazyInitializationException
이 발생할 수 있습니다.
728x90
'Spring' 카테고리의 다른 글
[Spring] return redirect:/주소, view이름 차이 (0) | 2024.01.16 |
---|