model에 enum type을 넣고 

mybatis에서 아래 테이블의 data를 받아오려고 한다.

 

 

enum은 여러 형태를 가질 수 있다.

 

아래와 같이 그냥 단건의 데이터만 지정하여 만드는 경우가 있을 수 있고

 

 

db에 쌓이는 데이터유형이 숫자( 1_VERSION, 2_VERSION )

특수문자로 시작할 경우 enum을 아래와 같이 인자를 2개씩 갖게 지정될 수 있다.

 

 

 

그럴경우 여러 형태의 enum 데이터를 바인딩 하지 못해

아래와 같은 오류가 발생 할 수 있다.

 

Caused by: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column '' from result set.

Caused by: java.lang.IllegalArgumentException: No enum constant

 

 

 

위소스를 보면 상품정보 rest controller에서 service를 거쳐 mapper에 해당하는 쿼리결과를 lists 객체에

담겨야 하는데 데이터를 못받아와 catch절 NOT_FOUND로 빠져  

swagger에서해당 data를 알지 못해 못받아오는 경우도 생긴다.

 

 

 

이럴경우 TypeHandler를 생성하여 해결할 수 있다.

 

 

 

 

그리고 생성한 type handler 위치의 패키지명을 아래와 같이 지정해준다.

type-handlers-package: com.shlee.toy1.common.handler.type

 

 

 

그리고 api를 조회해보면 아래와 같이 enum으로 정의한 키값으로 나온다.

 

 

 

이제 이 반환된 키 값으로 서비스 로직에서 데이터를 가공해서 반환해주면 된다.

 

 

 

 

이제 여러개의 enum type에 대응가능한 mybatis type handler에 대해 작성할 수 있게 되었다. 

  1. 오타감별사 2021.05.31 05:13

    오타 있습니다

    selectProductListsById, selectProductById 둘 중 하나로 통일하세요.

    mapper 는 selectProductById 로 되있고,

    controller 에는 productService.selectProductListsById 로 되어있네요.

    service 쪽 코드는 없기 때문에

    글을 읽던 중 사소한 차이로
    메서드명으로 살짝 딜레이가 되며 혼동이 오기에
    스크롤을 위로 올려 다시 체크하는 시간낭비가 발생합니다.

    설명글이니까 그냥 특정 코드가 생략되도, 독자가 흐름상 추론하기 쉬운 이름으로 통일하는게 가독성이 좋습니다.

    • effortDev 2021.06.06 14:19 신고

      의견 감사합니다.
      소스를 복붙하는 과정에서 발생한 것 같네요. 수정해서 확인해보겠습니다.
      고맙습니다.

+ Recent posts