JPA를 활용하여 Entity 코드를 작성할 때, 필요한 어노테이션들 중 대표적인 몇 개의 기능을 간략하게 알아보려고 한다.
@Entity
@Table(
name = "members",
uniqueConstraints = {
@UniqueConstraint(name = "EMAIL_UNIQUE", columnNames = {"email"})
}
)
@Builder
@Getter // Setter는 무결성을 위해 제외 권장
@NoArgsConstructor(access = AccessLevel.PROTECTED) // JPA용 기본 생성자
@AllArgsConstructor // 모든 필드 생성자
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_name", nullable = false, length = 50)
private String username;
private String email; // @Column 생략 시 필드명 그대로 컬럼 생성
@Enumerated(EnumType.STRING) // 반드시 STRING 사용!
private RoleType roleType;
}
데이터베이스의 테이블과 직접 연결되는 핵심 클래스이다.
속성
name:
catalog/schema:
uniqueConstraints:
주의사항
@Entity가 붙은 클래스는 파라미터가 없는 public 또는 protected 생성자가 반드시 있어야 한다.final, enum, interface를 사용할 수 없다.테이블의 기본키(PK, Primary Key)를 지정한다.
@Entity 클래스 내에 반드시 하나 이상 존재해야 한다.
기본 키의 생성 전략을 설정한다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
strategy
GenerationType.IDENTITY: DB에 비어있는 채로 넣으면 DB가 알아서 PK값을 채워준다. DB가 알아서 내부의 AUTO_INCREMENT 기능을 작동시켜 1, 2, 3, ... 순서대로 번호가 매겨진다.
GenerationType.SEQUENCE: DB 시퀀스를 사용해 값을 생성한다. DB가 생성해 둔 전용 시퀀스에서 번호를 먼저 받아와 엔터티를 할당한다.
GenerationType.AUTO: DB 방언에 맞춰 JPA가 자동으로 전략을 선택한다.
객체 필드를 테이블 컬럼에 매핑하며, 컬럼의 제약조건을 설정한다.
속성
name:
테이블의 실제 컬럼 이름을 지정한다.
nullable:
false로 설정하면 NOT NULL 제약조건이 붙는다.
length:
문자열 데이터의 길이를 제한한다.(기본값 255)
자바의 Enum(열거형) 타입을 테이블 컬럼에 매핑한다.
주의사항
@Enuerated(EnumType.STRING)으로 사용해야 한다.EnumType.STRING은 enum을 이름 순서대로 저장한다.EnumType.ORDINAL을 쓰면 순서(0, 1, 2, ...)가 저장되어, 추후 Enum사이에 새 값이 추가될 때 데이터가 꼬일 수 있다.반복적으로 작성해야하는 코드들(매서드,생성자 등)을 어노테이션으로 자동 생성해 주는 라이브러리
GoF 디자인 패턴 중 하나인 빌더(Builder) 패턴을 어노테이션으로 자동 생성해준다.
속성
객체를 생성할 때 생성자 파라미터의 순서 오류를 방지하고, 코드의 가독성을 극대화한다.
주의사항
생성자를 쓰면 new Member("홍길동", "hong@google.com")처럼 순서를 맞춰야 한다.
필드 값의 조회(getter)와 변경(setter)을 위한 메스드를 자동으로 생성한다.
주의사항
엔터티에는 데이터 무결성을 위해 @Setter를 가급적 사용하지 않거나 꼭 필요한 곳에만 별도로 메서드를 만드는 것이 좋다.
파라미터가 없는 기본 생성자를 자동으로 생성한다.
Tips
JPA는 프록시 기술 구현을 위해 기본 생성자가 필수이다. 무분별한 객체 생성을 막기 위해 @NoArgsConstructor(access = AccessLevel.PROTECTED) 방식을 권장한다.
클래스의 모든 필드를 파라미터로 받는 생성자를 자동으로 생성한다.
속성
빌더 패턴(@Builder)과 함께 사용하여 깔끔하게 객체를 생성할 때 자주 조합된다.