mybatis 환경에서 VO (value object)를 구현해서 서버 개발을 진행 할 때,
분명히 정상적으로 서비스가 실행되었고, 데이터베이스에 데이터가 존재하는데
리턴되는 데이터가 없다라고 할 때,
많은 케이스가 있지만
VO에 명시된 엔티티 네임과 쿼리에서 리턴하는 데이터 네임이 다를 경우가 있다
대부분 데이터 베이스 컬럼 명을 지정할 때,
네이밍 룰에 따라 대문자 및 스네이크 케이스를 사용해서 컬럼 네이밍을 진행한다.
그런데 !
VO에서 엔티티 네임을 카멜케이스로 명명했을 때, mybatis 설정을 통해 자동으로 스네이크 케이스를 자동 변환해서 사용할 수 있도록 설정하는 예제를 포스팅하려고 한다
1.
먼저 표기법을 변환할 config 파일을 생성해야 한다.
다음과 같이 파일을 생성하자
경로 설정은 SqlSessionFactory 객체를 설정해줬던 [app-context.xml]파일에서 해당 설정 파일의 속성을 추가하면서
경로를 명시해 둘 예정이라서 경로는 본인이 알아서 설정하면 된다.
따로 System Property 경로를 변경하지 않았다면, 왠만하면 System Property 디폴트 설정 경로인
[src/main/resources] 내부에 설정해주자
나는 프로젝트의 다음과 같은 경로에 생성했다
[ src/main/resources/config/mybatis ]
2.
mybatis-config.xml에 다음 구문을 추가하자
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 자동으로 카멜케이스 규칙으로 변환 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
3.
다음은 Application Context 파일을 수정해줘야 한다.
Web Application 최상단에 위치하고 있는 Context인데,
Bean 생성 및 관리, 컨테이너 관리, 데이터베이스 설정 등의 역할을 가지고 있다
프로젝트 내 해당 파일을 열어서
프로퍼티 설정을 해주자
<bean id=*"{beanId}"* class=*"org.mybatis.spring.SqlSessionFactoryBean"*>
<property name=*"dataSource"* ref=*"{dataSource}"* />
<property name=*"mapperLocations"* value=*"classpath:mappers/mapper-*.xml"* />
<property name="configLocation" value="classpath:{resource 내부 mybatis-config 파일 경로}/mybatis-config.xml" />
</bean>
beanId는 SqlSessionFactoryBean 객체를 생성할 네임이고,
그 하위에 property 태그를 추가해서 [configLocation] 항목을 추가해주면 된다.
우리가 생성했던 mybatis-config.xml 파일의 위치를 명시해준다.
이미 이전에 구현된 소스가 있어서, 모든 리턴 데이터를 카멜케이스로 변경하면 안될 때는?
1
resultMap을 사용하자
해당 쿼리에서 리턴할 데이터를 mybatis에서 제공하는 resultMap 에 담아서 쿼리가 종료될 때 리턴하면 된다
예시 )
<mapper namespace="{dao path}">
<resultMap id="selectInfo" type="{vo path}">
<result property="userId" column="USER_ID"/>
<result property="userName" column="USER_NAME"/>
</resultMap>
<select id="getUserInfo" resultMap="selectInfo">
SELECT
USER_ID,USER_NAME
FROM user
</select>
</mapper>
|
cs |
HashMap 형태로 받든, VO로 형태로 받든 resultMap을 사용하면 자유롭게 변환이 가능하다.
2
Alias를 이용하자
예시 )
<mapper namespace="{dao path}">
<select id="getUserInfo" resultType="java.util.Map">
SELECT
USER_ID AS "userId"
,USER_NAME AS "userName"
FROM user
</select>
</mapper>
|
cs |
이러한 방법들이 있지만, 명명 규칙이 통일화 되지 않고,
동료 개발자들과 협의되지 않은 코딩 컨벤션을 가지지 않고 있으면
제각각인 표기법과 중구난방인 로직들로 코드리뷰 및 소스 파악에 있어서 어려움이 엄청나다 ...
왠만하면 코딩 컨벤션을 가지고 효율적이게 개발합시다 !
'개발 > BACK' 카테고리의 다른 글
[Mysql] 실행계획 (Explain)에 따른 쿼리튜닝 방법 (0) | 2023.01.06 |
---|---|
[SpringFramework] 스프링 에러 Error occurred during initialization of boot layer 해결 방법 (0) | 2022.12.27 |
[SpringBoot] 스프링 부트 mybatis log4jdbc로 쿼리 출력하기 (0) | 2022.12.22 |
[형상 관리 툴] bitbucket이란 , 빗버킷 레포지토리 생성 복사 import 하기 (2) | 2022.12.22 |
[Java] 문자열 붙이기/문자열 자르기 + JAVA 8 (0) | 2022.09.28 |