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

BaseEntity는 모든 도메인(엔티티)의 부모가 되는 엔티티이다.
그래서, 추상 클래스이며 모든 도메인은 BaseEntity를 상속받아 사용한다.
| 속성 | 기능 |
|---|---|
@GeneratedValue(strategy = GenerationType.IDENTITY) | 기본 키 생성을 DB에 위임 (MySQL) |
@GeneratedValue(strategy = GenerationType.SEQUENCE) | DB 시퀀스를 사용해서 기본 키 할당 (ORACLE) |
@GeneratedValue(strategy = GenerationType.TABLE) | 키 생성 테이블 사용 (모든 DB 사용 가능) |
@GeneratedValue(strategy = GenerationType.AUTO) | 선택된 DB에 따라 자동으로 전략 선택 |
| 속성 | 기능 |
|---|---|
name | 필드와 매핑할 테이블의 컬럼 이름 지정. 기본값은 필드 이름으로 대체 |
insertable | true: 엔티티 저장 시 필드 값 저장. false: 필드 값이 저장되지 않음 |
updatable | true: 엔티티 수정 시 값이 수정됨. false: 엔티티 수정 시 값이 수정되지 않음 |
table | 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용 |
nullable | null 값 허용 여부 설정. false: NOT NULL 제약 조건 |
unique | 컬럼에 유니크 제약 조건 부여 |
columnDefinition | 데이터베이스 컬럼 정보를 직접 부여 |
length | 문자 길이 제약 조건. String 타입일 때 사용 |
precision, scale | BigDecimal 타입에서 사용. precision: 소수점을 포함한 전체 자릿수 설정. scale: 소수의 자릿수 설정 |

| 속성 | 기능 |
|---|---|
name | 매핑할 테이블의 이름을 지정합니다. |
catalog | DB의 catalog를 맵핑합니다. |
schema | DB 스키마와 맵핑합니다. |
uniqueConstraint | DDL 쿼리를 작성할 때 제약 조건을 생성합니다. |

| 속성 | 기능 |
|---|---|
name | 맵핑할 테이블의 컬럼 이름을 지정합니다. |
insertable | 엔티티 저장 시 선언된 필드도 같이 저장합니다. |
updateable | 엔티티 수정 시 이 필드를 함께 수정합니다. |
table | 지정한 필드를 다른 테이블에 맵핑할 수 있도록 합니다. |
nullable | NULL을 허용할지, 허용하지 않을지 결정합니다. |
unique | 제약 조건을 걸 때 사용합니다. |
columnDefinition | DB 컬럼 정보를 직접적으로 지정할 때 사용합니다. |
length | varchar의 길이를 조정합니다. 기본값으로 255가 입력됩니다. |
precision, scale | BigInteger, BigDecimal 타입에서 사용합니다. 각각 소수점 포함 자리수, 소수의 자리수를 의미합니다. |
@Getter
@Builder
public class User {
private String username;
private String password;
private String email;
}
User user = User.builder()
.username("abc")
.password("password123")
.email("abc@example.com")
.build();
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 주문과 상품의 관계는 OneToMany(일대다)로 정의됨
@OneToMany(mappedBy = "order") // Order 엔티티는 여러 Product 엔티티를 가질 수 있음
private List<Product> products;
}
@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;
}