이런설명이있다 이제것 작성해왔던 코드는 뚱뚱한 서비스가 된다
서비스는 단순이 제어만하는 역할만 해야되는대 복잡한 비즈니스 로직을 어떻게 유지보수하냐고!
결과적으로 유지보수 하기 어려워..
트랜잭션 문제 / 예외 누수 문제 / JDBC 반복 문제
jpa 코드 이런것만 알아두자
이거 트랜 잭션 어노테이션 구현이랑 같다!
트랜잭션을 추상화하자
txManager에 의존만하면됨
스프링은 이미 다 만들어놓음
내가 구현할 필요없음 이미다만들어짐
트랜잭션 동기화 매니저
트랜잭션 매니저는 트랜잭션 동기화 매니저 사용
쓰레드 로컬? 커넥션 안전하게 보관하는걸로만 알고 있자
트랜잭션 매니저는 트랜잭션 동기화 매니저에 커넥션을 보관함
설명이 잘ㅈ되있어서 일긱가 정말 편하다.
커넥션 꺼내옴 -> con.commit , con.rollback() 가져와서 하는구나.
트랜잭션 추상화 덕분에 서비스 코드는 이제 JDBC 기술에 의존하지 않는다.
이후 JDBC에서 JPA로 변경해도 서비스 코드를 그대로 유지할 수 있다.
기술 변경시 의존관계 주입만 DataSourceTransactionManager 에서 JpaTransactionManager 로 변경해주면 된다.
java.sql.SQLException 이 아직 남아있지만 이 부분은 뒤에 예외 문제에서 해결하자.
트랜잭션 템플릿을 쓰려면 트랜잭션 매니저가 필요함.
Execute WithoutResult 실행하면 코드 안에서 커밋 OR 롤백 예외가 처리됨
테스트는 기존하고 같아서 패스
이런식으로 변경해 간다
프록시를 사용하면 트랜잭션을 처리하는 객체와 비즈니스 로직을 처리하는 서비스 객체를 명확하게 분리할 수 있다.
이런식으로 변경해줘야 됨
@SpringBootTest : 스프링 AOP를 적용하려면 스프링 컨테이너가 필요하다. 이 애노테이션이 있으면 테 스트시 스프링 부트를 통해 스프링 컨테이너를 생성한다. 그리고 테스트에서 @Autowired 등을 통해 스프 링 컨테이너가 관리하는 빈들을 사용할 수 있다.
@TestConfiguration : 테스트 안에서 내부 설정 클래스를 만들어서 사용하면서 이 에노테이션을 붙이면, 스프링 부트가 자동으로 만들어주는 빈들에 추가로 필요한 스프링 빈들을 등록하고 테스트를 수행할 수 있 다.
TestConfig
DataSource 스프링에서 기본으로 사용할 데이터소스를 스프링 빈으로 등록한다. 추가로 트랜잭션
매니저에서도 사용한다.
DataSourceTransactionManager 트랜잭션 매니저를 스프링 빈으로 등록한다.
스프링이 제공하는 트랜잭션 AOP는 스프링 빈에 등록된 트랜잭션 매니저를 찾아서 사용하기 때 문에 트랜잭션 매니저를 스프링 빈으로 등록해두어야 한다.
이걸 보고 스프링부트 테스트네? 스프링을 임시로 하나 띄워주고 필요한 빈을 등록해줌
@Transactional 애노테이션 하나만 선언해서 매우 편리하게 트랜잭션을 적용하는 것을 선언적 트
랜잭션 관리라 한다.
선언적 트랜잭션 관리는 과거 XML에 설정하기도 했다. 이름 그대로 해당 로직에 트랜잭션을 적용하겠 다 라고 어딘가에 선언하기만 하면 트랜잭션이 적용되는 방식이다
트랜잭션 매니저 또는 트랜잭션 템플릿 등을 사용해서 트랜잭션 관련 코드를 직접 작성하는 것을 프로 그래밍 방식의 트랜잭션 관리라 한다.
선언적 트랜잭션 방식이 간결하고 편하기 때문에 더많이 선호하고 사용함
스프링 부트가 등장하기 이전에는 데이터소스와 트랜잭션 매니저를 개발자가 직접 스프링 빈으로 등록해서 사용했다. 그런데 스프링 부트로 개발을 시작한 개발자라면 데이터소스나 트랜잭션 매니저를 직접 등록한 적이 없을 것이다.
헉 그러네 yml 등록되있지
스프링 부트는 데이터소스( DataSource )를 스프링 빈에 자동으로 등록한다.
자동으로 등록되는 스프링 빈 이름: dataSource
참고로 개발자가 직접 데이터소스를 빈으로 등록하면 스프링 부트는 데이터소스를 자동으로 등록하지 않는 다.
yml 설정을 무시한다는 의미인가.
이때 스프링 부트는 다음과 같이 application.properties 에 있는 속성을 사용해서 DataSource 를 생 성한다. 그리고 스프링 빈에 등록한다.
스프링 부트가 기본으로 생성하는 데이터소스는 커넥션풀을 제공하는 HikariDataSource 이다. 커넥션풀 과 관련된 설정도 application.properties 를 통해서 지정할 수 있다.
spring.datasource.url 속성이 없으면 내장 데이터베이스(메모리 DB)를 생성하려고 시도한다.
스프링 부트는 적절한 트랜잭션 매니저( PlatformTransactionManager )를 자동으로 스프링 빈에 등록한 다.
자동으로 등록되는 스프링 빈 이름: transactionManager
참고로 개발자가 직접 트랜잭션 매니저를 빈으로 등록하면 스프링 부트는 트랜잭션 매니저를 자동으로 등록 하지 않는다.
다 자동으로 등록이 되네..
어떤 트랜잭션 매니저를 선택할지는 현재 등록된 라이브러리를 보고 판단하는데, JDBC를 기술을 사용하면 DataSourceTransactionManager 를 빈으로 등록하고, JPA를 사용하면 JpaTransactionManager 를 빈으로 등록한다. 둘다 사용하는 경우 JpaTransactionManager 를 등록한다. 참고로 JpaTransactionManager 는 DataSourceTransactionManager 가 제공하는 기능도 대부분 지원
정보 감사합니다.