-
[Spring] DB 상태 테이블, Enum 관리 Converter 사용해보자Spring JPA 2024. 7. 4. 11:40
이 글은 프로젝트를 진행하면서 공부한 내용이다
들어가기
erd 테이블 예시이다
위와 같이 회원 Table 에서 user_status_id 는 값이 정해져 있다 (휴먼, 활성화, 삭제 등등)
user_sex 도 정해져 있다 (남자, 여자)
image_status 도 정해져 있다 (썸네일, 본문, 회원)
ddl 문을 보면 다음과 같다
CREATE TABLE `user` ( ... `user_status_id` ENUM('휴먼', '활성화', '삭제') NOT NULL, `user_sex` ENUM('남자', '여자') NULL, ... );
이와 같이 값이 정해져 있는 데이터들은 Spring에서 어떻게 해야할까?=> Enum Converter를 사용하면 된다
사용법
UserStatus enum 클래스
import lombok.Getter; import java.util.Arrays; @Getter public enum UserStatus { ACTIVATE("활성화"), DORMANT("휴먼"), DELETE("삭제"), MANAGER("관리자"); private final String name; UserStatus(String name) { this.name = name; } public static UserStatus fromName(String name) { return Arrays.stream(UserStatus.values()) .filter(e -> e.name.equals(name)) .findAny() .orElseThrow(() -> new IllegalArgumentException("User Status 데이터가 잘못 되었습니다")); } }
Enum에서 필요한 데이터를 필드 값에 추가한다 그리고 fromName 정적 메서드를 통하여 db에서 데이터를 읽어 JPA entity 매핑할때 Enum과 db 테이블 값이 자동으로 컨버팅 하게 만들어준다
Converter 클래스
import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; @Converter(autoApply = true) public class UserStatusConverter implements AttributeConverter<UserStatus, String> { @Override public String convertToDatabaseColumn(UserStatus userStatus) { return userStatus.getName(); } @Override public UserStatus convertToEntityAttribute(String dbData) { return UserStatus.valueOf(dbData); } }
1. @Converter 어노테이션
- @Converter 어노테이션을 사용한다 autoApply = true로 설정하면 이 컨버터가 모든 UserStatus 속성에 자동으로 적용된다
2. AttributeConverter 인터페이스 구현
- AttributeConverter<X, Y>를 implements 해준다
- AttributeConverter<UserStatus, String> 이렇게 설정하면 이 인터페이스는 UserStatus 타입의 필드를 데이터베이스에 문자열로 저장하고 그 반대로 변환하는 메서드를 정의한다
3. convertToDatabaseColumn(), convertToEntityAttribute() 오버라이딩
- 두 메서드를 오버라이딩을 한다음 메서드 이름에 맞게 재정의 하면 된다
User 클래스
import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import solitour_backend.solitour.user.user_status.UserStatus; import solitour_backend.solitour.user.user_status.UserStatusConverter; import java.time.LocalDateTime; import solitour_backend.solitour.user_image.UserImage; @Entity @Getter @Builder @Table(name = "user") @AllArgsConstructor @NoArgsConstructor public class User { @Id @Column(name = "user_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "user_status_id") @Convert(converter = UserStatusConverter.class) private UserStatus userStatus; ... }
마무리
상태 값을 관리하는 enum converter를 알아 보았는데
개발을 하다보니 위와 같이 convertToDatabaseColumn() 과 convertToEntityAttribute() 메서드와 Converter 클래스 코드들이 반복이 많아 지는 것 같다
이 부분에서 AttributeConverter 를 커스터 마이징 하는 방법으로 코드를 줄이면 될 것 같지만
작자는 시간이 없는 관계로 하지 않고 관련된 url를 포스팅만 하겠다https://techblog.woowahan.com/2600/
Legacy DB의 JPA Entity Mapping (Enum Converter 편) | 우아한형제들 기술블로그
{{item.name}} 안녕하세요. 저는 우아한형제들 비즈상품개발팀의 이은경입니다. Legacy DB의 JPA Entity Mapping (복합키 매핑 편)에 이어 저는 DB의 코드값과 Java Enum을 연결해주는 과정에서 유용하게 사용
techblog.woowahan.com
'Spring JPA' 카테고리의 다른 글
[Spring JPA] JPA N+1 문제 (1) 2024.10.13 [Spring JPA] entity의 생성일, 수정일 어떤식으로 할까 (0) 2024.09.11 [Spring] 즉시(Eager) 로딩 과 지연(Lazy) 로딩 (0) 2024.08.11 [Spring] OSIV 란? (0) 2024.05.24