본문 바로가기
프로그래밍/TIL

[TIL] MyBatis 그리고 ObjectMapper

by 코딩중독 2024. 1. 28.

목차

    패캠 백엔드 부트캠프 토이프로젝트 2차가 시작되었다.

    온라인 강의 진도 기준으로 스트링부트를 이용한 프로젝트를 진행하고 있었지만, 실강 기준으로 프로젝트가 나오다 보니 헷갈린다. 토이 1차의 자바만을 이용한 여행 웹애플리케이션 콘셉트를 스프링과 MyBatis를 사용해서 API 개발이 목적이다.

    왜 안부트요???

    달성목표는 복잡하지 않다.

    • 여행과 여정의 정보를 1:n으로 관계로 설계
    • 여행 정보 등록, 조회, 수정
    • 여행에 포함된 여정의 정보 등록, 조회, 수정
    • 회원은 여러 여행 기록을 등록할 수 있습니다. (회원은 고려하지 않는다.)

    회원은 고려하지 않는다...? 회원이 없다면 정보 등록은 누가 하나요???

    더하면 더했지 덜하면 직성이 안 풀리기에 회원등록부터 시작하겠습니다^^

     

    A Few Moments Later...

     

     

    스프링부트와 JPA를 사용하는 프로젝트가 아니다 보니 많은 시간 구글링이 필요했다^^!

    그럼 시작해 봅시다.

     

    ObjectMapper

    Jackson에서 제공해 주는 ObjectMapper

    Serialize(Java Object -> Json Object), Deserialize(Json Object -> Java Object) 해준다.

     

    문제. Java에서 CamelCase를 사용하고 Json은 snake_case로 데이터를 전달해야 한다.

    해결1. Entity클래스에 @JsonNaming 어노테이션 추가

    @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)

     

    해결2. 변수에 @JsonProperty 어노테이션 추가

    @JsonProperty("registered_at")
    private LocalDateTime registeredAt;

     

    스프링부트 프로젝트에서 사용했던 ObjectMapper 설정을 @Bean으로 등록하는 방법은 다음에 전체적인 내용으로 추가할 예정이다.

     

    MyBatis

    이 친구 MyBatis가 말썽이다.

    스프링부트에서 JPA만 사용하다 해서 좀처럼 쓰지 않다 보니 가장 많은 시간을 할애했다.

    결론만 보면 간단하지만 이리저리 테스트를 하다 보니 mybatis-config.xml 설정 파일 추가하는 것으로 모든 게 해결됐다.

     

    문제1. MySQL 컬럼명이 snake_case를 사용해서 데이터가 NULL이다.

    mybatis-config.xml

    <configuration>
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
            <setting name="callSettersOnNulls" value="true"/>
            <setting name="jdbcTypeForNull" value="NULL"/>
        </settings>
    </configuration>

     

    mapUnderscoreToCamelSace : snake_case를 CamelCase로 바꿔준다.

    callSettersOnNulls : 쿼리 결과 Null 방지

    jdbcTypeForNull : 쿼리 파라미터 Null 방지

     

     

    문제2. Java의 LocalDateTime을 모른다.

    mybatis-config.xml

    <configuration>
        <typeHandlers>
            <typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/>
            <typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler"/>
            <typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler"/>
        </typeHandlers>
    </configuration>

     

    설정 파일을 추가하고 데이터는 가져왔지만 내가 원하는 모양새가 아니다 😥

    설정 파일 추가 결과
    설정 파일만 추가한 결과

     

    @JsonFormat을 추가한다.

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", shape = JsonFormat.Shape.STRING)
    private LocalDateTime registeredAt;

     

    성공

     

    주말이고 띄엄띄엄하다 보니 정신이 없었다.

    역시 막히고 답답하던 게 풀리는... 이 맛이지😁