MyBatis란?

lavender_je
|2025. 4. 9. 17:58
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 작업 가능

 

 

 


전체 흐름 요약

  1. 서비스가 MemberMapper.insert(member) 호출
  2. 스프링이 자동으로 XML에 있는 SQL을 찾아 실행
  3. #{} 부분에 자바 객체 필드 값이 자동 바인딩됨
  4. 결과가 있다면 resultType에 매핑하여 리턴
  5. 필요한 경우 자동으로 @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