스프링에서 마이바티스 활용: 주석 및 XML 기반 데이터베이스 작업 가이드

마이바티스 기본 설정

데이터베이스 연결 설정

JDBC 드라이버 클래스명

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

DB 연결 URL

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test characterEncoding=utf8&useSSL=false

DB 사용자 이름

spring.datasource.username=root

DB 비밀번호

spring.datasource.password=root

로깅 설정

마이바티스 로그 출력 위치, 콘솔로 출력

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

카멜 케이스 변환 활성화

mybatis: configuration: map-underscore-to-camel-case: true # 카멜 케이스 자동 변환

마이바티스 XML 파일 설정

마이바티스 XML 파일 경로 설정, resources/mapper 디렉토리에 모든 테이블 XML 파일 생성

mybatis.mapper-locations=classpath:mapper/**Mapper.xml

스프링에서 주석을 이용한 마이바티스 작업

마이바티스는 강력한 자바 데이터 영속성 프레임워크로, 주석을 통해 SQL 작업을 단순화할 수 있습니다. 다음에서는 @Mapper, @Select, @Insert, @Options, @Delete, @Update, @Results@ResultMap을 포함한 일반적으로 사용되는 마이바티스 주석 및 사용법을 자세히 설명합니다.

1. @Mapper

@Mapper 주석은 인터페이스를 마이바티스 매퍼 인터페이스로 식별하는 데 사용됩니다. 이 주석은 마이바티스가 인터페이스를 찾아 구현 클래스를 생성할 수 있게 합니다.

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface EmployeeMapper {
    // 메서드 정의
}

2. @Select

@Select 주석은 SQL 쿼리를 정의하는 데 사용됩니다. 인터페이스 메서드에 직접 쿼리 문을 지정할 수 있습니다.

import org.apache.ibatis.annotations.Select;

@Mapper
public interface EmployeeMapper {
    
    @Select("SELECT * FROM employees WHERE employee_id = #{id}")
    Employee getEmployeeById(int id);
}

3. @Insert

@Insert 주석은 삽입 작업을 실행하는 데 사용됩니다. @Select와 유사하게 메서드에 삽입 SQL 문을 직접 작성할 수 있습니다.

import org.apache.ibatis.annotations.Insert;

@Mapper
public interface EmployeeMapper {

    @Insert("INSERT INTO employees (name, position, salary) VALUES (#{name}, #{position}, #{salary})")
    void addEmployee(Employee employee);
}

4. @Options

@Options 주석은 SQL 문 실행 시 옵션을 구성하는 데 사용됩니다. 생성된 기본 키 값 사용, 업데이트용 SQL 유형 지정 등이 포함됩니다.

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;

@Mapper
public interface EmployeeMapper {

    @Insert("INSERT INTO employees (name, position, salary) VALUES (#{name}, #{position}, #{salary})")
    @Options(useGeneratedKeys = true, keyProperty = "employeeId")
    void addEmployee(Employee employee);
}

5. @Delete

@Delete 주석은 삭제 작업의 SQL 문을 정의하는 데 사용됩니다.

import org.apache.ibatis.annotations.Delete;

@Mapper
public interface EmployeeMapper {

    @Delete("DELETE FROM employees WHERE employee_id = #{id}")
    void removeEmployee(int id);
}

6. @Update

@Update 주석은 업데이트 작업의 SQL 문을 정의하는 데 사용됩니다.

import org.apache.ibatis.annotations.Update;

@Mapper
public interface EmployeeMapper {

    @Update("UPDATE employees SET name = #{name}, position = #{position}, salary = #{salary} WHERE employee_id = #{id}")
    void modifyEmployee(Employee employee);
}

7. @Results

@Results 주석은 쿼리 결과의 매핑 관계를 정의하는 데 사용됩니다. 일반적으로 @Select와 함께 사용되며 SQL 쿼리 결과의 열을 객체 속성에 매핑하도록 지정할 수 있습니다.

import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Result;

@Mapper
public interface EmployeeMapper {

    @Select("SELECT * FROM employees WHERE employee_id = #{id}")
    @Results({
        @Result(property = "name", column = "name"),
        @Result(property = "position", column = "position"),
        @Result(property = "salary", column = "salary")
    })
    Employee getEmployeeById(int id);
}

8. @ResultMap

@ResultMap 주석은 정의된 결과 집합 매핑을 참조하는 데 사용됩니다. 이것은 여러 쿼리에서 동일한 결과 매핑을 재사용하는 더 유연한 방법을 제공합니다.

import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Result;

@Mapper
public interface EmployeeMapper {

    @Results(id = "employeeResultMap", value = {
        @Result(property = "employeeId", column = "employee_id"),
        @Result(property = "name", column = "name"),
        @Result(property = "position", column = "position"),
        @Result(property = "salary", column = "salary")
    })
    Employee getEmployeeById(int id);

    @Select("SELECT * FROM employees WHERE salary > #{salary}")
    @ResultMap("employeeResultMap")
    List<Employee> getEmployeesWithHigherSalary(int salary);
}

스프링에서 XML을 이용한 마이바티스 작업

XML 방식을 사용하여 마이바티스로 데이터베이스 작업을 수행하는 일반적인 패턴입니다. 다음에서는 마이바티스 구성, SQL 매핑 및 데이터베이스 작업 단계를 포함한 XML 방식으로 마이바티스를 구성하는 기본 단계와 예제를 설명합니다.

1. 마이바티스 의존성 추가

Maven을 사용하는 경우 pom.xml에 마이바티스 의존성을 추가할 수 있습니다:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version> <!-- 필요에 따라 버전 선택 -->
</dependency>

2. 마이바티스 구성 파일 생성

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/your_database"/>
                <property name="username" value="your_username"/>
                <property name="password" value="your_password"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <mapper resource="path/to/YourMapper.xml"/>
    </mappers>
</configuration>

3. 매퍼 XML 파일 생성

SQL 문과 해당 매핑을 정의하는 매퍼 XML 파일을 생성합니다. 예를 들어 EmployeeMapper.xml:

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

<mapper namespace="com.example.mapper.EmployeeMapper">

    <select id="selectEmployeeById" resultType="com.example.model.Employee">
        SELECT * FROM employees WHERE employee_id = #{id}
    </select>

    <insert id="insertEmployee" parameterType="com.example.model.Employee">
        INSERT INTO employees (name, position, salary) VALUES (#{name}, #{position}, #{salary})
    </insert>

</mapper>

4. 엔티티 클래스 생성

데이터베이스 테이블에 해당하는 엔티티 클래스를 생성합니다. 예를 들어 Employee.java:

package com.example.model;

public class Employee {
    private int employeeId;
    private String name;
    private String position;
    private double salary;

    // Getters and Setters
}

5. 매퍼 인터페이스 생성

마이바티스 제공 메서드를 사용하기 위해 매퍼 인터페이스를 생성합니다. 예를 들어 EmployeeMapper.java:

package com.example.mapper;

import com.example.model.Employee;
import java.util.List;

public interface EmployeeMapper {
    Employee selectEmployeeById(int id);
    void insertEmployee(Employee employee);
}

6. 마이바티스를 이용한 데이터베이스 작업

메인 프로그램에서 SqlSessionFactory와 SqlSession을 사용하여 데이터베이스 작업을 수행합니다.

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.Reader;

public class Main {
    public static void main(String[] args) {
        try {
            // mybatis-config.xml 구성 파일 읽기
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            
            // SqlSession 획득
            try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
                EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

                // 직원 추가
                Employee newEmployee = new Employee();
                newEmployee.setName("Bob");
                newEmployee.setPosition("Developer");
                newEmployee.setSalary(75000.00);
                mapper.insertEmployee(newEmployee);
                sqlSession.commit(); // 트랜잭션 커밋

                // 직원 조회
                Employee employee = mapper.selectEmployeeById(1);
                System.out.println(employee.getName());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

데이터베이스 필드와 Java 속성 매핑 정의

마이바티스에서 XML 파일을 통해 데이터베이스 필드와 Java 속성의 매핑을 정의하는 것은 데이터 영속화를 구현하는 중요한 단계입니다. 이 매핑 프로세스는 SQL 결과 집합의 열을 Java 객체의 속성에 해당시켜 두 간의 데이터가 올바르게 변환되도록 보장합니다.

1. 데이터베이스 테이블과 Java 엔티티 클래스 생성

employees라는 데이터베이스 테이블이 있다고 가정하면, 구조는 다음과 같습니다:

CREATE TABLE employees (
    employee_id INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(100),
    last_name VARCHAR(100),
    department VARCHAR(100),
    hire_date DATE
);

이 테이블에 해당하는 Java 엔티티 클래스 Employee를 생성합니다:

package com.example.model;

public class Employee {
    private int employeeId;
    private String firstName;
    private String lastName;
    private String department;
    private Date hireDate;

    // Getters and Setters
    public int getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public Date getHireDate() {
        return hireDate;
    }

    public void setHireDate(Date hireDate) {
        this.hireDate = hireDate;
    }
}

2. 매핑을 위한 매퍼 XML 파일 정의

매퍼 XML 파일에서 resultMap 요소를 사용하여 SQL 쿼리 결과와 Java 객체 필드 간의 매핑 관계를 정의합니다. 다음은 EmployeeMapper.xml 파일의 예시입니다:

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

<mapper namespace="com.example.mapper.EmployeeMapper">

    <!-- 결과 매핑 정의 -->
    <resultMap id="employeeResultMap" type="com.example.model.Employee">
        <id property="employeeId" column="employee_id"/>
        <result property="firstName" column="first_name"/>
        <result property="lastName" column="last_name"/>
        <result property="department" column="department"/>
        <result property="hireDate" column="hire_date"/>
    </resultMap>

    <!-- 결과 매핑을 사용한 조회 -->
    <select id="selectEmployeeById" resultMap="employeeResultMap">
        SELECT employee_id, first_name, last_name, department, hire_date 
        FROM employees 
        WHERE employee_id = #{id}
    </select>

    <!-- 직원 추가 -->
    <insert id="insertEmployee" parameterType="com.example.model.Employee">
        INSERT INTO employees (first_name, last_name, department, hire_date) 
        VALUES (#{firstName}, #{lastName}, #{department}, #{hireDate})
    </insert>

</mapper>

3. 매핑 요소 설명
  • resultMap: 매핑 규칙 집합을 정의하는 데 사용됩니다. id는 매핑의 고유 식별자이고, type은 매핑될 Java 객체의 전체 정규화된 클래스명을 지정합니다.
  • idresult:
  • <id property="employeeId" column="employee_id"/>는 기본 키의 매핑 관계를 지정합니다. property는 Java 객체의 속성명에 해당하고, column은 데이터베이스 테이블의 열명에 해당합니다.
  • <result property="firstName" column="first_name"/>는 데이터베이스의 first_name 열 값을 Java 객체의 firstName 속성에 매핑함을 나타냅니다.

태그: 마이바티스 스프링 자바 SQL 매퍼

6월 17일 03:07에 게시됨