티스토리 뷰
개요
- JPA (Java Persistence API)는 자바 객체와 관계형 데이터베이스 간의 매핑을 지원하는 표준 ORM 인터페이스
- 개발자는 객체 지향 방식으로 CRUD 작업을 수행하고, 엔티티의 생명주기와 상태를 영속성 컨텍스트를 통해 관리할 수 있음
- JPA는 다양한 구현체(Hibernate, EclipseLink 등)를 기반으로 동작하며, 데이터 정합성과 트랜잭션 관리, 캐싱 및 지연 로딩 등 다양한 기능을 제공
장점
생산성 향상
- 객체와 테이블 간의 자동 매핑을 통해 반복적인 SQL 작성 없이 개발할 수 있음
유지보수성 개선
- 데이터베이스와 비즈니스 로직이 분리되어 요구사항 변경에 유연하게 대응할 수 있음
표준화
- JPA 표준 인터페이스를 사용하므로 다양한 구현체 간 전환이 용이하며, 코드 재사용성과 확장성이 높음
영속성 관리
- 영속성 컨텍스트를 통한 엔티티 상태 관리와 트랜잭션 통합으로 데이터 정합성을 보장
캐싱 및 로딩 전략
- 1차, 2차 캐시 및 Lazy/Eager Loading 기능을 통해 성능 최적화가 가능
단점
성능 이슈
- 자동 매핑 및 추상화 계층으로 인해 복잡한 쿼리나 대용량 데이터 처리 시 성능 최적화에 한계가 있을 수 있음
러닝 커브
- 영속성 컨텍스트, 캐싱, 지연 로딩 등 내부 동작을 이해해야 하므로 초기 학습 부담이 존재
디버깅 어려움
- 자동으로 생성되는 SQL이나 캐시 동작을 파악하기 어려워 디버깅 및 문제 해결에 시간이 소요될 수 있음
설정 복잡성
- 다양한 옵션과 설정이 존재하여 초기 환경 구성 및 최적화 작업이 복잡할 수 있음
JPA의 핵심 개념 및 활용
객체와 테이블 매핑
- 엔티티 클래스에 @Entity 어노테이션을 부여하여 데이터베이스 테이블과 자동으로 매핑
영속성 컨텍스트
- EntityManager가 관리하는 메모리 공간으로, 엔티티의 상태를 1차 캐시 형태로 관리하고, 트랜잭션 내에서 데이터베이스와 동기화
트랜잭션 및 CRUD 작업
- EntityManager를 통해 persist(), merge(), remove() 등의 메서드를 사용해 엔티티를 저장, 수정, 삭제하며, 트랜잭션 커밋 시 flush를 통해 데이터베이스와 일치시킴
쿼리 실행
- JPQL이나 Criteria API를 사용해 객체지향적인 쿼리를 작성하고 실행할 수 있으며, 필요 시 동적 쿼리 작성도 지원
캐싱과 로딩 전략
- 1차 캐시(영속성 컨텍스트), 2차 캐시, 그리고 Lazy Loading과 Eager Loading 전략을 통해 데이터 조회 성능을 최적화함
JPA 동작 과정
1. 설정 및 초기화
Persistence Unit 구성
- persistence.xml 또는 스프링 설정 파일을 통해 데이터베이스 연결 정보, 엔티티 클래스 목록, 캐시 및 기타 설정을 정의
EntityManagerFactory 생성
- 설정 정보를 바탕으로 EntityManagerFactory가 생성되고, 이를 통해 여러 EntityManager 인스턴스를 만들 수 있음
2. 영속성 컨텍스트 생성 및 EntityManager 활용
EntityManager 생성
- 실제 데이터베이스 작업(조회, 저장, 수정, 삭제)을 담당하는 EntityManager가 생성
영속성 컨텍스트
- 생성된 EntityManager는 자체적으로 영속성 컨텍스트를 갖고 있으며, 이 공간에서 엔티티의 생명주기와 상태를 관리
- 엔티티가 영속성 컨텍스트에 등록되면, 해당 객체는 1차 캐시 역할을 수행하며 데이터베이스와의 동기화가 준비
3. 트랜잭션 관리 및 CRUD 작업
트랜잭션 시작
- 데이터베이스 작업 전, EntityManager를 통해 트랜잭션이 시작
- 예) EntityManager.getTransaction().begin() 또는 선언적 트랜잭션
엔티티 저장 및 수정
- persist()를 호출하면 엔티티가 영속성 컨텍스트에 등록되어, 트랜잭션 커밋 시 INSERT 쿼리가 실행
- 엔티티의 속성이 변경되면, 트랜잭션 종료 시 dirty checking을 통해 자동으로 UPDATE 쿼리가 수행
엔티티 삭제
- remove()를 호출하여 엔티티를 삭제할 수 있으며, 커밋 시 DELETE 쿼리가 실행
쿼리 실행
- JPQL이나 Criteria API를 사용하여 엔티티를 조회하면, 영속성 컨텍스트의 캐시를 활용하여 효율적인 데이터 접근이 가능
4. 동기화(Flush) 및 트랜잭션 커밋
Flush
- 트랜잭션 커밋 전, EntityManager는 영속성 컨텍스트의 변경 사항을 데이터베이스에 반영하기 위해 flush를 수행
- 이 과정에서 INSERT, UPDATE, DELETE 쿼리가 실제로 실행되어 데이터베이스와의 상태가 일치
커밋 또는 롤백
- 모든 작업이 정상적으로 완료되면 트랜잭션이 커밋되고, 문제가 발생할 경우 롤백
5. 영속성 컨텍스트 종료
EntityManager 종료
- 트랜잭션 종료 후, 사용한 EntityManager는 종료되어 영속성 컨텍스트와의 연결이 끊김
- 이후 추가 작업이 필요하면 새로운 EntityManager를 생성하여 사용
자바 예제 코드 (JPA 활용)
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Column;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true, nullable = false)
private String email;
// 기본 생성자
public User() {}
// 생성자
public User(String name, String email) {
this.name = name;
this.email = email;
}
// Getter & Setter
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
면접 대비 질문
기초 질문
Q1. JPA란 무엇이며, 그 주요 기능은 무엇인가요?
모범 답안
JPA는 자바 객체와 관계형 데이터베이스 간의 매핑을 지원하는 표준 ORM 인터페이스로, 엔티티 관리, 영속성 컨텍스트, 트랜잭션 관리 등의 기능을 제공합니다.
Q2. JPA를 사용함으로써 얻을 수 있는 주요 장점은 무엇인가요?
모범 답안
JPA를 사용하면 객체 지향적인 코드로 데이터베이스 작업을 수행할 수 있어 생산성과 유지보수성이 향상되며, 다양한 구현체를 통해 확장성과 유연성을 확보할 수 있습니다.
심화 질문
Q1. JPA의 영속성 컨텍스트가 무엇이며, 어떤 역할을 하나요?
모범 답안
영속성 컨텍스트는 엔티티의 상태를 관리하는 메모리 공간으로, 엔티티를 1차 캐시로 관리하며, 트랜잭션 범위 내에서 데이터베이스와 동기화 역할을 합니다.
Q2. JPA에서 Lazy Loading과 Eager Loading의 차이점은 무엇인가요?
모범 답안
Lazy Loading은 필요한 시점에 연관 데이터를 로드하여 초기 로딩 시간을 단축하는 반면, Eager Loading은 엔티티 조회 시 모든 관련 데이터를 즉시 로드하여 추가 쿼리 없이 사용할 수 있습니다.
압박 질문
Q1. JPA를 사용할 때 발생할 수 있는 성능 이슈와 이를 해결하기 위한 방법은 무엇인가요?
모범 답안
JPA 사용 시 자동 SQL 생성이나 지연 로딩 등으로 인한 N+1 문제, 캐시 부적절 사용 등 성능 이슈가 발생할 수 있습니다. 이를 해결하기 위해 패치 조인, 배치 사이즈 설정, 엔티티 그래프 활용 등 다양한 최적화 전략을 적용할 수 있습니다.
Q2. JPA와 Hibernate의 관계 및 차이점을 설명해 주세요.
모범 답안
JPA는 ORM의 표준 인터페이스이며, Hibernate는 그 구현체 중 하나입니다. Hibernate는 JPA의 기능을 구현할 뿐만 아니라, 추가적인 최적화 및 확장 기능을 제공하여 실무 환경에 적합한 선택지가 될 수 있습니다.
Q3. 복잡한 도메인 모델을 JPA로 매핑할 때 주의해야 할 점은 무엇인가요?
모범 답안
복잡한 도메인 모델에서는 연관관계, 상속 구조, 캐싱 전략 등이 중요한 이슈가 됩니다. 이를 위해 도메인 모델을 단순화하고, 명확한 엔티티 설계와 적절한 로딩 전략, 트랜잭션 관리 등을 고려해야 합니다.
'Spring' 카테고리의 다른 글
[Spring] H2 Database & Spring Boot DevTools (0) | 2025.02.25 |
---|---|
[Spring] 트랜잭션 관리(@Transactional) (0) | 2025.02.25 |
[Spring] MyBatis (0) | 2025.02.24 |
[Spring] JDBC Template (0) | 2025.02.20 |
[Spring] 데이터 바인딩 및 검증 (@Valid, BindingResult) (0) | 2025.02.19 |
- Total
- Today
- Yesterday
- 우선순위 큐
- 동적 프로그래밍
- MSA
- 알고리즘
- Spring Boot
- 자바
- 프리코스
- 백트래킹
- HTTP
- 분할 정복
- Spring
- devops
- 우테코
- k8
- B+Tree
- 스프링
- TRIE
- 운영체제
- CS
- 자료구조
- i/o모델
- CPU 스케줄링
- 해시 테이블
- 우아한 테크코스
- 그리디 알고리즘
- db
- 탐색 알고리즘
- Java
- 데이터베이스
- restful api
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |