Mybatis 동작 예시 및 원리 - 개념 정리
✅ 간단한 동작 예시
- 라이브러리 추가 (Dependency)
- Mybatis와 사용하고자하는 DB 클라이언트 (Mysql, Oracle, MariaDB 등)
- Config 파일에 접속정보(DataSource) 설정
- 매퍼 인터페이스를 생성한다.
- 위의 인터페이스 경로로 namespace를 가지는 xml 파일 생성
- xml 파일에 CRUD 쿼리를 작성한다.
- 매퍼 인터페이스에 5번에 작성한 메소드를 매핑시킨다. (인터페이스 메소드명과 쿼리 ID는 동일하게 맞춰야함)
- 서비스 로직에서 매퍼 인터페이스를 주입 받아서 특정 쿼리 메소드를 사용한다.
- 상세 설명-
1. 라이브러리 추가 (Dependency): Maven 또는 Gradle과 같은 의존성 관리 도구를 사용하여 MyBatis 라이브러리를 프로젝트에 추가합니다.
2. Config 파일에 접속 정보 설정: MyBatis는 데이터베이스 연결 정보를 설정하는 XML 또는 Java 설정 파일을 사용합니다. 아래는 XML 설정 파일의 예시입니다:
<!-- mybatis-config.xml -->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mydatabase" />
<property name="username" value="username" />
<property name="password" value="password" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml" />
</mappers>
</configuration>
위의 코드는 MyBatis의 설정 파일인 mybatis-config.xml의 예시입니다. 이 파일은 MyBatis 애플리케이션의 설정 및 구성을 정의하는 데 사용됩니다. 아래에서 XML 코드를 하나씩 설명하겠습니다:
- <configuration>: MyBatis 설정 파일의 루트 엘리먼트입니다. 모든 설정 내용은 이 엘리먼트 안에 위치합니다.
- <environments>: MyBatis는 여러 환경을 지원할 수 있으며, 여기서는 development 환경을 설정하고 있습니다. 하나의 MyBatis 설정 파일에서 여러 환경을 정의하고, 그 중 하나를 기본(default) 환경으로 설정할 수 있습니다.
- <environment>: 환경을 정의하는 엘리먼트입니다. 각 환경은 데이터베이스 연결 정보와 트랜잭션 관리자 정보를 포함합니다.
- <transactionManager>: 데이터베이스 트랜잭션 관리자의 종류를 설정합니다. 여기서는 JDBC를 사용하고 있습니다. MyBatis는 JDBC 트랜잭션 관리를 지원합니다.
- <dataSource>: 데이터베이스 연결 정보를 설정합니다. 데이터베이스 연결 풀을 사용하려면 type 속성에 "POOLED"를 설정합니다.
- <property>: 데이터베이스 연결 정보에 대한 속성들을 설정합니다. 여기서는 드라이버 클래스, 데이터베이스 URL, 사용자 이름, 암호를 설정하고 있습니다. 이 정보를 통해 MyBatis는 데이터베이스와 연결합니다.
- <mappers>: MyBatis 매퍼 파일을 설정합니다. 이 엘리먼트 안에 여러 매퍼 파일을 정의할 수 있습니다. 이 예시에서는 UserMapper.xml 파일을 참조하고 있습니다.
<mapper>: 매퍨 파일을 지정합니다. resource 속성에 매퍼 파일의 경로를 지정합니다. UserMapper.xml 파일은 com/example/mapper 패키지 내에 있어야 합니다.
이 설정 파일은 MyBatis 애플리케이션의 데이터베이스 연결 및 매퍼 설정을 정의합니다. 매퍼 파일에는 SQL 쿼리와 매핑 정보가 포함되어 있으며, 애플리케이션에서 MyBatis를 사용할 때 이 설정 파일을 로드하여 데이터베이스 액세스를 설정합니다.
3. 매퍼 인터페이스 생성: 데이터베이스와 상호 작용할 메서드를 선언한 매퍼 인터페이스를 만듭니다.
// UserMapper.java
public interface UserMapper {
User getUserById(int id);
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
4. XML 파일에 CRUD 쿼리 작성
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="User">
INSERT INTO users (username, email) VALUES (#{username}, #{email})
</insert>
<update id="updateUser" parameterType="User">
UPDATE users SET username = #{username}, email = #{email} WHERE id = #{id}
</update>
<delete id="deleteUser">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
5. 매퍼 인터페이스에 메소드 매핑: 매퍼 인터페이스와 XML 파일을 연결하여 MyBatis가 각 메서드를 해당 SQL 쿼리와 연결하게 합니다.
6 서비스 로직에서 MyBatis 사용: 서비스 로직에서 MyBatis를 사용하여 데이터베이스 액세스를 수행합니다.
// UserService.java
public class UserService {
private final SqlSessionFactory sqlSessionFactory;
public UserService(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public User getUserById(int id) {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
return userMapper.getUserById(id);
}
}
public void addUser(User user) {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.insertUser(user);
sqlSession.commit();
}
}
}
✅ 내부 동작 원리
내부 동작 원리는 Spring 프레임워크가 기동 될때와 클라이언트가 특정 동작을 요청할때로 나뉜다.
- 프로그램 시작 시 수행되는 프로세스
- SqlSessionFactoryBuilder가 설정파일을 읽어와서 SqlSession을 생성하기위한 SqlSessionFactory를 생성한다.
- 이렇게 생성된 SqlSessionFactory는 Spring DI 컨테이너에 저장된다.
- 클라이언트 요청 시 수행
- 특정 쿼리 수행요청이 들어옴
- SqlSessionFactory가 SqlSession을 생성하고 애플리케이션에 반환한다.
- 애플리케이션이 매퍼 인터페이스 객체를 가져온다. (@Autowired)
- 매퍼 인터페이스 객체가 SqlSession 메소드를 통해 XML 파일에 있는 SQL을 실행한다.