1. 테스트 케이스 작성 시 service layer 테스트 시에는 @Transactional 어노테이션을 붙으면 rollback 되는 것을 확인하였는데controller 테스트 할 때도 결과값을 DB에 반영되지 않게 할 수 있는 방법이 있나요? 이경우는 DELETE 메서드를 호출해서 수동으로 초기화해주는 방법만 있나요?
-> 스프링 MVC를 띄워서 테스트 하는 컨트롤러 테스트는 별도의 스프링 컨테이너가 떠서 실행되기 때문에 수동으로 진행해야 합니다. 혹시 더 나은 방법이 있으면 저도 알려주세요^^2. 트랜잭션 관리
- 1.DB에 저장 시 에러가 발생되면 exception이 발생되어 2.external api 호출이 안되게는 할수 있을것 같은데
- 1.DB에 저장은 성공해서 데이터베이스에 값이 들어가 있는 상태에서 2. external api 호출 시 에러가 나면 1.DB에 이미 저장되어 있는 값을 다시 롤백할 수 있는 방법이 있나요?
// 서비스 함수
public void test() {
// 1. DB에 저장
// 2. external api 호출 (이 경우 외부 서비스에서 1번에서 저장 된 값을 REST API를 호출해서 참조)
}
-> 서비스 함수에서 트랜잭션을 걸면 됩니다. 보여주신 예제에서 test() 위에 @Transactional을 걸어주면 딱 원하시는데로 동작합니다. 이 메서드가 모두 정상 실행되어야 커밋됩니다. 그게 바로 트랜잭션이지요. DB에 insert query는 성공해도 트랜잭션이 커밋되지 않으면 실제 DB에 데이터가 저장되지 않습니다.
@Transactional //스프링 트랜잭션 어노테이션으로 트랜잭션 시작
public void test() {
// 1. DB에 저장
// 2. external api 호출 (이 경우 외부 서비스에서 1번에서 저장 된 값을 REST API를 호출해서 참조)
} -> 이 메서드가 모두 정상 실행되면 스프링이 트랜잭션 자동 커밋(AOP)
3. exception 발생 위치 - save()함수 호출 후 "저장 성공"이라는 문구가 콘솔에 찍히면 해당 메서드는 Transaction이 종료되는 시점에 이슈가 없다고 봐도 될까요? 아니면 memberRepository.save() 함수 호출 시 발생되는 exception이 있고, Transaction이 종료되는 시점에 발생되는 exception도 존재하나요?
@Transactional
public void save(Member member) {
memberRepository.save(member);
System.out.println("저장 성공"):
}
-> 저장 성공이라고 찍혀도 저장 성공 다음에 바로 이 메서드를 빠져나가는 시점에 스프링이 트랜잭션을 커밋 시도 합니다. 이때 데이터베이스 연결이 불안정하거나 하면 예외가 발생하면서 롤백이 될 수 있습니다!
도움이 되셨길 바라며 감사합니다^^