Backend/spring

MyBatis 연결 (Spring DAO 작성 방법)

dddzr 2024. 10. 30. 18:57

목차

1. 매퍼 인터페이스 사용

   *MyBatis Generator를 사용하여 생성하는 방법

2. SqlSession 직접 사용 

3. 어노테이션 기반 매퍼

 

0. 시작하기 전에

0-1. Spring boot mybatis 의존성 추가

  • pom.xml에 MyBatis 의존성을 추가합니다.
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.6</version>
</dependency>

 

0-2. Spring 공통 설정

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    
    <!-- 어노테이션 기반에서는 필요 x -->
    <property name="mapperLocations" value="classpath:/mapper/**/*_SQL.xml" />
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

 

0-3. MyBatis-Spring 통합 라이브러리 사용 준비

  • MyBatis-Spring 통합은 Spring Framework와 MyBatis를 함께 사용하는 방식으로, 의존성 주입(DI) 및 트랜잭션 관리를 쉽게 할 수 있습니다.

- application.properties / application.yml

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

 

- pom.xml

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.9</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>

 

1. 매퍼 인터페이스 사용

  • 매퍼 인터페이스는 SQL 쿼리를 호출하는 메서드를 정의하는 Java 인터페이스입니다. 매퍼 XML 파일에 정의된 SQL 문장은 인터페이스의 메서드 이름과 매핑되어 호출됩니다.
  • 복잡한 SQL 쿼리를 사용하거나, 여러 SQL 문을 효율적으로 관리할 필요가 있을 때 유용합니다.

- UserMapper.xml

<mapper namespace="UserMapper">
    <select id="getUserById" parameterType="int" resultType="User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

 

- UserMapper.java (mapper interface)

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {
    User getUserById(int id);
}

 

- UserService

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    
    @Autowired
    private UserMapper userMapper; // MyBatis 매퍼 인터페이스를 주입받음

    public User getUserById(int id) {
        return userMapper.getUserById(id); // 매퍼 메소드를 직접 호출
    }
}



 * MyBatis-Spring 통합 라이브러리 사용하지 않을 때

더보기

- UserMapper.java (@Mapper 사용 x)

public interface UserMapper {
    User getUserById(int id);
}

 

- UserDAOImpl.java -> 구현 필요.

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class UserDAOImpl implements UserMapper {
    
    @Autowired
    private SqlSession sqlSession; // SqlSession을 주입받음

    @Override
    public User getUserById(int id) {
        return sqlSession.selectOne("UserMapper.getUserById", id); // SqlSession을 사용하여 호출
    }
}

 

- UserService

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class UserDAOImpl implements UserMapper {
    
    @Autowired
    private SqlSession sqlSession; // SqlSession을 주입받음

    @Override
    public User getUserById(int id) {
        return sqlSession.selectOne("UserMapper.getUserById", id); // SqlSession을 사용하여 호출
    }
}

 

* MyBatis Generator한 dto 자동 생성.

  • MyBatis Generator는 데이터베이스 테이블 구조에 맞춰 MyBatis 매퍼 및 모델 클래스를 자동으로 생성하는 도구입니다. 
  • DAO(=model, = repository), DTO(mapper interface), SQL(mapper.xml) 자동 생성
  • 대규모 프로젝트에서 데이터베이스 테이블 구조에 맞춰 코드의 일관성을 유지하고, 반복적인 작업을 줄이기 위해 사용됩니다.

- 사용 예시

더보기

- pom.xml

의존성 추가

<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.4.0</version>
</dependency>


<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.4.0</version>
            <configuration>
                <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

 

- generatorConfig.xml

DB정보를 입력합니다.

<?xml version="1.0" encoding="UTF-8"?>
<context id="MyBatisGenerator" targetRuntime="MyBatis3">
    <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                    connectionURL="jdbc:mysql://localhost:3306/mydb"
                    userId="root"
                    password="password"/>
    
    <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java" />
    <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources/mapper" />
    <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java" />
    
    <table tableName="users" domainObjectName="User"/>
</context>

 

- 자동 생성된 코드 예시 (기본 CRUD 소스를 포함합니다.)

- 테이블

id username password
1 user1 pass1
2 user2 pass2

 

- User.java (모델)

package com.example.model;

public class User {
    private Integer id;         // 필드 1: ID
    private String username;    // 필드 2: 사용자명
    private String password;    // 필드 3: 비밀번호
    
    // Getters and Setters
}

 

- UserMapper.java (매퍼 인터페이스)

package com.example.mapper;

import com.example.model.User;

public interface UserMapper {
    int insert(User user);                   // Create
    User selectByPrimaryKey(Integer id);     // Read
    List<User> selectAll();                  // Read
    int update(User user);                   // Update
    int delete(Integer id);                   // Delete
}

 

- UserMapper.xml (매퍼 XML)

<mapper namespace="com.example.mapper.UserMapper">
    <insert id="insert" parameterType="com.example.model.User">
        INSERT INTO users (username, password) VALUES (#{username}, #{password})
    </insert>

    <select id="selectByPrimaryKey" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <select id="selectAll" resultType="com.example.model.User">
        SELECT * FROM users
    </select>

    <update id="update" parameterType="com.example.model.User">
        UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}
    </update>

    <delete id="delete" parameterType="Integer">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>

 

2. 어노테이션 기반 매퍼

  • 어노테이션 기반 매퍼는 XML 매퍼 파일 대신 Java 어노테이션을 사용하여 SQL 쿼리를 정의하는 방식입니다.
  • 간단한 쿼리나 CRUD 작업을 수행할 때 유용합니다. 특히 작은 프로젝트나 프로토타입 개발에 적합합니다.

- UserMapper.java

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
}

 

- UserService.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    
    @Autowired
    private UserMapper userMapper; // MyBatis 매퍼 인터페이스를 주입받음

    public User getUserById(int id) {
        return userMapper.getUserById(id); // 매퍼 메소드를 직접 호출
    }
}

 

* MyBatis-Spring 통합 라이브러리 사용하지 않을 때

더보기

- UserMapper.java (@Mapper 사용 x)

public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
}

 

- UserService.java

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    
    @Autowired
    private SqlSession sqlSession; // SqlSession을 주입받음

    public User getUserById(int id) {
        return sqlSession.selectOne("UserMapper.getUserById", id); // SqlSession을 사용하여 호출
    }
}

 

3. SqlSession 직접 사용

  • SqlSession은 MyBatis에서 SQL 쿼리를 실행하는 객체입니다. SqlSession을 사용하여 XML 매퍼 파일에 정의된 SQL 문장을 직접 호출할 수 있습니다.
  • SQL 쿼리를 직접 제어해야 할 필요가 있는 경우나 복잡한 동적 SQL을 작성해야 할 때 유용합니다.

- UserLoginDAO.java

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

@Repository
public class UserLoginDAO {
    private final SqlSession sqlSession;

    public UserLoginDAO(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }

    public User getUserById(int id) {
        return sqlSession.selectOne("UserMapper.getUserById", id);
    }
}