관리 메뉴

너와 나의 스토리

[SpringBoot] JPA Converter 적용 / Converter null 처리 본문

개발/Spring Boot

[SpringBoot] JPA Converter 적용 / Converter null 처리

노는게제일좋아! 2023. 3. 5. 00:00
반응형

JPA Converter 사용법

  • Member라는 entity가 있고, member는 role을 가진다. 
  • role은 enum으로 선언되어 있는데, 디비에는 int형으로 member의 role을 저장하고, 불러올 때는 다신 MemberRoleType으로 가져오려고 한다.

 

1. ConvertibleEntity를 implements하여 member role을 매핑할 enum 객체를 만든다.

@Getter
public enum MemberRoleType implements ConvertibleEntity<MemberRole> {
    Owner(1) {
        @Override
        public MemberRole asModel() {
            return MemberRole.Owner;
        }
    }, Member(2) {
        @Override
        public MemberRole asModel() {
            return MemberRole.Member;
        }
    };
	...
}
  • MemberRole: 도메인 영역에서 사용하는 member role enum 객체

2. DB에 저장된 int형을 MemberRoleType으로 변환해 줄 Converter 생성

@Converter
public class MemberRoleTypeConverter implements AttributeConverter<MemberRoleType, Integer> {
    @Override
    public Integer convertToDatabaseColumn(MemberRoleType attribute) {
        return attribute.getCode();
    }

    @Override
    public MemberRoleType convertToEntityAttribute(Integer dbData) {
        return MemberRoleType.of(dbData);
    }
}

 

3. Entity 필드 위에 @Convert 어노테이션 붙이기

@Entity
@Table(name = "member")
...
public class MemberEntity extends TimeAuditingEntity implements ConvertibleEntity<Device> {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "nick_name", unique = true, nullable = false)
    private String nickName;
    
    @Column(name = "name", nullable = false)
    private String name;

    @Column(name = "role", nullable = false)
    @Convert(converter = MemberRoleTypeConverter.class)
    private MemberRoleType role;

	...
}

 

 

Converter NULL 처리하는 방법

  • MemberRoleType을 나중에 추가하여 이미 디비에 해당 필드 없이 값들이 들어있다면, 실행 시 에러가 발생한다.
  • 이러한 문제로 MemberRoleType을 nullable하게 수정하여 작업을 할 수 있을 것이다.
    • 하지만, 이렇게 하면 MemberRoleType을 convert하는 과정에서 MemberRoleType이 null인 경우 에러가 발생하게 된다.
    • 이때, MemberRoleType이 null이여도 convert하기 위해서는 MemberRoleTypeConverter를 다음과 같이 수정해야 한다.
@Converter
public class AllocatorTypeConverter implements AttributeConverter<AllocatorEntityType, Integer> {

    @Override
    public Integer convertToDatabaseColumn(AllocatorEntityType attribute) {
        return attribute != null ? attribute.getCode() : null;
    }

    @Override
    public AllocatorEntityType convertToEntityAttribute(Integer dbData) {
        return dbData != null ? AllocatorEntityType.of(dbData) : null;
    }
}
반응형
Comments