Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- java
- IoC
- SOLID
- 싱글톤패턴
- 클라이언트사이드렌더링
- 애너테이션
- 다형성
- 항해99
- 변경감지
- 자바의정석
- 비정적중첩클래스
- 정적중첩클래스
- DI
- refreshtoken
- publicapi
- 스프링컨테이너
- bean
- privateapi
- 9기
- 서버사이드렌더링
- 지네릭스
- github actions
- Spring
- 스파르타코딩클럽
- 인수테스트
- Velog
- 더티채킹
- 항해99 9기
- 인프콘
- 일급컬렉션
Archives
- Today
- Total
멈재
[Spring/JPA] 14. AttributeConverter로 코드의 가독성을 높여보자 본문
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
참고
https://astrid-dm.tistory.com/497
'JAVA & Spring & JPA' 카테고리의 다른 글
[JAVA] 20. 동일성(identity)과 동등성(equality) (0) | 2023.01.08 |
---|---|
[JAVA] 18. 상속(IS-A) VS 구성(HAS-A) (0) | 2023.01.02 |
[JAVA] 13. JAVA의 HashSet은 어떻게 동작할까? (1) | 2022.12.19 |
[JAVA/Spring] 10. CQS 패턴 (Command Query Separation) (0) | 2022.12.17 |
[JAVA] 08. 일급 컬렉션(First Class Collection) (0) | 2022.10.19 |