프로그래밍/백엔드 스프링부트

엔티티 애너테이션

Mt.Hwang 2025. 5. 11. 11:12

 * 엔티티 애너테이션

 엔티티 클래스
데이터베이스 테이블에 매핑되는 객체. 
해당 테이블의 데이터 구조를 표현

실제 데이터베이스 CRUD 로직은 리포지토리 계층에서 처리


애너테이션 목록
 1. @Entity : 엔티티로 등록
 2. @Table : 매핑 테이블 지정
 3. @Id : 기본 키로 지정
 4. @IdClass : 기본 키로 여러 속성을 쓸 때 사용
 5. @GeneratedValue : 기본키 생성 방법 지정
 6. @Column : 매핑 속성 지정
 7. @ManyToOne : 다대일 관계 명시
 8. @OneToMany : 일대다 관계 명시
 9. @ManyToMany : 다대다 관계 명시
 10. @OneToOne : 일대일 관계 명시
 11. @JoinColumn : 외래키 명시
 12. @Enumerated : Enum 타입 지정
 13. @Embedded : 복합값을 쓸 때 사용
 14. @Version : 낙관적 락 처리

..~~~~..

 * 클래스에 사용하는 애너테이션

@Entity
해당 클래스를 엔티티로 등록

@Table(name = "테이블명")
해당 클래스를 명시한 테이블명과 매핑

@IdClass 
기본 키 클래스를 사용할 때 명시

..~~~~..

 * 기본키 관련 애너테이션

@Id
필드를 기본 키로 지정
기본키가 여러개인 경우 -> 기본 키 클래스를 만들어야 함


@GeneratedValue
기본 키 생성 방법 정의

사용 형식은
@GeneratedValue(strategy = GenerationType.방식, generator = "객체명 or 테이블명")

generator은 SEQUENCE, TABLE 방식일 떄만 사용

방식 종류는
 1. IDENTITY : 기본 키 자동 증가 방식. generator는 사용 x
 2. SEQUENCE : 시퀀스 객체를 통해 기본 키 생성. generator에 시퀀스 객체명 사용
 3. AUTO : 자동 선택. JPA 구현체에 따라 자동 선택됨. generator은 사용 x
 4. TABLE : 테이블 기반으로 기본키 생성. 기본 키 관리 테이블을 사용한다. generator에 테이블명 명시


자동 생성 키의 경우 엔티티 객체를 만들 때
생성자에 해당 필드의 값을 null 혹은 0을 넣어줘야 한다
그러면 스프링 데이터 JPA가 알아서 값을 채워줌

..~~~~..

 * 복합 기본 키 사용 (composite primary key)

기본 키가 여러개일 때 사용

순서는
 1. 복합 기본 키 클래스 만들기. 이름은 보통 엔티티명Id.class ex) GroupId.class
 2. 복합 기본 키 클래스로 Serializable 상속. implements Serializable
 3. 복합 기본 키 클래스에 사용 복합 키 정의. ex) private int userId, private int groupId
 4. 복합 기본 키 클래스에 @EqualsAndHashCode 적용
 5. 엔티티 클래스에 @IdClass 적용 ex) @IdClass(GroupId.class)


다만 JPA는 복합키 각각에 @GeneratedValue를 적용하는 것을 지원하지 않음
-> uuid, 시퀀스 직접 제어 등을 사용


ex)
Group 엔티티가 userId, groupId를 복합 기본 키로 사용하는 경우

@EqualsAndHashCode
class GroupId implements Serializable {
  private int userId;
  private int groupId;
}

@Entity
@IdClass(GroupId.class)
class Group {
  @Id
  @Column(...)
  private int userId;

  @Id
  @Column(...)
  private int groupId;
}

..~~~~..

 * 필드 관련 애너테이션

@Column
필드와 매핑될 속성 지정

매개변수는
 1. name = "속성명"
 2. length = int 값 
 3. nullable = boolean 값
 4. unique = boolean 값

ex)
@Column(name = "group_key", length = 100, nullable = false, unique = true)


@JoinColumn 
외래키 지정

매개변수는
 1. name = "외래키명"
 2. referencedColumnName = "참조되는 속성"

ex)
@JoinColumn(name = "user_id", referencedColumnName = "user_id)


@Enumerated
Enum 타입 지정

매개변수는
 1. EnumType.ORDINAL : 순서 값 사용
 2. EnumType.STRING : 이름 값 저장


@Embedded
복합 값을 하나의 객체로 정의하고 엔티티에서 사용


@Version
낙관적 락을 처리하기 위한 버전 필드 정의 (Optimistic Locking)
데이터베이스에서 여러 사용자가 동시에 데이터를 수정할 때, 충돌을 방지하기 위한 버전 필드

..~~~~..

 * 엔티티 생성자

엔티티 클래스는 반드시 기본 생성자가 있어야 함
스프링 데이터 JPA가 프록시 생성을 하기 위해서

..~~~~..

'프로그래밍 > 백엔드 스프링부트' 카테고리의 다른 글

MySQL (맥북)  (0) 2025.07.04
스프링부트 설정파일  (1) 2025.07.04
DAO와 DTO  (0) 2025.05.02
도메인 모델  (0) 2025.05.02
리포지토리 계층  (0) 2025.05.02