😎 서론
안녕하세요, 인더제이 입니다.
오늘은 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의 내부 클래스를 참조할 때는 $ 기호 사용해야 합니다. 저는 이 작은 부분 때문에 많은 시간을 낭비하였는데 이 글을 통해 같은 문제를 겪는 분들에게 도움이 되기를 바랍니다. 😌
'💻 프로그래밍 > 🆂 Spring' 카테고리의 다른 글
Spring에서 잘못된 메시지 요청 핸들링하기 (0) | 2023.08.19 |
---|---|
Spring Boot 에서 응답 및 예외 처리 모델 구축하기 (0) | 2023.08.14 |
스프링 부트 JSON 응답 Null 값 자동 제거 (0) | 2023.08.14 |