본문 바로가기
Spring/Spring MVC 5

MyBatis

코동이 2020. 5. 27.

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