마이바티스 프레임워크

  1. 마이바티스 개요

1.1简介

마이바티스(MyBatis)는 오픈소스 영속성(Persistence) 프레임워크로, JDBC 개발을 간소화하기 위해 설계되었습니다. 원래 Apache의 iBatis 프로젝트로 시작하여 2010년에 Google Code로 이전되면서 마이바티스로 이름을 변경했으며, 2013년 11월부터 GitHub에서 관리되고 있습니다.

마이바티스의 특징은 다음과 같습니다:

  • 마이바티스는 일반 SQL 쿼리, 저장 프로시저 및 고급 매핑을 지원하는 우수한 영속성 프레임워크입니다.
  • 마이바티스는 JDBC 코드와 파라미터 수동 설정, 결과셋 검색의 거의 모든 작업을 캡슐화합니다.
  • 마이바티스는 간단한 XML 또는 어노테이션을 사용하여 매핑 관계를 설정하고, Java의 POJO(Plain Old Java Objects)를 데이터베이스 레코드로 변환합니다.

영속성 계층: 데이터 접근 계층(DAO)을 의미하며, 데이터베이스를 조작하는 역할을 합니다.

프레임워크: 반제품 소프트웨어로, 재사용 가능한 일반적인 소프트웨어 기초 코드 모델입니다. 프레임워크 위에서 개발하면 더 효율적이고 규칙적이며 확장 가능한 개발이 가능합니다.

1.2 마이바티스 빠른 시작

1.2.1 데이터 준비

framework_db 데이터베이스에 Member 테이블을 생성하고 데이터를 추가합니다.

-- framework_db 데이터베이스 생성 (UTF8 인코딩)
CREATE DATABASE IF NOT EXISTS framework_db CHARACTER SET utf8;
USE framework_db;

-- 회원 정보 테이블 생성
CREATE TABLE `member` (
    `member_id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '회원 ID',
    `member_name` VARCHAR(20) NOT NULL COMMENT '회원이름',
    `gender` CHAR(1) NOT NULL COMMENT '성별',
    `age` INT NOT NULL COMMENT '나이',
    `hometown` VARCHAR(50) NOT NULL COMMENT '고향'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='회원정보테이블';

-- 데이터 삽입
INSERT INTO member VALUES 
(2001, '이순신', 'm', 45, '부산'),
(2002, '세종대왕', 'm', 50, '서울'),
(2003, '신사임당', 'f', 38, '대구'),
(2004, '퇴계이황', 'm', 42, '광주'),
(2005, '양귀자', 'f', 29, '대전');

SELECT * FROM member;

1.2.2 Maven 모듈 생성 및 의존성 추가

pom.xml에 다음 의존성을 추가합니다:

<dependencies>
    <!-- 마이바티스 의존성 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.5</version>
    </dependency>
    <!-- MySQL 드라이버 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.31</version>
    </dependency>
    <!-- JUnit 테스트 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
    </dependency>
</dependencies>

1.2.3 마이바티스 핵심 설정 파일 작성

연결 정보 관리 및 하드코딩 문제 해결을 위한 설정 파일입니다. 파일명: mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 연결 정보 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/framework_db?useSSL=false&amp;serverTimezone=Asia/Seoul&amp;useTimezone=true"/>
                <property name="username" value="root"/>
                <property name="password" value="password123"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 엔티티 인터페이스 매핑 파일 경로 -->
        <mapper resource="MemberMapper.xml"/>
    </mappers>
</configuration>

1.2.4 SQL 매핑 파일 작성

SQL 문을 중앙 집중식으로 관리하여 하드코딩 문제를 해결합니다. 파일명: MemberMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!-- namespace: 이름 공간 - 해당 엔티티 인터페이스의 전체 경로 권장 -->
<mapper namespace="test">
    <select id="selectAllMembers" resultType="com.example.entity.Member">
        SELECT * FROM member;
    </select>
</mapper>

1.2.5 Java 코드 작성

① 데이터베이스 테이블에 따른 Entity 클래스 정의

② 핵심 설정 파일 로딩하여 SqlSessionFactory 객체 획득

③ SqlSession 객체 획득 후 SQL 문 실행

④ 리소스 해제

public static void main(String[] args) throws IOException {
    // 1. 마이바티스 핵심 설정 파일 로딩 및 SqlSessionFactory 생성
    String configFile = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(configFile);
    SqlSessionFactory sqlSessionFactory = 
        new SqlSessionFactoryBuilder().build(inputStream);

    // 2. SqlSession 객체 생성 (SQL 실행용)
    SqlSession sqlSession = sqlSessionFactory.openSession();

    // 3. SQL 실행 - selectList 메서드 호출 (매개변수: namespace.id)
    List<Member> members = sqlSession.selectList("test.selectAllMembers");
    System.out.println(members);

    // 4. 리소스 해제
    sqlSession.close();
}
  1. 매퍼 프록시 개발

2.1 목적

기존 방식의 하드코딩 문제를 해결하고, 이후 실행될 SQL을 간소화합니다.

기존写法:

// SQL 실행: namespace.id
List<Member> members = sqlSession.selectList("test.selectAllMembers");

프록시写法:

// MemberMapper 인터페이스의 프록시 객체 획득
MemberMapper mapper = sqlSession.getMapper(MemberMapper.class);
List<Member> members = mapper.selectAllMembers();

2.2 개발 단계

매퍼 프록시 방식을 사용하여 빠른 시작 예제를 구현합니다.

1) SQL 매핑 파일과 동일한 이름의 Mapper 인터페이스 정의

public interface MemberMapper {
    // ... 추상 메서드 (CRUD 연산 정의)
}

2) SQL 매핑 파일을 resources 폴더 내의 Mapper 인터페이스와 동일한 경로에 배치

주의: 디렉토리 생성 시 패키지가 아닌 일반 폴더로 생성해야 합니다. 다중 계층 구조는 "/"로 구분합니다.

3) SQL 매핑 파일의 namespace 속성을 Mapper 인터페이스의 전체 경로로 설정

<mapper namespace="com.example.mapper.MemberMapper">
</mapper>

4) Mapper 인터페이스에 메서드 정의 - 메서드 이름은 SQL 매핑 파일의 SQL 태그 id와 일치させ, 파라미터 타입과 반환 타입도 맞춥니다

package com.example.mapper;

import com.example.entity.Member;
import java.util.List;

public interface MemberMapper {
    /*모든 회원 정보 조회*/
    List<Member> selectAllMembers();
}

5) 코딩 구현

  • SqlSession의 getMapper 메서드를 통해 Mapper 인터페이스의 프록시 객체 획득
  • 해당 메서드 호출하여 SQL 실행
@Test
public void testProxy() throws IOException {
    // 1. SqlSessionFactory 획득
    InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(stream);

    // 2. SqlSession 객체 생성
    SqlSession sqlSession = factory.openSession();

    // 3. getMapper 메서드 호출
    MemberMapper mapper = sqlSession.getMapper(MemberMapper.class);
    List<Member> members = mapper.selectAllMembers();
    for (Member member : members) {
        System.out.println(member);
    }

    // 4. 세션 종료
    sqlSession.close();
}

세부사항: Mapper 인터페이스 이름과 SQL 매핑 파일 이름이 동일하고同一 디렉토리에 있는 경우, 패키지 스캔 방식을 사용하여 SQL 매핑 파일 로드를 간소화할 수 있습니다.

mybatis-config 파일에 다음 내용 추가:

<mappers>
    <package name="com.example.mapper"/>
</mappers>
  1. 마이바티스 설정 파일 분석

3.1 핵심 설정 파일 분석

<?xml version="1.0" encoding="UTF-8" ?>

<!-- configuration: 마이바티스 핵심 설정 파일의 루트 요소 -->
<configuration>

    <!-- typeAliases: POJO 엔티티 클래스의 별칭 설정 -->
    <typeAliases>
        <package name="com.example.entity"/>
    </typeAliases>

    <!-- environments: 데이터베이스 연결 환경 설정 (여러 환경 가능)
         default 속성: 연결할 환경을 지정 (environment의 id 값) -->
    <environments default="development">

        <!-- 환경 설정: id는 고유 식별자 -->
        <environment id="development">
            <!-- 트랜잭션 관리 방식: JDBC/MANAGED
                 JDBC: JDBC 트랜잭션 관리 - 수동 커밋 또는 롤백 필요
                 MANAGED: 다른 컨테이너에 트랜잭션 위임 (예: Spring) -->
            <transactionManager type="JDBC"/>
            
            <!-- dataSource: 데이터소스 설정 JNDI/POOLED/UNPOOLED
                 JNDI: 컨텍스트의 데이터소스 사용 (legacy)
                 POOLED: 커넥션 풀 사용 (권장)
                 UNPOOLED: 커넥션 풀 미사용 -->
            <dataSource type="POOLED">
                <!-- MySQL 드라이버 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!-- MySQL 연결 URL -->
                <property name="url" value="jdbc:mysql://localhost:3306/framework_db?useSSL=false&amp;serverTimezone=Asia/Seoul&amp;useTimezone=true"/>
                <!-- MySQL 사용자명 -->
                <property name="username" value="root"/>
                <!-- MySQL 비밀번호 -->
                <property name="password" value="password123"/>
            </dataSource>
        </environment>

        <environment id="production">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
                <property name="username" value="system"/>
                <property name="password" value="oracle123"/>
            </dataSource>
        </environment>
    </environments>

    <!-- SQL 매핑 파일 로드 -->
    <mappers>
        <!-- resource: 매핑 파일의 구체적인 경로 (슬래시 "/" 구분자 사용) -->
        <!-- <mapper resource="com/example/mapper/MemberMapper.xml"/> -->

        <!-- 경로가 많은 경우 패키지 스캔 방식 사용 가능 -->
        <package name="com.example.mapper"/>
    </mappers>

</configuration>

3.2 SQL 매핑 파일

<?xml version="1.0" encoding="UTF-8" ?>

<!-- SQL 매핑 파일:
namespace:命名空间 - 매퍼의 고유 식별자
命名规则: 매핑 파일에 해당하는 인터페이스의 전체 경로 권장

mapper: 데이터베이스와 상호작용하는 CRUD 연산 태그 포함
-->

<!-- select: 조회 연산
*id: 연산 메서드명과 대응
*resultType: 반환 타입 (typeAliases 설정 시 단축명 사용 가능, 대소문자 무관)
-->

SELECT * FROM member

태그: MyBatis java ORM persistence framework

6월 5일 21:34에 게시됨