이게 보니까 우리가 스프링 트랜잭션 한번 배웠긴 했는데 다시 배우는 게
이번에는 좀 더 깊게? 어떻게 일어나는 지 그거 보는거랑 트랜잭션 추가 기능? 트랜잭션에 우리가
@Transactional(옵션이름=값)
이런 식으로 줄 수 있는데,
우선순위라는 게 예를 들어
@Transactional(옵션1 = 값1)
class TxClass{
@Transactional(옵션1 = 값2)
public void txTest(){
}
}
하면 저 값2가 적용된다는 이야기.
사실 더 자세할 수록 그것이 적용된다는 것은 어느정도 프로그래머 입장에서는 통설로 받아들여져서..
@SpringBootTest
@Slf4j
public class TxLevelTest {
@Autowired
LevelService service;
@Test
void doTest(){
service.write();
service.read();
}
@TestConfiguration
static class TestConfig{
@Bean
public LevelService levelService(){
return new LevelService();
}
}
@Slf4j
@Transactional(readOnly = true)
static class LevelService{
@Transactional(readOnly = false)
public void write(){
log.info("call write");
printTxInfo();
}
public void read(){
log.info("call read");
printTxInfo();
}
private void printTxInfo(){
boolean isTxActive = TransactionSynchronizationManager.isActualTransactionActive();
log.info("tx active = {}", isTxActive);
boolean isTxReadonly = TransactionSynchronizationManager.isCurrentTransactionReadOnly();
log.info("tx readOnly = {}", isTxReadonly);
}
}
}
테스트 문.
일단
@TestConfiguration
저거 해야 저게 Configuration으로 인지된다.
@Bean해서 빈으로 등록할 거 해 주고.
그럼 빈으로 등록되니 @Autowired 해서 자동으로 주입받을 수 있음.
뭐 당연히 더 자세한 옵션이 우선적으로 적용 됨.
그것보다는
TransactionSynchronizationManager
이게 트랜잭션 상태에 대한 여러 정보를 얻을 수 있는 클래스 인 듯.
저렇게 트랜잭션 활성화 상태인지, 또 트랜잭션이 현재 readOnly 상태인지.
저런 트랜잭션 옵션에 대해선 나중에 다룰 듯.
일단 만난 김에 readOnly에 대해 말하자면
말 그대로 읽기전용, 뭐 select나 이런 거만 된다는 뜻 인듯?
그리고 기본값은 당연 false.
그리고 인터페이스에도 트랜잭션 적용이 가능하다고 함.
물론 잘 사용은 안할 듯.
확실히 구현체에 넣어놓는게 직관적임. 사용해야 할지 아닐 지도 더 잘 알 수 있고.
스프링에서도 권장하지 않는 방법이라고 함.
뭐 인터페이스에 애노테이션 하는 자체가 AOP 적용이 잘 안될 때가 있다고 함.
AOP란 관점지향 객체 프로그램 으로,
메소드를 관점에 따라 나눈? 공통적인 관점에 따라 처리하는? 프록시, 왜 @Before @After같이 이것들은 처음엔 이렇게 해야 해 이런 거.
'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글
43. 트랜잭션 AOP 주의사항 2 -프록시 내부호출 (0) | 2023.10.15 |
---|---|
42. 트랜잭션 AOP 주의사항 -프록시 내부 호출 (0) | 2023.10.14 |
40. 스프링 트랜잭션 테스트 (0) | 2023.10.14 |
39. DB 접근 기술의 조합 (0) | 2023.10.14 |
38. 실용적인 구조로 변환 (0) | 2023.10.14 |