
MyBatis를 사용하다 보면 다수의 데이터를 조건으로 조회해야 하는 상황이 자주 발생합니다.
특히 여러 개의 ID나 상태값을 기준으로 조회할 때 List 파라미터를 전달하고 foreach로 처리하는 방법이 자주 활용됩니다.
이 글에서는 MyBatis에서 List를 파라미터로 전달하고 foreach 태그를 이용해 SQL에 적용하는 방법을 예제 중심으로 정리해보겠습니다.
1. MyBatis에서 List 파라미터가 필요한 상황
다음과 같은 경우에 List 파라미터 처리가 필요합니다.
- 여러 개의 ID로 데이터를 조회할 때
- 상태 코드 리스트를 조건으로 줄 때
- 대량의 사용자 또는 상품 번호 등을 조건에 활용할 때
이러한 경우 반복문으로 쿼리를 생성하지 않고, MyBatis의 foreach 태그를 활용해 간결하고 안전한 SQL을 작성할 수 있습니다.
2. foreach 태그 기본 구조 이해
MyBatis의 <foreach>는 컬렉션을 순회하면서 SQL의 일부를 동적으로 생성할 수 있게 해줍니다.
기본 구조는 다음과 같습니다:
<foreach collection="list"
item="item"
open="("
close=")"
separator=",">
#{item}
</foreach>
- collection: 전달받은 파라미터 이름
- item: 루프 안에서 사용할 변수명
- open/close: 괄호 등 감싸는 문자
- separator: 항목 구분자 (보통 쉼표)
3. 단순 List 파라미터 처리 예제
아래는 단순히 List<Integer> 타입의 ID 목록을 전달해 IN 조건에 사용하는 예시입니다.
Mapper XML
<select id="selectUsers" resultType="User">
SELECT * FROM users
WHERE id IN
<foreach collection="idList" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
Java 코드
List<Integer> idList = Arrays.asList(1, 2, 3);
List<User> users = userMapper.selectUsers(idList);
Mapper 인터페이스의 파라미터 이름이 idList라면, XML에서도 collection="idList"로 일치시켜야 합니다.
4. 객체 List 파라미터 처리 예제
객체 리스트(List<User>)를 넘기는 경우에는 item.property 형태로 접근해야 합니다.
XML 예시
<select id="selectByUsernames" resultType="User">
SELECT * FROM users
WHERE username IN
<foreach collection="userList" item="user" open="(" separator="," close=")">
#{user.username}
</foreach>
</select>
Java 예시
List<User> userList = Arrays.asList(
new User("kim"), new User("lee")
);
userMapper.selectByUsernames(userList);
객체를 순회하면서 특정 필드만 SQL에 사용할 수 있어 복잡한 조건에도 유연하게 대응할 수 있습니다.
5. IN 조건 외 다양한 활용 방법
foreach는 IN 절 외에도 다음과 같이 활용 가능합니다.
- VALUES 절에 여러 행 INSERT
- 동적 WHERE 절 구성
- 복합 조건 구성 (key = value 형태 등)
또한 separator, open, close 속성을 적절히 조합하면 쿼리 포맷 오류를 예방하고 가독성도 높일 수 있습니다.
✅ 마무리
MyBatis에서 List 파라미터를 처리할 때 foreach 태그를 잘 활용하면, 복잡한 조건도 안전하고 효율적으로 처리할 수 있습니다.
단순한 ID 리스트부터 객체의 특정 필드 조건까지 다양하게 활용 가능하며, XML 구조와 Java 코드 간 파라미터 명칭 일치가 중요합니다.
이번 글에서 소개한 예제들을 직접 따라 해보면 실무에서 바로 활용할 수 있을 것입니다.