Mybatis/고급 매핑 기법

다중 파라미터 처리

DEVLIB 2025. 4. 17. 08:55
728x90

1. @Param 어노테이션 방식 (추천)

가장 일반적이고 직관적인 방식입니다.

Mapper 인터페이스

User selectUser(@Param("name") String name, @Param("email") String email);

XML 매퍼

<select id="selectUser" resultType="User">
  SELECT * FROM users WHERE name = #{name} AND email = #{email}
</select>
 

@Param("키")로 지정한 이름을 XML에서 #{키}로 사용할 수 있어요.


2. Map을 이용한 방식

간단하지만 타입 안정성이 떨어지므로 큰 프로젝트에서는 잘 사용하지 않습니다.

Mapper 인터페이스

User selectUser(Map<String, Object> paramMap);

XML 매퍼

<select id="selectUser" resultType="User">
  SELECT * FROM users WHERE name = #{name} AND email = #{email}
</select>
 

호출 코드

Map<String, Object> map = new HashMap<>();
map.put("name", "단비");
map.put("email", "danbi@example.com");
userMapper.selectUser(map);

#{key} 는 Map의 key 이름과 반드시 일치해야 해요.


3. 복합 객체(DTO)로 감싸기

2개 이상의 값을 하나의 객체에 담아서 전달하는 방식입니다.

DTO 예시

public class UserSearchCondition {
    private String name;
    private String email;
}

Mapper 인터페이스

User selectUser(UserSearchCondition cond);

XML 매퍼

<select id="selectUser" resultType="User">
  SELECT * FROM users WHERE name = #{name} AND email = #{email}
</select>

내부 필드명을 기준으로 #{name}, #{email} 매핑 가능


동적 조건 WHERE 처리

다중 파라미터는 종종 조건 검색과 연결되므로 동적 SQL로 활용하면 좋아요:

<select id="searchUsers" resultType="User">
  SELECT * FROM users
  <where>
    <if test="name != null">
      name = #{name}
    </if>
    <if test="email != null">
      AND email = #{email}
    </if>
  </where>
</select>

어떤 방식을 언제 써야 할까?

상황 추천 방식
두세 개의 파라미터만 있는 경우 @Param
파라미터가 동적/가변적인 경우 Map
조건 객체가 명확하게 정의되어 있는 경우 DTO 방식

마무리 요약

방식 특징 장점 단점
@Param 어노테이션으로 이름 지정 명확하고 안전함 이름 누락 주의
Map 유동적 구조 빠르게 구현 가능 타입 안정성 떨어짐
DTO 객체화된 파라미터 명확한 도메인 구조 클래스 생성 필요
LIST