새발블로그
[Spring] Spring + MyBatis 본문
0. ORM(Object Relational Mapping)이란?
ORM은 객체(Object)와 데이터베이스(Relational DB)를 매핑(Mapping)하는 기술
- 개발자가 SQL을 직접 작성하지 않고, 객체 지향적으로 DB를 다룸
- ORM 프레임워크가 내부적으로 SQL을 생성해 실행
- 대표 ORM: Hibernate, JPA
장점
- SQL 작성량 줄어듦
- 객체 지향적 개발 가능
단점
- 복잡한 SQL/성능 튜닝 시 제약 많음
- 자동 생성된 SQL 디버깅 어려움
1. MyBatis란?
MyBatis는 SQL 기반의 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 연동 구조
- HikariConfig – DB 접속 정보 설정
- HikariDataSource – HikariCP 커넥션 풀
- SqlSessionFactory – MyBatis 핵심 세션
- SqlSessionTemplate – 트랜잭션 관리 포함 실행기
- 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 |