Back-End

[Spring] Mybatis

Minch13r 2025. 5. 8. 19:54

MyBatis의 주요 특징 ✨

  1. 간결한 DB 연동 처리 - 자바 코드 1~2줄로 DB 연동 가능
  2. SQL과 자바 코드의 분리 - XML 파일로 SQL 분리
    • 결합도 감소 ⬇️
    • 응집도 증가 ⬆️
    • 유지보수성 향상 🔧

MyBatis 구현 단계 📝

1. 의존성 추가 📦

Maven pom.xml 또는 Gradle build.gradle 파일에 MyBatis 의존성을 추가합니다.

2. Mapper XML 파일 생성 📄

  • SQL 명령어에 고유 ID 부여 방식으로 설정
  • DAO에 작성된 SQL 분리
  • XML 태그(엘리먼트)를 사용하여 SQL 관리
  • 자바 코드는 소문자, SQL은 대문자 사용 권장
<mapper namespace="com.example.mapper.BoardMapper">
    <insert id="insert">
        INSERT INTO BOARD VALUES (NVL((SELECT MAX(BID)+1 FROM BOARD),1001),#{title}, #{content}, #{writer}, 0)
    </insert>
    
    <select id="selectAll" resultType="board">
        SELECT * FROM BOARD ORDER BY BID DESC
    </select>
    
    <select id="selectOne" resultType="board">
        SELECT * FROM BOARD WHERE BID=#{bid}
    </select>
    
    <update id="update">
        UPDATE BOARD SET TITLE=#{title}, CONTENT=#{content} WHERE BID=#{bid}
    </update>
    
    <delete id="delete">
        DELETE FROM BOARD WHERE BID=#{bid}
    </delete>
</mapper>

3. MyBatis 설정 파일(config.xml) 생성 ⚙️

  • DBMS 연결 설정 (Spring에서는 applicationContext.xml에 포함)
  • Mapper XML 파일 위치 지정
  • TypeAlias 설정
  • 트랜잭션 관리 설정
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 타입 별칭 설정 -->
    <typeAliases>
        <typeAlias type="com.example.model.Board" alias="board"/>
    </typeAliases>
    
    <!-- 매퍼 파일 위치 설정 -->
    <mappers>
        <mapper resource="mappers/BoardMapper.xml"/>
    </mappers>
</configuration>

4. Spring 연동 설정 🔄

applicationContext.xml에 MyBatis 관련 빈 등록:

<!-- DataSource 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    <property name="username" value="system"/>
    <property name="password" value="1234"/>
</bean>

<!-- SqlSessionFactory 설정 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>

<!-- SqlSessionTemplate 설정 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg ref="sqlSessionFactory"/>
</bean>

<!-- DAO 빈 등록 -->
<bean id="boardDAO" class="com.example.dao.BoardDAOImpl">
    <property name="sqlSession" ref="sqlSession"/>
</bean>

<!-- Service 빈 등록 및 DI -->
<bean id="boardService" class="com.example.service.BoardServiceImpl">
    <property name="boardDAO" ref="boardDAO"/>
</bean>

MyBatis의 추가 기능 🌟

  1. 동적 SQL - 조건에 따라 SQL 구문 변경 가능
  2. ResultMap - 복잡한 객체 매핑 처리
  3. 캐싱 - 성능 향상을 위한 1차/2차 캐시 제공
  4. 배치 처리 - 대량 데이터 처리 지원

MyBatis vs JPA 비교 🔍

특징 MyBatis JPA
SQL 제어 개발자가 직접 SQL 작성 자동 생성
학습 곡선 상대적으론 낮음 높음
성능 튜닝 세밀한 SQL 튜닝 가능 제한적
객체지향성 중간 높음

실무 활용 팁 💡

  1. XML 파일 구조화 - 기능별로 매퍼 분리
  2. 동적 SQL 활용 - 검색 조건에 따른 쿼리 최적화
  3. TypeHandler 사용 - 복잡한 데이터 타입 변환 처리
  4. 로깅 설정 - SQL 실행 과정 모니터링

'Back-End' 카테고리의 다른 글

[Java] JPA 영속성  (1) 2025.05.23
[DDD] 도메인 주도 설계 애그리거트  (0) 2025.05.22
[Spring] 어노테이션 세부사항 정리  (1) 2025.04.24
[Spring] AOP  (1) 2025.04.23
[Spring] 빈 생명주기  (1) 2025.04.22