코딩 개발/Spring

MyBatis 1탄 - Configuration, Annotation, SqlSessionFactory 로 실행하기

호소세 2023. 7. 10. 23:51
728x90
반응형

MyBatis란?

사전을 찾아보니까 Batis라는 새가 있더라고요. 귀엽죠.

 

하지만 알아보니 iBATIS 라는 초기버전에서 유래된 이름이라고 합니다.

 

MyBatis는 자바 언어를 위한 오픈 소스 퍼시스턴스 프레임워크입니다. 퍼시스턴스 프레임워크는 데이터베이스와의 상호 작용을 관리하고 데이터 액세스 계층을 개발하기 위한 도구와 기능을 제공합니다. 

 

MyBatis는 데이터베이스 쿼리, 저장 프로시저 또는 함수 호출, 데이터 매핑 등을 처리하는 간단한 방법을 제공합니다. 이를 통해 개발자는 데이터베이스 액세스 코드를 작성할 때 SQL 쿼리 및 데이터 매핑에 집중할 수 있습니다.

MyBatis는 JDBC(Java Database Connectivity)를 기반으로 하며, SQL 쿼리를 작성하고 실행하는 데 사용됩니다. 

 

MyBatis는 SQL mapper 파일과 자바 객체 사이의 매핑을 지원합니다. 개발자는 SQL 쿼리를 XML 파일이나 주석을 통해 작성하고, 이를 객체에 매핑하여 사용할 수 있습니다.

이러한 방식은 개발자가 SQL 코드를 명시적으로 작성하면서도 객체 지향적인 프로그래밍 모델을 사용할 수 있게 해 줍니다.

 

또한 MyBatis는 동적 SQL을 작성하는 기능을 제공하여 쿼리를 동적으로 생성(WHERE 절, 조건문 등등 매번 다른 값 사용 가능)할 수 있습니다. 이는 조건에 따라 쿼리를 생성하고 실행할 수 있으며, 동적 SQL을 사용하여 보다 유연한 데이터 액세스 로직을 구현할 수 있습니다.

 

MyBatis는 자바의 다양한 프레임워크와 통합될 수 있으며, 대표적으로 스프링 프레임워크와 함께 사용되는 경우가 많습니다. 스프링 프레임워크와 MyBatis를 함께 사용하면 데이터베이스 액세스 관련 작업을 효과적으로 처리할 수 있습니다.

 

MyBatis는 자바 언어를 위한 오픈 소스 퍼시스턴스 프레임워크로, SQL 쿼리와 데이터 mapping을 간편하게 처리하고 개발자가 데이터베이스 액세스 코드를 효율적으로 작성할 수 있도록 도와줍니다.

MyBatis를 작동시킬 수 있는 방법이 두 가지가 있습니다.

하나는 JavaConfig 파일과 Annotation을 이용하는 방식

하나는 Annotation과 Xml 파일을 이용하는 방식입니다.

 

오늘은 JavaConfig 파일과 Annotation을 이용하는 방식을 알아보겠습니다.

 

JavaConfig(AppConfig)와 Annotation 이용하여 MyBatis 실행하기

이번에도 Maven 프로젝트로 만들어 pom.xml (폼) 파일을 만든 후 외부에서 라이브러리를 가져와야 합니다. 어떤 것들이 필요한지 알아볼게요.

  	<dependencies>		
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.1</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.25</version>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>1.7.25</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.3.20</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>2.8.0</version>
		</dependency>
			<dependency>
			<groupId>com.oracle.database.jdbc</groupId>
			<artifactId>ojdbc8</artifactId>
			<version>21.5.0.0</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.6</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.0</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>5.3.20</version>
		</dependency>
	</dependencies>

너무 많죠? 하지만 새로 추가된 것들만 설명해 보겠습니다.

mybatis, mybatis-spring 라이브러리 두 개가 새로운 것 같죠?

 

mybatis

MyBatis 핵심 라이브러리 자체를 의미하며, MyBatis 작업과 관련된 주요 기능을 제공합니다. SQL 매핑을 정의하고 데이터베이스 작업을 실행하는 데 사용할 수 있습니다.

 

mybatis-spring

MyBatis-Spring 통합 라이브러리를 의미합니다. MyBatis와 Spring 프레임워크를 함께 사용할 때 필요한 기능을 제공합니다. 이 라이브러리를 사용하면 Spring의 트랜잭션 관리 및 빈(Bean) 구성과 MyBatis의 SQL 매핑을 통합할 수 있습니다.

 

처음에 이 두개가 무슨 차이가 있나 봤는데, mybatis는 spring이 아니라도 작동할 수 있습니다. 하지만 spring에서 mybatis를 쉽게 구동하기 위해서는 mybatis-spring이 꼭 필요하더라고요.

조금 있다 알아볼 SqlsessionFactoryBean, SqlSessionTemplate에 꼭 필요한 라이브러리입니다.

 

Configuration 설정 파일 제작

<AppConfig.java>

@Configuration 
@ComponentScan("myproject") 
public class AppConfig {
	@Bean	
	public DataSource dataSource() {
		BasicDataSource dataSource=new BasicDataSource();
		dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
		dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
		dataSource.setUsername("pom");
		dataSource.setPassword("michuddai");
		return dataSource;
	}
	@Bean 
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(dataSource);
		Resource []res=new PathMatchingResourcePatternResolver().getResources("classpath:/mappers/*Mapper.xml");
		sqlSessionFactoryBean.setMapperLocations(res);
		return sqlSessionFactoryBean.getObject();
	}
	@Bean  
	public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

위에서 설명드렸듯이 JDBC를 기반으로 SQL문을 실행합니다.

1. 따라서 데이터베이스 풀을 생성합니다.

2. SqlSessionFactory 인스턴스를 생성하기 위한 SqlSessionFactoryBean 객체를 생성합니다.

3. 데이터베이스 연결을 위해 DataSource를 설정합니다.

4. MyBatis 설정 파일 위치를 설정합니다.

PathMatchingResourcePatternResolver(). getResources() 메서드를 이용해서 *Mapper.xml 파일을 찾아서 SQL Mapping을 정의하는 데 사용합니다. -> 경로 "classpath:/mappers/*Mapper.xml"

5. SqlSessionFactory 객체를 getObject()로 생성하고 반환합니다.

 

밑에 SqlSessionTemplate은 더욱더 간단하게 sql문을 실행할 수 있는 객체입니다.

 

1. SqlSessionFactory를 매개변수로 받습니다.

2. SqlSessionTemplate은 내부적으로 SqlSessionFactory를 사용하여 SqlSession을 관리합니다.

-> 그래서 따로 Connection을 close 할 필요도 없고 그냥 실행만 해주면 됩니다.

 

template을 사용하기 이전에 sessionFactory를 이용해서 sql 실행하는 것을 해보고 나서 template을 사용해 볼게요. 내부에서 어떻게 작동하는지 알기는 해야 할 것 같아서요.

 

SqlSessionFactory를 이용한 sql 실행

<memberDAOImplVer1.java>

public class MemberDAOImplVer1 implements MemberDAO {
	private Logger log=LoggerFactory.getLogger(getClass());
	private SqlSessionFactory factory;
	@Autowired 
	public MemberDAOImplVer1(SqlSessionFactory factory) {
		super();
		this.factory = factory;
		log.debug(factory.toString());
	}
	@Override
	public int getTotalMemberCount() {
		SqlSession session=null;
		int count=0;
		try {
			session=factory.openSession();
			count=session.selectOne("member.getTotalMemberCount");
		}finally {
			session.close();
		}
		return count;
	}
}

기존 Connection 객체를 이용해서 실행하는 것보다 훨씬 코드가 짧아졌죠.

1. 로깅은 의존성 주입을 확인하기 위해 넣어놨습니다.

2. 멤버의 숫자를 확인하는 메서드 getTotalMemberCount를 설명하겠습니다.

3. SqlSession을 팩토리에서 openSession() 메서드로 할당합니다. (Connection 객체 할당이랑 비슷한 느낌이죠.)

4. 그다음 session에서 sql을 실행하여 값을 하나 가져오는 메서드인 selectOne 메서드를 실행합니다.

5. finally 구문으로 session을 닫아줍니다.

 

이렇게 작성하고 해야 할 일이 있습니다.

아까 위에서 설정 파일을 "classpath:/mappers/*Mapper.xml" 제작하지 않았더라고요.

Mybatis 설정 파일 생성 법

아주 중요합니다.

Help - Eclipse Marketplace - mybatis 검색 - 1.3 버전 다운로드 - 설치하고 eclipse restart

이러면 설정파일을 생성할 수 있습니다.

 

mappers 폴더를 하나 생성 -  오른쪽 마우스 클릭 - new - others - mybatis 검색 - xml 생성

멤버에 관한 것이니까 이름은 그냥 MemberMapper.xml이라고 생성하면 되겠습니다.

 

위에서 selectOne 메서드 옆에 member.getTotalMemberCount라는 Statement를 불러왔지 않습니까?

이것을 어떻게 사용하는지 보여드릴게요.

<?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="member">
<select id="getTotalMemberCount" resultType="int">
SELECT COUNT(*) FROM spring_member
</select>
</mapper>

namespace -  member

id - getTotalMemberCount

resultType - int

를 작성해서 statement를 불러오면 됩니다.

이렇게 설정하고 그 밑에 Sql 문을 작성해 놓으면 완성입니다! 느낌 오시죠?

 

모든 작업이 끝났습니다. 이제 test 만 하면 완성입니다.

 

<TestGetMemberCount.java>

public class TestGetMemberCount {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(AppConfig.class);
		MemberDAO dao=(MemberDAO)ctx.getBean("memberDAOImplVer1");
		System.out.println(dao.getTotalMemberCount());
		ctx.close();
	}
}

이렇게 하고 실행하면 결과 값이 잘 나오게 됩니다.

 

소감

template을 이용하여 mybatis 실행하는 것도 작성하려고 했는데, 너무 글이 길어질 것 같아서 다음 시간에 글을 더 작성해 보도록 하겠습니다.

벌써 23년의 반이 지났네요. 시간을 잘 활용해서 많은 것들을 정리하고 알아보고 싶습니다.

반응형