스프링 공부/JPA

[JPA] 7. 필드와 컬럼 매핑

장아장 2022. 10. 20. 20:14

테이블 자체를 매핑했다면, 테이블 내에 있는 컬럼을 필드와 매핑해주어야 한다. 

이를 위해 사용하는 몇가지 어노테이션부터 정렬해보자면, 

@Column 일반적인 데이터베이스의 컬림 명시
@Temporal 자바의 Time, Date, TimeStamp을 매핑한다. (요즘은 LocalDate, LocalDateTime을 사용하기에 잘 쓰지 않는다. . )
@Enumrated enum타입을 쓸 때, 그 값을 어떻게 저장할지 정해준다. 
@Lob 사이즈가 매우 큰 문자열 저장에 쓰인다. 
@Transient 해당 자바 변수를 매핑하고 싶지 않을 때 쓴다. 

이렇게가 존재한다. 

 

표에 다 적긴 힘들어서 하나씩 부연설명을 적어야 할 것 같다. 

@Column : 기본적인 컬럼 매핑에 사용한다. 즉, 이게 적혀있다면 데이터베이스 테이블의 컬럼이라는 뜻. 소괄호 안에 아래의 요소가 들어간다. 

  • Name : 매핑할 테이블의 컬럼 이름을 명시해줄 수 있다. (기본값은 필드 명을 그대로 )
  • Insertable : insert문이 나갈 때 이 컬럼을 등록할지 말지를 명시한다. 
  • Updatable : update문이 나갈 때 이 컬럼을 등록할지 말지 명시한다. 
  • Nullable : 객체를 새로 저장할때, null을 허용할지를 명시한다. 
  • Unique : 컬럼의 유니크 제약조건을 넣어준다. 문제는 JPA는 제약조건의 이름이 랜덤값이므로 사용하지 않고, 테이블에 @UniqueConstraints 어노테이션을 써서 제약조건명을 따로 넣어 사용한다. 
  • Length : 문자열 길이의 제한(기본값 = 255)
  • columnDefinition : 데이터베이스의 컬럼 정보를 직접 줄 수 있다. (ex. default = ???)
  • precision/Scale : 아주 작은 소수점을 쓸 때 사용한다. 

@Enumrated : enum타입을 쓸 때, 값을 어떻게 저장시킬지 정한다. 

  • Ordinal : enum 클래스를 만들어보면, 안에 순서대로 값들이 입력되어있다. Ordinal은 어플리케이션에서 작성된 enum 값의 index를 저장한다.
    • 이는 문제가 있다. enum 클래스를 수정하면, 그 index가 바뀔 수 있고, 이를 통해 원래 저장했던 값과 다른 결과를 만들 수 있다. 
  • String : enum 값을 그대로 문자열로 저장한다. 

@Temporal : 요즘은 LocalDate, LocalDateTime을 이용한다. 

 

@Lob : 지정된 속성이 존재하지는 않는다. 매핑 필드 타입이 문자열이면 CLOB, 나머지는 BLOB라고 하는데, 데이터베이스의 종류에 따라 다르게 저장되기도 한다. 

 

@Transient : 데이터베이스에 해당 객체를 매핑시키지 않는 경우에 작성한다.