[Servlet][MyBatis] MyBatis3 시작하기

2022. 2. 15. 00:19JAVA/MyBatis

1. 설치

https://github.com/mybatis/mybatis-3/releases

 

Releases · mybatis/mybatis-3

MyBatis SQL mapper framework for Java. Contribute to mybatis/mybatis-3 development by creating an account on GitHub.

github.com

  1. mybatis-3.5.9.zip 다운로드
  2. mybatis-3.5.9.jar 파일을 프로젝트 lib 폴더에 저장
  3. Project Libraries에 mybatis-3.5.9.jar 추가
    1. Project 오른쪽 버튼 클릭->Build Path->Configure Build Path
    2. Libraries -> Add JARs.. -> WEB-INF/lib/mybatis-3.5.9.jar 선택
    3. mybatis 라이브러리 추가 확인

2. XML에서 SqlSessionFactory 빌드하기

1. mybatis 설정 파일 생성 및 작성 ( mybatis-config-test.xml )

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	
	<typeAliases>
		<typeAlias alias="MemberLoginVO" type="com.yh.libraryapp.member.model.vo.MemberLoginVO"/>
	</typeAliases>

  <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/ORCLPDB"/>
        <property name="username" value="LIBRARY"/>
        <property name="password" value="LIBRARY"/>
      </dataSource>
    </environment>
  </environments>
	
  <mappers>
    <mapper resource="com/yh/libraryapp/config/MemberMapper.xml"/>
  </mappers>
</configuration>

 

2. SqlSessionFactory 객체 생성 (myBatisTest.java)

class myBatisTest {

	private static SqlSessionFactory sqlSessionFactory;
	
	@BeforeAll
	public static void setup() throws IOException {
		String resource = "com/yh/libraryapp/config/mybatis-config-test.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
}

위 코드에서 setup() 메서드가 SqlSessionFactory 객체를 생성하는 메서드입니다. 위 myBatisTest 클래스는 JUNIT5를 기준으로 테스트를 수행하였습니다.

 

3. SqlSessionFactory에서 SqlSession 생성하기

SqlSession 객체를 생성하여 SQL 쿼리 구문 실행 (myBatisTest.java)

	@Test
	public void gettingStarted(){	
		String mem_email = "user1@gmail.com";
		
		try(SqlSession session = sqlSessionFactory.openSession()){
			MemberLoginVO member =  session.selectOne("MemberMapper.login",mem_email);
			System.out.println(member);
		}
	}
  • SqlSession session = sqlSessionFactory.openSession() : sqlSessionFactory 객체를 통하여 SqlSession 객체 생성
  • session.selectOne("MemberMapper.login",mem_email) : session 객체의 selectOne 메서드를 통하여 MemberMapper 파일의 login이라는 이름의 SQL구문을 실행하라는 의미

실행결과

MemberLoginVO [mem_email=user1@gmail.com, pwd=tmvlzj]

 

4. 매핑된 SQL 구문 작성

MemberMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MemberMapper">
	<select id="login" parameterType="String" resultType="MemberLoginVO">
    	select * from member where mem_email = #{mem_email}
  	</select>
</mapper>

 

5. Mapper Interface 방식

Mapper xml 파일에 쿼리구문을 작성하는 방식대신 인터페이스를 생성하여 매핑할 수 있습니다.

MemberMapper interface 생성

public interface MemberMapper {
	@Select("SELECT * FROM member WHERE mem_email = #{mem_email}")
	MemberLoginVO login(String mem_email);
}

 

MemberMapper.xml 파일 수정

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yh.libraryapp.config.MemberMapper">

</mapper>

namespace에 MemberMapper interface가 저장되어 있는 경로를 설정합니다.

 

myBatisTest.java

	@Test
	public void gettingStartedWithoutXML(){	
		String mem_email = "user1@gmail.com";
		
		try(SqlSession session = sqlSessionFactory.openSession()){
			MemberMapper mapper = session.getMapper(MemberMapper.class);
			MemberLoginVO member =  mapper.login(mem_email);
			System.out.println(member);
		}
	}

실행결과

MemberLoginVO [mem_email=user1@gmail.com, pwd=tmvlzj]

 

6. 스코프(Scope)와 생명주기(Lifecycle)

1. SqlSessionFactoryBuilder

  • SqlSessionFactory 객체를 생성한후 유지할 필요가 없습니다. 가장 좋은 스코프는 메서드의 지역변수입니다.

2. SqlSessionFactory

  • 한번 생성한 뒤 SqlSessionFactory는 애플리케이션을 실행하는 동안 존재해야 합니다. 그래서 삭제하거나 재생성할 필요가 없습니다.
  • SqlSessionFactory의 가장 좋은 스코프는 애플리케이션 스코프입니다. 싱글턴 패턴이나 static 싱글턴 패턴을 사용하는 것이 좋습니다.

3. SqlSession

  • 각각의 쓰레드는 자체적으로 SqlSession 인스턴스를 가져야 합니다.
  • sqlSession 인스턴스는 공유되지 않고 쓰레드에 안전하지도 않습니다.
  • 가장 좋은 스코프는 메서드의 지역변수입니다.

4. Mapper 인스턴스

  • Mapper는 매핑된 구문을 바인딩하기 위해 만들어야할 인터페이스입니다.
  • mapper 인터페이스의 인스턴스는 SqlSession에서 생성합니다.
  • mapper 인스턴스의 가장 좋은 스코프는 SqlSession과 동일합니다. (메서드의 지역 변수)
  • 명시적으로 닫을 필요는 없습니다.

References

 Source Code : https://github.com/yonghwankim-dev/mybatis_study
MyBatis : https://mybatis.org/mybatis-3/ko/getting-started.html