회사에서 Mybatis를 사용하고 있습니다. DataBase에서는 컬럼명을 snake case로 쓰고 자바에서는 camel case로 필드 이름을 정해주고 있어요. 객체에 값을 제대로 매핑해주기 위해서 쿼리 조회 시 일일이 Alias로 camel case를 적어주고 있었습니다. 그런데 알고보니 몇 가지 세팅만 해주면 이런 노가다는 필요없다는 사실 알고 계셨나요?? 충격을 먹어서 바로 찾아봤습니다.
문제 상황
우선, 왜 이러한 설정이 필요한지에 대해 이해해봅시다. 이미 서론에서 언급하긴 했는데 더 자세하게 알아볼게요.
보통 자바에서는 변수명을 camel case로 표현합니다. 예를 들어, userName, userEmail과 같이 말이죠. 반면에, 데이터베이스에서는 snake case를 흔히 사용합니다. 예를 들면, user_name, user_email 등입니다.
따라서 자바 객체와 데이터베이스 간에 자료형을 변환할 때, 이 두 가지 스타일의 차이점이 종종 문제가 될 수 있습니다. 이를 해결하기 위한 가장 간단한 방법은 컬럼명을 직접 매핑하는 것입니다. 하지만 이는 코드의 중복을 증가시키며, 유지 보수를 어렵게 만듭니다.
해결 방법
이 문제를 해결하기 위해 MyBatis는 mybatis.configuration.map-underscore-to-camel-case라는 설정을 제공합니다.
Spring Boot의 application.properties 또는 application.yml 파일에 다음과 같이 설정을 추가하면 됩니다.
application.properties의 경우
mybatis.configuration.map-underscore-to-camel-case=true
application.yml의 경우
mybatis:
configuration:
map-underscore-to-camel-case: true
이 설정을 추가하면, MyBatis는 자동으로 snake case 컬럼명을 camel case 필드명으로 매핑해줍니다.
mybatis-config.xml 사용
혹은 위의 경우로 해결되지 않는다면 mybatis-config.xml을 추가하는 방법을 사용하시면 됩니다.
같은 위치에(src/main/resources/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>
<!-- snake to camel -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 쿼리 결과가 null인 경우 누락되지 않도록 -->
<setting name="callSettersOnNulls" value="true"/>
<!-- 쿼리에 보내는 파라미터가 null인 경우 에러 발생 방지 -->
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
</configuration>
저는 여기서 mapUnderscoreToCamelCase만 사용중입니다. 그 외의 설정은 필요하신 분들만 쓰시면 됩니다.
다음으로는 DB관련 Config 클래스에서 mybatis-config.xml 경로를 추가해주면 됩니다.
public class DatabaseConfig {
@Autowired
private ApplicationContext applicationContext;
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));
sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources("classpath:mappers/*Mapper.xml"));
return sqlSessionFactoryBean.getObject();
}
}
주의 사항
이 설정은 대부분의 경우에서 잘 동작하지만, 모든 상황에서 완벽하게 동작하는 것은 아닙니다. 예를 들어, user_name과 userName은 잘 매핑되지만, user_Name과 같은 경우에는 예상대로 동작하지 않을 수 있습니다.(애초에 이런 케이스가 있는게 이상하지만) 이러한 상황에서는 직접 매핑을 해주어야 합니다.
이렇게 Spring Boot와 MyBatis에서 snake case를 camel case로 자동 변환하는 방법에 대해 알아보았습니다. 이 설정을 통해 코드의 중복을 줄이고 유지 보수를 용이하게 할 수 있습니다. 다만, 꼭 모든 상황을 완벽하게 커버하지는 못하니, 특정 상황에 따라 직접 매핑이 필요할 수 있음을 기억해주세요.
다음 시간에는 또 다른 유용한 팁으로 찾아뵙겠습니다. 그럼, 행복한 코딩 시간 되세요!
'web > spring&spring boot' 카테고리의 다른 글
[Spring boot] 포트 변경 방법 (0) | 2024.02.28 |
---|---|
[Spring] HTTPS 활성화 (0) | 2024.02.12 |
API 호출을 위한 RestTemplate, WebClient 및 Feign 비교 (0) | 2023.05.11 |
[Spring Boot] @Component에 대한 이해 (0) | 2023.04.03 |
[Spring Batch] Spring Batch의 장점 (0) | 2022.02.26 |