| 태그 | 설명 |
|---|---|
<if test=""> | 조건에 따라 SQL 절 삽입 |
<choose><when><otherwise> | 다중 조건 분기 처리 |
<trim> | 불필요한 접두사, 접미사 제거 (WHERE, SET 등) |
<where> | 조건이 없으면 WHERE 제거, 자동으로 AND 앞 처리 |
<set> | UPDATE 구문에서 마지막 쉼표 자동 제거 |
<foreach> | 리스트나 배열 반복 처리 (IN 절 등 활용) |
<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>
DB의 상태를 변화시키는 논리적 작업 단위
ACID 원칙을 따름
| 원칙 | 설명 |
|---|---|
| 원자성 | 전체 성공 or 전체 실패 |
| 일관성 | 트랜잭션 전후 DB 상태가 일관됨 |
| 격리성 | 동시에 실행되는 트랜잭션 간 간섭 없음 |
| 지속성 | 성공된 트랜잭션은 영구적으로 반영됨 |
@Transactional 어노테이션으로 선언만 해도 적용됨
Spring AOP 기반의 프록시 패턴으로 동작
예외 발생 시 자동 rollback, 정상 실행 시 commit
@Service
public class UserService {
@Transactional
public void saveUser(User user) {
userRepository.insert(user);
logRepository.insertLog(user.getId()); // 중간 예외 시 전체 rollback
}
}
| 항목 | MyBatis 동적 SQL | Spring 트랜잭션 |
|---|---|---|
| 목적 | 조건에 따른 SQL 유연 처리 | 데이터의 일관성과 안정성 보장 |
| 사용 방법 | XML의 , 등 | @Transactional 어노테이션 |
| 장점 | SQL 중복 제거, 재사용성 향상 | 코드 간결, rollback 자동 처리 |
| 주의 | SQL Injection 주의 필요 | RuntimeException만 rollback 대상 (기본) |