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

km6914님의 프로필 이미지
km6914

작성한 질문수

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

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

해결된 질문

작성

·

384

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"인 데이터가 있으므로 오류를 발생시켜야 한다고 생각했는데요, 결과는 정상적으로 테스트가 수행됩니다.

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

감사합니다.

 

 

 

답변 1

0

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

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

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

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

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

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

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

감사합니다.

km6914님의 프로필 이미지
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" 이 삭제되는 것을 확인할 수 있습니다.

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

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

km6914님의 프로필 이미지
km6914
질문자

확인했습니다.

답변 감사합니다.

km6914님의 프로필 이미지
km6914

작성한 질문수

질문하기