티스토리 뷰
AttributeConverter
당신은 커피가 땡긴다 리펙터링 중, 잔의 사이즈 / 용량 단위 / 재료 와 같이 Enum 객체가 필요한 부분이 늘었다. Enum을 어떻게 효율적으로 저장하고 불러올 수 있는지 고민하던 중 AttributeConverter의 존재를 알게 되었다.
1. Enum 객체 생성
@Getter
public enum Category {
BASE("원액", 1L),
MILK("우유", 2L),
WATER("물/얼음", 3L),
CREAM("크림", 4L),
SYRUP("시럽", 5L);
private final String category;
private final Long code;
Category(String category, Long code) {
this.category = category;
this.code = code;
}
public static Category ofCode(Long dbData) {
return Arrays.stream(Category.values())
.filter(v -> v.getCode().equals(dbData))
.findAny()
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 카데고리 코드입니다."));
}
}
2. AttributeConverter를 implements 하여 Converter 객체 생성
@Converter
public class CategoryConverter implements AttributeConverter<Category, Long> {
@Override
public Long convertToDatabaseColumn(Category category) {
return category.getCode();
}
@Override
public Category convertToEntityAttribute(Long dbData) {
return Category.ofCode(dbData);
}
}
** 주의 **
AttributeConverter<X, Y> 의
X는 Entity Attribute
Y는 Database Column이며, Y에는 기본 타입(int, double)이 사용 불가능 하다.
3. Entity 클래스에 @Convert 어노테이션으로 컬럼 추가
@Entity
@Getter
@RequiredArgsConstructor
public class Ingredient {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name = "INGREDIENT_ID")
private Long id;
@Convert(converter = CategoryConverter.class)
private Category category;
@JsonBackReference와 @JsonManagedReference
- @JsonManagedReference
- 양방향 관계에서 정방향 참조할 변수에 어노테이션을 추가하면 직렬화에 포함된다
- @JsonBackReference
- 양방향 관계에서 역방향 참조로 어노테이션을 추가하면 직렬화에서 제외된다
직렬화(Serializable)란?
객체를 데이터스트림으로 만드는것이다. 객체 자체를 영속적으로 보관할때 사용하는데 파일형태로 저장되어 네트워크를 통해 전송이 가능하다.
직렬화 방법
- 표형태의 다량데이터를 직렬화 할때 CSV형태
- 구조적인 데이터는 XML, JSON형태
댓글