카테고리 없음

Mapper 의 계념

mad038 2024. 6. 24. 16:35

Mapper

  • 데이터베이스와 자바 객체 간의 매핑을 담당하는 인터페이스입니다. 주로 ORM (Object-Relational Mapping) 프레임워크인 MyBatis에서 사용되며, SQL 쿼리를 자바 메서드로 매핑하여 데이터베이스에 접근하고 처리할 수 있도록 도와줍니다.

Mapper의 주요 역할:

  1. SQL 쿼리 정의: Mapper 인터페이스 내에서 SQL 쿼리를 정의합니다. 이 쿼리는 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용됩니다.
  2. 매개변수 매핑: SQL 쿼리에 필요한 매개변수를 정의하고, 이를 자바 메서드의 매개변수로 전달합니다. MyBatis는 이 매개변수를 쿼리 실행 시에 바인딩하여 쿼리를 실행합니다.
  3. 결과 매핑: SQL 쿼리의 실행 결과를 자바 객체에 매핑합니다. 결과가 여러 행이나 복잡한 구조를 가질 수 있으며, MyBatis는 이를 자바 객체에 매핑하여 반환합니다.
  4. 동적 쿼리 작성: MyBatis의 동적 SQL을 사용하여 필요에 따라 쿼리를 조건적으로 생성하고 실행할 수 있습니다. 예를 들어, 조건에 따라 WHERE 절을 추가하거나, 동적으로 정렬 조건을 변경할 수 있습니다.

 

Mapper 예제

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    User findById(@Param("id") Long id);

    @Select("SELECT * FROM users WHERE age > #{age}")
    List<User> findByAgeGreaterThan(@Param("age") int age);

    // 복잡한 쿼리나 조인을 사용할 수도 있습니다.
    @Select("SELECT u.*, p.* FROM users u INNER JOIN profiles p ON u.id = p.user_id WHERE u.id = #{userId}")
    UserWithProfile findUserWithProfile(@Param("userId") Long userId);
}

 

Mapper 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.UserMapper">
    
    <select id="findById" parameterType="java.lang.Long" resultType="com.example.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
    
    <select id="findByAgeGreaterThan" parameterType="int" resultType="com.example.User">
        SELECT * FROM users WHERE age > #{age}
    </select>
    
    <select id="findUserWithProfile" parameterType="java.lang.Long" resultMap="userWithProfileResultMap">
        SELECT u.*, p.* FROM users u INNER JOIN profiles p ON u.id = p.user_id WHERE u.id = #{userId}
    </select>
    
    <!-- resultMap을 사용한 결과 매핑 예제 -->
    <resultMap id="userWithProfileResultMap" type="com.example.UserWithProfile">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <!-- 필요한 경우 다양한 속성을 매핑할 수 있습니다 -->
    </resultMap>
    
</mapper>

 

Mapper Repository 의 차이 

Mapper

장점:

  1. SQL 제어: 직접 SQL 쿼리를 작성하여 데이터베이스와의 상호작용을 세밀하게 제어할 수 있습니다. 복잡한 조인이나 특수한 데이터 처리에 유리합니다.
  2. 성능: 맵퍼를 사용하면 필요한 데이터만 쿼리할 수 있어 성능을 최적화할 수 있습니다.
  3. 유연성: SQL 쿼리를 XML 파일로 분리하여 관리하므로 쿼리의 수정이 용이합니다.

단점:

  1. 발생 가능한 문제: SQL 쿼리의 오타나 잘못된 사용으로 인해 런타임 에러가 발생할 수 있습니다.
  2. 배경지식 요구: SQL 쿼리 작성 및 데이터베이스 구조에 대한 이해가 필요합니다.
  3. 반복적인 코드: 매번 SQL 쿼리를 작성해야 하므로 반복적인 코드 작성이 발생할 수 있습니다.

Repository

장점:

  1. 간편성: Spring Data JPA를 사용하면 인터페이스와 어노테이션을 통해 CRUD 메서드를 자동으로 생성할 수 있어 개발 시간을 단축시킬 수 있습니다.
  2. 유지보수성: SQL 쿼리 대신 메서드 이름에 따라 쿼리가 자동으로 생성되므로 오타나 문법 에러가 발생할 가능성이 줄어듭니다.
  3. 객체지향적 접근: Entity 객체를 사용하여 데이터베이스 레코드를 객체로 다룰 수 있어 객체지향 설계에 부합합니다.

단점:

  1. 추상화 계층 추가: Repository는 Spring Data JPA와 같은 추가 라이브러리에 의존하기 때문에 추가적인 학습과 설정이 필요합니다.
  2. 성능: Repository는 기본적으로 제공하는 쿼리 메서드를 사용하므로 복잡한 조인이나 특수한 쿼리 처리에 제한적일 수 있습니다.
  3. 복잡성: 특정 복잡한 데이터 처리 작업이나 성능 최적화를 위해서는 직접 쿼리 작성이 필요할 수 있습니다.

 

 

언제 어느 것을 선택해야 할까?

  • Mapper: 데이터베이스와의 상호작용을 직접 제어하고자 할 때, 복잡한 SQL 쿼리를 작성해야 할 때, 특정 성능 최적화가 필요할 때 유리합니다.
  • Repository: CRUD 기능을 간편하게 구현하고자 할 때, 객체지향적인 접근을 선호하고자 할 때, 대부분의 경우에서 충분한 성능을 제공받을 수 있는 경우에 유리합니다.