새발블로그

[Spring] Spring + MyBatis 본문

Server/Spring

[Spring] Spring + MyBatis

EUG 2025. 9. 22. 00:11

0. ORM(Object Relational Mapping)이란?

ORM은 객체(Object)와 데이터베이스(Relational DB)를 매핑(Mapping)하는 기술

  • 개발자가 SQL을 직접 작성하지 않고, 객체 지향적으로 DB를 다룸
  • ORM 프레임워크가 내부적으로 SQL을 생성해 실행
  • 대표 ORM: Hibernate, JPA

장점

  • SQL 작성량 줄어듦
  • 객체 지향적 개발 가능

단점

  • 복잡한 SQL/성능 튜닝 시 제약 많음
  • 자동 생성된 SQL 디버깅 어려움

1. MyBatis란?

MyBatisSQL 기반의 ORM 프레임워크

  • SQL을 직접 작성 → MyBatis가 SQL ↔ Java 객체 매핑
  • 복잡한 쿼리나 성능 튜닝이 필요한 경우 JPA보다 유리
  • XML 또는 어노테이션을 이용해 매핑

2. Mapper란?

Mapper는 Java 코드와 SQL을 연결하는 중간 다리.

 

설명
인터페이스(@Mapper) Java 메서드 정의 → SQL과 연결
XML 파일 SQL 정의, Mapper 인터페이스와 1:1 매핑

예시

UserMapper.java

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

 

UserMapper.xml <- resources에 존재!

<mapper namespace="com.example.mapper.UserMapper">
  <select id="selectUserById" resultType="com.example.domain.User">
    SELECT * FROM user WHERE id = #{id}
  </select>
</mapper>

3. MyBatis 동작 흐름

Java Service → Mapper 인터페이스 호출
→ MyBatis가 XML(SQL) 실행
→ DB 접근
→ 결과를 Java 객체로 매핑
→ 반환
 
 

4. Spring + MyBatis 연동 구조

  1. HikariConfig – DB 접속 정보 설정
  2. HikariDataSource – HikariCP 커넥션 풀
  3. SqlSessionFactory – MyBatis 핵심 세션
  4. SqlSessionTemplate – 트랜잭션 관리 포함 실행기
  5. Mapper – SQL 실행 (인터페이스 + XML 매핑)

5. Connection Pool이란?

  • DB 연결 생성은 비용이 큼 → 미리 만들어두고 재사용
  • 대표 라이브러리: HikariCP 

장점

  • 빠른 성능
  • 연결 개수 제어로 과부하 방지

6. DataSource란?

  • Spring MVC에서는 직접 bean 등록

1. XML 기반 Bean 등록

<!-- DataSource Bean -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    <property name="username" value="root"/>
    <property name="password" value="1234"/>
</bean>

<!-- SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath:/mappers/*.xml"/>
</bean>

<!-- Mapper Scanner -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
</bean>

 

2. Java Config 기반 Bean등록

Spirng 3.x 이후 등장, XML 대신 Java 클래스로 Bean 정의

@Configuration
@MapperScan(basePackages = "com.example.mapper") // Mapper 인터페이스 스캔
public class MyBatisConfig {

    @Bean
    public DataSource dataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/test");
        ds.setUsername("root");
        ds.setPassword("1234");
        return ds;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        factory.setMapperLocations(
            new PathMatchingResourcePatternResolver().getResources("classpath:/mappers/*.xml")
        );
        return factory.getObject();
    }
}
 

7. Statement란?

 

종류 설명
Statement 단순 문자열 실행(보안 취약)
PreparedStatement ? 바인딩 방식, MyBatis 내부적으로 사용
CallableStatement 프로시저 호출

8. JPA vs MyBatis 비교

구분 JPA MyBatis
SQL 작성 자동 생성 (쿼리 추상화) 직접 작성
학습 곡선 상대적으로 큼 SQL만 알면 쉽게 사용
장점 객체지향적, 생산성 ↑ SQL 최적화, 복잡 쿼리 유리
단점 디버깅/튜닝 어려움 SQL 작성량 많음
활용 CRUD 위주, 빠른 개발 레거시 시스템, 성능 튜닝 중요

9. Trouble Shooting 모음

1. Null 리턴 문제

  • 원인: resultType / resultMap 불일치
  • 해결: 컬럼명 ↔ VO 필드명 확인 (Camel Case 매핑 옵션 확인)

2. 매퍼 인식 안 됨

  • 원인: @MapperScan 설정 누락
  • 해결: @MapperScan("com.example.mapper") 추가

3/ DB Connection 누수

  • 원인: SqlSession 직접 관리 시 close 누락
  • 해결: SqlSessionTemplate 사용으로 해결

4.  “Too many connections” 에러

  • 원인: 커넥션 풀 설정 부족
  • 해결: maximumPoolSize 조정

5. 동적 SQL 오류

  • 원인: <if>, <foreach> 등 태그 닫힘 오류
  • 해결: MyBatis XML 검증 툴, IDE 플러그인 사용

'Server > Spring' 카테고리의 다른 글

[Spring] 직렬화와 역직렬화  (0) 2025.09.22
[Spring] 파일 업로드 & 다운로드  (0) 2025.09.22
[Spring] Spring 어노테이션  (0) 2025.07.11
[Spring] Spring MVC  (0) 2025.07.08
[Spring] Bean Scope & 생명주기  (0) 2025.07.08