티스토리 뷰
개요
- MyBatis는 자바 애플리케이션에서 SQL 문장을 XML 파일이나 애너테이션으로 분리 관리하면서, 자바 객체와 데이터베이스 테이블 간의 매핑을 지원하여 데이터베이스와 애플리케이션 간의 데이터 저장, 조회, 갱신 등을 쉽게 처리할 수 있도록 도와주는 소프트웨어 도구( 경량 퍼시스턴스 프레임워크 )
- 개발자는 직접 SQL을 작성하여 복잡한 쿼리 로직을 세밀하게 제어할 수 있고, 동시에 객체 지향적인 데이터 접근 방식을 구현할 수 있음
장점
직접적인 SQL 제어
- 개발자가 SQL을 직접 작성하므로 쿼리 최적화 및 복잡한 로직 구현이 용이
유연한 매핑 구조
- XML 매퍼 파일 또는 애너테이션을 통해 SQL과 자바 객체 간의 매핑을 명확하게 관리할 수 있어 재사용성과 유지보수가 용이
낮은 학습 곡선
- 내부 복잡한 매커니즘 대신 단순한 구조를 채택하여 빠른 도입과 학습이 가능
단점
반복 코드 증가
- SQL을 직접 작성하다 보면 유사한 코드가 반복되어 관리가 어려워질 수 있음
초기 설정 복잡성
- 매퍼 인터페이스와 XML 매퍼 간의 매핑 설정 등 초기 환경 구성이 다소 번거로울 수 있음
자동화 기능 제한
- 완전 자동화된 ORM 프레임워크에 비해 일부 기능은 개발자가 직접 관리해야 하는 경우가 많음
MyBatis의 핵심 개념 및 활용
1. SQL과 자바 객체 매핑
- SQL 문장은 XML 파일이나 애너테이션을 통해 정의되며, 특정 자바 메서드에 매핑되어 실행
- 예를 들어, 사용자 정보를 조회하는 SQL을 작성한 후 UserMapper 인터페이스의 메서드와 연결하여 실행할 수 있음
2. 매퍼 구성
매퍼 인터페이스
- 자바 코드 내에서 SQL 관련 메서드를 선언하며, XML 매퍼 파일과 연계하여 SQL을 실행
XML 매퍼 파일
- SQL 문장과 결과 매핑 규칙을 정의한 별도 파일로, 인터페이스와 협력하여 데이터베이스 작업을 수행
3. 환경 설정 및 SQL 세션 관리
설정 파일 (mybatis-config.xml)
- 데이터 소스, 매퍼 파일, 캐시 설정 등 전체 애플리케이션의 환경을 구성
SQL 세션 팩토리
- 설정 파일을 기반으로 SQL 세션을 생성하여 데이터베이스와의 연결 및 트랜잭션을 관리
자바 예제 코드
1. 매퍼 인터페이스 정의
public interface UserMapper {
// 사용자 ID로 단일 사용자 정보 조회
User findUserById(@Param("id") Long id);
// 모든 사용자 목록 조회
List<User> findAllUsers();
}
2. 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.UserMapper">
<select id="findUserById" parameterType="long" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
<select id="findAllUsers" resultType="com.example.model.User">
SELECT * FROM users
</select>
</mapper>
MyBatis – 애너테이션 방식
개요
- 애너테이션 방식은 XML 매퍼 파일 대신, 자바 코드 내에서 직접 애너테이션을 사용하여 SQL 문장을 정의하고 매핑하는 방법
- MyBatis는 기본적으로 XML 기반의 매핑을 지원하지만, 애너테이션을 통해 SQL을 간결하게 관리할 수 있어 코드와 설정을 한 곳에 모아둘 수 있음
장점
코드 집중화
- SQL 문장이 자바 인터페이스 내에 포함되어 있어 별도의 XML 파일을 관리할 필요가 없음
간결성
- 단순한 쿼리의 경우 XML 파일보다 직관적으로 코드를 작성할 수 있어, 개발 속도가 빨라짐
유지보수 용이
- 코드와 SQL이 한 파일에 있기 때문에 변경사항을 추적하고 수정하기가 수월
단점
코드와 설정의 혼재
- SQL 문장이 자바 코드에 포함되면, 코드와 설정이 분리되어 있지 않아 복잡한 프로젝트에서는 관리가 어려울 수 있음
재사용성 제한
- XML 매퍼처럼 여러 군데에서 재사용하기 어려울 수 있으며, 쿼리의 복잡성이 증가하면 가독성이 떨어질 수 있음
테스트 및 디버깅 이슈
- SQL이 코드에 내장되어 있기 때문에, SQL 변경 시 별도의 XML 파일보다 수정 및 디버깅이 까다로울 수 있음
애너테이션 방식의 주요 개념 및 활용
1. 애너테이션 기반 SQL 매핑
정의
- 자바 인터페이스의 메서드 위에 @Select, @Insert, @Update, @Delete 등의 애너테이션을 사용해 SQL 문장을 직접 지정
목적
- XML 파일 없이도 SQL 매핑을 쉽게 할 수 있으며, 간단한 쿼리를 작성하는 경우 효율적
2. 매퍼 인터페이스와 애너테이션
매퍼 인터페이스
- 자바 인터페이스에 SQL 관련 애너테이션을 부여하여, MyBatis가 실행 시 해당 애너테이션 정보를 읽어 SQL을 실행
결과 매핑
- 애너테이션 내에 resultType이나 resultMap을 지정하여 쿼리 결과를 자바 객체에 매핑할 수 있음
3. 설정 및 실행
환경 설정
- MyBatis의 기본 설정 파일(mybatis-config.xml)에는 매퍼 스캔 설정이 포함되어, 애너테이션 방식으로 작성된 매퍼 인터페이스를 자동으로 등록할 수 있음
SQL 세션
- 애너테이션 기반 매퍼도 XML 방식과 동일하게 SQL 세션을 통해 데이터베이스와의 연결 및 트랜잭션 관리를 수행
자바 예제 코드 (애너테이션 방식)
매퍼 인터페이스 정의
package com.example.mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import com.example.model.User;
public interface UserMapper {
// 사용자 ID로 단일 사용자 정보 조회
@Select("SELECT * FROM users WHERE id = #{id}")
User findUserById(@Param("id") Long id);
// 모든 사용자 목록 조회
@Select("SELECT * FROM users")
List<User> findAllUsers();
// 새로운 사용자 등록
@Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
int insertUser(User user);
}
애너테이션 방식과 XML 매퍼 방식의 차이
면접 대비 질문
기초 질문
Q1. MyBatis란 무엇이며, 주요 기능은 무엇인가요?
모범 답안
MyBatis는 SQL과 자바 객체 간의 매핑을 지원하는 프레임워크로, 개발자가 SQL을 직접 작성하여 데이터베이스 작업을 세밀하게 제어할 수 있도록 돕습니다.
Q2. MyBatis의 기본 구조와 구성 요소는 무엇인가요?
모범 답안
MyBatis는 매퍼 인터페이스, XML 매퍼 파일, 그리고 환경 설정 파일(mybatis-config.xml)로 구성되어 있으며, 이를 통해 SQL 매핑, 세션 관리, 캐싱 등 다양한 기능을 제공합니다.
Q3. MyBatis의 애너테이션 방식이란 무엇인가요?
모범 답안
MyBatis의 애너테이션 방식은 XML 매퍼 파일 없이 자바 인터페이스에 직접 @Select, @Insert 등의 애너테이션을 사용해 SQL을 정의하고 매핑하는 방법입니다.
심화 질문
Q1. XML 매퍼 파일과 애너테이션 방식의 차이점 및 장단점을 설명해 주세요.
모범 답안
XML 매퍼 파일은 SQL을 별도로 관리하여 재사용성과 유지보수가 용이하지만, 초기 설정과 파일 관리가 번거로울 수 있습니다. 반면, 애너테이션 방식은 코드 내에서 간결하게 SQL을 정의할 수 있으나, 복잡한 쿼리 관리에는 한계가 있을 수 있습니다.
Q2. MyBatis 설정 파일에서 캐시 설정이 가지는 역할과 그 효과에 대해 설명해 주세요.
모범 답안
캐시 설정은 동일한 쿼리의 반복 실행 시 데이터베이스 부하를 줄이고 응답 속도를 향상시키기 위해 결과 데이터를 임시 저장하는 역할을 합니다.
Q3. 애너테이션 방식을 사용할 때 주의해야 할 점은 무엇인가요?
모범 답안
코드와 SQL이 혼재되어 코드 가독성이 떨어질 수 있으며, 쿼리 복잡성이 증가하면 유지보수가 어려워질 수 있습니다. 또한, 디버깅 시 SQL 수정 및 테스트가 XML 방식보다 번거로울 수 있습니다.
압박 질문
Q1. MyBatis를 사용하면서 발생할 수 있는 반복 코드 문제를 해결하기 위한 방법은 무엇인가요?
모범 답안
반복 코드 문제는 SQL 재사용성을 높이기 위해 동적 SQL, 공통 매퍼의 활용, 그리고 코드 생성 도구를 도입하여 해결할 수 있습니다.
Q2. MyBatis와 전통적인 ORM 프레임워크 간의 차이점 및 각각의 실무 적용 시 고려사항에 대해 구체적으로 설명해 주세요.
모범 답안
MyBatis는 SQL을 직접 제어할 수 있어 세밀한 쿼리 최적화와 복잡한 로직 구현이 가능하지만, 개발자가 직접 SQL을 관리해야 하므로 코드 중복 및 초기 설정의 번거로움이 있습니다. 반면, 전통적인 ORM은 객체와 테이블 간의 자동 매핑을 제공하여 개발 생산성을 높이지만, 복잡한 쿼리의 경우 성능 최적화에 한계가 있을 수 있습니다. 실무에서는 프로젝트의 특성과 팀의 역량에 따라 적절한 프레임워크를 선택하고, 필요에 따라 두 방식을 혼용하는 전략이 필요합니다.
Q3. 복잡한 SQL 쿼리 작성 시 애너테이션 방식이 가지는 한계와 그 극복 방안은 무엇인가요?
모범 답안
복잡한 SQL 쿼리 작성 시 애너테이션 방식은 코드 내에 길고 복잡한 문자열로 작성되어 가독성과 유지보수가 어려울 수 있습니다. 이 경우, XML 매퍼 방식을 혼용하거나 동적 SQL 기능을 활용하여 코드 분리를 시도할 수 있습니다.
Q4. 실무 프로젝트에서 애너테이션 방식과 XML 매퍼 방식을 혼용하는 경우, 어떤 기준으로 선택해야 하나요?
모범 답안
간단한 CRUD 작업이나 소규모 쿼리는 애너테이션 방식을, 복잡한 조인이나 동적 쿼리가 필요한 경우는 XML 매퍼 방식을 사용하는 것이 좋습니다. 프로젝트 규모와 팀의 유지보수 전략, 코드 가독성을 고려하여 적절한 방식을 선택해야 합니다.
'Spring' 카테고리의 다른 글
[Spring] 트랜잭션 관리(@Transactional) (0) | 2025.02.25 |
---|---|
[Spring] JPA (0) | 2025.02.24 |
[Spring] JDBC Template (0) | 2025.02.20 |
[Spring] 데이터 바인딩 및 검증 (@Valid, BindingResult) (0) | 2025.02.19 |
[Spring] 예외 처리 (@ExceptionHandler, @ControllerAdvice 등) (0) | 2025.02.18 |
- Total
- Today
- Yesterday
- 그리디 알고리즘
- Spring Boot
- 백트래킹
- HTTP
- 동적 프로그래밍
- 우아한 테크코스
- 분할 정복
- MSA
- 데이터베이스
- TRIE
- k8
- devops
- Java
- restful api
- 자료구조
- 알고리즘
- 우테코
- 프리코스
- B+Tree
- Spring
- CPU 스케줄링
- 우선순위 큐
- 탐색 알고리즘
- CS
- 자바
- 스프링
- 운영체제
- db
- 해시 테이블
- i/o모델
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |