MyBatis 동적 쿼리

SEAN·2025년 4월 21일

📌 동적 SQL(Dynamic SQL)이란?

  • Runtime 시점에 SQL을 동적으로 생성하여 실행
  • 사용자 조건, 필터, 정렬 등에 따라 유연하게 쿼리 작성 가능
  • XML 기반 if, choose, trim, foreach 태그 사용

📚 MyBatis 동적 SQL 태그 정리

태그설명
<if test="">조건에 따라 SQL 절 삽입
<choose><when><otherwise>다중 조건 분기 처리
<trim>불필요한 접두사, 접미사 제거 (WHERE, SET 등)
<where>조건이 없으면 WHERE 제거, 자동으로 AND 앞 처리
<set>UPDATE 구문에서 마지막 쉼표 자동 제거
<foreach>리스트나 배열 반복 처리 (IN 절 등 활용)

✍ 동적 SQL 예시

<select id="findUsers" resultType="User">
  SELECT * FROM users
  <where>
    <if test="name != null">
      name = #{name}
    </if>
    <if test="email != null">
      AND email = #{email}
    </if>
  </where>
</select>
<update id="updateUser">
  UPDATE users
  <set>
    <if test="name != null">name = #{name},</if>
    <if test="email != null">email = #{email},</if>
  </set>
  WHERE id = #{id}
</update>

✅ Spring 트랜잭션(Transaction)

✔ 정의

  • DB의 상태를 변화시키는 논리적 작업 단위

  • ACID 원칙을 따름

원칙설명
원자성전체 성공 or 전체 실패
일관성트랜잭션 전후 DB 상태가 일관됨
격리성동시에 실행되는 트랜잭션 간 간섭 없음
지속성성공된 트랜잭션은 영구적으로 반영됨

🌀 Spring 트랜잭션 처리 방식

  • @Transactional 어노테이션으로 선언만 해도 적용됨

  • Spring AOP 기반의 프록시 패턴으로 동작

  • 예외 발생 시 자동 rollback, 정상 실행 시 commit

@Service
public class UserService {
    @Transactional
    public void saveUser(User user) {
        userRepository.insert(user);
        logRepository.insertLog(user.getId()); // 중간 예외 시 전체 rollback
    }
}

✅ 정리 요약

항목MyBatis 동적 SQLSpring 트랜잭션
목적조건에 따른 SQL 유연 처리데이터의 일관성과 안정성 보장
사용 방법XML의 , 등@Transactional 어노테이션
장점SQL 중복 제거, 재사용성 향상코드 간결, rollback 자동 처리
주의SQL Injection 주의 필요RuntimeException만 rollback 대상 (기본)
profile
성장하는 BE 개발자 입니다.

0개의 댓글