[java] spring Interceptor 에서 DB(mybatis) connection 연동 하기
spring interceptor는 처음 프로젝트 실행할때, 인터셉터 부분은 @Controller나 @Service 어노테이션이 없어서,
메모리에 bean 생성을 안해놓아서, 일반적인 구조로는 db 연동이 되질 않는다.
db 연동 방법에는 세가지 방법이 있다.
spring을 어떤식으로 개발을 진행했는지에 따라서 선택적으로 하면 될 것 같다.
1. 첫번째 방법
만약 SqlSessionTemplate를 이용했을 경우는
factory를 생성하고, sqlsession를 만드는 부분을 따로 만들어 준다
public SqlSessionFactory sqlSessionFactory() throws Exception { //프로퍼티 값 읽어오기 Properties properties = new Properties(); ClassLoader loader = Thread.currentThread().getContextClassLoader(); String proPath = loader.getResource("system.xml").getPath(); //db 정보가 들어있다. InputStream inputRead = new FileInputStream(proPath); properties.loadFromXML(inputRead); inputRead.close(); BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(properties.getProperty("jdbc.gaus.driverClassName")); dataSource.setUrl(properties.getProperty("jdbc.gaus.url")); dataSource.setUsername(properties.getProperty("jdbc.gaus.username")); dataSource.setPassword(properties.getProperty("jdbc.gaus.password")); PathMatchingResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean(); sqlSessionFactory.setDataSource(dataSource); sqlSessionFactory.setConfigLocation(resourceResolver.getResource("mybatis-config.xml")); sqlSessionFactory.setMapperLocations(resourceResolver.getResources("classpath:sqlmap/**/**/*.xml")); return sqlSessionFactory.getObject(); } |
인터셉터 안에서는 (다른 어디서든)
TestController com = new TestController();
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(com.sqlSessionFactory());
List<HashMap<String,Object>> menu_list= sqlSessionTemplate.selectList("Common.selectMenuList",user_no);
객체 생성해서 쓰면 된다.
내 실제 소스이다. 적당히 수정해서 쓰면 될 것 같다.
2. 두번째 방법
@Configuration 를 설정한 파일에서 해당 DB를 연동할 Service를 bean으로 등록하는 방법이 있다.
@Configuration .... ....(이하 중략). } |
이후에 인터셉터에서(다른 어디서든)
@Autowired
private LoginService beanLoginService;
를 상단에 선언하고,
해당 service 기능(db 연동)을 사용하면 된다.
3. 세번째 방법
두번째 방법은, auto compile 할 시에 bean을 못 찾는다고 에러가 발생한다.(spring boot에서만 bean 순서에 따른 영향)
interceptor를 @Component 로 등록하지 말고, configure 파일에서 interceptor 자체를 bean 으로 등록 한다.
-----------------------------------------------------------------------------------------------------------
이렇게 db 연동 방법은 사용하는 부분이 한정되어있고, 몇개 없으면 3번째 방법을 추천하고,
여기저기 Service를 연동할 부분이 많으면 첫번째 방법이 편하다.