나를 기록하다
article thumbnail
반응형

MyBatis-Spring

  • 마이바티스-스프링 연동 모듈은 둘을 간편하게 연동하도록 도와줌
  • 해당 모듈은 마이바티스로 하여금 스프링 트랜잭션에 쉽게 연동되도록 처리
  • mapper와 SqlSession을 다루고, 빈에 주입시켜줌
  • MyBatis 예외를 스프링의 DataAccessException으로 반환

MyBatis-Spring 버전

 

mybatis-spring

감사 인사 이 프로젝트가 실제로 만들어지게 도와준 모든 특별한 분들에게 정말 감사한다. 알파벳 순서로 보면, 코딩및 테스트 그리고 문서화를 담당했던 Eduardo Macarron, Hunter Presnall, Putthiphong Boon

mybatis.org

 

구성 요소

구성요소

 


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
 

mybatis – 마이바티스 3 | 동적 SQL

동적 SQL 마이바티스의 가장 강력한 기능 중 하나는 동적 SQL을 처리하는 방법이다. JDBC나 다른 유사한 프레임워크를 사용해본 경험이 있다면 동적으로 SQL 을 구성하는 것이 얼마나 힘든 작업인지

mybatis.org

 
  • #{}
    ` `로 감싸져서 나옴
    #{}(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)
- 생성자 주입은 빈을 생성할 때 생성자를 통해 의존성을 주입하는 방식
- 생성자 주입은 빈이 생성되는 시점에 필요한 의존성을 한 번에 주입
- 이 방식은 빈을 생성하는 동안 필요한 모든 의존성을 명확하게 나타내므로 빈의 일관성과 불변성 유지에 용이
- 생성자 주입은 빈이 불변성을 가지도록 돕기 때문에 스레드 안전성을 보장하는 데 유용

 

 

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...