Java 언어를 사용하여 데이터베이스와 연동하는 프로그램을 만들 수 있는 기술이 JDBC
JDBC 프로그래밍을 보다 쉽게 할 수 있도록 설계된 라이브러리가 MyBatis
MyBatis는 Spring framework에서 이용할 수 있도록 라이브러리를 제공하고 있다.
*JDBC(Java DataBase Connectivity) = 자바에서 데이터베이스에 연결하기 위한 인터페이스
*ODBC(Open Database Connectivity) = ODBC는 모든 응용 프로그램(프로그래밍 언어 무관)에서 모든 데이터베이스 시스템과 통신하는 데 사용할 수있는 개방형 인터페이스. 언어와 독립적이다.
*DBCP(DataBase Connection Pool) = 데이터베이스와 커넥션을 맺고 있는 객체를 관리하는 역할.
즉, WAS를 실행하면, 미리 일정량의 DB Connection 객체를 생성하고 Pool공간에 저장해 가져다 쓴다.
*MyBatis = 개발자의 SQL에 대해 고급 매핑(Mapping)을 지원한다. 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑할 수 있다. JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다.
*라이브러리 추가
1. 데이터베이스 드라이버 jar (odbc driver)
2. spring jdbc
3. dbcp
4. mybatis
5. mybatis-spring
*Maven Project에 추가
<!-- Ojdbc -->
<!-- spring jdbc -->
<!-- dbcp2 -->
<!-- mybatis -->
<!-- mybatis spring -->
<ServletAppContext.java>
@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer{
@Valid("${db.classname}")
private String db_classname;
...
//database 접속 정보 관리
@Bean
public BasicDataSource dataSource() {
BasicDataSource source = new BasicDataSource();
source.setDriverClassName(db_classname);
source.setUrl(db_url);
source.setUsername(db_username);
source.setPassword(db_password);
return source;
}
//query문과 접속 관리하는 객체
@Bean
public SqlSessionFactory factory(BasicDataSource source) throws Exception{
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(source);
SqlSessionFactory factory = factoryBean.getObject();
return factory;
}
//query문 실행을 위한 객체
@Bean
public MapperFactoryBean<MapperInterface> test_mapper(SqlSessionFactory factory) throws Exception {
MapperFactoryBean<MapperInterface> factoryBean = new MapperFactoryBean<MapperInterface>(MapperInterface.class);
factoryBean.setSqlSessionFactory(factory);
return factoryBean;
}
}
ServletAppContext.java에서 properties 등록을 @ProperySource로 한다.
이전에 JS 오류에 대한 properties는 Message 형태로 등록하기 위해 메서드에서 참조시켰다.
PropertySource를 통해 ServletAppContext.java의 내부 변수에 @Value로 db연결에 관한 정보를 저장한다.
MyBatis를 연결하기 위해서 3개의 설정을 해야 한다.
1. database 접속 정보 관리
2. query문과 접속을 관리하는 객체
3. query문 실행을 위한 객체
이 3가지의 설정을 해주어야 mybatis를 사용할 수 있다.
이 query문의 작성은 어디서 할까?
<MapperInterface.interface>
public interface MapperInterface {
@Insert("insert into spring_mvc_table(data1,data2,data3) values(#{data1},#{data2},#{data3})")
void insert_data(DataBean dataBean);
@Select("select data1,data2,data3 from spring_mvc_table")
List<DataBean> select_data();
}
query문은 interface에 정의한다. interface로 만든 이유는 여기에 있는 query문들은 상황에 따라서, 계속 바뀌어가면서 사용되기 때문이다.
특히, {#data1}, {#data2}, {#data3}에 어떤 값이 들어갈까? DataBean dataBean를 주입한다. 이것은 실제 비지니스 로직을 만드는 TestController.java의 코드부분과 연관이 있다. 즉, 여기서는 쿼리문에 대한 정의와, 어떤 클래스를 사용할 것인지만 결정하고 실제로 Bean의 주입은 TestController.java.에서 한다.
이 query문의 실제 작동은 어디서 할까?
<TestController.java>
@Autowired
MapperInterface mapper1;
@PostMapping("/input_pro")
public String input_data(DataBean dataBean) {
mapper1.insert_data(dataBean);
return "input_pro";
}
@GetMapping("/read_data")
public String read_data(Model model) {
List<DataBean> list = mapper1.select_data();
model.addAttribute("list", list);
return "read_data";
}
MapperInterface의 객체 mapper1을 만들고 @Autowired로 Bean을 주입한다. 이로써, mapper1을 통해 실제 쿼리문을 사용 할 Bean이 만들어져있다. 이제 Controller 안의 메소드에서 로직을 만든다. 참고로 파라미터 안에 DataBean databean은 client의 입력 값이 넘어온 값들이다. 따라서 insert_data의 경우 client가 입력한 값들이 주입되어서 실제 쿼리문이 실행된다.
read_data의 경우에는 model을 만들었다. mapper1의 select_data()로 read_data의 요청이 들어왔을 때, 쿼리문이 실행되어 select로 조회된 list정보들이 model에 담겨서 read_data.jsp로 넘어간다.
'Spring > Spring MVC 5' 카테고리의 다른 글
미니프로젝트 (0) | 2020.05.29 |
---|---|
Restful API (0) | 2020.05.28 |
예외처리 (0) | 2020.05.27 |
Interceptor (0) | 2020.05.27 |
Validator 커스터마이징 (0) | 2020.05.27 |