멈재

[Spring/JPA] 14. AttributeConverter로 코드의 가독성을 높여보자 본문

JAVA & Spring & JPA

[Spring/JPA] 14. AttributeConverter로 코드의 가독성을 높여보자

멈재 2022. 12. 20. 00:38
728x90

AttributeConverter를 찾아보게 된 배경은 최근 프로젝트에서 YN 필드를 두어 삭제 시 UPDATE 하는 방법을 고민해보라는 것에서 시작되었다.

 

이름에도 쓰여있듯 어떤 변환을 위한 용도로 사용되고, 나로서는 단순히 가독성을 높이기 위함이었지만 주로 다음과 같은 상황에서 사용이 된다고 한다.

1. JPA가 지원하지 않는 타입을 매핑하는 경우
2. 두 개 이상의 속성을 갖는 밸류 타입을 한 개 칼럼으로 매핑하는 경우
참고: https://gunju-ko.github.io/jpa/2020/11/14/AttributeConverter.html

 

결론적으로, 내가 원했던 건 엔티티에서는 Boolean 타입으로 true / false 값을 저장하고 싶었고, DB에는 Y / N 형태로 저장하고 싶었다. 

분명 좋은 상황과 적절한 예시는 아니겠지만 응용할 곳은 정말 많으리라 생각된다. 특히, Enum에 적용할 때가 정말 유용할 것 같다.

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Employee {

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

    private String employeeId;

    private String nickname;

    @Convert(converter = BooleanToStringConverter.class)
    private Boolean isEnter;

    public Employee(String nickname) {
        this.employeeId = UUID.randomUUID().toString().substring(0, 8);
        this.nickname = nickname;
        this.isEnter = true;
    }

    public Boolean changeEnter() {
        isEnter = !isEnter;
        return isEnter;
    }
}
@Converter
@Slf4j
public class BooleanToStringConverter implements AttributeConverter<Boolean, String> {
    @Override
    public String convertToDatabaseColumn(Boolean attribute) {
        // Entity -> DB
        String convertString = String.valueOf(attribute);
        log.info("Entity -> DB:: old = {}, new = {}", attribute, convertString);

        return attribute == true ? "Y" : "N";
    }

    @Override
    public Boolean convertToEntityAttribute(String dbData) {
        // DB -> Entity
        Boolean convertBoolean = Boolean.valueOf(dbData);
        log.info("DB -> Entity:: old = {}, new = {}", dbData, convertBoolean);

        return dbData.equals("Y") ? true : false;
    }
}

 

 

[전체 코드]

https://github.com/ahn-sj/spring-box/tree/master/simple-mockmvc-controller-test

 

GitHub - ahn-sj/spring-box: I want to handle the spring better. This repository is for me to apply what I've learned

I want to handle the spring better. This repository is for me to apply what I've learned - GitHub - ahn-sj/spring-box: I want to handle the spring better. This repository is for me to apply wha...

github.com

 

 

참고

https://astrid-dm.tistory.com/497