JPA 어노테이션 정리

방혁·2024년 7월 1일

JPA

목록 보기
1/1
post-thumbnail

JPA를 공부, 사용하면서 생기는 어노테이션에 대해 정리한 포스트입니다.
따라서, 수정이 계속 이루어질 수 있는 포스트입니다.

매핑과 관련된 어노테이션

@Entity

JPA를 사용해 테이블과 일대일 매핑할 클래스에 붙여주는 어노테이션이다. 이 어노테이션을 붙임으로써 JPA가 해당 클래스를 관리하게 된다.
SpringBoot를 설정할 시 spring.jpa.hibernate.ddl-auto 설정이 create or update로 설정할 경우 프로젝트 시작 시 EntityManager가 자동으로 DDL을 수행해준다.

속성기능기본값
nameJPA에서 사용할 엔티티 이름 지정클래스 이름을 엔티티 이름으로 지정

@Table

엔티티와 매핑할 테이블을 지정해주는 어노테이션이다.

속성기능기본값
name매핑할 테이블 이름엔티티 이름(@Entity(name="~") 사용
uniqueContraintsDDL 생성시 유니크 제약조건 생성

@Column

객체 필드를 테이블 컬럼과 매핑한다.

속성기능기본값
name필드와 매핑할 테이블의 컬럼 이름 지정필드이름으로 대체
insertableEntity 저장 시 해당 Field도 저장, false로 읽기 전용 설정 가능true
updatableEntity 수정 시 해당 Field도 수정, false로 읽기 전용 설정 가능true
table하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용현재 Class가 매핑된 Table
nullabletrue/false로 null 허용 여부 설정true
unique컬럼에 유니크 제약조건 부여true
length문자 길이 제약조건 String 타입일 때 사용255
columnDefinition데이터베이스 컬럼 정보를 직접 부여적절한 Column Type 생성
precision, scaleBigDecimal 타입에서 사용, precision : 소수점을 포함한 전체 자릿수 설정, scale : 소수의 자릿수

-> 여기서 name, insertable, updatable, table을 제외한 나머지 속성들은 DDL 생성 기능을 사용할 때만 사용되는 속성들이다. 즉 실행 로직에는 영향을 끼치지 않는다.

@Id

특정 속성을 PK로 설정하는 어노테이션이다.

  • @Id 어노테이션만 적게될 경우 기본키값을 직접 부여해줘야 한다.

@GeneratedValue 어노테이션을 사용하면 기본값을 DB에서 자동으로 생성하는 전략을 사용 할 수 있다.

전략에는 IDENEITY, SEQUENCE, TABLE 3가지가 있다.

  • IDENTITY : 기본 키 생성을 데이터베이스에 위임한다.(ex MySQL - AUTO INCREMENT...)

  • SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.(ex Oracle sequence...)

  • TABLE : 키 생성 테이블을 사용한다.(ex 시퀀스용 테이블을 생성해서 테이블의 기본키를 저장하고 관리한다.)

@GeneratedValue(startegy = GenerationType.AUTO) 인 경우 선택된 DB에 따라 JPA가 자동으로 전략 선택

@EmbeddedId

2개 이상의 키를 가지는 복합키로 테이블을 매칭하는 경우 사용하는 어노테이션이다.

  • @EmbeddedId 어노테이션을 붙여줘야 한다.
  • Serializable 인터페이스를 구현해야 한다.
  • 기본 생성자가 있어야 한다.
  • 식별자 클래스는 public 이어야 한다.

@Enumerated

enum 타입을 매핑할 때 사용한다.
속성 value

  • EnumType.ORDINAL : enum 순서를 DB에 저장
  • EnumType.STRING : enum이름을 DB에 저장

⭐️ 대부분 경우 STRING을 무조건 사용하는 것이 오류를 줄일 수 있다.
Why? 만약 2개를 저장해둔 enum이 있다고 가정하자. 이 경우를 ORDINAL 속성으로 두면 추후 enum에 1개를 추가할 경우 순서가 밀려 DB의 값들이 깨져서 심각한 오류를 발생할 가능성이 높다. 따라서 STRING으로 저장해두는 것이 안전하다.

@Transient

어노테이션을 붙인 필드는 DB에 저장하지도 조회하지도 않는다. 객체에 임시로 값을 보관하고 싶을 때 사용

연관 관계와 관련된 어노테이션

관계 에서 사용하는 어노테이션

@JoinColumn(name="")
외래키를 정의하는 어노테이션이다.

속성기능기본값
name매핑할 외래키 이름'필드명'_'참조하는 테이블 기본키 컬럼명'
referencedColumnName외래키가 참조하는 대상 테이블의 컬럼명참조하는 테이블 기본키 컬럼명
foreignKey외래 키 제약조건 지정

@XXToXX
N:1 관계를 표현하는 어노테이션이다. @ManyToOne이 붙은 엔티티가 M이고 반대 엔티티가 1일 때 붙인다.

속성기능기본값
optionalfalse : 연관된 엔티티가 항상 존재true
fetch글로벌 페치 전략 설정@XXToOne=FetchType.EAGER @XXToMany=FetchType.LAZY
cascade영속성 전이 기능 사용
targetEntity연관된 엔티티 타입 정보 설정

양방향 관계

속성으로 mappedBy가 사용, mapppedBy는 양방향 매핑일 때 사용한다.
속성 값에는 반대쪽 매핑의 필드 이름값을 넣는다.
-> 반대쪽 클래스 명으로 매핑 필드값을 정하면 될텐데 왜 mappedBy를 이용해야하는 것인가?
∵ 객체는 서로 다른 단방향 2개로 이루어져있는것과 관련이 있다.
그러면, 2개의 연관관계 ID가 필요하게 된다. 즉, 외래키 2개를 관리하게 될텐데 관계형 데이터베이스는 외래키 1개를 가지고 관리한다.
그래서 JPA는 두 개의 연관관계중 하나를 고르게 하기 위해 mappedBy를 설정한다. 여기서 관리되는 연관관계를 연관관계의 주인이라 한다. 다시 말해 mappedBy가 없는 엔티티가 연관관계의 주인이다.

profile
반갑습니다 👋

0개의 댓글