JPA

[JPA] @Column / @Enumerated 속성

솔솔 2021. 7. 2. 08:57
반응형

@Column 컬럼을 매핑

  • name : 필드와 매핑할 테이블의 컬럼 이름
@Column(name = "name") 
private String username;
  • insertable / updateable : 등록, 변경 가능 여부 / 기본값 : TRUE
//DB에 insert문이 처리될 때 할건지 말건지 / update문 처리될때 반영할건지 말건지 
@Column(insertable=true, updatable=true) 
private String username;
  • nullable : null 값의 허용 여부 설정 (false로 설정하면 DDL 생성시 not null 처리) / 기본값 : TRUE
// false일 경우, not null 제약조건이 걸린다
@Column(nullable=false) 
private String username;
  • unique : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다.
//unique를 걸어주는 작업이지만 잘 사용하지않음.. 이유는 unique가 생성되면서 unique명이 랜덤으로 지정되어 운영에서 사용X.. 그래서 위 @Table 에서 지정해주는것을 선호
@Column(unique=true) 
private String username; 
  • columnDefinition : 데이터베이스 컬럼 정보를 직접 줄 수 있다.
//DB컬럼 정보를 직접 넣어주는 것
@Column(columnDefinition="varchar(100) default 'EMPTY'") 
private String username; 

  • length : 문자 길이 제약조건, String 타입에만 사용한다.
  • percision / scale : BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다) percision은 소수점을 포함한 전체 자릿수, scale은 소수의 자릿수. double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다.
//숫자일 경우.. precision : 소수점을 포함한 전체 자릿수, scale : 소수의 자릿수
@Column(precision=19, scale=2)
private Integer age;

 

 

@Enumerated enum 타입 매핑

EnumType.ORDINAL : enum 순서를 DB에 저장 (Integer Type으로 저장) :: 기본값

EnumType.STRING : enum 이름을 DB에 저장 (String Type으로 저장)

 

enum class를 이렇게 설정해두고

RoleType.java

public enum RoleType { 
	USER, ADMIN
}

 

EnumType.ORDINAL Type으로 실행했을 경우

Member member = new Member();
member.setId(200L);
member.setUsername("A");
member.setRoleType(RoleType.USER);

ROLETYPE은 USER이 순서인 0이 된다.

 

Member member = new Member();
member.setId(201L);
member.setUsername("B");
member.setRoleType(RoleType.ADMIN);

ADMIN을 넣게되면 ADMIN 순서인 1이 DB에 저장된다.

* 여기서 ORDINAL을 사용하면 안되는 이유가 나온다..

enum에 데이터를 추가할 경우, 순서가 변경된다면? 기존에 DB에 넣어진 데이터들이 망가지게된다..

public enum RoleType { 
	TEST, USER, ADMIN
}

enum에 TEST를 추가한 후 TEST의 값을 넣었을 경우

Member member = new Member();
member.setId(202L);
member.setUsername("C");
member.setRoleType(RoleType.TEST);

방금 TEST로 넣은 3번째 데이터도 ROLETYPE이 0이 되었다..

이러한 문제 때문에 기본값인 EnumType.ORDINAL은 사용하면 안된다.

 

그래서 사용하는 것이 EnumType.STRING

@Enumerated(EnumType.STRING) //객체에서 enum Type을 사용하고싶을때
private RoleType roleType; 
Member member = new Member();
member.setId(200L);
member.setUsername("A");
member.setRoleType(RoleType.USER);

저장된 데이터를 보면 String 형식으로 들어간 것을 볼 수 있다.

 

데이터를 아끼려다가 큰장애를 내는 것 보다 EnumType.STRING을 꼭 사용하는 것을 권장한다.

 

 

인강으로 공부하면서 작성하는 글로 잘못된 정보가 있을 수도 있습니다! 잘못된 정보가 있을 시 댓글달아주세요 : 0

반응형