728x90
MyBatis는 SQL을 XML이나 어노테이션으로 분리해서 깔끔하게 관리할 수 있는 SQL Mapper 프레임워크야. JPA처럼 객체-테이블 매핑은 직접 안 해주지만, SQL을 내가 원하는 대로 컨트롤할 수 있다는 장점이 있어.
✅ MyBatis 기본 개념
| 요소 | 설명 |
| Mapper XML | SQL이 정의된 XML 파일 |
| Mapper Interface | XML에서 정의한 SQL을 호출하는 인터페이스 |
| SqlSessionFactory | MyBatis 설정을 읽고 SqlSession을 만드는 팩토리 |
| SqlSession | 실제 SQL 실행을 담당하는 객체 |
🔧 1. 기본 설정하기 (build.gradle)
dependencies {
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2'
implementation 'mysql:mysql-connector-java:8.0.33' // DB 드라이버
}
👉 역할
- mybatis-spring-boot-starter: MyBatis를 Spring Boot 프로젝트에서 쉽게 쓸 수 있게 해주는 스타터 패키지
- Mapper 스캔, SqlSession 자동 생성 등을 해줘
- mysql-connector-java: MySQL과 통신하기 위한 JDBC 드라이버
⚠️ 이 두 개는 MyBatis와 MySQL을 연동하는 데 필수야!
🏗️ 2. application.yml 설정
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_db
username: your_username
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:/mappers/**/*.xml
type-aliases-package: com.example.domain
👉 역할
- spring.datasource: MyBatis가 사용할 데이터베이스 정보
- 이 설정을 통해 HikariCP 커넥션 풀을 통해 DB 연결
- mapper-locations: MyBatis XML 파일들이 어디 있는지 지정
- classpath:는 resources/ 폴더 기준이라는 뜻
- type-aliases-package: 도메인 클래스가 있는 패키지
- XML에서 클래스 전체 이름 안 쓰고 <resultType="Member">처럼 간단하게 쓰게 해줌
🧱 3. 도메인 클래스 (예: Member.java)
@Data
public class Member {
private int memberId;
private String username;
private String password;
}
👉 역할
- Member는 DB의 member 테이블과 매핑되는 자바 객체
- MyBatis는 SQL 결과(ResultSet)를 이 객체에 자동으로 매핑해줘
- @Data는 Lombok으로 게터/세터 자동 생성
🧾 4. Mapper 인터페이스
@Mapper
public interface MemberMapper {
Member findById(int memberId);
void insert(Member member);
void update(Member member);
void delete(int memberId);
}
👉 역할
- MyBatis에서 XML과 연결되는 인터페이스
- 인터페이스 메서드 이름은 XML의 <select>, <insert> 태그의 id 속성과 정확히 일치해야 함
- @Mapper: 해당 인터페이스가 MyBatis Mapper라는 걸 스프링에 알려줌
스프링이 MemberMapper의 구현체를 자동으로 만들어 Bean으로 등록해줘
🗂️ 5. Mapper XML (resources/mappers/MemberMapper.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.MemberMapper">
<select id="findById" parameterType="int" resultType="com.example.domain.Member">
SELECT * FROM member WHERE member_id = #{memberId}
</select>
<insert id="insert" parameterType="com.example.domain.Member" useGeneratedKeys="true" keyProperty="memberId">
INSERT INTO member (username, password)
VALUES (#{username}, #{password})
</insert>
<update id="update" parameterType="com.example.domain.Member">
UPDATE member SET password = #{password}
WHERE member_id = #{memberId}
</update>
<delete id="delete" parameterType="int">
DELETE FROM member WHERE member_id = #{memberId}
</delete>
</mapper>
<mapper namespace="com.example.mapper.MemberMapper">
👉 역할
- 이 XML 파일이 어떤 인터페이스와 연결되는지 명시
- namespace는 인터페이스의 FQCN(Fully Qualified Class Name) 과 같아야 해
<select id="findById" parameterType="int" resultType="com.example.domain.Member">
SELECT * FROM member WHERE member_id = #{memberId}
</select>
- id: 인터페이스 메서드 이름
- parameterType: SQL에 전달되는 파라미터의 타입
- resultType: 결과를 어떤 객체로 매핑할지
<insert id="insert" parameterType="com.example.domain.Member" useGeneratedKeys="true" keyProperty="memberId">
INSERT INTO member (username, password)
VALUES (#{username}, #{password})
</insert>
- useGeneratedKeys="true": DB에서 생성된 AUTO_INCREMENT 값을 자동으로 받아와서
- keyProperty="memberId": 그 값을 member.memberId에 자동으로 세팅해줘
<update id="update" parameterType="com.example.domain.Member">
UPDATE member SET password = #{password}
WHERE member_id = #{memberId}
</update>
<delete id="delete" parameterType="int">
DELETE FROM member WHERE member_id = #{memberId}
</delete>
모든 SQL 문법에서 #{} 는 파라미터 바인딩 (PreparedStatement처럼) 이라고 보면 돼.
✅ 6. 서비스에서 사용하기
@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberMapper memberMapper;
public Member findMember(int id) {
return memberMapper.findById(id);
}
public void registerMember(Member member) {
memberMapper.insert(member);
}
}
👉 역할
- 스프링 서비스 레이어에서 Mapper를 주입받아 SQL을 실행
- 직접 SQL을 작성할 필요 없이 Mapper 메서드 호출로 DB 작업 가능
전체 흐름 요약
- 서비스가 MemberMapper.insert(member) 호출
- 스프링이 자동으로 XML에 있는 SQL을 찾아 실행
- #{} 부분에 자바 객체 필드 값이 자동 바인딩됨
- 결과가 있다면 resultType에 매핑하여 리턴
- 필요한 경우 자동으로 @Mapper 기반 구현체가 주입됨
🚨 주의할 점
- XML과 인터페이스 메서드 이름, 파라미터 타입 정확히 맞춰야 함
- 패키지명까지 정확히 매핑되어야 함
- 매퍼 위치랑 alias 패키지 정확히 설정해야 오류 안 남
728x90
'프로그래밍 > Spring' 카테고리의 다른 글
| Mock란? - 4월 10일 (1) | 2025.04.10 |
|---|---|
| Mock이란? - 4월9일 (0) | 2025.04.10 |
| 🌟 트랜잭션(Transaction) 이란? (0) | 2025.04.09 |
| JDBC를 이용한 간단한 CRUD 구현 (0) | 2025.04.08 |
| @GeneratedValue란? (0) | 2025.04.07 |