본문 바로가기

학원/복기

[MyBatis] MyBatis란? / 예제

https://blog.mybatis.org/

 

The MyBatis Blog

A blog about the the MyBatis data mapper framework.

blog.mybatis.org

 

Products >> MyBatis 3 다운로드

 

 
다운로드 후 빌드 처리

slf4j-log4j12-1.7.21.jar 파일은 없어서 따로 빌드처리 해주었다.
 
 
마이바티스 참조 문서 :https://mybatis.org/mybatis-3/ko/
 


 

mybatis-config.xml 생성

 

 먼저 mybatis 환경설정파일 [mybatis-config.xml]을 만들어보자.

 mybatis 환경설정파일은 SqlSessionFactofy 객체를 생성하기 위해 필요한 정보를 제공하는 파일이다.

 

먼저 <!DOCTYPE configuration> 선언문을 추가한다.

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">

 

 

이제 엘리먼트를 등록해보자.

 

 

environments : environment 엘리먼트를 등록하기 위한 상위 엘리먼트 
 - default 속성 : environment 엘리먼트의 식별자(id 속성값)을 속성값으로 설정한다. (mybatis 프레임워크가 기본적으로 사용하기 위한 접속 DBMS 서버를 지정하는 것임)


environment : DBMS 서버 접속에 필요한 정보를 설정하기 위한 엘리먼트 (여러개 등록 가능)
 → Connection 객체를 생성하기 위한 정보를 제공한다.
 - id 속성 :  environment 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정한다.

<configuration> 
 	<environments default="development">
        <environment id="development">
                 <!--엘리먼트 작성-->
                 <!--엘리먼트 작성-->
                 <!-- ....... -->
        </environment>
    </environments>
</configuration>


 transactionManager : 트랜잭션 관리자(커밋 또는 롤백 처리)를 설정하기 위한 엘리먼트
 - type 속성 : [JDBC] 또는 [MANAGED] 둘 중 하나를 속성값으로 설정한다.
  →  JDBC 속성값 : JDBC 기능을 사용하여 직접 트랜잭션을 관리 - Connection 객체의 메소드 호출
  →  MANAGED 속성값 : 트랜잭션 관리 프로그램을 사용하여 트랜잭션 관리

<!--  JDBC 기능을 사용하여 직접 트랜잭션을 관리  -->
<transactionManager type="JDBC"/>


 dataSource : Connection 객체를 생성하기 위한 정보를 제공하는 엘리먼트
 - type 속성 : [UNPOOLED], [POOLED], [JNDI] 중 하나를 속성값으로 설정한다.
 type 속성값에 따라 하위 엘리먼트 설정이 변경된다.
  → UNPOOLED 속성값 : Connection 객체를 미리 생성하지 않고 실행시 생성하여 제공받을 수 있다. 
  → POOLED 속성값 : Connection 객체를 미리 생성하여 실행시 제공받을 수 있다. - DBCP 
  → JNDI 속성값 : Connection 객체를 WAS 프로그램에 등록된 자원을 이용하여  실행시 제공받을 수 있다.
 

property : Connection 객체 생성에 필요한 값을 제공하는 엘리먼트
 - name 속성 : Connection 객체 생성에 필요한 값이 저장될 이름을 속성값으로 설정한다.
 - value 속성 : Connection 객체에 필요한 값을 속성값으로 설정한다.

 

<dataSource type="POOLED">
	<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
	<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
	<property name="username" value="scott"/>
	<property name="password" value="tiger"/>
</dataSource>


 
mappers : mapper 엘리먼트를 등록하기 위한 상위 엘리먼트 
mapper : 매퍼 파일(MapperFile)을 *매퍼(Mapper)로 등록하기 위한 엘리먼트
 

*매퍼(Mapper)는 SQL 명령에 필요한 값을 전달받아 SQL 명령을 등록하고 실행결과를 Java 객체(원시형)으로 매핑하기 위한 정보를 제공한다. 
→ mybatis 프레임워크에서는 XML 기반의 매퍼 파일 Interface 기반의 매퍼 파일을 이용하여 매퍼를 등록할 수 있다. 
→ ibatis 프레임워크에서는 XML 기반의 매퍼 파일로만 매퍼 등록이 가능했다. 

 
 - resource 속성 : XML 기반의 매퍼 파일의 경로를 속성값으로 설정한다.
   → XML 기반의 매퍼 파일 경로는 파일 시스템 경로로 표현하여 작성하면 된다.
 

매퍼파일 위치

<mappers>
	<mapper resource="xyz/itiwll/mapper/StudentMapper.xml"/>
</mappers>

 
 
< mybatis-config.xml 전체 소스코드>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
				<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
				<property name="username" value="scott"/>
				<property name="password" value="tiger"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="xyz/itwill/mapper/StudentMapper.xml"/>	
	</mappers>
</configuration>

 



먼저 XML 기반의 매퍼파일을 만들어보자.
XML 기반의 매퍼파일은 엘리먼트를 사용하여 SQL 명령을 등록하기 위한 파일이다.
 
매퍼파일은 mybatis 환경 설정 파일에서 mapper 엘리먼트를 사용하여 매퍼로 등록해야만 사용이 가능하다.
 
mpper : SQL 명령을 등록하기 위한 상위 엘리먼트
 - namespace 속성 : 매퍼를 구분하기 위한 식별자를 속성값으로 설정
   → SqlSession 객체를 필요한 SQL 명령이 등록된 매퍼를 구분하기 위해 사용한다. 
   → mybatis 프레임워크에서는 namespace 속성값을 Java 자료형 형식으로 표현하여 작성하는 것을 권장한다.
      (권장일뿐 형식이 정해져 있는 것은 아니며, 다른 매퍼와 namespace가 충돌만 일어나지 않으면 된다.)
   → 참고) ibatis 프레임워크에서는 namespace 속성 생략이 가능하다.
 
[StudentMapper.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xyz.itwill.mapper.StudentMapper"></mapper>

이제 VO 클래스인 [Student] 클래스를 선언하자. 
 
테이블의 컬럼명과 같은 이름으로 필드명을 작성하여 클래스를 선언하는 것을 권장한다.
→  mybatis 프레임워크의 SqlSession 객체는 검색행의 컬럼값을 같은 이름의 필드에 자동 매핑되어 저장하기 때문이다.
 

package xyz.itwill.dto;

/*
이름       널?       유형            
-------- -------- ------------- 
NO       NOT NULL NUMBER(4)     
NAME              VARCHAR2(50)  
PHONE             VARCHAR2(20)  
ADDRESS           VARCHAR2(100) 
BIRTHDAY          DATE       
*/


//테이블의 컬럼명과 같은 이름으로 필드명을 작성하여 클래스를 선언하는 것을 권장한다.
// => mybatis 프레임워크의 SqlSession 객체는 검색행의 컬럼값은 같은 이름의 필드에 자동 매핑되어 저장
public class Student {
	private int no;
	private String name;
	private String phone;
	private String address;
	private String birthday;
	
	public Student() {
		// TODO Auto-generated constructor stub
	}

	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getBirthday() {
		return birthday;
	}

	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	
	
}

 


다시 매퍼 파일로 돌아가서 마저 작성하자
 
select : SELECT 명령을 등록하기 위한 엘리먼트
 - id 속성 : 매퍼 파일에 등록된 SQL 명령을 구분하기 위한 식별자를 속성값으로 설정 (DAO 클래스의 메소드 이름과 동일한 역할)
 - resultType :속성 : SQL 명령의 실행결과를 객체로 매핑하여 제공하기 위한 Java 자료형을 속성값으로 설정한다.
   → SELECT 명령으로 실행된 하나의 검색행에 대한 Java 자료형을 설정하여 Java 객체로 매핑 처리한다.
 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xyz.itwill.mapper.StudentMapper">
	<select id="selectStudentList" resultType="xyz.itwill.dto.Student">
		select no, name, phone, address, birthday from student order by no
	</select>
</mapper>

 


[StudentDAO 클래스]

 

StudentDAO 클래스에 메소드를 선언한다. 

StudentDAO 클래스는 싱클톤 패턴으로 작성한다.

public class StudentDAO {
	private static StudentDAO _dao;
	
	private StudentDAO() {
		// TODO Auto-generated constructor stub
	}
	
	static {
		_dao=new StudentDAO();
	}
	
	public static StudentDAO getDAO() {
		return _dao;
	}
	
        //코드작성
        //...
}


 
JDBC를 이용하는 것이 아니라, mybatis를 이용해 DAO 클래스에 메소드를 선언해볼것이다.
→ SqlSession 객체의 메소드를 호출하여 매퍼에 등록된 정보를 이용하여 SQL 명령을 전달해 실행하고 결과를 Java 객체로 반환받아 사용할 수 있다.
 
이를 위해 SqlSessionFactory 객체를 생성하여 반환하는 메소드를 먼저 선언해주어야한다.
SqlSessionFactory 객체는 SqlSession 객체를 생성하여 제공하기 위한 객체이다.
→ SqlSessionFactory 객체를 생성하기 위해서는 mybatis 환경설정파일(mybatis-config.xml)이 필요하다.
 
Resources.getResourceAsStream(resource) : 매개변수에 mybatis 환경설정파일경로를 전달받아 파일 입력스트림을 생성하여 반환하는 메소드
SqlSessionFactoryBuilder.build(InputStream inputStream) : 매개변수로 mybatis 환경설정파일의 입력스트림을 제공받아 SqlSessionFactory 객체를 생성하여 반환하는 메소드 
 

	private SqlSessionFactory getSqlSessionFactory() {
		//만약 mybatis 환경설정파일을 패키지에 작성한 경우 파일 시스템 경로(/)로 표현
		//String resource="xyz/itwill/config/mybatis-config.xml";

		String resource="mybatis-config.xml";
		
		InputStream inputStream=null;
		try {
			//mybatis 환경설정파일 경로를 전달받아 파일 입력스트림을 생성해 반환
			inputStream=Resources.getResourceAsStream(resource);
		} catch (IOException e) {//mybatis 환경설정파일이 없는 경우 예외 발생
			throw new IllegalArgumentException();
		}
		
		//mybatis 환경설정파일의 입력스트림을 제공받아 SqlSessionFactory 객체를 생성하여 반환
		return new SqlSessionFactoryBuilder().build(inputStream);
	}

 
 
이제 메소드를 선언해보자

 
SqlSessionFactory.openSession() : SqlSession 객체를 생성하여 반환하는 메소드 
SqlSessinon 객체 : 매퍼에 등록된 정보를 이용하여 SQL 명령을 제공받아 실행하고 실행결과를 Java 객체로 매핑 처리하여 반환하는 기능을 제공하는 객체 
 
SqlSession.selectList(String elementId) : 매퍼에 등록된 SELECT 명령을 제공받아 DBMS 서버에 전달하여 실행하고 실행결과를 List 객체로 반환하는 메소드 
→ elementId 매개변수에는 매퍼의 식별자(mapper 엘리먼트의 namespace 속성값)와 select 엘리먼트의 식별자(id 속성값) 을 이용한 문자열을 전달받아 매퍼에 등록된 SQL 명령을 DBMS 서버에 전달하여 실행하고 실행결과를 Java 객체로 매핑 처리하여 반환한다. 
 
SqlSession.close : SqlSession 객체가 사용한 JDBC 관련 객체를 제거하는 메소드 
 

//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 List 객체로 반환하는 메소드
    public List<Student> selectStudentList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession();//SqlSession 객체 생성해 반환
		try {
			//SQL 명령을 DBMS 서버에 전달하여 실행하고 실행결과를 Java 객체로 매핑처리하여 반환
			return sqlSession.selectList("xyz.itwill.mapper.StudentMapper.selectStudentList");
		} finally {
			//SqlSession 객체가 사용한 JDBC 관련 객체를 제거 
			sqlSession.close();
		}
	}

 
전체소스코드

package xyz.itwill.dao;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import xyz.itwill.dto.Student;

public class StudentDAO {
	private static StudentDAO _dao;
	
	private StudentDAO() {
		// TODO Auto-generated constructor stub
	}
	
	static {
		_dao=new StudentDAO();
	}
	
	public static StudentDAO getDAO() {
		return _dao;
	}
	
	
	//SqlSessionFactory 객체를 생성하여 반환하는 메소드
	private SqlSessionFactory getSqlSessionFactory() {
		//만약 mybatis 환경설정파일을 패키지에 작성한 경우 파일 시스템 경로(/)로 표현
		//String resource="xyz/itwill/config/mybatis-config.xml";
		
		String resource="mybatis-config.xml";
		
		InputStream inputStream=null;
		try {
			//mybatis 환경설정파일 경로를 전달받아 파일 입력스트림을 생성해 반환
			inputStream=Resources.getResourceAsStream(resource);
		} catch (IOException e) {//mybatis 환경설정파일이 없는 경우 예외 발생
			throw new IllegalArgumentException();
		}
		
		//mybatis 환경설정파일의 입력스트림을 제공받아 SqlSessionFactory 객체를 생성하여 반환
		return new SqlSessionFactoryBuilder().build(inputStream);
	}
	
	//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 List 객체로 반환하는 메소드
	public List<Student> selectStudentList() {
		SqlSession sqlSession=getSqlSessionFactory().openSession();//SqlSession 객체 생성해 반환
		try {
			//SQL 명령을 DBMS 서버에 전달하여 실행하고 실행결과를 Java 객체로 매핑처리하여 반환
			return sqlSession.selectList("xyz.itwill.mapper.StudentMapper.selectStudentList");
		} finally {
			//SqlSession 객체가 사용한 JDBC 관련 객체를 제거 
			sqlSession.close();
		}
	}
}

 
mybatis가 제대로 동작되는지 확인하기 위해 jsp 문서를 만들어보자
 
[student.jsp]

<%@page import="xyz.itwill.dao.StudentDAO"%>
<%@page import="xyz.itwill.dto.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	List<Student> studentList=StudentDAO.getDAO().selectStudentList();
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MYBATIS</title>
<style type="text/css">
table {
	border: 1px solid black;
	border-collapse: collapse;
}

td {
	border: 1px solid black;
	text-align: center;
	padding: 10px;	
}
</style>
</head>
<body>
	<h1>학생목록</h1>
	<hr>
	<table>
		<tr>
			<td>학번</td>
			<td>이름</td>
			<td>전화번호</td>
			<td>주소</td>
			<td>생년월일</td>
		</tr>	
		<% for(Student student : studentList) { %>
		<tr>
			<td><%=student.getNo() %></td>
			<td><%=student.getName() %></td>
			<td><%=student.getPhone() %></td>
			<td><%=student.getAddress() %></td>
			<td><%=student.getBirthday().substring(0, 10) %></td>
		</tr>
		<% } %>
	</table>
</body>
</html>

 
결과가 잘 출력된다.


mybatis 환경설정파일에서 선언할 수 있는 엘리먼트들을 추가로 알아보자.
 
 
properties : property 엘리먼트를 등록하기 위한 상위 엘리먼트
property : mybatis 환경설정파일에 필요한 값을 제공하기 위한 엘리먼트 
→ 다른 엘리먼트에서 ${이름} 형식으로 property 엘리먼트로 제공되는 값을 사용
property는 다수의 엘리먼트에서 공통적으로 사용되는 값을 제공하기 위해 설정한다 . 중복성을 최소화하여 유지보수의 효율성을 높일 수 있다.
 

[mybatis-config.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis 환경설정파일 : SqlSessionFactory 객체를 생성하기 위해 필요한 정보를 제공하는 파일-->
<configuration>
	<properties>
		<property name="oracleDriver" value="oracle.jdbc.driver.OracleDriver"/>
	</properties>

	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<!-- <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>  -->
               		 <!--  ${이름} 형식으로 property 엘리먼트로 제공되는 값을 사용할 수 있다 -->
				<property name="driver" value="${oracleDriver}"/>
				<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
				<property name="username" value="scott"/>
				<property name="password" value="tiger"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="xyz/itwill/mapper/StudentMapper.xml"/>	
	</mappers>
</configuration>

 
 
이번엔 resource 속성을 이용해 Properties 파일의 경로를 속성값으로 설정해보자
 

oracle_url.properties 생성

[oracle_url.properties]
 
오라클 서버의 url 주소를 저장

#name = value
local = jdbc:oracle:thin:@localhost:1521:xe
server = jdbc:oracle:thin:@www.itwill.xyz:1521:xe

 
resource 속성 : Properties 파일의 경로를 속성값으로 설정한다. (생략 가능)
→ property 엘리먼트 대신 Properties 파일의 등록된 정보를 이용하여 이름으로 값을 제공받아 사용할 수 있다.

 

[mybatis-config.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- mybatis 환경설정파일 : SqlSessionFactory 객체를 생성하기 위해 필요한 정보를 제공하는 파일-->
<configuration>
	<properties resource="oracle_url.properties">
		<property name="oracleDriver" value="oracle.jdbc.driver.OracleDriver"/>
	</properties>
	
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<!-- <property name="driver" value="oracle.jdbc.driver.OracleDriver"/>  -->
				<property name="driver" value="${oracleDriver}"/>
				<!-- <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/> -->
                <!-- Properties 파일의 등록된 정보를 이용하여 이름으로 값을 제공받아 사용 -->
				<property name="url" value="${local}"/>
				<property name="username" value="scott"/>
				<property name="password" value="tiger"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="xyz/itwill/mapper/StudentMapper.xml"/>	
	</mappers>
</configuration>

 
 
setting : mybatis 실행시 필요한 정보를 제공하기 위한 엘리먼트
→ setting 엘리먼트를 사용하지 않아도 실행에 필요한 값은 기본값으로 제공받아 사용할 수 있다.
→ mybatis 실행을 기본값을 제외한 값으로 제공받아 사용할 경우에만 setting 엘리먼트를 설정하면 된다. 
 
ex) callSettersOnNulls 기능을 [true]로 설정하면 UPDATE 명령 실행시 컬럼값을 NULL로 변경하는 기능을 허용한다. 

<settings>
	<setting name="callSettersOnNulls" value="true"/>
</settings>

 
아래의 페이지에서 setting 엘리먼트에 대한 환경설정들에 대한 정보를 알 수 있다.
https://mybatis.org/mybatis-3/ko/configuration.html#settings

 

MyBatis – 마이바티스 3 | 매퍼 설정

매퍼 설정 마이바티스 XML 설정파일은 다양한 설정과 프로퍼티를 가진다. 문서의 구조는 다음과 같다.: configuration properties 이 설정은 외부에 옮길 수 있다. 자바 프로퍼티 파일 인스턴스에 설정할

mybatis.org

 
 
typeAliases : typeAliase 엘리먼트를 등록하기 위한 상위 엘리먼트 
typeAliase : XML 기반의 매퍼 파일에서 Java 자료형 대신 사용할 별칭 별칭(AliasName)을 설정하기 위한 엘리먼트
→ mybatis 프레임워크는 내부적으로 Java 자료형에 대신 사용할 별칭을 제공한다. 
 - type 속성 : Java 자료형을 속성값으로 설정한다. 
 - alias 속성 : Java 자료형 대신 사용될 별칭을 속성값으로 설정한다.
 

<typeAliases>
	<typeAlias type="xyz.itwill.dto.Student" alias="Student"/>
</typeAliases>

 
[StudentMapper.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xyz.itwill.mapper.StudentMapper">
	<!-- 
	<select id="selectStudentList" resultType="xyz.itwill.dto.Student">
		select no, name, phone, address, birthday from student order by no
	</select>
	-->
    
	<select id="selectStudentList" resultType="Student">
		select * from student order by no
	</select>
</mapper>


이처럼 resultType 속성값으로 Java 자료형 대신 별칭(AliasName) 사용이 가능하다.
Java 자료형을 쉽게 표현하기 위해 별칭을 사용하며, 유지보수의 효율성이 증가한다. 
 
 
 
 

'학원 > 복기' 카테고리의 다른 글

[MyBatis] 매퍼 바인딩 / package 엘리먼트  (0) 2023.07.19
[MyBatis] 예제  (0) 2023.07.18
[MVC] 필터(Filter)  (0) 2023.07.16
[MVC] Functions 태그 라이브러리  (0) 2023.07.16
[MVC] Formatter 태그 라이브러리  (0) 2023.07.16