JPA 이해하기

롱롱·2023년 3월 22일
2

spring

목록 보기
4/4
post-thumbnail

1. JPA란


Java Persistence API
Java 어플리케이션에서 관계형 데이터 베이스를 사용하는 방식을 정의한
인터페이스의 모음입니다.
이 JPA 인터페이스를 구현한 대표적인 오픈소스로 Hibernate가 있습니다.


2. ORM이란


Object-Relational Mapping
객체관계형 데이터베이스를 중간에서 매핑해주는 기술입니다.


3. JPA 사용 이유


  1. 어플리케이션과 DB 사이에 추상화된 데이터 접근 계층을 사용해서 어플리케이션이 특정 DB에 종속되지 않도록 합니다.
  2. SQL 작성과 JDBC API 사용하는 부분을 JPA가 대신 해주어 생산성이 증가합니다.
  3. 유지보수 시에, 필드가 추가되어도 쿼리를 수정할 필요가 없습니다.

4. JPA의 기본 Annotations


@Entity

정의한 클래스가 JPA에 의해 관리될 엔티티임을 의미합니다.


@Column

해당 컬럼의 세부 속성을 정의합니다.
name : 컬럼명
length : 문자열인 경우 길이
nullable : null 허용 여부
unique : 유니크 키인지 여부


@Id

해당 필드를 프라이머리 키로 매핑합니다.


@GeneratedValue

프라이머리 키를 직접 할당하지 않고 자동으로 생성하게 합니다.
값을 생성하는 방식 : Identity, Sequence, Table, Custom
mysql을 사용하는 경우 GenerationType.IDENTITY 전략을 사용합니다.

@GeneratedValue(strategy = GenerationType.IDENTITY)

@Table

엔티티 이름과 테이블 이름이 다를 경우 이름을 지정하여 엔티티와 매핑되는 테이블을 지정합니다.


@OrderBy

@OrderBy("age asc")

해당되는 필드명을 오름차순/내림차순으로 정렬합니다.


@Transient

테이블의 컬럼으로 매핑되지는 않지만, 로직 상 선언해야 하는 변수가 있는 경우 사용합니다.



5. 연결관계에 관한 JPA의 Annotations


@OneToMany

일대다 관계의 '일'에 해당하는 엔티티 안에 '다'에 해당하는 엔티티의 리스트를 생성하고 그 위에 붙여줍니다.

@Entity
public class Parent {
...
@OneToMany(mappedBy="parent")
private List<Child> children = new ArrayList<Child>();
...
}

이 때 '다' 쪽이 데이터가 너무 많으면 연관관계 매핑을 지양하는 것이 좋다고 합니다.


@ManyToOne

다대일 관계의 '다'에 해당하는 엔티티 안에 '일'에 해당하는 엔티티 객체를 생성하고 그 위에 붙여줍니다.

@Entity
public class Child {
...
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="parent_id") // child 테이블은 parent 테이블의 parent_id로 연결되어있음을 의미(포린키)
private Parent parent;
...
}

fetchType.LAZY

특정 엔티티를 조회할 때 연관된 엔티티를 가져오지 않음을 뜻합니다.


fetchType.EAGER

특정 엔티티를 조회할 때 따로 명시하지 않아도 연관된 엔티티까지 조회합니다.

Eager를 사용할 경우 JPQL을 사용할 때 N+1 문제가 발생합니다.
N+1 문제는 쿼리 1개를 날리면서 추가적으로 N개의 쿼리가 나가는 것을 말합니다.


6. Auto DDL 기능


application.properties나 application.yaml에 쓸 수 있는 데이터베이스 초기화 전략 설정 옵션입니다.

none으로 하는 경우

데이터베이스 구조를 바꾸지 않습니다.

update로 하는 경우

주어진 엔티티 구조로 데이터베이스가 업데이트됩니다.

validate로 하는 경우

스키마가 바뀌면 어플리케이션을 종료시킵니다.

create로 하는 경우

Drop table if exists [테이블 이름]

위 코드가 실행되어 기존 데이터가 삭제되고 새로운 커밋이 진행됩니다.

create-drop으로 하는 경우

테이블을 생성하고, SessionFactory가 끝나면 테이블을 드롭합니다.

1개의 댓글

comment-user-thumbnail
2023년 3월 29일

제이피에이 재미잇네요 호호 ^^

답글 달기