애플리케이션에서 생성한 데이터를 데이터베이스와 같은 영구 저장소에 저장하고, 필요할 때 다시 불러오는 과정을 의미
영속성은 데이터를 객체화하고, 이를 영구적으로 저장하거나 관리하는 것을 중심으로 작동
1. 영속성(Persistence)이란?
데이터가 애플리케이션의 실행 주기와 독립적으로 존재할 수 있도록 저장하는 메커니즘을 의미
- 비영속 데이터: 메모리에만 존재하며 애플리케이션 종료 시 사라지는 데이터
- 영속 데이터: 데이터베이스에 저장되어 애플리케이션이 종료되어도 유지되는 데이터
자바에서 영속성을 관리하기 위해 ORM(Object Relational Mapping)기술과 JPA를 주로 사용한다
2. 영속성을 이해하기 위한 주요 개념
2.1. JPA
- JPA는 자바 애플리케이션에서 데이터를 영속적으로 관리하기 위한 표준 API다
- SQL문을 직접 작성하지 않고도 자바 객체와 데이터베이스 간의 매핑을 지원
- Hibernate, EclipseLink 같은 ORM 프레임워크들이 JPA의 구현체다
2.2. ORM
- 객체와 관계형 데이터베이스 테이블 간의 데이터를 매핑하는 기술
- 데이터베이스의 행(row)은 객체로, 열(column)은 객체의 속성(field)로 매핑된다
2.3. Entity
- 데이터베이스 테이블과 매핑되는 자바 클래스
- `@Entity`, `@Table` 어노테이션을 사용하여 클래스와 테이블을 매핑한다
3. JPA의 주요 상태
3.1. 비영속 상태(Transient)
- 영속성 컨텍스트와 연관되지 않은 상태
- 객체를 `new`로 생성한 상태이며, 데이터베이스와 아직 연결되지 않음
- 예
User user = new User(); // 비영속 상태
user.setName("John");
3.2. 영속 상태(Persistent)
- 객체가 영속성 컨텍스트에 저장된 상태
- `EntityManager`또는 `Session`을 통해 데이터베이스와 동기화된다
- 예
em.persist(user); // user는 이제 영속 상태
특징
- 영속성 컨텍스트에 의해 관리되며, 상태 변경시 데이터베이스에도 자동으로 반영된다
- `persist()`메서드 호출 이후의 상태
3.3. 준영속 상태(Detached)
- 영속성 컨텍스트에서 분리된 상태
- 데이터베이스와 연결이 끊어졌으므로 더이상 상태 변경이 반영되지 않음
- 예
em.detach(user); // 영속성 컨텍스트에서 분리
3.4. 삭제 상태(Removed)
- 객체가 삭제될 예정인 상태
- `remove()`메서드 호출시 삭제 상태가 되며, 트랜잭션 커밋 시 데이터베이스에서 삭제된다
- 예
em.remove(user); // 삭제 상태
4. 영속성 컨텍스트
4.1. 영속성 컨텍스트란?
- 엔티티를 영속상태로 관리하는 일종의 캐시 메커니즘
- JPA가 데이터베이스와 통신하기 전에 엔티티 객체를 관리하는 메모리 공간
4.2. 1차 캐시
- 영속성 컨텍스트 내부의 캐시
- 동일한 엔티티를 여러번 조회해도 데이터베이스에 반복적으로 접근하지 않고, 영속성 컨텍스트에서 가져온다
- 예
User user1 = em.find(User.class, 1L); // DB 조회
User user2 = em.find(User.class, 1L); // 1차 캐시에서 조회
5. JPA 동작 흐름
- 엔티티 생성
- 엔티티 객체를 생성 (비영속 상태)
- 엔티티 저장
- `EntityManager.persist()`를 호출하여 영속 상태로 전환
- 상태 변경 감지(Dirty Checking)
- 엔티티의 필드 값이 변경되면 트랜잭션 커밋 시 자동으로 데이터베이스에 반영
- 엔티티 조회
- `EntityManager.find()`를 호출하여 데이터베이스에서 데이터를 가져옴
- 엔티티 삭제
- `EntityManager.remove()`를 호출하여 삭제 상태로 전환
6. JPA 주요 어노테이션
6.1. 클래스 수전 어노테이션
- `@Entity` : 클래스를 엔티티로 지정
- `@Table(name = "table_name")` : 데이터베이스 테이블 이름 매핑
6.2. 필드 수준 어노테이션
- `@Id` : 기본 키를 지정
- `@GeneratedValue` : 키 생성 전략을 설정 (IDENTITY, SEQUENCE 등)
- `@Column` : 데이터베이스의 컬럼과 매핑
- `@OneToOne`, `@OneToMany`, `@ManyToOne` : 관계 매핑
7. 간단한 JPA 예제
7.1. 엔티티 클래스
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
private String email;
// Getters and Setters
}
7.2. 데이터 저장
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
User user = new User();
user.setName("John Doe");
user.setEmail("john.doe@example.com");
em.persist(user); // 영속 상태로 전환
em.getTransaction().commit();
em.close();
emf.close();
7.3. 데이터 조회
User user = em.find(User.class, 1L); // 데이터베이스에서 사용자 조회
System.out.println(user.getName());
8. JPA의 장단점
장점
- 생산성: SQL 작성이 줄어들고 객체 지향적인 개발 가능.
- 유지보수성: 데이터베이스 변경 시 코드 수정이 최소화.
- 캐싱: 1차 캐시와 2차 캐시로 성능 최적화.
- 표준화: JPA는 표준 API로 다양한 구현체에서 동일한 방식으로 동작.
단점
- 초기 학습 곡선: 설정 및 개념 이해가 어렵다.
- 복잡한 쿼리: 복잡한 SQL 쿼리는 JPQL이나 네이티브 SQL로 처리해야 함.
- 성능: 대규모 데이터 처리 시 최적화가 필요.
출처 : ChatGPT
'BE > Java' 카테고리의 다른 글
[Java] 쓰레드 (0) | 2024.12.22 |
---|---|
[Java] StringBuffer, StringBuilder (1) | 2024.12.19 |
[Java] 레이어드 아키텍처와 mvc (1) | 2024.12.15 |
[Java] 명령형 , 선언형 프로그래밍 (0) | 2024.12.12 |
[Java] 어노테이션 (2) | 2024.12.11 |