[Trouble shooting] No enum constant error

정의정·2024년 2월 28일
0

Trouble Shooting

목록 보기
2/3
post-thumbnail

💥 문제 상황

대외 활동 목록 조회 API를 테스트 하는 중 에러가 발생했습니다.
대외 활동 목록 조회 API를 구현하고, 임의의 데이터를 삽입한 후 Postman으로 응답 결과를 확인하려는 참이었습니다.

그러나 기대한 응답 결과가 아닌 다음과 같은 에러 응답이 돌아왔습니다.

{
    "code": 400,
    "message": "No enum constant com.fasttime.domain.reference.entity.RecruitmentStatus.before",
    "data": null
}

💡 원인

ENUM 상수 없음 에러? 처음보는 에러였기 때문에 정확한 에러 메시지를 보기 위해 서버 로그를 살펴봤습니다.

Resolved [org.springframework.dao.InvalidDataAccessApiUsageException: No enum constant com.fasttime.domain.reference.entity.RecruitmentStatus.before]

RecruitmentStatus ENUM에 정의된 상수 외의 값이라는 내용이었습니다.
구글에 검색한 결과 해당 에러는 DB에 저장된 데이터가 ENUM에 정의된 상수 값 외의 값을 가지고 있는 경우 발생할 수 있다고 합니다.

ENUM과 DB에 임의의 데이터를 삽입하던 SQL문을 확인해봤습니다.

ENUM

public enum RecruitmentStatus {

    BEFORE, DURING, CLOSED
}

SQL

INSERT INTO `fast-time`.`activity` (`id`, `title`, `organization`, `corporate_type`, `participate`, `start_date`, `end_date`, `period`, `recruitment`, `area`, `preferred_skill`, `homepage_url`, `field`, `activity_benefit`, `bonus_benefit`, `description`, `image_url`, `status`) 
VALUES 
('1', 'test1', 'organization1', '중소기업', '대학생', '2024-02-28', '2024-03-01', '24-07-01 ~ 24-12-31', '20', '강남', '우대사항', '홈페이지 URL', '활동 분야', '활동 혜택', '추가 혜택', '테스트 대외활동입니다.', '이미지URL', 'BEFORE'),
('2', 'test2', 'organization1', '중소기업', '대학생', '2024-02-27', '2024-02-29', '24-07-01 ~ 24-12-31', '20', '강남', '우대사항', '홈페이지 URL', '활동 분야', '활동 혜택', '추가 혜택', '테스트 대외활동입니다.', '이미지URL', 'BEFORE')
;

ENUM과 SQL문에서는 문제를 찾을 수 없었습니다.

다음으로 DB에 저장한 데이터를 살펴봤습니다.

분명 'BEFORE'로 저장한 status 값이 소문자 'before'로 저장되어 있었습니다.

이유가 무엇일까요??

테이블 정보를 살펴보니 ENUM에 정의된 상수들이 소문자로 지정되어 있었습니다.

원인은, DB Flyway였습니다. 프로젝트에서 Flyway를 통해 DDL 형상관리를 하고 있었는데, Activity 테이블을 추가하며 작성한 DDL에서 문제를 찾을 수 있었습니다.

무심코 소문자로 작성해두었고, 이 때문에 DB 테이블에서 ENUM의 상수들이 소문자로 설정되어버린 것이었습니다.


🪄해결 방안

1. DDL 수정

CREATE TABLE activity
(
    // ~~생략~~
    status           enum ('BEFORE','DURING','CLOSED') NOT NULL,
    CONSTRAINT pk_activity PRIMARY KEY (id)
);

위처럼 대문자로 잘 수정해줍니다.

다시 어플리케이션 실행 후 API를 호출해보았습니다. 결과는?

드디어 정상적으로 목록이 불러와지네요.

💭 느낀 점

DDL 작성 시 더블체크가 필요하다는 것을 다시 한 번 느낄 수 있었습니다.😅

profile
배움 기록

0개의 댓글