목차
- MyBatis
1-1. MyBatis 흐름
1-2. MyBatis 동작 구조
1-3. MyBatis 라이브러리 연동 - mybatis-config.xml 프로젝트당 1개
2-1. mybatis-3-config.dtd 문서 형식 정의
2-2. <configuration> 마이바티스 설정
2-3. <environments>, <environment> 연동할 DB 정보 등록
2-4-1. <properties> 외부 프로퍼티 파일 불러오기
2-4-2. <dataSource> 프로퍼티 설정값 활용
2-5. <settings> null 값 처리
2-6. <typeAliaes> 자료형별 별칭 선언
2-7. <mappers>, <mapper> 매퍼 파일 등록 - mapper.xml 회원, 게시판 등 각 패키지마다 존재
3-1. mybatis-3-mapper.dtd 문서 형식 정의
3-2. <mapper> namespace 지정
3-3. <resultMap> <id>, <result>
3-4. <select>
3-5. <insert>, <update>, <delete> - 사용 예시: Connection Config
4-1. Java Config
4-2. XML Config - Scope Lifecycle
1. MyBatis
✅ 마이바티스(MyBatis) API 사이트
- 마이바티스(MyBatis)는 회원가입, 회원정보수정, 게시글 등록/수정/삭제 등 데이터의 입력, 조회, 수정, 삭제에 이르는CRUD 작업을 보다 간편하게 할 수 있도록 XML로 구조화한 Mapper 설정 파일 통해 JDBC를 구현한 영속성 프레임워크이다: [MyBatis] framework | 영속성 프레임워크
- 기존에 JDBC 통해 구현했던 상당 부분의 코드, 파라미터 설정 및 결과 매핑을 XML 설정 통해 간결하게 구현할 수 있도록 돕는다. pstmt.setInt(), while(rset.next())와 같이 파라미터 설정 및 결과 매핑했던 형식적인 코드들을 XML 설정만으로 대신할 수 있게 된 것이다.
현재 사용 추세는 XML에서 → 어노테이션(Annotation) 기반으로 많이 넘어가고 있다. 따라서 XML 통한 설정과 자바 클래스상에 어노테이션 통한 설정 두 가지 모두 다뤄보고자 한다.
1-1. MyBatis 흐름
JDBC DAO 예시 : [JDBC] DAO | MVC 패턴 | CRUD | Query
- 앞서 JDBC를 학습하는 동안 DAO(데이터 접근 객체, Data Access Object) 단계에서 일일이 작성해 조회 및 가공하던 Connection, PreparedStatement, ResultSet들을 MyBatis 전용 라이브러리로 대체할 수 있다.
- SqlSession의 경우 해당 객체들은 물론 커밋(commit), 롤백(rollback)과 같은 트랜잭션(transaction) 처리까지 가능하기 때문이다.
1-2. MyBatis 동작 구조
메소드명 | 용도 |
Object selectOne(String mapper, Object param) | 하나의 객체만 조회하고자 할 때 사용 |
List<E> selectList(String mapper, Object param) | 조회 결과를 List로 받고자 할 때 사용 |
Map<K, V> selectMap(String mapper, Object param, String mapKey) | 결과에 대한 값을 Map으로 받고자 할 때 사용 (마지막 인자에 key로 사용될 컬럼 명시) |
int insert(String mapper, Object param) | 데이터베이스에 데이터를 입력 |
int update(String mapper, Object param) | 데이터베이스의 데이터를 수정 |
int delete(String mapper, Object param) | 데이터베이스의 데이터를 삭제 |
mapper.xml에서 선언한 쿼리 구문을 SqlSession에서 실행할 때 쓰이는 메소드 종류에는 위와 같이 총 6가지가 있다.
- 마이바티스(MyBatis) 활용 객체을 생성하고 사용하기 위해서는 라이브러리 추가가 선행되어야 한다: mybatis-x.x.x.jar
- mybatis-config.xml 파일은 프로젝트당 하나만 두는 반면 mapper.xml의 경우 게시판, 멤버 등등 각 패키지마다 존재한다.
- config에서는 configuration이라는 그 뜻처럼 클래스(class)의 alias, DB 연결 정보, SQL 구문 경로에 이르는 설정 내용을 다룬다.
- mapper 파일 안에서는 인자값, 결과값, 데이터 타입 등의 설정을 포함한 SQL 구문 작성이 치러진다.
1-3. MyBatis 라이브러리 연동
❗ ojdbc8.jar 파일 다운로드 경로
※ 오라클 홈페이지 다운로드
※ 오라클이 C:\에 설치돼 있는 환경 : C:\app\사용자명\product\18.0.0\dbhomeXE\jdbc\lib
❗ mybatis-3.5.6.jar 파일 다운로드 경로
※ Maven Repository(mvnrepository) 홈페이지 다운로드
- ① 프로젝트 하위에 lib 폴더를 생성한다.
- ② 오라클(Oracle) 연결용 라이브러리인 ojdbc.jar를 다운로드 받아 lib 폴더에 드래그 앤 드랍한다.
- ③ 마이바티스(MyBatis) 라이브러리를 같은 폴더에 붙여넣는다: mybatis-3.5.6.jar
- ④ 프로젝트명 → (우클릭) → Properties 창을 띄워 Java Build Path의 Libraries를 설정한다. Classpath를 선택하고, Add JARs... 버튼을 눌러 사용하고자 하는 라이브러리 파일 모두를 등록한다.
- ⑤ 같은 창 하단의 Apply and Close를 눌러 변경사항을 적용시킨다.
2. mybatis-config.xml 프로젝트당 1개
✅ 마이바티스(MyBatis) API : 매퍼 설정 속성값
2-1. mybatis-3-config.dtd 문서 형식 정의
- .xml 파일 최상단에 문서 형식 정의(dtd, document type definition)을 지정한다.
- 이하의 내용이 마이바티스(MyBatis) 설정을 따르고 있음을 선언하는 것이다.
2-2. <configuration> 마이바티스 설정
- 최상위 태그로서 <configuration>을 작성하고, 필요한 설정들을 시작태그와 종료태그 사이에 서술한다.
2-3. <environments>, <environment> 연동할 DB 정보 등록
- <environments> 태그 안에 여러 <environment>를 나열할 수 있다. 즉 연결해 사용할 DB를 여러 개 둘 수가 있다는 뜻이다. 단, 각각의 <environment> id 속성값이 달라야 한다.
- 하위에 <transactionManager>, <dataSource>, <property>를 순서대로 작성한다. 이러한 환경 설정 정보를 가지고 해당 DB에 접속하겠다는 선언인 것이다.
2-4-1. <properties> 외부 프로퍼티 파일 불러오기
<properties resource=“경로+파일명.properties”>
<property name=“key명” value=“설정값”>
</properties>
- 외부 자바(Java) 프로퍼티(property) 파일을 불러올 때 쓰인다.
- resource 속성에 "경로+파일명.properties"를 명시해야 하며, 내부의 프로퍼티(property)들은 각각 name, value로 불러올 수 있다.
2-4-2. <dataSource> 프로퍼티 설정값 활용
구분 | POOLED | UNPOOLED |
특징 | 최초 Connection 객체 생성 시 해당 정보를 풀(pool) 영역에 저장해두고, 이후 Connection 객체를 생성할 때는 이를 불러가 재사용 | Connection 객체를 별도 저장하는 행위 없이 객체 호출 시 매번 생성하여 사용 |
장점 | Connection 객체를 미리 생성해 활용하기에 데이터베이스와 연결을 구축하는 데 걸리는 시간 단축 | Connection 연결이 많지 않은 코드를 작성할 때 간단하게 구현 가능 |
단점 | 단순한 로직을 수행하는 데 있어서 객체를 만들어두기엔 설정해야 할 정보가 많음 | 매번 새로운 Connection 객체를 생성하므로 속도가 상대적으로 느림 |
- 데이터베이스 연결을 관리하는 dataSource의 type은 크게 POOLED와 UNPOOLED로 나눠볼 수 있으며, 그 차이는 위와 같다.
- 한편 설정 가능한 type에는 JNDI도 있는데, 이는 마이바티스(MyBatis)에서 Connection 객체를 생성 및 관리하지 않고 웹 애플리케이션(Web Application) 설정을 따르겠다는 의미이다.
<dataSource type="POOLED">
<property name=“명칭” value=“${properties에 설정된 key명}”/>
<property name=“명칭” value=“${properties에 설정된 key명}”/>
</dataSource>
- <dataSource> 태그 안에서 <properties> 설정값들을 활용한다.
- ${ key } 형태로도 값 설정이 가능하다.
2-5. <settings> null 값 처리
<settings>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
- 마이바티스(MyBatis) 구동 시 선언할 설정들을 다룬다.
- Null 값이 발생할 경우 빈 칸으로 두지 않고 널(null)로 인식하도록 작성된 예시이다.
2-6. <typeAliaes> 자료형별 별칭 선언
<typeAliases>
<typeAlias type="member.model.vo.Member" alias="Member"/>
</typeAliases>
- type의 속성값으로서 패키지명부터 클래스명에 이르는 풀 네임 작성이 요구된다.
- alias에는 해당 자료형에 붙일 별칭을 기재한다.
2-7. <mappers>, <mapper> 매퍼 파일 등록
<mappers>
<mapper resource="member/model/mapper/member-mapper.xml"/>
<mapper resource="notice/model/mapper/notice-mapper.xml"/>
<mapper resource="board/model/mapper/board-mapper.xml"/>
</mappers>
- 사용하고자 하는 쿼리가 정의된 매퍼(mapper) 파일을 등록한다.
- <mappers> 태그 안에서 여러 <mapper>들을 나열할 수 있으며, 이때 각 <mapper> 시작태그의 resource 속성에 각 파일의 경로를 지정한다.
- 예시에서는 회원(member), 공지(notice), 게시판(board)별로 생성해둔 mapper.xml 파일들을 불러온 모습이다.
3. mapper.xml 회원, 게시판 등 각 패키지마다 존재
3-1. mybatis-3-mapper.dtd 문서 형식 정의
- .xml 파일 최상단에 이하의 내용은 마이바티스(MyBatis) 매퍼(mapper) 설정임을 선언하는 구문을 우선 작성한다.
3-2. <mapper> namespace 지정
<mapper namespace="Member">
. . .
</mapper>
- 이어서 <mapper> 태그를 쓰고, 외부에서 접근할 수 있는 이름인 namespace 속성을 기입한다.
3-3. <resultMap> <id>, <result>
<resultMap id="resultMember" type="Member">
<id property="id" column="ID"/>
<result property="passwd" column="PASSWD"/>
. . .
</resultMap>
- 조회한 결과를 객체와 행간의 1:1 매칭이 아닌, 원하는 객체의 필드에 담아 반환하고자 할 때 쓰인다.
- mybatis-config.xml에서 <typeAliases>로 별칭을 지정하지 않은 경우, <resultMap>의 type 속성은 패키지명부터 클래스명에 이르는 풀네임 작성이 요구된다.
- 그 하위에는 PK 컬럼에 해당하는 <id>와 그 외 일반 컬럼을 다루는 <result>가 자리한다.
3-4. <select>
속성 | 내용 |
id | 구문을 찾기 위해 사용될 namespace 내부의 유일한 구분자 |
parameterType | 구문에 전달될 파라미터의 풀네임 클래스명 또는 별칭 |
resultType | 리턴되는 타입의 패키지 경로를 포함한 풀네임 클래스명 또는 별칭 Collection인 경우 list, arrarylist로 설정 가능 |
resultMap | 사용할 resultMap의 id 기술 |
- SQL 조회 구문에 사용된다. 해당 쿼리를 외부에서 접근하고자 할 때는 namespace.id 형태로 호출될 것이다.
- #{ field }는 전달된 값을 뜻하며, JDBC에서 PreparedStatement 사용 시 함께 쓰였던 위치홀더(?) 역할과 같다.
- 쿼리문 종료를 의미하는
세미콜론(;)은 작성되지 않는다.
3-5. <insert>, <update>, <delete>
속성 | 내용 |
id | 구문을 찾기 위해 사용될 namespace 내부의 유일한 구분자 |
parameterType | 구문에 전달될 파라미터의 풀네임 클래슴여 또는 별칭 |
flushCache | 기본값은 false이며, true로 세팅 시 구문이 호출될 때마다 캐시가 지워짐(flush) |
timeout | 예외 발생 전 데이터베이스의 요청 결과를 기다리는 최대 시간 설정 ※ 드라이버에 따라 지원되지 않을 수 있음 |
- 주요 속성은 위와 같다.
- 마찬가지로 SQL 구문 종료를 의미하는
세미콜론(;)은 작성하지 않는다.
4. 사용 예시: Connection Config
4-1. Java Config
❗ DB 접속 관련 환경 설정
JdbcTransactionFactory : 수동 커밋
ManagedTransactionFactory : 자동 커밋
PooledDataSource : ConnectionPool 사용
UnPooledDataSource : ConnectionPool 미사용
- DB와 연결하는 객체 커넥션(Connection)을 풀(pool) 안에 미리 만들어놓고, Application이 DB 쪽으로 기능을 수행할 때마다 이들을 가져가 쓸지 말지를 선택한다.
- 커넥션풀(ConnectionPool) 사용 시 빠르게 반환돼 작업 시간이 절약된다는 이점이 따른다. 따라서 특수하게 쓰지 않아야 하는 상황이 아닌 이상 기본값처럼 커넥션풀 사용(PooledDataSource)으로 여기는 것이 낫다.
Mapper.interface
-- Mapper.interface
import org.apache.ibatis.annotations.Select;
public interface Mapper {
@Select("SELECT SYSDATE FROM DUAL")
java.util.Date selectSysdate();
}
- 인터페이스 Mapper를 생성하고, @Select 어노테이션을 붙여 현재 시각을 구하는 쿼리문을 전달한다.
Application.class
-- Application.class
private static String DRIVER = "oracle.jdbc.driver.OracleDriver";
private static String URL = "jdbc:oracle:thin:@localhost:1521:xe";
private static String USER = "C##REMINDER";
private static String PASSWORD = "REMINDER";
- Application 클래스에서는 오라클 DB와의 연결 위한 정보를 필드로 선언한다.
- 이때 URL로서 아이피, 포트 번호, 버전 정보(ip:port:version)가 전달된다. xe의 경우 Express Edition에서 비롯된 버전 이름이다.
Environment environment =
new Environment("dev"
, new JdbcTransactionFactory()
, new PooledDataSource(DRIVER, URL, USER, PASSWORD));
- Environment 객체는 환경을 만든다.
- 첫 번째 인자로 환경 정보 이름을 선언한다. 예시에서 전달된 "dev"처럼 이름은 임의적으로 설정이 가능하다.
- 다음으로는 커밋의 자동 여부, 즉 트랙잭션 매니저 종류를 결정한다. 이때 JdbcTransactionFactory()는 수동 커밋하겠다는 의미이다.
- 마지막으로 PooledDataSource는 커넥션풀(ConnectionPool)을 사용하겠다는 것으로, 앞서 필드로 선언해두었던 DB 연결 정보를 전달한다.
Configuration configuration = new Configuration(environment);
configuration.addMapper(Mapper.class);
- 생성한 환경 설정 정보를 토대로 마이바티스(MyBatis) 설정 객체 Configuration을 만든다.
- 해당 설정 객체에 인터페이스로 생성해둔 매퍼(Mapper)를 등록한다. 같은 패키지 하위에 있는 경우는 위처럼 별도 import 없이 인터페이스명만 전달해 쓸 수가 있다.
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
❗ SqlSessionFactoryBuilder → SqlSessionFactory → SqlSession
- SqlSessionFactoryBuilder의 경우 SqlSessionFactory 인터페이스 타입의 하위 구현 객체를 생성하기 위한 빌드 역할 수행한다.
- 이때 build()는 설정에 대한 정보를 담고 있는 Configuration 타입의 객체(Configuration) 혹은 외부 설정 파일과 연결된 스트림(InputStream)이 매개변수로 전달되거든 SqlSessionFactory 인터페이스 타입의 객체를 반환하는 메소드이다.
- SqlSessionFactory는 SqlSession 객체를 생성하기 위한 팩토리 역할을 수행하는 인터페이스이다.
SqlSession sqlSession = sqlSessionFactory.openSession(false);
- openSession()은 sqlSession 인터페이스 타입의 객체를 반환하는 메소드이다. boolean 타입을 인자로 삼아 오토 커밋(auto commit) 여부에 대한 옵션을 설정할 수가 있다.
- 따라서 false로 지정한 때는 Connection 인터페이스 타입 객체로 DML 수행 후 오토 커밋(auto commit)을 사용하지 않겠다는 의미가 된다. 작업 시 권장사항이기도 하다.
- true의 경우는 반대로 오토 커밋(auto commit)을 사용하겠다는 것이다.
Mapper mapper = sqlSession.getMapper(Mapper.class);
java.util.Date date = mapper.selectSysdate();
System.out.println(date);
- getMapper() 메소드는 환경 설정 정보 Configuration으로서 등록된 매퍼를 동일 타입에 대해 리턴한다.
- Mapper 인터페이스에 작성돼 있는 메소드를 호출하여 마침내 쿼리를 실행할 수 있게 된다.
- 예시의 결과값은 현재 시각을 나타내며 다음과 같은 형식을 가진다: Mon Mar 14 10:22:34 GMT+09:00 2022
sqlSession.close();
- close() 메소드 통해 사용을 마친 SqlSession 객체에 대한 반납이 치러져야 한다.
4-2. XML Config
mybatis-config.xml
<!DOCTYPE configuration ...>
<?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>
<environments default="dev">
<environment id="dev">
<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="C##REMINDER"/>
<property name="password" value="REMINDER"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/reminder/xmlconfig/mapper.xml"></mapper>
</mappers>
</configuration>
- 상단에 문서 형식 정의(dtd, document type definition)가 가장 먼저 선행되어야 한다. 이하의 설정 내용이 마이바티스(mybatis)에 해당함을 선언하는 것이자 이를 통해 뒤이을 태그들의 기능 역시 활성화되기 때문이다. DOCTYPE에 대한 내용은 API 사이트의 '시작하기' 메뉴에서 참고할 수 있다: 마이바티스(MyBatis) API
- 마이바티스 설정 객체인 <configuration> 태그 안에서 환경 설정(environment) 및 매퍼 설정(mapper)이 이루어진다.
- 이때 환경 설정 정보를 담는 <environments> 내부에 여러 <environment>를 서술할 수 있다.
- <transactionManager>의 type으로서 "JDBC" 또는 "MANAGED"를 선택한다. JDBC는 수동 커밋을, MANAGED는 자동 커밋을 의미한다.
- 커넥션풀(ConnectionPool) 사용 여부에 대해 <dataSource>의 type으로 명시할 수 있다. "POOLED"는 사용, "UNPOOLED"는 미사용에 해당되며, 가급적 사용하는 것을 기본으로 한다.
- DB 연결 정보를 담은 프로퍼티에 대해서는 <property> 태그와 name, value 속성으로 지정한다.
- 환경 설정 정보 이외에 사용하고자 하는 매퍼(mapper)에 대한 설정 역시 다뤄주어야 한다. <mappers>의 경우도 마찬가지로 그 하위에 복수의 <mapper>를 가질 수 있다. resource 속성 통해 해당 파일의 위치를 작성해 사용한다.
mapper.xml
<!DOCTYPE mapepr ...>
❗ config.xml과 mapper.xml에서 사용하는 .dtd는 다르다. 따라서 해당 .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="mapper">
<select id="selectSysdate" resultType="java.util.Date">
SELECT
SYSDATE
FROM DUAL
</select>
</mapper>
- 파일 생성 후 매퍼(mapper) 용도의 .dtd를 작성한다: 마이바티스(MyBatis) API
- mapper.xml 파일간 구분을 위해 namespace 속성을 지정한다. 예시에서 사용된 매퍼는 하나뿐이므로 간단히 mapper라 명명하였다.
- <select>, <insert>, <update>, <delete> 등 실질적으로 수행하고자 하는 SQL 구문을 <mapper> 하위에 작성한다. id 속성 통해 각각의 구문이 식별될 수 있도록 하며, resultType은 반환 타입에 대한 정의를 말한다.
Application.class
-- Application.class
String resource = "com/reminder/xmlconfig/mybatis-config.xml";
- xml 파일 설정을 모두 마친 뒤, Application 클래스에서 필요한 연결 작업을 진행한다.
- 마이바티스 설정 정보가 담긴 mybatis-config.xml 파일 위치를 문자열 resource에 담는다.
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- 이를 InputStream 객체 통해 읽어와 SqlSessionFactory 객체를 생성하는 과정이다.
- Resources에 선언돼 있는 getResourceAsStream() 메소드의 경우 IOException에 대한 핸들링이 요구되므로 try~catch 블럭 통해 예외처리하여야 한다.
- build()는 인자로서 Configuration 또는 InputStream 인스턴스를 취급할 수 있다. 예시에서는 InputStream을 사용한 모습이다.
SqlSession session = sqlSessionFactory.openSession(false);
- openSession()과 함께 오토 커밋(auto commit) 여부에 대해 false로 설정한다.
java.util.Date date = session.selectOne("mapper.selectSysdate");
System.out.println(date);
- SqlSession의 selectOne()은 하나의 행을 조회할 수 있는 메소드이다. 이때 인자로서 xml 파일에서 설정하였던 "namespace.id"로 특정 요소(element)를 선택해온다.
- 결과값은 Java Config 사용 시와 동일하게 현재 시각이 출력된다: Mon Mar 14 11:25:02 GMT+09:00 2022
session.close();
} catch (IOException e) {
e.printStackTrace();
}
- 사용을 모두 마친 SqlSession 객체에 대해 close()로 반납한다.
5. Scope Lifecycle
-- Template.class
private static SqlSessionFactory sqlSessionFactory;
- SqlSessionFactory는 애플리케이션이 실행되는 동안 존재해야 하는데, 이때 매번 다시 빌드되지 않는 것이 가장 좋은 형태이기도 하다.
- 따라서 애플리케이션 스코프(application scope)로 관리하기 위한 가장 간단한 방법으로 싱글톤 패턴(singleton pattern)을 적용한 모습이다: public static
public static SqlSession getSqlSession() {
if(sqlSessionFactory == null) {
String resource = "com/greedy/section01/xmlconfig/mybatis-config.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
- getSqlSession() 메소드를 정의하는 과정이다.
- SqlSessionFactoryBuilder의 경우는 SqlSessionFactory를 생성한 후 더 이상 유지될 필요가 없으므로 메소드 스코프(method scope)로 두도록 한다.
SqlSession sqlSession = sqlSessionFactory.openSession(false);
System.out.println("sqlSessionFactory의 hashCode() : " + sqlSessionFactory.hashCode());
return sqlSession;
}
- SqlSession은 요청 시마다 생성되어야 한다. 또한, 스레드(thread)에 안전하지 않아 공유될 수 없다.
- 따라서 요청 시 생성하고, 요청이 완료되면 반납(close)하는 HTTP와 유사한 스코프(scope)에 두는 것이 가장 올바른 방법이다.
- 위 예시에서 테스트를 위해 sqlSessionFactory의 hashCode()를 불러오자, 몇 번을 출력하든 동일한 hashCode를 보인다. 필드에 static으로 선언하고, null일 때 한 번 생성한 뒤 계속 같은 객체 토대로 쓰이고 있는 인스턴스이기 때문이다.
- 반면 getSqlSession()의 경우는 요청하는 순간마다 다른 객체, 인스턴스가 만들어지고 있다.
- 이 같은 차이는 이들의 스코프(scope)가 각각 SqlSessionFactoryBuilder는 메소드 지역변수처럼 쓰인 메소드 스코프, SqlSessionFactory는 애플리케이션 스코프, SqlSession은 요청 시마다 생성 또는 메소드 스코프로 상이한 데서 비롯된 것이다.
'Database' 카테고리의 다른 글
[Oracle/SQLDeveloper] 스크립트 내보내기(export) (0) | 2023.08.13 |
---|---|
[MyBatis] framework | 영속성 프레임워크 (0) | 2022.03.14 |
[UML] 유스케이스 다이어그램 실습 (0) | 2022.03.02 |
[UML] 유스케이스 다이어그램 | 액터 | 포함 관계 | 확장 관계 (0) | 2022.03.02 |
[DB 모델링] 3차 정규화 실습 | 데이터 논리 모델링 (0) | 2022.03.02 |