ABOUT ME

Today
Yesterday
Total
  • [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

Designed by Tistory.