JPA/JPA Basic

[JPA] 엔티티 매핑 - @Entity, @Table, @Column

IT록흐 2023. 5. 31. 16:44
반응형

 

 

 

 

 

엔티티매니저에 의해 생성된 엔티티는 DB의 테이블과 매핑된다. 

 

매핑 작업은 JPA프레임워크가 담당한다. 개발자가 해야할 일은 어떤 엔티티가 어떤 테이블과 매핑되어야 하는지, 어떤 필드가 기본키인지, 어떤 필드가 어떤 컬럼과 매핑되어야 하는지를 '표시' 하는 작업이다. 

 

'표시'는 '어노테이션'으로 이루어진다. 

 

 

[JAVA] 어노테이션( Annotation )이란?

어노테이션(Annotation)은 무엇일까? 어노테이션은 '주석'이다. JVM이 읽는 주석이다. 주석이 필요한 이유가 무엇일까? 철학책과 과학책이 있다. 과학책은 과학코너로 철학책은 철학코너로 분류하고

lordofkangs.tistory.com

 

 

어노테이션에 대한 자세한 내용은 위 포스팅을 참고 바란다. 이번 포스팅에서는 매핑작업에 사용되는 가장 기본적인 어노테이션 @Entity, @Table, @Column에 대해서 알아보겠다.

 

 

@Entity 

@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
    String name() default "";
}

 

@Entity는 클래스가 엔티티클래스임을 '표시'하는 어노테이션이다. JPA는 트랜잭션이 발생하면 동적으로 엔티티객체를 만들어야 하는데, 이때 @Entity로 표시된 클래스를 엔티티 객체로 만든다.

 

@Entity는 name 속성을 가진다.

 

 

[JAVA] 어노테이션( Annotation )의 속성

[JAVA] 어노테이션( Annotation )이란? (1) 어노테이션(Annotation)은 무엇일까? 어노테이션은 '주석'이다. JVM이 읽는 주석이다. 주석이 필요한 이유가 무엇일까? 철학책과 과학책이 있다. 과학책은 과학코

lordofkangs.tistory.com

 

위 포스팅에서도 다루었지만, 어노테이션의 속성도 '표시'이다. 특정 로직을 처리하기 위한 '표시'이다. name 속성은 JPA가 name과 동일한 테이블과 매핑할 수 있도록 테이블명과 동일한 데이터를 name 속성값으로 넣어야 한다. name의 속성값을 넣지 않으면 클래스명으로 자동 매핑된다. 

 

 

@Table

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String name() default "";

    String catalog() default "";

    String schema() default "";

    UniqueConstraint[] uniqueConstraints() default {};

    Index[] indexes() default {};
}

 

개발자는 엔티티와 매핑 될 테이블에 대한 구체적인 정보를 JPA에게 넘기고 싶다. @Entity는 속성으로 name 밖에 없기에 구체적인 정보를 넘겨줄 수 없다. 그래서 @Table이 필요하다. 

 

- name : 매핑될 테이블의 이름

- catalog : 매핑될 테이블이 속할 카탈로그의 이름

- schema : 매핑될 테이블이 속할 스키마의 이름

- uniqueConstaraints : 매핑될 테이블에게 적용될 제약조건

- indexes : 매핑될 테이블의 인덱스

 

보통 catalog, schema, uniqueConstaraints 같은 정보는 DB스키마를 만들때 사용된다. JPA는 DB 스키마 자동생성 기능도 제공한다. 실제 운영환경에서 사용되는 MySQL, ORACLE 같은 복잡한 DBMS는 자체적인 DB스키마를 유지한다. 반면, 개발이나 테스트 환경에서 사용되는 내장형 DB의 경우 간단히 JPA가 DB스키마를 자동생성하여 사용할 수 있다. 이때 위 속성들에 필요에 맞는 데이터를 주입하면 된다.

 

@Column

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String name() default "";

    boolean unique() default false;

    boolean nullable() default true;

    boolean insertable() default true;

    boolean updatable() default true;

    String columnDefinition() default "";

    String table() default "";

    int length() default 255;

    int precision() default 0;

    int scale() default 0;

 

@Column은 테이블의 컬럼과 연결될 대상에 '표시'하는 어노테이션이다. Return 값을 반환하는 메소드( 일반적으로 Getter 메소드 )나 필드에 '표시'된다. 

 

테이블의 컬럼은 여러가지 설정이 있다.  UNIQUE 설정, Null값 방지 설정, 삽입 및 수정 방지 설정, 컬럼의 길이 등등이 있다. 개발자는 컬럼의 정보를 어노테이션에 담아 JPA에게 전달할 수 있다. 추가로 @Column은 생략가능하다. 생략하면 동일한 필드명과 컬럼명이 매핑된다. 만약 이름이 다른 필드와 컬럼을 매핑하고 싶다면 반드시 @Column을 사용해야 한다.

 

 

사용 예시

@Entity
@Table(name = "products", schema = "my_schema", uniqueConstraints = {
    @UniqueConstraint(name = "uk_product_code", columnNames = "product_code")
}, indexes = {
    @Index(name = "idx_product_name", columnList = "product_name")
})
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "product_id")
    private Long id;

    @Column(name = "product_code", nullable = false)
    private String code;

    @Column(name = "product_price", precision = 10, scale = 2)
    private BigDecimal price;

}

 

 

이와 같이, 엔티티에 어노테이션을 활용하면 원하는 테이블의 구체적인 정보를 표시하여 JPA에게 넘겨줄 수 있다. 이번 포스팅에서는 가장 기본적인 어노테이션 3가지를 알아보았다. 다음 포스팅에서는 기본키 생성전략을 알아보겠다.

 

 

 


 

 

참고자료

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

 

 

 

 

 

 

 

반응형