본문 바로가기

개발/BACK

[SpringFramework] Mybatis 문자 표기법 자동 변환 [ 스네이크 케이스 카멜 케이스 ]

728x90

 

 

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

 

 

이러한 방법들이 있지만, 명명 규칙이 통일화 되지 않고, 

동료 개발자들과 협의되지 않은 코딩 컨벤션을 가지지 않고 있으면 

제각각인 표기법과 중구난방인 로직들로 코드리뷰 및 소스 파악에 있어서 어려움이 엄청나다 ...

왠만하면 코딩 컨벤션을 가지고 효율적이게 개발합시다 !

728x90