정구리의 우주정복

[Spring] JPA Postgresql Enum 사용시 - ERROR: column "recommend_type" is of type recommend_type but expression is of type character varying Hint: You will need to rewrite or cast the expression. 해결하기 본문

JAVA/PROJECT

[Spring] JPA Postgresql Enum 사용시 - ERROR: column "recommend_type" is of type recommend_type but expression is of type character varying Hint: You will need to rewrite or cast the expression. 해결하기

Jungry_ 2024. 6. 5. 00:09
반응형

 

사용 환경 :

Java 21

Postgresql 16

 

문제 상황 

Postgresql 에 recommend_type 이라는 이름의 Enum 을 만들었음. 하지만 jpa 에서 recommend_type 을 enum 값이 아닌 character 로 인식하면서 발생하는 문제 

 

문제 코드

 

엔티티

Recommend.java

@Entity
@Table(name = "recommend")
@Getter
public class Recommend {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.UUID)
    private String id;

    @Column(name = "user_id")
    private String userId;

    @Column(name = "password")
    private String password;

    @Enumerated(EnumType.STRING)
    @Column(name = "recommend_type")
    private RecommendType recommendType;

    @Column(name = "title")
    private String title;

    @Column(name = "contents")
    private String contents;

    @Column(name = "image")
    private String image;

    @Column(name = "created_date")
    private LocalDateTime createdDate;

    @Column(name = "modified_date")
    private LocalDateTime modifiedDate;

이하생략

 

DTO

public class AddRecommendRequest {
    private String userId;
    private String password;
    private RecommendType recommendType;
    private String title;
    private String contents;
    private String image;
    
    이하생략

 

Enum 정의

public enum RecommendType {
    RESTAURANT,
    PLACE,
    CLOTH,
    MUSIC,
    YOUTUBE,
    MOVIE_DRAMA,
    ODDS,
    ELECTRONICS,
    BOOK
}

 

RecommendService.java

    /**
     * 신규 게시글 (Recommend) 추가
     * @param token 로그인 정보 token 값 (유저정보)
     * @param request 추가하고자 하는 정보
     * @return 신규 추가된 값
     */
    public RecommendResponse addRecommend(String token, AddRecommendRequest request) {
        // token parsing
        TokenUtils tokenUtils = new TokenUtils();
        KeycloakToken keycloakToken = tokenUtils.tokenParser(token);

        Recommend recommend = Recommend.builder()
                .userId(keycloakToken.userId())
                .password(request.getPassword())
                .recommendType(request.getRecommendType())
                .title(request.getTitle())
                .contents(request.getContents())
                .image(request.getImage())
                .build();

        Recommend result = recommendRepository.save(recommend);

        return RecommendMapper.toDto(result);
    }

 

 

엔티티에 Enumerate 를 추가해 enum 임을 명시했지만 해당 오류가 계속해서 발생했다

 

 

문제 해결

 

Entity 에 columnDefinition , @JdbcTypeCode 를 추가함으로 해결

    @Enumerated(EnumType.STRING)
    @Column(name = "recommend_type", columnDefinition = "recommend_type")
    @JdbcTypeCode(SqlTypes.NAMED_ENUM)
    private RecommendType recommendType;

 

 

@JdbcTypeCode(SqlTypes.NAMED_ENUM)

 

Java 에 enum 을 사용해도 JPA 는 enum 임을 알수 없기 때문에 명시를 해주니 해결이 되었다

 

왜 나에게 이런일이

반응형
Comments