티스토리 뷰

DB

[MyBatis]mapper에서 공통 property 사용

까오기 까오기 2020. 4. 2. 12:24

myBatis mapper에서 바인딩 변수는 파라미터 값을 이용합니다.

그런데 시스템 공통 값을 property에 설정하고 이용할 수는 없을까요?

 

예를 들어 아래와 같은 쿼리에서 'securityKey' 값은 UserParam에는 없는 값입니다.   

    <select id="getUserInfo" resultType="User"  parameterType="UserParam">
        SELECT
             user_id
            , user_nm
            , AES_DECRYPT(UNHEX(PW), '${securityKey}') pw
        FROM USERS
        WHERE user_id = #{userId} 
    </select>

이런 경우 처리 예제입니다. 

 

[테스트 환경]

- java8

- spring boot 

- myBatis

- mysql 

 

내용 

Datasource를 설정하는 @Configuration Bean에서 mybatis-config.xml을 설정하고 해당 파일에 프라퍼티 설정을 합니다. 그리고 해당 변수를 mapper에서 이용하면 끝~~~ 

 

1. Datasource 설정

@Configuration
public class DefaultDatabaseSource {

    @Bean(name="dataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name="sqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactoryBean(@Autowired @Qualifier("dataSource") DataSource dataSource, ApplicationContext applicationContext)
            throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));
        factoryBean.setMapperLocations(applicationContext.getResources("classpath:mapper/**/*.xml"));
        return factoryBean.getObject();
    }

    @Bean(name="sqlSession")
    @Primary
    public SqlSessionTemplate sqlSession(@Autowired @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean(name="transactionManager")
    @Primary
    public DataSourceTransactionManager transactionManager(@Autowired @Qualifier("dataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

}

2. mybatis-config.xml에 property 설정. 

<?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>

    <properties resource="security.properties"></properties>
    
    <settings>
        <setting name="useGeneratedKeys" value="true"/>
        <setting name="callSettersOnNulls" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="defaultStatementTimeout" value="200"/>
        <setting name="defaultExecutorType" value="REUSE"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="cacheEnabled" value="false" />
        <setting name="jdbcTypeForNull" value="NULL" />
    </settings>
	<typeAliases>
	  <package name="eblo"/>
	</typeAliases>
	
    <typeHandlers>
        <typeHandler javaType="java.sql.Timestamp"
                     handler="org.apache.ibatis.type.DateTypeHandler"/>
        <typeHandler javaType="java.sql.Time"
                     handler="org.apache.ibatis.type.DateTypeHandler"/>
        <typeHandler javaType="java.util.Date"
                     handler="org.apache.ibatis.type.DateTypeHandler"/>
    </typeHandlers>

</configuration>

<properties resource="security.properties"></properties> <-- 이 부분입니다. 

해당 부분을 하단에 설정하는 경우 에러가 납니다. 

 

에러내용

Caused by: org.xml.sax.SAXParseException: 요소 유형 "configuration"의 콘텐츠는 "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"과(와) 일치해야 합니다.

에러 내용을 보고 properties가 오타도 아니고 일치하는데 왜 그럴까 싶은데 해당 속성이외 순서도 일치해야합니다. 

순서 중요해요~~~ 

 

3. 프라퍼티 파일 생성, security.properties

securityKey=test1234

4. 테스트

 

기타 고려 사항. 

사용자가 정의한 변수는 #{securityKey} 이렇게 사용할 수는 없습니다. 

반드시 '${securityKey}' 이렇게 해야 합니다. 

댓글
댓글쓰기 폼