백엔드/Mybatis

Mybatis 동작 예시 및 원리 - 개념 정리

코딩질문자 2023. 10. 14. 19:48
728x90

 간단한 동작 예시

  1. 라이브러리 추가 (Dependency)
    • Mybatis와 사용하고자하는 DB 클라이언트 (Mysql, Oracle, MariaDB 등)
  2. Config 파일에 접속정보(DataSource) 설정
  3. 매퍼 인터페이스를 생성한다.
  4. 위의 인터페이스 경로로 namespace를 가지는 xml 파일 생성
  5. xml 파일에 CRUD 쿼리를 작성한다.
  6. 매퍼 인터페이스에 5번에 작성한 메소드를 매핑시킨다. (인터페이스 메소드명과 쿼리 ID는 동일하게 맞춰야함)
  7. 서비스 로직에서 매퍼 인터페이스를 주입 받아서 특정 쿼리 메소드를 사용한다.

 

- 상세 설명-

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을 실행한다.
728x90