JPA 어노테이션 정리

Hwani·2024년 5월 23일

Java 개념정리

목록 보기
5/5

JPA는 수많은 어노테이션을 지원한다.
어노테이션을 이용하여 데이터베이스에게 자세하게 전달을 해야 올바르게 작동한다.
나도 프로젝트를 하면서 엔티티 연관관계 설정에서 많이 헤매서 자주 쓰는 어노테이션을 정리해보려한다.

BaseEntity


BaseEntity는 모든 도메인(엔티티)의 부모가 되는 엔티티이다.
그래서, 추상 클래스이며 모든 도메인은 BaseEntity를 상속받아 사용한다.

@MappedSuperclass

  • 해당 클래스가 엔티티가 아니라 다른 엔티티에서 상속되는 공통 부모 클래스임을 나타낸다.
    이 클래스의 필드들은 상속받는 엔티티 클래스에서 매핑된다.

@Getter @Setter

  • 이 두 애너테이션은 Lombok에서 제공하며, 필드에 대한 자동으로 게터(Getter)와 세터(Setter) 메서드를 생성하여 다른 곳에서 해당 필드의 값을 쉽게 설정(Set)하고 조회(Get)할 수 있도록 합니다.
  • 주의할 점은 실제론 Setter는 외부에 노출되어 데이터 조작이 가능하기에 정말 필요한 곳에서만 Setter 어노테이션을 사용해야하고 실제 필드의 Setter 값을 노출해선 안된다!

@Id

  • 엔티티 클래스의 필드를 기본키(Primary Key)로 매핑할 때 사용한다.

@GeneratedValue

  • strategy 옵션으로 기본키 생성 방식을 지정할 수 있다.
속성기능
@GeneratedValue(strategy = GenerationType.IDENTITY)기본 키 생성을 DB에 위임 (MySQL)
@GeneratedValue(strategy = GenerationType.SEQUENCE)DB 시퀀스를 사용해서 기본 키 할당 (ORACLE)
@GeneratedValue(strategy = GenerationType.TABLE)키 생성 테이블 사용 (모든 DB 사용 가능)
@GeneratedValue(strategy = GenerationType.AUTO)선택된 DB에 따라 자동으로 전략 선택

@Column

  • 객체 필드를 테이블 컬럼과 매핑할 때 사용한다.
속성기능
name필드와 매핑할 테이블의 컬럼 이름 지정. 기본값은 필드 이름으로 대체
insertabletrue: 엔티티 저장 시 필드 값 저장. false: 필드 값이 저장되지 않음
updatabletrue: 엔티티 수정 시 값이 수정됨. false: 엔티티 수정 시 값이 수정되지 않음
table하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용
nullablenull 값 허용 여부 설정. false: NOT NULL 제약 조건
unique컬럼에 유니크 제약 조건 부여
columnDefinition데이터베이스 컬럼 정보를 직접 부여
length문자 길이 제약 조건. String 타입일 때 사용
precision, scaleBigDecimal 타입에서 사용. precision: 소수점을 포함한 전체 자릿수 설정. scale: 소수의 자릿수 설정

@PrePersist @PreUpdate

  • 이 어노테이션들은 해당 엔티티가 영속 상태로 저장되기 전(pre-persist)과 업데이트되기 전(pre-update)에 실행될 메서드를 지정한다. 주로 생성일시와 수정일시를 업데이트하는 메서드가 정의되어 있다.

@Entity

  • JPA에서 엔티티 클래스를 정의할 때 사용되는 애너테이션, 엔티티는 데이터베이스 테이블에 매핑되는 자바 객체로, 데이터베이스의 테이블과 일대일로 대응된다.

@Table

  • 매핑할 테이블을 지정한다.
속성기능
name매핑할 테이블의 이름을 지정합니다.
catalogDB의 catalog를 맵핑합니다.
schemaDB 스키마와 맵핑합니다.
uniqueConstraintDDL 쿼리를 작성할 때 제약 조건을 생성합니다.

@Column

  • 객체 필드와 DB 테이블의 컬럼을 매핑한다.
속성기능
name맵핑할 테이블의 컬럼 이름을 지정합니다.
insertable엔티티 저장 시 선언된 필드도 같이 저장합니다.
updateable엔티티 수정 시 이 필드를 함께 수정합니다.
table지정한 필드를 다른 테이블에 맵핑할 수 있도록 합니다.
nullableNULL을 허용할지, 허용하지 않을지 결정합니다.
unique제약 조건을 걸 때 사용합니다.
columnDefinitionDB 컬럼 정보를 직접적으로 지정할 때 사용합니다.
lengthvarchar의 길이를 조정합니다. 기본값으로 255가 입력됩니다.
precision, scaleBigInteger, BigDecimal 타입에서 사용합니다. 각각 소수점 포함 자리수, 소수의 자리수를 의미합니다.

@Builder

@Getter
@Builder
public class User {
    private String username;
    private String password;
    private String email;
}
  • 빌더 패턴이라고 하며, 빌더 클래스가 자동으로 생성되며 이 빌더 클래스를 통해 객체를 생성할 수 있다.
  • 가독성이 좋으며 매개변수가 많거나 일부 매개변수 값이 선택적일 때 유용하게 사용한다.

@Builder 사용예시

User user = User.builder()
                .username("abc")
                .password("password123")
                .email("abc@example.com")
                .build();

@OneToMany, @ManyToOne, @JoinColumn, @mappedBy

  • 말그대로 일대다, 다대일, 조인되는 컬럼을 설정하는 어노테이션이다.
    주문과 상품을 하는 예시를 들어 설명하겠습니다.
@Entity
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // 주문과 상품의 관계는 OneToMany(일대다)로 정의됨
    @OneToMany(mappedBy = "order") // Order 엔티티는 여러 Product 엔티티를 가질 수 있음
    private List<Product> products;
}
  • mappedBy 속성은 Product 엔티티의 order 필드에 의해 매핑된다는 것을 나타냅니다.
@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // Product 엔티티는 하나의 주문에만 속함
    @ManyToOne // Product 엔티티는 하나의 Order 엔티티에만 속함을 나타냄
    @JoinColumn(name = "order_id") // 주문을 식별하기 위한 외래 키 설정
    private Order order;
}
  • @JoinColumn(name = "order_id"): 이 어노테이션은 Order 엔티티의 기본 키를 참조하는 외래 키를 지정합니다. 이 경우 Order 테이블의 기본 키인 id를 참조하는 order_id 컬럼이 Product 테이블에 생성됩니다.
profile
개발자될거야

0개의 댓글