반응형
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 | 31 |
Tags
- resultMap
- 스프링부트
- db
- 스프링 빈
- 스프링 프레임워크
- jdbc
- DIP
- thymeleaf
- JPA
- assertThrows
- spring
- 생성자 주입
- 스프링 부트 입문
- 싱글톤
- 스프링
- 스프링 컨테이너
- 스프링 부트
- springboot
- java
- sqld
- Javascript
- Effective Java
- 필드 주입
- DI
- assertThat
- @Configuration
- SQL
- 스프링 부트 기본
- mybatis
- kafka
Archives
- Today
- Total
선 조치 후 분석
[JPA] JPA란? 그리고 JPA에서 자주 사용되는 어노테이션 본문
728x90
반응형
SMALL
JPA( Java-Persistence API)
- Java 애플리케이션에서 데이터베이스와 객체 간 매핑(ORM)을 처리하는 표준 API
- JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리기술을 지원
- 데이터베이스에 의존적인 SQL을 작성하는 대신 객체를 사용해 데이터베이스 작업을 수행할 수 있도록 지원
JPA 주요 개념
- 엔티티(Entity)
데이터베이스 테이블과 매핑되는 자바 클래스
각 엔티티는 @Entity 어노테이션으로 표시
엔티티의 필드는 데이터베이스의 컬럼에 매핑 - 영속성(Persistence)
애플리케이션에서 객체를 영구적으로 저장, 읽기, 수정, 삭제 등의 작업을 수행
영속성 컨텍스트는 JPA에서 이러한 영속성을 관리하는 핵심 역할 - EntityManager
엔티티를 저장하고, 수정하고, 삭제하고, 조회하는 작업을 담당
영속성 컨텍스트를 직접 관리
영속성 컨텍스트(Persistence Context)
- 영속성 컨텍스트는 엔티티 객체를 저장(영속)하고 관리하는 JPA의 저장소
- 데이터베이스와 애플리케이션 간의 1차 캐시 역할
영속성 컨텍스트의 주요 특징
- 엔티티 생명주기 관리
Transient(비영속) : 영속성 컨텍스트와 관련이 없는 상태 User user = new User(); // 비영속 상태 Persistence(영속) : 영속성 컨텍스트에 저장된 상태 entityManger.persist(user); // 영속 상태 Detached(준영속) : 영속성 컨텍스트에서 분리된 상태 entityManger.detach(user); // 준영속 상태 Removed(삭제) : 삭제 요청 상태 entityManger.remove(user); // 삭제 상태
- 1차 캐시
영속성 컨텍스트는 1차 캐시를 사용해 데이터베이스 조회 전에 이미 메모리에 있는 엔티티를 우선 반환
동일한 트랜잭션 내에서 동일한 ID로 조회하면 항상 같은 객체를 반환 - 변경 감지(Dirty Checking)
영속성 컨텍스트는 엔티티의 상태를 감지하고, 변경이 있을 경우 트랜잭션 종료 시점에 자동으로 데이터베이스에 반영
User user = entityManger.find(User.class, 1L); user.setName("newName"); // 변경 감지
- 쓰기 지연 (Write Behind)
변경된 데이터를 즉시 데이터베이스에 반영하지 않고, 트랜잭션 종료 시점에 SQL을 일괄 실행
Insert/Update/Delete 작업이 하나의 SQL Batch로 처리 - 동일성 보장 (Identity Guarantee)
동일한 영속성 컨텍스트 내에서 동일한 엔티티 ID를 가진 객체는 항상 같은 객체로 보장
User user1 = entityManger.find(User.class, 1L); User user2 = entityManger.find(User.class, 1L); System.out.println(user1 == user2); // true
영속성 컨텍스트의 장점
- 성능 최적화
1차 캐시와 쓰기 지연을 통해 데이터베이스 접근을 최소화하고 성능을 향상 - 변경감지
애플리케이션 코드에서 명시적으로 SQL을 작성하지 않아도 변경 사항을 자동으로 감지해 처리 - 동일성 보장
동일 트랜잭션에서 동일 동일한 ID의 엔티티는 동일한 객체로 관리 - 트랜잭션 관리
데이터베이스 작업이 하나의 트랜잭션 내에서 일관성을 유지할 수 있도록 관리
JPA에서 자주 사용되는 어노테이션
1. 엔티티 클래스 관련 어노테이션
- @Entity
클래스가 JPA 엔티티임을 선언
데이터베이스의 테이블과 매핑
@Entity public class User { @Id @GeneratedValue private Long id; }
- @Table
엔티티와 매핑될 데이터베이스 테이블을 지정
name 속성을 통해 테이블 이름 지정 가능
@Entity @Table(name = "users") public class User { @Id @GeneratedValue private Long id; }
2. 필드 매핑 관련 어노테이션
- @Id
엔티티의 기본 키(PK)를 지정 - @GeneratedValue
기본 키의 자동 생성 전략 strategy : GenerationType.IDENTITY, GenerationType.SEQUENCE, GenerationType.TABLE, GenerationType.AUTO
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
- @Column
필드를 데이터베이스 컬럼과 매핑
name, nullable, unique, length, updatable 등의 속성 제공
@Column(name = "user_name", nullable = false, unique = true) private String name;
- @Enumerated
열거형(Enum)을 매핑
EnumType.STRING(문자열), EnumType.ORDINAL(숫자)로 설정 가능
@Enumerated(EnumType.STRING) private UserType userType;
- @Lob
CLOB(문자 대용량 데이터) 또는 BLOB(이진 대용량 데이터)를 매핑
@Lob private String description;
- @Transient
데이터베이스와 매핑되지 않는 필드 지정
@Transient private String tempData;
3. 관계 매핑 관련 어노테이션
- @OneToOne
1:1 관계 매핑
@OneToOne @JoinColumn(name = "profile_id") private Profile profile;
- @OntToMany
1:N 관계 매핑
@OneToMany(mappedBy = "user") private List<Order> orders;
- @ManyToOne
N:1 관계 매핑
@ManyToOne @JoinColumn(name = "team_id") private Team team;
- @ManyToMany
N:N 관계 매핑
@ManyToMany @JoinTable( name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id") ) private List<Role> roles;
- @JoinColumn
외래키를 매핑 - @JoinTable
다대다 관계에서 연결 테이블 지정
JPA의 영속성 컨텍스트는 데이터베이스와 객체 간의 중간 역할을 하며, 개발자가 SQL 작성 없이 객체 중심의
프로그래밍을 할 수 있도록 지원한다. 이를 통해 생산성을 높이고 유지보수를 용이하게 한다.
하지만, 성능 최적화와 복잡한 쿼리 작업에서는 한계가 있을 수 있기에 필요에 따라 다른 기술과 병행 사용하는 것이 좋다.
728x90
반응형
LIST