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