반응형
MyBatis-Spring
- 마이바티스-스프링 연동 모듈은 둘을 간편하게 연동하도록 도와줌
- 해당 모듈은 마이바티스로 하여금 스프링 트랜잭션에 쉽게 연동되도록 처리
- mapper와 SqlSession을 다루고, 빈에 주입시켜줌
- MyBatis 예외를 스프링의 DataAccessException으로 반환
구성 요소
Dynamic SQL
동적 SQL
- Runtime 시점에서 생성되는 SQL
- 사용자의 입력 혹은 특정 조건에 따라 동적으로 SQL을 생성하여 실행하는 방식
- MyBatis를 활용하면 동적 SQL을 보다 편리하게 사용 가능
- JSTL이나 XML 기반의 텍스트 프로세서와 비슷한 느낌
사용 이유
- 유연성
- 실행 중 SQL 쿼리를 조건에 따라 동적으로 생성 가능. 다양한 상황에 따른 SQL 실행
- 조건부
- 사용자가 선택한 조건에 따라 WHERE 절 추가 가능
- 정렬
- 동적으로 정렬 조건 추가 가능
보안 문제와 SQL Injection 공격에 노출 가능(주의 필요)
MyBatis 동적 SQL 종류
- if
- choose(when, otherwise)
- trim(where, set)
- foreach
- #{}
` `로 감싸져서 나옴
#{}(Named Parameter)은 Precompiled Statement의 placeholder로 사용된다. 이것은 매개변수를 SQL에 안전하게 전달하는 데 사용된다. 즉, 매개변수 값이 SQL 쿼리에 직접 포함되는 것이 아니라 JDBC 드라이버에 의해 안전하게 처리된다. 이렇게 함으로써 SQL 인젝션 공격을 방지할 수 있다. 또한, `#{}을 사용하면 자동으로 매개변수의 타입 변환을 처리한다.
예를 들어, MyBatis와 같은 프레임워크에서는 `#{}을 사용하여 동적 SQL에서 매개변수를 바인딩합니다.
SELECT * FROM users WHERE id = #{userId}
- ${}
${}은 변수를 SQL에 직접 삽입한다. 이는 매개변수 값을 문자열로 대체하여 SQL을 생성하는 데 사용된다. 하지만 이 방법은 보안상의 위험이 있다. 왜냐하면 사용자 입력을 그대로 쿼리에 삽입하기 때문에 SQL 인젝션 공격에 노출될 수 있다. 또한, 자동 타입 변환이 이루어지지 않으므로 사용자가 올바른 타입의 값을 제공해야 한다.
예를 들어, 다음과 같이 `${}`을 사용하여 동적으로 테이블 이름을 지정할 수 있다.
SELECT * FROM ${tableName}
결론적으로, `#{}을 사용하여 매개변수를 전달하는 것이 안전하고 권장되며, `${}`은 보안 문제로 인해 사용을 피하는 것이 좋다.
Spring TX
Transaction
- 데이터베이스의 상태를 변화시키기 위해 수행하는 논리적인 작업 단위
- 원자성: 트랜잭션의 작업은 모두 수행되거나 전혀 수행되지 않아야 함
- 일관성: 트랜잭션은 데이터베이스를 일관성 있는 상태로 유지해야 함
- 격리성: 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않아야 함
- 지속성: 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 반영되어야 함
Spring TX
- Spring에서 제공하는 트랜잭션 기능 활용 가능
- @Transactional을 활용하여 트랜잭션을 적용할 메소드 선언
- 해당 어노테이션이 있다면 자동으로 트랜잭션을 시작, 정상 종료 시 commit, 오류 발생 시 rollback 수행
동작 과정
- 트랜잭션 관리자를 통해 수행
- @Transactional을 사용하면 Spring AOP를 통해 AOP 프록시 객체를 생성하고 이 프록시 객체가 관리자에게 처리를 위임
- 따라서 사용자가 직접 관리할 필요 없이 선언만으로 트랜잭션을 관리 가능
Spring TX 사용
- 트랜잭션 관리자 설정
<!-- property : 설정자 주입, constructor-arg : 생성자 주입 -->
<!-- 트랜잭션 매니저 등록 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource"></constructor-arg>
</bean>
bean 설정에서 property(설정자 주입) vs constructor-arg(생성자 주입)
설정자 주입(property)
- 설정자 주입은 빈에 필요한 의존성을 설정자 메서드(setter method)를 통해 주입하는 방식
- 설정자 메서드는 빈을 생성한 후에 호출되어 의존성 설정
- 각 의존성을 독립적으로 설정할 수 있으므로, 유연성이 높고 선택적 의존성을 처리하기에 용이함
- 빈의 의존성이 변경될 때에도 설정자 메서드를 호출하여 의존성을 업데이트 가능
생성자 주입(constructor-arg)
- 생성자 주입은 빈을 생성할 때 생성자를 통해 의존성을 주입하는 방식
- 생성자 주입은 빈이 생성되는 시점에 필요한 의존성을 한 번에 주입
- 이 방식은 빈을 생성하는 동안 필요한 모든 의존성을 명확하게 나타내므로 빈의 일관성과 불변성 유지에 용이
- 생성자 주입은 빈이 불변성을 가지도록 돕기 때문에 스레드 안전성을 보장하는 데 유용
반응형
'TIL' 카테고리의 다른 글
[TIL-57/240613] Spring 계층 구조(레이어 아키텍처), Web Server & WAS & Web Service (0) | 2024.06.13 |
---|---|
[TIL-56/240416] REST API (0) | 2024.04.17 |
[TIL-54/240408] MyBatis (0) | 2024.04.09 |
[TIL-53/240401] 위상 정렬 (0) | 2024.04.01 |
[TIL-52/240328] 프림(Prim) 알고리즘 (0) | 2024.03.29 |