woniper

[spring] 동적 DataSource 생성 본문

개인 프로젝트/ColumnConverter

[spring] 동적 DataSource 생성

woniper1 2014. 6. 8. 14:07

  ColumnConverter를 만들면서 가장 핵심이 어떻게 동적으로 DB에 연결 할 것인가 였다.

찾아보니 당연히 자료가 나왔고 참고해서 구현을했다. spring은  IoC에 의해서 서버 로딩시 객체를 모두 생성하고 컨테이너에서 관리 되기 때문에 동적으로 생성하려면 다른 방법을 찾아야 했다. 

자세한 내용은 [spring] IoC(Inversion of Control)와 DI(Dependency Injection)을 참고하자!!

  이 때문에 DataSource를 동적으로 생성하는게 ColumnConverter에서는 중요했고 구현 방법을 정리하고자 포스팅한다. 처음에는 어떻게 Bean을 동적으로 생성 할까 고민 했지만 더 좋은 방법인지는 모르겠으나 service객체를 이용해서 DataSource를 생성하면 된다. 예제는 ColumnConveter를 기준으로 설명하겠다.


1. Service (DataSource 생성)

package com.woniper.converter.service.impl;

import com.woniper.converter.dto.DatabaseDto;
import com.woniper.converter.service.DatabaseService;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;

/**
 * Created by woniper on 2014. 6. 3..
 */
@Service
public class DatabaseServiceImpl implements DatabaseService {

    @Override
    public DataSource createDataSource(DatabaseDto dto) {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl(dto.getUrl());
        dataSource.setUsername(dto.getUsername());
        dataSource.setPassword(dto.getPassword());
        return dataSource;
    }
}

  DataSource 구현체는 BasicDataSource를 사용했고 아직 MySQL만 지원하기 때문에 DriverName은 MySQL Driver("com.mysql.jdbc.Driver")로 되있다. Parameter로 넘어온 DatabaseDto는 DataSource를 생성할 기본 내용을 담고 있는 DTO클래스이다. (19~21 line에 보듯이 url, username, password를 담고있다. 소스는 생략^^)


2. DAO (DataSource를 이용한 JdbcTemplate 사용)

package com.woniper.converter.dao;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import javax.sql.DataSource;
import java.util.List;

/**
 * Created by woniper on 2014. 6. 8..
 */
@Repository
public class DataSourceTestDao {

    private JdbcTemplate jdbcTemplate;

    public List getList(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
        return jdbcTemplate.queryForList("select * from query");
    }
}

  JdbcTemplate을 이용해서 생성된 DataSource로 간단한 쿼리로 List로 데이터를 받는 예제이다. 여기서 JdbcTemplate은 따로 설명하지 않겠다. 소스를 보면 알겠지만 매우 간단하게 사용 가능하다.


3. Controller

package com.woniper.converter.controller;

import com.woniper.converter.dao.DataSourceTestDao;
import com.woniper.converter.dto.DatabaseDto;
import com.woniper.converter.service.DatabaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.sql.DataSource;
import java.util.List;

/**
 * Created by woniper on 2014. 6. 8..
 */
@Controller
public class DataSourceTestController {

    @Autowired private DatabaseService service;
    @Autowired private DataSourceTestDao dao;

    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public @ResponseBody List test(@RequestBody DatabaseDto dto) {
        DataSource dataSource = service.createDataSource(dto);
        return dao.getList(dataSource);
    }
}

  /test를 요청해 앞에 설명한 service와 dao를 이용해 DataSource를 생성(26line)하고 List를 얻어와(27line) 데이터를 반환해 준다. 지금까지 설명한 글을 토대로 개발을해 나가고 있고 현재는 로그인 기능이나 사용자를 구분하는 기능이 없어서 사용자별로 DataSource를 유지하지 않지만 개발해 나갈 것이다.

Comments