인프런 커뮤니티 질문&답변

jihyeon.jang님의 프로필 이미지
jihyeon.jang

작성한 질문수

실전! Querydsl

강의 듣고 실무 적용하다가 궁금한 사항이 있어서 문의 드립니다.

작성

·

379

0

안녕하세요. 강의 잘 듣고 있습니다.

궁금한 사항이 있어서 문의 드립니다.

1. 테스트 케이스 작성 시  service layer 테스트 시에는 @Transactional 어노테이션을 붙으면 rollback 되는 것을 확인하였는데controller 테스트 할 때도 결과값을 DB에 반영되지 않게 할 수 있는 방법이 있나요? 이경우는 DELETE 메서드를 호출해서 수동으로 초기화해주는 방법만 있나요?

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를 호출해서 참조)

3. exception 발생 위치 - save()함수 호출 후 "저장 성공"이라는 문구가 콘솔에 찍히면 해당 메서드는 Transaction이 종료되는 시점에 이슈가 없다고 봐도 될까요? 아니면 memberRepository.save() 함수 호출 시 발생되는 exception이 있고, Transaction이 종료되는 시점에 발생되는 exception도 존재하나요? 

@Transactional

public void save(Member member) {

    memberRepository.save(member);

    System.out.println("저장 성공"):

}

너무 많은 질문을 한꺼번에 했는데.;;;

아시는 부분에 대해서 답변 주시면 감사하겠습니다.

수고하세요.

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. jihyeon.jang님

질문에 바로 답을 달아드릴께요^^

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("저장 성공"):

}

-> 저장 성공이라고 찍혀도 저장 성공 다음에 바로 이 메서드를 빠져나가는 시점에 스프링이 트랜잭션을 커밋 시도 합니다. 이때 데이터베이스 연결이 불안정하거나 하면 예외가 발생하면서 롤백이 될 수 있습니다!

도움이 되셨길 바라며 감사합니다^^

jihyeon.jang님의 프로필 이미지
jihyeon.jang

작성한 질문수

질문하기