9.2 Entity 매핑과 전략 패전
JPA를 사용하기 위한 첫 단추는 자바의 클래스(Class)가 데이터베이스의 어떤 테이블(Table)과 연결될지 선언하는 것입니다. 이렇게 매핑된 클래스를 엔티티(Entity) 라고 부릅니다.
기본 매핑 애너테이션
엔티티를 매핑하기 위해 가장 필수적인 애너테이션은 @Entity와 @Id입니다.
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.AccessLevel;
@Entity
@Table(name = "users") // 테이블명을 소문자 복수형 등으로 명시하고자 할 때 사용
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED) // JPA는 기본 생성자가 필수입니다.
public class User {
@Id // 이 필드가 테이블의 PK(Primary Key)임을 알림
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 카멜케이스 userEmail은 자동으로 스네이크케이스 user_email로 컬럼 매핑됩니다.
@Column(nullable = false, length = 100, unique = true)
private String userEmail;
@Column(nullable = false)
private String password;
@Column(length = 50)
private String nickname;
// 비즈니스 로직(예: 닉네임 변경)을 위한 편의 메서드
public void changeNickname(String newNickname) {
this.nickname = newNickname;
}
}
@Entity: 이 클래스가 JPA가 관리하는 엔티티임을 명시합니다.@Id: 이 필드가 기본 키(PK)임을 나타냅니다.@Column: 객체 필드와 테이블 컬럼을 매핑합니다. DB 테이블 스키마의 제약조건(nullable,unique,length)을 설정할 수 있습니다. (설정하지 않아도 필드가 있으면 자동으로 컬럼으로 인식합니다.)
기본 키(PK) 생성 전략 (@GeneratedValue)
데이터베이스마다 식별자를 자동 생성해 주는 방식이 다릅니다. 이 차이를 극복하기 위해 전략(strategy) 값을 제공합니다.
GenerationType.IDENTITY(가장 권장됨): 기본 키 생성을 데이터베이스에 위임합니다. MySQL의AUTO_INCREMENT가 이에 해당합니다. 저장이 이루어진 후에야 ID 값을 알 수 있습니다.GenerationType.SEQUENCE: 데이터베이스의 시퀀스(Sequence) 오브젝트를 사용하여 키를 생성합니다. Oracle, PostgreSQL 등에서 주로 쓰입니다.GenerationType.UUID(JPA 최신): 분산 환경이나 유추하기 힘든 키가 필요할 때 32자리 UUID 문자열을 자동 생성합니다. (Id 타입이UUID또는String이어야 합니다)
엔티티 설계를 완료하고 애플리케이션을 기동하면, application.yml의 ddl-auto: update 옵션을 통해 JPA가 엔티티 구조를 분석하여 데이터베이스에 자동으로 테이블을 CREATE 해주는 모습도 볼 수 있습니다.