Curl Up Black Cat


😎 서론

안녕하세요, 인더제이 입니다.

 

오늘은 MyBatis XML Mapper에서 Java 내부 클래스 참조시 발생하는 문제와 그에 대한 해결 방법을 알려드리려 합니다. 개인적으로 문제로 인해 상당한 시간을 헤맸기에 경험을 여러분과 공유하고 싶습니다.

 

🥲 문제 상황

먼저, 아래는 Java 내부 클래스를 포함한 BoardDto 모델입니다.

package com.board.backend.model;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDateTime;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class BoardDto {

    @Getter
    @Setter
    public static class Response {
        private long id;
        private String title;
        private String content;
        private String writer;
        private long view_count;
        private Long created_id;
        private LocalDateTime created_dt;
        private LocalDateTime modified_dt;
    }
}

모델을 MyBatis XML Mapper resultType으로 설정하려고 했을 , 내부 클래스 Response 참조해야 했습니다. 처음 작성한 코드는 아래와 같습니다.

<select id="findById" resultType="com.board.backend.model.BoardDto.Response">
    SELECT *
    FROM board
    WHERE id = #{id}
</select>

하지만 위와 같이 설정했을 , 연결이 제대로 이루어지지 않았고, 다음과 같은 에러가 발생했습니다.

Error creating bean with name 'boardMapper' defined in file  ...
Cannot resolve reference to bean 'sqlSessionTemplate' while setting bean property 'sqlSessionTemplate'

🤔 원인 

sqlSessionTemplate 연결 에러의 원인은 다양합니다: 설정 파일 누락, 설정 파일 위치 불일치, 의존성 문제, 데이터 소스 연결 문제, 빈 이름 불일치, 생성자/세터 주입 문제 등. 이 모든 가능성을 확인했지만, 문제의 원인을 찾지 못하고 있었습니다.

그러던 , Java에서 내부 클래스를 참조할 $ 기호로 연결된다는 것을 알게 되었습니다.


🙂 해결방법

Mapper XML에서 resultType 올바르게 설정하기 위해선 $ 기호를 사용해야 합니다.

<select id="findById" resultType="com.board.backend.model.BoardDto$Response">
    SELECT *
    FROM board
    WHERE id = #{id}
</select>

핵심은 BoardDto.Response 대신 BoardDto$Response 사용하는 것입니다.

 

결론적으로, MyBatis에서 Java 내부 클래스를 참조할 때는 $ 기호 사용해야 합니다. 저는  작은 부분 때문에 많은 시간을 낭비하였는데 이 글을 통해 같은 문제를 겪는 분들에게 도움이 되기를 바랍니다. 😌

+ Recent posts