BE/Java

[Java] 영속성

baek-dev 2024. 12. 16. 18:45

애플리케이션에서 생성한 데이터를 데이터베이스와 같은 영구 저장소에 저장하고, 필요할 때 다시 불러오는 과정을 의미

영속성은 데이터를 객체화하고, 이를 영구적으로 저장하거나 관리하는 것을 중심으로 작동


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의 장단점

장점

  1. 생산성: SQL 작성이 줄어들고 객체 지향적인 개발 가능.
  2. 유지보수성: 데이터베이스 변경 시 코드 수정이 최소화.
  3. 캐싱: 1차 캐시와 2차 캐시로 성능 최적화.
  4. 표준화: JPA는 표준 API로 다양한 구현체에서 동일한 방식으로 동작.

단점

  1. 초기 학습 곡선: 설정 및 개념 이해가 어렵다.
  2. 복잡한 쿼리: 복잡한 SQL 쿼리는 JPQL이나 네이티브 SQL로 처리해야 함.
  3. 성능: 대규모 데이터 처리 시 최적화가 필요.

 

 

 


 

 

출처 : 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