Skip to content

Latest commit

 

History

History
114 lines (82 loc) · 2.43 KB

enumerated-attributeconverter.md

File metadata and controls

114 lines (82 loc) · 2.43 KB

Enumerated, AttributeConverter

public enum Role {
	ADMIN, USER;
}

ORDINAL

  • 데이터를 enum에 정의되어있는 값들의 순서를 DB값으로 넣는다.
  • 저장 공간은 효율적이지만, ENUM 값 순서가 바뀌거나 중간에 추가 또는 삭제하기 까다롭다.
  • 참고로 Enumerated를 설정해주지 않으면 ORDINAL과 동일하게 동작한다.
@Entity
public class User {

	@Id @GeneratedValue
	private Long id;

	@Enumerated(EnumType.ORDINAL)
	private Role role;

	... constructors
}

ordinal

STRING

  • 데이터를 enum에 정의되어있는 값 그 자체를 DB값으로 넣는다.
  • 저장 공간이 비효율적이지만, 언제든지 ENUM 값의 추가와 삭제에 자유롭다.
  • 요즘은 DB가 워낙 좋아져 이 방식을 이용한다고 해서 크게 문제 되지 않고 상황에 따라 대처하면 된다.
@Entity
public class User {

	@Id @GeneratedValue
	private Long id;

	@Enumerated(EnumType.STRING)
	private Role role;

	... constructors
}

string

AttributeConverter

  • 컨버터를 구현해서 컬럼과 연결해주면 DB -> Enum, Enum -> DB 데이터를 자유롭게 설정할 수 있다.
@Getter
public enum Role {
    
	ADMIN("관리자", "3"),
	USER("사용자", "1");

	private String key;
	private String value;

	Role(String key, String value) {
		this.key = key;
		this.value = value;
	}

	public static Role from(String value) {
		return Arrays.stream(Role.values())
			.filter(v -> value.equals(v.value))
			.findAny()
			.orElseThrow();
	}
}
  • convertToDatabaseColumn : Enum -> db data
  • convertToEntityAttribute : db data -> Enum
@Converter
public class RoleConverter implements AttributeConverter<Role, String> {

	@Override
	public String convertToDatabaseColumn(Role attribute) {
		return attribute.getValue();
	}

	@Override
	public Role convertToEntityAttribute(String dbData) {
		return Role.from(dbData);
	}
}
public class User {

    ...

	@Convert(converter = RoleConverter.class)
	private Role role;
}

converter

References