inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! Querydsl

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

419

jihyeon.jang

작성한 질문수 5

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

}

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

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

수고하세요.

JPA java

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

}

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

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

SpringBoot 4.X에서의 Querydsl 설정

0

84

2

querydsl 오픈소스에 대한 질문

0

70

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

108

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

316

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

68

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

160

1

querydsl sum() 메서드 없어요.

0

158

2

build 디렉터리 생성

0

135

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

113

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

90

1

오타 제보 드립니다.

0

70

2

벌크 연산과 flush, clear

0

76

1

Run As Intellij 로 변경시 Q타입 import 불가

0

87

1

QHello import하기 문제 발생

0

147

2

등록된 함수 보는법(H2Dialect) 질문

0

68

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

195

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

200

1

querydsl 설정 문제

0

222

2

quey dsl 설정부분

0

158

2

count 쿼리 관련 질문입니다!

0

75

1

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

89

1

답변부탁드리겠습니다.

0

89

2

(OrderSpecifier)관련 내용 어디있을가요

0

64

1

중급문법 벌크연산에서

0

81

2