inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

rollback(false) 동작방식 관련 질문

해결된 질문

438

km6914

작성한 질문수 7

0

섹션 4. 회원 도메인 개발] 회원 기능 테스트 강의를 수강하는 중 질문이 있습니다.

 

@ExtendWith(SpringExtension.class)
@SpringBootTest
@Transactional  // for rollback
class MemberServiceTest {

    @Autowired
    MemberService memberService;

    @Autowired
    MemberRepository memberRepository;

    @Autowired
    EntityManager em;

    @Test
    @DisplayName("회원가입")
    @Rollback(false)
    public void signUp() throws Exception {
        // given
        Member member = new Member();
        member.setName("kim");

        // when
        Long saveId = memberService.join(member);

        // then
        Assertions.assertThat(member).isEqualTo(memberRepository.findOne(saveId));
    }
  1. @Rollback(false) 어노테이션을 사용한 결과 강의와 동일하게 db의 member table에 name = "kim" 이 정상적으로 들어온 것을 확인하였습니다.

 

  1. 그런데 이후 @Rollback(false) 어노테이션을 주석 처리한 뒤 Test를 실행하면, 위에서 저장했던 name="kim" 의 row가 지워진 것을 확인할 수 있었습니다.

 

여기서 저의 궁금증은, 첫 번째의 결과로 인해 name = "kim" 인 row가 이미 생성이 되었으므로, 2번을 실행할 때 memberService.join 메서드에서 이미 기존의 name="kim"인 데이터가 있으므로 오류를 발생시켜야 한다고 생각했는데요, 결과는 정상적으로 테스트가 수행됩니다.

위의 이유를 잘 모르겠습니다.

감사합니다.

 

 

 

java spring 웹앱 spring-boot jpa

답변 1

0

David

안녕하세요. km6914님, 공식 서포터즈 David입니다.

아래 가이드를 따라 프로젝트 공유 요청드립니다.

전체 프로젝트를 압축한 뒤
구글 드라이브로 공유해서 링크를 남겨주세요.

1. 구글 드라이브 업로드 방법

구글 드라이브 업로드 방법
링크

2. 주의사항
구글 드라이브 공유시
권한을 반드시 확인해주세요

3. 아래 내용을 작성 부탁드립니다.
a. 프로젝트 실행 방법을 알려주세요.
b. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

0

km6914

https://drive.google.com/file/d/1oFrDjyU7Zdq5Qk8Xjn0ojzbZ1p8gcan_/view?usp=sharing

  1. 구글 드라이브에 전체 코드 압축 파일 업로드 하였습니다: jpashop

  2. 권한 확인 완료하였습니다.

  3. application.yml 에서 mysql user, passwd 입력 후 테스트 가능합니다.

    1. 문제 확인 방법은 다음과 같습니다.

    2. 먼저 @Rollback(false) 어노테이션을 입력한 뒤 코드를 실행하면 member table에 name = "kim" 이 정상적으로 들어온 것을 확인할 수 있습니다.

    3. 다음으로 @Rollback(false) 어노테이션을 주석처리한뒤 코드를 실행하면 member table에 name = "kim" 이 삭제되는 것을 확인할 수 있습니다.

2

David

테스트 실행시, ddl-auto 옵션인 create에 의해 기존 테이블이 삭제된 후 다시 생성되기 때문에 기존 데이터는 테이블과 함께 삭제됩니다.

만약 데이터를 남기기 원하신다면 ddl-auto 옵션을 none으로 변경하신 후 시도해 주세요.

0

km6914

확인했습니다.

답변 감사합니다.

OrderServiceTest 상문주문 테스트 시 update 쿼리 문의

0

21

1

sdk 설정 오류

0

59

2

오탈자 - @Transactional

0

58

1

src/test/resources 테스트 경로 문제

0

53

1

상품 등록후 H2 db 출력 순서 바꿀 수 있나요?

0

67

1

MemberRepositoryTest 실행오류

0

83

1

boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)

1

186

2

강의 마지막 QueryDSL 사용 부분 질문있습니다

1

146

2

클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.

0

54

1

도메인 모델 패턴 vs 트랜잭션 스크립트 패턴

0

77

1

기본 생성자

0

62

1

h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.

0

104

1

멤버서비스테스트 부분에서 막힙니다.

0

168

4

실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?

0

118

1

초반에 h2 다운로드 과정 꼭 필요한가요?

0

122

2

자신 필드에도 get으로 접근하는 이유가 있을까요?

0

115

1

24분 27초 연관관계 편의 메서드 위치

0

114

1

단건 주문만 가능하게 한건 의도한 부분이신가요?

0

112

2

빌드 툴, Gradle

0

61

1

h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다

0

78

2

Repository에서 EntityManager 주입 방식 차이

0

91

1

롬복과 사용자 정의 setter 메서드

0

74

1

주문 목록 조회 fetch join 질문드립니다

0

85

1

dirty checking 질문드립니다.

0

84

1