[Wesell] Hibernate - @ColumnDefault

Kim Hyen Su·2024년 3월 2일
0
post-custom-banner

@ColumnDefault 어노테이션

⚠️ Trouble

  • enum 타입의 필드의 default 값을 설정하기 위해서 @ColumnDefault 어노테이션을 사용.
  • DDL Syntax 오류로 인해 테이블이 생성되지 않는 오류 발생함.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USER not null,
        a_uuid varchar(50) not null,

💻 Analyze

  • 처음에는 ddl 생성 설정을 create로 변경해주지 않았던 것이 원인인 줄 알았지만, 설정 변경 후 실행해보니 위와 같은 오류가 발생함.
  • @ColumnDefault 어노테이션을 제거 후 서버 재실행 시에 오류 발생 없이 정상적으로 ddl 발생 및 테이블이 생성됨.
  • String 타입의 필드에 @ColumnDefault 어노테이션 설정 후 재실행 했을 때도 오류 발생 없음.
  • 결론적으로 enum 타입의 필드에 @ColumnDefault 어노테이션을 추가했기 때문이다.

👀 Why

  • 원인을 찾아보기 위해 MySQL Documentation 을 읽어보던 중 Enum type 관련된 문서를 확인하였다.
  • 메뉴얼 상 enum 타입은 default 설정 시 ddl에 명시하는 것이 아니라, null을 허용하는 경우 null을 default 값으로 갖고, not null 인 경우 enum 내 항목 중 index(1) 인 항목이 default로 설정된다.

👨‍🔧 Trouble-Shooting

  • @ColumnDefault 어노테이션 제거.

    @Enumerated(EnumType.STRING)
    @Column(name= "a_role", nullable = false, length = 20)
    private Role role;
  • DTO 에서 Entity로 변환 시에 Role 을 초기화 해주는 방식으로 로직 수정.

    public AuthUser toEntity(CreateUserRequestDto createUserRequestDto) {
    
            String email = createUserRequestDto.getEmail();
            String password = createUserRequestDto.getPw();
            String uuid = createUserRequestDto.getUuid();
    
            return AuthUser.builder()
                    .email(email)
                    .password(password)
                    .uuid(uuid)
                    .role(Role.USER)
                    .build();
    }
profile
백엔드 서버 엔지니어
post-custom-banner

0개의 댓글