프로젝트에서 Enum 사용해보기


지금까지 프로젝트에서 Enum을 사용할 때, 남성/여성을 표현하기 위해 사용해본 적이 있다.
JPA 프로젝트에서 enum을 사용하는 방법은 다음과 같다.


@Enumerated

@Enumerated 은 두가지 저장 방법을 제공한다.




@Converter

DB에 값을 효율적이게 저장할 수 있는 방법이 바로 @Converter 이다.

@Convertor
아래와 같은 구조로 사용된다.
영속성 컨텍스트 > Convetor > DB
영속성 컨텍스트에 데이터가 들어가고, 실제 디비로 들어가거나 나오기 직전에
Convetor 로직이 있다면 돌고 난 후에 DB로 접근하게 되어있다.


프로젝트에 적용한 부분은 다음과 같다.
좋아요(Like) 기능을 게시글(Post)과 댓글에(Comment) 적용하기 위해
Type enum을 만들고 @Enumerated 사용의 문제점을 해결하기 위해
AttributeConverter를 구현했다.


@Entity
public class Like {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@Convert(converter = LikeTypeConverter.class)
	private Type type;

	@ManyToOne
	@JoinColumn(name = "user_id")
	private User user;

	private Long parentId;

	. . .

}


public enum Type {
	POST(1), COMMENT(2);

	public int type;

	Type(int type) {
		this.type = type;
	}

	public int toDbValue() {
		return type;
	}

	public static Type from(Integer dbData) {
		return Stream.of(Type.values())
			.filter(x -> x.type == dbData)
			.findFirst()
			.orElseThrow(IllegalArgumentException::new);
	}

}


@Converter
public class LikeTypeConverter implements AttributeConverter<Type, Integer> {

    // DB에 어떤 값이 저장되는지 
	@Override
	public Integer convertToDatabaseColumn(Type attribute) {
		return attribute.toDbValue();
	}
	
    // DB에서 Entity로 값을 넣을 때 어떤 값을 리턴하는지 
	@Override
	public Type convertToEntityAttribute(Integer dbData) {
		return Type.from(dbData);
	}
}


참고