[JPA] 컬럼 매핑

Bam·2025년 5월 16일
0

Spring

목록 보기
54/73
post-thumbnail

@Column

@Column은 컬럼 매핑에서 가장 많이 사용되는 어노테이션으로 엔티티의 필드를 테이블의 컬럼과 매핑할 때 사용합니다.

@Column
private String name;

@Column에서 사용되는 속성 값들은 다음과 같습니다.

속성설명
name필드와 매핑할 컬럼 이름. 기본 값으로 필드명을 사용
nullableNOT NULL의 사용 여부. false 시 NOT NULL
unique컬럼에 유니크 제약 조건을 걸 때 사용
lengthString 타입의 문자 길이 제약 조건 설정
insertable엔티티 저장 시 해당 필드를 저장.
기본적으로 true이며 false 시 엔티티 저장 시에 해당 필드를 저장하지 않음
updatable엔티티 수정 시 해당 필드도 수정
table하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용
columnDefinition컬럼 정보 직접 생성
ex) "VARCHAR(255) NOT NULL DEFUALT 'a' "
precision, scaleBigDecimal, BigInteger 타입 사용 시 큰 수나 정밀한 소수 저장을 위해 사용

nullable은 기본 값으로 true입니다. 그런데 자바 언어 특성상 기본 타입(int 등)에는 null 값이 올 수 없기 때문에 기본 타입을 생성하는 경우 명시적으로 nullable = false를 걸어주는 것이 좋습니다.


@Enumerated

@Enumerated는 자바의 Enum 타입을 매핑할 때 사용합니다.

속성설명
valueEnumType에 따라 데이터베이스 저장 형식 변경

EnumType에는 EnumType.ORDINAL, EnumType.STRING이 존재합니다.

  • EnumType.ORDINAL: Enum 정의 순서대로 저장
  • EnumType.STRING: Enum 정의된 이름 그대로 저장
public enum UserType {
	ADMIN,
    USER
}

위와 같은 Enum이 있다면 EnumType.ORDINAL에서는 ADMIN을 0, USER를 1로 저장하고 EnumType.STRING에서는 'ADMIN', 'USER'로 저장합니다.

EnumType.ORDINAL에서는 Enum의 순서를 변경하기가 어렵습니다. 만약 다음과 같이 Enum을 변경했을 때를 가정합니다.

public enum UserType {
	ADMIN,
    TESTER,
    USER
}

ADMIN은 0, TESTER는 1, USER는 2로 저장되게 됩니다. 이때 이전에 저장된 USER는 여전히 1 값을 저장해놓고 있기 때문에 불일치 문제가 발생하게 됩니다.
따라서 EnumType.STRING의 사용을 권장합니다.


@Temporal

@TemporalDate, Calendar와 같은 날짜 타입 매핑에 사용됩니다.

속성설명
valueTemporalType에 따라 데이터베이스 타입 매핑 변경.
필수로 지정해야 함

TemporalType은 다음 세 가지가 존재합니다.

  • TemporalType.DATE: 데이터베이스의 DATE 타입과 매핑
  • TemporalType.TIME: 데이터베이스의 TIME 타입과 매핑
  • TemporalType.TIMESTAMP: 데이터베이스의 TIMESTAMP 타입과 매핑, 날짜와 시간을 매핑

날짜 타입에서 @Temporal을 생략하면 TIMESTAMP(OracleDB, PostgreSQL 등), DATETIME(MySQL)과 자동으로 매핑됩니다.


@Lob

@Lob은 데이터베이스의 BLOB, CLOB 타입 매핑에 사용됩니다.

참조) MySQL의 BLOB 타입

@Lob은 속성이 따로 없습니다.

매핑 시 문자, 문자열인 경우에는 CLOB, 그 외 타입에 대해서는 BLOB을 매핑합니다.


@Transient

@Transient는 아무것도 매핑하지 않는 필드에 사용합니다. 단순히 객체에 어떤 값을 잠깐 저장하고자 할 때 사용합니다.


@Access

@Access는 JPA가 엔티티 데이터에 접근하는 방식을 지정합니다.

AccessType에 따라 접근 방식이 변경되며 다음과 같은 두 가지 접근 방식을 제공합니다.

  • AccessType.FILED: 필드 접근. 필드에 직접 접근합니다. 필드의 접근 제어자가 private로 선언되어 있어도 접근합니다.
  • AccessType.PROPERTY: 프로퍼티 접근. getter를 통해 접근합니다.

@Access@Id가 설정되어 있다면 따로 명시하지 않아도 자동으로 접근 방식을 결정합니다.

@Entity
@Access(AccessType.FILED)	//생략 가능
public class User1 {
	@Id	//@Id가 필드 레벨에 작성되었으므로 자동으로 AccessType.FILED 지정
	private int id;
}

@Entity
@Access(AccessType.PROPERTY)	//생략 가능
public class User2 {
	private int id;
    
    @Id	//@Id가 프로퍼티 레벨에 작성되었으므로 자동으로 AccessType.PROPERTY 지정
    public int getId() {
    	return this.id;
    }
}

0개의 댓글