목차
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);
}
}
'Backend > spring' 카테고리의 다른 글
DTO 작성 방법 - Array 및 Object 타입 (0) | 2024.11.18 |
---|---|
Spring WebSocket (0) | 2024.03.01 |
비밀번호 암호화/인증 (spring security 계정 생성) (0) | 2023.11.06 |
[spring security] 3. UserDetailsService, UserDetails (0) | 2023.08.29 |
[spring security] 2. configure 작성 (0) | 2023.08.27 |