wintertreey 님의 블로그
MyBatis란? Pooling기법 본문
MyBatis란?
MyBatis는 자바 개발자들이 데이터베이스를 쉽게 다룰 수 있도록 도와주는
오픈 소스 ORM(Object-Relational Mapping) 프레임워크이다.
MyBatis의 주요 장점
- 유연성: SQL 쿼리를 직접 작성할 수 있으므로 매우 유연하다. 또한, MyBatis는 동적 쿼리를 작성할 수 있다.
- 간결성: MyBatis는 SQL 쿼리와 프로그래밍 언어 코드를 분리하기 때문에 코드가 간결해져 유지보수에 용이
- 성능: MyBatis는 캐시 기능을 제공하여 데이터베이스 연산 속도를 높일 수 있다.
- 다양한 데이터베이스 지원: MyBatis는 다양한 데이터베이스에 대한 지원을 제공한다.
Configuration.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>
<properties resource="pack/mybatis/db.properties" />
<typeAliases>
<typeAlias type="pack.business.DataDto" alias="dto"/>
<typeAlias type="pack.business.DataForm" alias="fbean"/>
</typeAliases>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="pack/mybatis/DataMapper.xml" />
</mappers>
</configuration>
<Configuration>
mybatis 설정 파일의 최상의 요소
<Properties>
외부 프로퍼티 파일인 db.properites를 참조해 변수설정한다.
db.properites에는 데이터 접속정보가 들어있다.
db.properties
<typeAliases>
별칭을 설정해줌
<environments>
mybatis가 사용할 환경 설정. 이름은 dev.
transactionManager: 트랜잭션 관리 방식을 설정. JDBC로 설정해둠.
dataSource: 데이터베이스 접속 정보를 설정. POOLED 타입으로 설정되어 있어, 데이터베이스 접속을 풀링 방식으로 관리한다. ${driver}, ${url}, ${username}, ${password}는 db.properties 파일에서 설정한 변수 값을 참조한다.
<mappers>
SQL 매퍼 파일을 설정. pack/mybatis/DataMapper.xml 파일을 참조하여 SQL 쿼리와 자바 메서드를 매핑.
DataMapper.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="dev">
<select id="selectDataAll" resultType="dto">
select * from sangdata order by code asc
</select>
<select id="selectDataById" parameterType="string" resultType="dto">
select code,sang,su,dan from sangdata where code = #{code}
</select>
<insert id="insertData" parameterType="fbean">
insert into sangdata(code,sang,su,dan) values(#{code},#{sang},#{su},#{dan})
</insert>
<update id="updateData" parameterType="fbean">
update sangdata set sang=#{sang},su=#{su},dan=#{dan} where code=#{code}
</update>
<delete id="deleteData" parameterType="int">
delete from sangdata where code=#{code}
</delete>
</mapper>
++ 앞선 <environment> 부분에서 풀링방식으로 데이터베이스 접속을 관리한다고 한다.
풀링방식에 대해 추가적으로 알아보자.
Pooling
풀링(Pooling)은 데이터베이스 접속을 효율적으로 관리하기 위한 기법이. 기본적으로 데이터베이스 접속은 비용이 큰 작업이며, 특히 매번 새로운 접속을 맺는 것은 성능에 부담을 줄 수 있다. 이런 문제를 해결하기 위해 연결 풀링 기법이 사용된다.
연결 풀링의 개념
연결 풀링은 데이터베이스 접속을 미리 여러 개 생성해 두고, 필요할 때마다 이 접속을 재사용하여 데이터베이스에 접속하는 방식. 풀링 관리자는 풀에 여유 접속이 있는지 확인하고, 필요할 때 접속을 빌려주고 사용이 끝나면 다시 풀에 반환한다. 이 과정에서 접속 생성과 해제에 따른 비용을 줄일 수 있어 성능을 향상시킬 수 있다는 이득이 있다.
풀링 방식의 장점
- 성능 향상: 접속을 반복적으로 맺고 끊는 비용을 줄여서 응용 프로그램의 성능을 향상시켜준다.
- 자원 관리: 데이터베이스 접속을 풀에서 관리하기 때문에, 자원의 효율적인 사용과 관리가 가능.
- 동시 접속 처리: 다수의 클라이언트가 동시에 데이터베이스에 접속해야 할 때, 풀링을 사용하면 동시 접속을 더욱 효율적으로 처리할 수 있다.
ProcessDao.java
각 sql문마다 세션을 열고 닫아준다.
package pack.business;
import java.sql.SQLException;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import pack.business.DataDto;
import pack.mybatis.SqlMapConfig;
public class ProcessDao {
// 필요없어서 뺌. (jpro7mybatis와 다른점)
private SqlSessionFactory factory = SqlMapConfig.getSqlSession();
public List<DataDto> selectDataAll() throws SQLException{
SqlSession sqlSession = factory.openSession(); //세션열기
List list = sqlSession.selectList("selectDataAll");
sqlSession.close();//세션닫기
return list;
}
public DataDto selectPart(String para) throws SQLException{
SqlSession sqlSession = factory.openSession(); //세션열기
DataDto dto = sqlSession.selectOne("selectDataById", para);
sqlSession.close();//세션닫기
return dto;
}
public void insData(DataForm form) throws SQLException{
SqlSession sqlSession = factory.openSession(); //transation 수동처리
sqlSession.insert("insertData", form);
sqlSession.commit(); //수동! 커밋이라고 적어야 적은값이 반영되어 콘솔창에 뜬다.
sqlSession.close();//세션닫기
}
public void upData(DataForm form) throws SQLException{
SqlSession sqlSession = factory.openSession(true); //transation 자동처리. 상단과 달리 commit 불요.
sqlSession.insert("updateData", form);
sqlSession.close();//세션닫기
}
//void일때 반환값없어서 개발자 확인이 어렵. del는 보이게 해보자. boolean, int 등 자유롭게 가.
public boolean delData(int para) {
boolean result = false;
SqlSession sqlSession = factory.openSession();
try {
int cou = sqlSession.delete("deleteData", para);
if(cou > 0) result = true;
sqlSession.commit();
} catch (Exception e) {
System.out.println("delData err: "+ e);
sqlSession.rollback();
}finally {
if(sqlSession != null) sqlSession.close();
}
return result;
}
}
출력연습과 관련한 코드는 깃허브의 wproject5mybatis를 참고하자.
https://github.com/yoonah0327/java_source.git
https://ccomccomhan.tistory.com/130
'백엔드 > Spring' 카테고리의 다른 글
@Qualifier, @Resource, @Value (0) | 2024.07.07 |
---|---|
@Scope, @Autowired @Resoruce, @PreConstruct @PreDestroy (0) | 2024.07.07 |
constructor/setter injection, scope 다형성 캐스팅 (0) | 2024.07.04 |
@Component , @Autowired, @Configuration, @ComponentScan (0) | 2024.07.04 |
Setter Injection (0) | 2024.07.04 |