sullog-official / sullog-server

3 stars 0 forks source link

mybatis typehandler 이슈 #30

Open seungyeonchoi opened 1 year ago

seungyeonchoi commented 1 year ago

이슈 배경

resultMap에 지정한 typehandler가 호출되지 않음

<result property="photoPathList" column="photo_path" typeHandler="sullog.backend.common.mapper.typehandler.StringListTypeHandler"/>

즉, 이렇게 썼는데, StringListTypeHandler가 아닌 다른 타입핸들러(FlavorTagListTypeHandler)가 실행됨

원인

  1. 타입핸들러 config 설정이 가장 우선순위가 높음..! 과거 mybatis config를 살펴보면..
        sqlSessionFactory.setTypeHandlers(new TypeHandler[] {
                new StringListTypeHandler(), // 우선순위 낮음
                new AlcoholPercentFeelingTypeHandler(AlcoholPercentFeeling.class),
                new FlavorTagListTypeHandler() // 우선순위 높음
        });

    이런 형태였음.

resultMap에서 타입핸들러를 지정했음에도 FlavorTagListTypeHandler가 호출된 것으로 보아 이 config 순서가 가장 높은 우선순위를 가짐을 유출할 수 있음..

따라서

        sqlSessionFactory.setTypeHandlers(new TypeHandler[] {
                new AlcoholPercentFeelingTypeHandler(AlcoholPercentFeeling.class),
                new FlavorTagListTypeHandler(), 
                new StringListTypeHandler()
        });

이렇게 순서를 바꿨더니 List 타입에 StringListTypeHandler이 정상적으로 적용됨.

확인할 것

  1. config 선언순서의 우선순위가 가장 높은게 맞는지?
    • 상식적으로 구체적으로 resultmap에 지정한 타입핸들러가 가장 높아야하는건 아닌지..?ㅎㅎ

기타

<result property="photoPathList" column="photo_path" />

이렇게 명시적으로 타입핸들러 지정안해도, StringListTypeHandler가 잘 호출됨!

cnpcnp99 commented 1 year ago

정말정말 이상한 거 같네요...! 사실 저희 로직에 큰 영향은 없는데 현재 상태임에도 불구하고 비정상적으로 동작하는 케이스가 있긴 한데 정리되는대로 공유하겠습니다

seungyeonchoi commented 1 year ago

위 케이스가 최근검색어 조회 api에서의 동작 맞나요!? typeHandler를 타지만, List 타입으로 변환해야하는데 원소가 String이 아닌 Array로 만들어지는 것을 목격했습니다. .ㅎㅎ

arr[0] -> ["a', "b", "c"] 꼴 ...