Replies: 1 comment
|
수고하셨습니다 ㅎㅎ |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
4. 스프링과 문제 해결 - 트랜잭션 (2)
#️⃣ 목차
트랜잭션 문제 해결 - 트랜잭션 템플릿
트랜잭션을 사용하는 로직을 살펴보면 다음과 같은 패턴이 반복되는 것이 보임
트랜잭션 사용 코드
try,catch,finally를 포함한 성공시 커밋, 롤백 코드가 반복될 것임트랜잭션 템플릿
템플릿 콜백 패턴을 적용하려면 템플릿이 제공하는 클래스를 작성해야 하는데, 스프링은
TransactionTemplate라는 템플릿 클래스를 제공함TransactionTemplate
MemberServiceV3_2
트랜잭션 템플릿을 사용해서 반복하는 부분을 제거해보자
트랜잭션 템플릿 사용 로직
try-catch가 들어갔는데,bizLogic()메서드를 호출하면SQLException체크 예외를 넘겨줌. 해당 람다에서 체크 예외를 밖으로 던질 수 없기 때문에 언체크 예외로 바꾸어 던지도록 예외를 전환함MemberServiceV3_2Test
테스트 코드는
MemberServiceV3_1Test와 동일하여 생략함정리
트랜잭션 문제 해결 - 트랜잭션 AOP 이해
프록시를 통한 문제 해결
서비스 계층의 트랜잭션 사용 코드 예시
기존의 코드
프록시 도입 후
트랜잭션 프록시 코드 예시
트랜잭션 프록시 적용 후 서비스 코드 예시
스프링이 제공하는 트랜잭션 AOP
@Transactional애노테이션만 붙여주면 됨. 스프링의 트랜잭션 AOP는 이 애노테이션을 인식해서 트랜잭션 프록시를 적용해줌트랜잭션 문제 해결 - 트랜잭션 AOP 적용
트랜잭션 AOP를 사용하는 새로운 서비스 클래스 만들기
MemberServiceV3_3
@Transactional애노테이션 추가@Transactional애노테이션은 메서드에 붙여도 되고, 클래스에 붙여도 됨public메서드가 AOP 적용 대상이 됨MemberServiceV3_3Test
@SpringBootTest@Autowired등을 통해 스프링 컨테이너가 관리하는 빈들을 사용할 수 있음@TestConfigurationTestConfigDataSource스프링에서 기본으로 사용할 데이터소스를 스프링 빈으로 등록함. 추가로 트랜잭션 매니저에서도 사용함DataSourceTransactionManager트랜잭션 매니저를 스프링빈으로 등록함AOP 프록시 적용 확인
실행결과
memberService에EnhancerBySpringCGLIB..라는 부분을 통해 프록시(CGLIB)가 적용된 것을 확인할 수 있음.memberRepository에는 AOP를 적용하지 않았기 때문에 프록시가 적용되지 않음트랜잭션 문제 해결 - 트랜잭션 AOP 정리
@Transactional애노테이션이 있으면, 스프링은 AOP Proxy를 만들고 이 AOP Proxy에서 트랜잭션 로직을 모두 처리함transactionManager.getTransaction()으로 트랜잭션을 시작함con.setAutoCommit(false)선언적 트랜잭션 관리 vs 프로그래밍 방식 트랜잭션 관리
선언적 트랜잭션 관리(Declarative Transaction Management)
@Transactional애노테이션 하나만 선언해서 매우 편리하게 트랜잭션을 적용하는 것을 선언적 트랜잭션 관리라 함프로그래밍 방식의 트랜잭션 관리(programmatic transaction management)
선언적 트랜잭션 관리가 프로그래밍 방식에 비해서 훨씬 간편하고 실용적이기 때문에 실무에서는 대부분 선언적 트랜잭션 관리를 사용
프로그래밍 방식의 트랜잭션 관리는 스프링 컨테이너나 스프링 AOP 기술 없이 간단히 사용할 수 있지만 실무에서는 대부분 스프링 컨테이너와 스프링 AOP를 사용하기 때문에 거의 사용되지 않음
스프링 부트의 자동 리소스 등록
스프링 부트가 등장하기 이전에는 데이터소스와 트랜잭션 매니저를 개발자가 직접 스프링 빈으로 등록해서 사용함
데이터소스와 트랜잭션 매니저를 스프링 빈으로 직접 등록
데이터 소스 - 자동 등록
dataSource이때, 스프링 부트는 다음과 같이
application.properties에 있는 속성을 사용해서DataSource를 생성함. 그리고 스프링 빈에 등록함application.properties
HikariDataSource임. 커넥션풀과 관련된 설정도application.properties를 통해서 지정할 수 있음spring.datasource.url속성이 없으면 내장 데이터베이스(메모리 DB)를 생성하려고 시도함트랜잭션 매니저 - 자동 등록
transactionManager어떤 트랜잭션 매니저를 선택할지는 현재 등록된 라이브러리를 보고 판단함, JDBC 기술을 사용하면
DataSourceTransactionManager를 빈으로 등록하고, JPA를 사용하면JpaTransactionManager를 빈으로 등록함. 둘 다 사용하는 경우JpaTransactionManager를 등록함. 참고로JpaTransactionManager는DataSourceTransactionManager가 제공하는 기능도 대부분 지원함데이터소스, 트랜잭션 매니저 직접 등록
이번에는 스프링 부트가 제공하는 자동 등록을 이용해서 데이터소스와 트랜잭션 매니저를 편리하게 적용시켜 보자. 먼저
application.properties에 코드 추가데이터소스와 트랜잭션 매니저 자동 등록 - MemberServiceV3_4Test
TestConfig부분만 다름application.properties에 지정된 속성을 참고해서 데이터소스와 트랜잭션 매니저를 자동으로 생성해줌🔗 출처
All reactions