[MyBatis] Config, Mapper

컨테이너·2025년 11월 16일
0

SpringFramework

목록 보기
5/15
post-thumbnail

0. Mapper Interface ↔ Mapper XML 연동 규칙

  1. 인터페이스와 XML 파일이 동일 패키지, 동일 파일명이어야 한다.
  2. XML의 namespace인터페이스 풀네임(패키지 + 클래스명) 으로 지정한다.
  3. 인터페이스의 메서드 이름 = XML의 id,
    인터페이스의 리턴 타입 = XML 쿼리 결과 타입 이어야 한다.

1. MyBatis Configuration by JAVA

1-1. Environment

역할

  • DB 접속 설정 + 트랜잭션 방식 + DataSource(커넥션풀) 정보를 묶어둔 환경 객체

생성

Environment env = new Environment(
    "dev",                         // 환경 이름
    new JdbcTransactionFactory(),  // 트랜잭션 매니저
    new PooledDataSource(DRIVER, URL, USER, PASSWORD) // 커넥션풀
);

키워드

  • JdbcTransactionFactory : 수동 commit (권장)
  • ManagedTransactionFactory : 컨테이너/서버가 트랜잭션 관리
  • PooledDataSource : 커넥션 풀 사용
  • UnpooledDataSource : 매번 새 커넥션 생성

1-2. Configuration

역할

  • Environment를 받아서 만드는 MyBatis 전역 설정 객체
  • DB접속, Mapper 등록, 별칭 설정 등을 모두 담는 그릇

사용

Configuration config = new Configuration(env);
config.addMapper(Mapper.class);

키워드

  • addMapper(인터페이스.class) : Mapper 인터페이스를 설정에 등록
  • 이후 sqlSession.getMapper(Mapper.class)로 사용

1-3. SqlSessionFactory · SqlSessionFactoryBuilder

역할

  • SqlSessionFactory: SqlSession을 만드는 공장(팩토리)
  • SqlSessionFactoryBuilder: SqlSessionFactory를 한 번 생성할 때만 사용하는 빌더

생성

SqlSessionFactory factory =
    new SqlSessionFactoryBuilder().build(configuration);

암기 포인트

  • SqlSessionFactory는 애플리케이션 전체에서 한 번만 생성(싱글톤)

  • Builder는 “공장 만드는 도구”라 매번 new해도 됨

  • build() 인자로:

    • XML InputStream
    • XML + env id
    • XML + Properties
    • Configuration 객체
      등을 넘길 수 있다.

1-4. SqlSession

역할

  • 실제로 SQL을 실행하는 세션
  • selectOne, selectList, insert, update, delete 메서드 제공

생성

SqlSession sqlSession = sqlSessionFactory.openSession(false);

암기 포인트

  • openSession(false) : auto-commit 끄고, Service에서 직접 commit/rollback
  • SqlSession은 쓰레드 안전 X → 요청마다 생성해서 쓰고 반드시 close()
  • DB 리소스(Connection, Statement, ResultSet) 정리를 대신해주는 느낌

주요 메서드

  • selectOne(statement, param)
  • selectList(statement, param)
  • insert/update/delete(statement, param) → 반환값: 영향받은 행 수(int)

2. MyBatis Configuration by XML (config XML 태그 암기)

2-1. <.properties>

역할

  • DB정보 같은 공통 설정값을 외부 .properties 파일에서 읽어오는 공간

형태

<properties resource="config/connection-info.properties"/>

사용

  • ${driver}, ${url}, ${username}, ${password} 식으로 참조

2-2. <.settings>

역할

  • SqlSessionFactory와 MyBatis 동작 특성을 전역으로 조정하는 옵션 모음

자주 쓰는 것

  • mapUnderscoreToCamelCase : menu_namemenuName 자동 매핑
  • jdbcTypeForNull : NULL 처리 방식
  • 그 외 대부분은 기본값으로 두는 경우가 많다.

예시

<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

2-3. <.typeAliases>

역할

  • 클래스 풀네임 대신 쓸 별칭 등록

형태

<typeAliases>
    <typeAlias type="com.example.Member" alias="Member"/>
</typeAliases>

효과

  • resultType="com.example.Member" 대신 resultType="Member" 로 사용 가능

2-4. · ·

역할

  • DB 접속 정보, 트랜잭션 방식, 커넥션풀 설정

형태(프로퍼티 직접)

<environments default="dev">
    <environment id="dev">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
            ...
        </dataSource>
    </environment>
</environments>

형태(프로퍼티 파일 사용)

<properties resource="config/connection-info.properties"/>
<environments default="dev">
    <environment id="dev">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            ...
        </dataSource>
    </environment>
</environments>

키워드

  • transactionManager: JDBC(수동 commit), MANAGED(컨테이너 관리)
  • dataSource: POOLED(커넥션풀), UNPOOLED(매번 new)

2-5.

역할

  • 사용할 매퍼(XML 혹은 인터페이스)를 MyBatis 설정에 등록

형태

<mappers>
    <mapper resource="member/model/mapper/member-mapper.xml"/>
</mappers>

여러 방식

  • resource : 클래스패스 기준 XML
  • url : 절대경로
  • class : Mapper 인터페이스
  • package : 패키지 단위 스캔

2-6. 기타 태그

  • <typeHandler> : DB 타입 ↔ 자바 타입 커스텀 매핑 (예: ENUM, 암호화/복호화)
  • <objectFactory> : 결과 객체 생성 방식 커스터마이징
  • <plugins> : AOP처럼 쿼리 실행 과정에 끼어들어 로그/검증 등 부가기능 구현

3. MyBatis Mapper by JAVA (인터페이스 + 어노테이션)

3-1. Mapper 인터페이스

역할

  • SQL을 가진 인터페이스
  • 메서드 이름이 쿼리의 key, 리턴 타입이 결과 타입

사용

Mapper mapper = sqlSession.getMapper(Mapper.class);
Date date = mapper.selectSysdate();

3-2. @Results / @Result / @ResultMap

역할

  • XML의 <resultMap>을 자바 어노테이션으로 표현한 것

예시

@Results(id = "menuResultMap", value = {
    @Result(id = true, property = "code", column = "MENU_CODE"),
    @Result(property = "name", column = "MENU_NAME"),
    ...
})

포인트

  • property : DTO 필드명
  • column : DB 컬럼명
  • id = true : PK 컬럼

3-3. @Select / @Insert / @Update / @Delete

역할

  • 각각 SELECT / INSERT / UPDATE / DELETE SQL 문자열을 붙이는 어노테이션

예시

@Select("""
    SELECT
           MENU_CODE
         , MENU_NAME
    FROM TBL_MENU
    WHERE MENU_CODE = #{code}
""")
@ResultMap("menuResultMap")
MenuDTO selectMenuByCode(int code);

포인트

  • 리턴 타입이 결과 타입
  • INSERT/UPDATE/DELETE는 int(수행된 행 수)를 리턴하는 게 기본 패턴

4. MyBatis Mapper by XML (Mapper XML)

4-1. Mapper.xml 기본 규칙

  1. Mapper 인터페이스와 같은 패키지, 같은 이름
  2. XML의 namespace = 인터페이스 풀클래스명
  3. XML의 id = 인터페이스 메서드 이름
  4. 리턴 타입도 일치해야 한다.

4-2.

역할

  • 컬럼명 → DTO 필드에 어떻게 매핑할지 정의

형태

<resultMap id="resultMember" type="Member">
    <id property="userId" column="USER_ID"/>
    <result property="password" column="PASSWORD"/>
</resultMap>

4-3. <.select>

역할

  • 조회 SQL

핵심 속성

  • id : 구분자 (Mapper 메서드명과 매칭)
  • parameterType : 전달 파라미터 타입
  • resultType : 결과 타입 클래스나 별칭
  • resultMap : 미리 정의한 resultMap 사용

파라미터 바인딩

  • #{field} : PreparedStatement의 ?와 동일, 안전 (권장)
  • ${field} : 문자열 그대로 치환 (SQL 인젝션 위험)

4-4. <.insert> / <.update> / <.delete>

역할

  • DML SQL

포인트

  • resultType 기본이 int (영향받은 행 수) → 명시 안해도 됨
  • parameterType이 DTO인 경우 필드명으로 #{필드명} 바인딩

4-5. <.cache> / <.cache-ref>

역할

  • 쿼리 결과를 캐시에 저장해 성능 향상

기본 동작

  • select 결과 캐시 저장
  • insert/update/delete 시 관련 캐시 삭제

4-6. <.sql> + <.include>

역할

  • 여러 쿼리에서 반복되는 SQL 조각을 재사용

예시

<sql id="columns">
    MENU_CODE, MENU_NAME, MENU_PRICE
</sql>

<select id="selectSqlTest" resultMap="menuResultMap2">
    SELECT
        <include refid="columns"/>
    FROM TBL_MENU
</select>

5. Remix 방식 (Java Config + XML Mapper 섞기)

개념

  • Template, Environment, Configuration 등은 Java-config로 설정
  • 쿼리는 XML Mapper에 작성
  • Mapper 인터페이스와 XML을 연동해서 사용

연동 규칙

  1. 인터페이스와 XML 같은 패키지, 같은 이름
  2. XML namespace = 인터페이스 풀네임
  3. 메서드명 = XML id, 리턴 타입 일치

결과

  • Service에서 getMapper(인터페이스.class)로 호출하면
    내부적으로 XML 쿼리를 찾아 실행한다.

6. 용어 정리 (추가)

Properties 객체

  • key=value 형태로 문자열 설정을 관리하는 자바 클래스
  • DB 설정 같은 값을 .properties 파일로 분리해서 관리할 때 사용

예시

Properties props = new Properties();
// props.load(inputStream);
String url = props.getProperty("url");

SqlSessionFactory

  • SqlSession을 만들어주는 “공장 인터페이스”
  • 인터페이스로 존재하는 이유: 구현체를 바꾸더라도 상위 타입은 유지 → 하위 호환, 확장성 확보
  • 애플리케이션 전체에서 하나만 생성(싱글톤)하는 것이 일반적인 패턴
profile
백엔드

0개의 댓글