강의

멘토링

커뮤니티

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

고운 코끼리님의 프로필 이미지
고운 코끼리

작성한 질문수

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

회원 기능 테스트

JPA관련 여러 가지 질문입니다.

작성

·

310

0

실무와 가까운 강의 항상 감사드립니다.

강의를 들을 때마다 질문이 많이 쌓이네요..

질문이 길어 죄송스럽지만, 답변 주시면 감사하겠습니다.

  

1. EntityManager는 Spring이 만들어서 주입시켜 준다고 말씀주셨는데, JPA는 Spring 없이 (DI 없이) 사용은 못 하는건가요? 자동 주입 된다고하면, Spring 없이는 어떻게 동작하는지, Spring은 이를 어떻게 구분하는지 궁금하여 나온 질문입니다.!

 

2. 앞 강의에서는 필드 초기화를 권장해주셨는데, 주입은 왜 생성자 주입이 더 안전한가요? 제가 아직 차이를 이해하지 못한 모양입니다. 둘다 생성 시 주입되고, 바꾸지 못 하는 부분은 같아 보이는데, 알려주시면 감사하겠습니다.

 

3. Service에서 사용하는 @Transactional과 Test에서 사용하는 @Transactional과 같은 것을 사용하는데, repository나 service 쪽은 롤백이 안 되고, test 쪽은 롤백이 되는 것이 맞나요? 그렇다면, 이 둘을 java에서 어떻게 구분지어서 한 쪽은 롤백이 되고 다른 쪽은 롤백이 되지 않는 것인가요?

 

4. 테스트 쓸 때 느낀 점인데, Member 객체에는 왜 생성자를 만들지 않나요? 이름을 받는 생성자를 만들면 편할 것 같은데, 혹시 만들면 안 되는 이유가 있는지 궁금합니다. !

 

5. 중복회원예외 테스트 함수에서 @Rollback(false)를 추가하면 어떨지 궁금해서 추가해봤는데, rollback-only라는 식의 문구가 떴습니다. rollback-only 속성이 박혀있는 것이라면, 어느 부분 때문에 박혀있는 것인지 알 수 있을까요?

 

6. test쪽 application.yml에 아무 것도 적지 않아도 자동으로 memory DB로 돌려준다고 말씀주시면서, jdbc:h2:mem~~으로 쓰인 부분을 보여주셨습니다. test 실행 시에 test쪽 application.yml이 있어 main 쪽 application.yml을 덮어서 실행한다면, 1) 어떤 것을 보고 h2인 것을 아나요? 2) 그리고, h2에서 memory DB로 실행하는 방법은 어떻게 알고 있나요?

 

강의를 들을 때, 원리를 모른 채 magic 같이 일어난다고 생각되는 부분을 최소화하기 위해, 어떻게 작동하는 지 최대한 이해하려고 노력하는 중입니다.

하지만, 그러기엔 처음 접하는 Framework이다보니 질문의 양이 많네요.. 

항상 감사드립니다.

이번에도 답변 주시면 감사하겠습니다.

답변 5

1

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

네^^

0

아하, 스프링 부트가 library를 통해 사용여부를 판단하는군요.

 

감사합니다.

모든 궁금증이 해결됐습니다!

0

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

5. 그렇다면 아마 중복회원  Exception이 발생하여 rollback 시켰나봅니다. 감사합니다!

-> 네^^

 

6. 질문이 살짝 잘못 전달된 것 같습니다. 😅 test쪽 application.yml이 우선권을 가졌을 때, 안에 datasource에 대한 정보가 없으면 spring이 어떤 DB를 사용하는지 알 수 없어 보이는데, 어떤 것을 보고 h2라는 것을 알고, h2를 메모리 모드로 실행을 해주는 것인가요?

-> 네 스프링 부트가 이렇게 판단을 합니다.

1. H2 데이터베이스 관련 라이브러리를 사용하고 있음

2. application.yml에 h2 데이터베이스 관련된 별도의 설정이 없음

이런 조건을 만족하면 H2를 메모리 모드로 실행합니다^^

0

답변 감사드립니다.

다만 추가 질문이 있어 이렇게 추가 답변 드립니다.!

 

5. 그렇다면 아마 중복회원  Exception이 발생하여 rollback 시켰나봅니다. 감사합니다!

 

6. 질문이 살짝 잘못 전달된 것 같습니다. 😅 test쪽 application.yml이 우선권을 가졌을 때, 안에 datasource에 대한 정보가 없으면 spring이 어떤 DB를 사용하는지 알 수 없어 보이는데, 어떤 것을 보고 h2라는 것을 알고, h2를 메모리 모드로 실행을 해주는 것인가요?

 

감사합니다.

0

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

안녕하세요. t님

1. EntityManager는 Spring이 만들어서 주입시켜 준다고 말씀주셨는데, JPA는 Spring 없이 (DI 없이) 사용은 못 하는건가요? 자동 주입 된다고하면, Spring 없이는 어떻게 동작하는지, Spring은 이를 어떻게 구분하는지 궁금하여 나온 질문입니다.!

-> JPA 기본편을 참고해주세요^^ (기본편에서 정말 순수한 JPA 만으로 실행합니다.)

 

2. 앞 강의에서는 필드 초기화를 권장해주셨는데, 주입은 왜 생성자 주입이 더 안전한가요? 제가 아직 차이를 이해하지 못한 모양입니다. 둘다 생성 시 주입되고, 바꾸지 못 하는 부분은 같아 보이는데, 알려주시면 감사하겠습니다.

-> 네 이 부분은 완전히 다른 내용입니다. 생성자 주입이 좋은 이유에 대해서는 스프링 핵심 원리 기본편을 참고해주세요.

 

3. Service에서 사용하는 @Transactional과 Test에서 사용하는 @Transactional과 같은 것을 사용하는데, repository나 service 쪽은 롤백이 안 되고, test 쪽은 롤백이 되는 것이 맞나요? 그렇다면, 이 둘을 java에서 어떻게 구분지어서 한 쪽은 롤백이 되고 다른 쪽은 롤백이 되지 않는 것인가요?

-> 스프링이 테스트 케이스에서 실행된 @Transactional을 자동으로 인식해서 롤백해줍니다.

 

4. 테스트 쓸 때 느낀 점인데, Member 객체에는 왜 생성자를 만들지 않나요? 이름을 받는 생성자를 만들면 편할 것 같은데, 혹시 만들면 안 되는 이유가 있는지 궁금합니다. !

-> 만들어도 됩니다^^

 

5. 중복회원예외 테스트 함수에서 @Rollback(false)를 추가하면 어떨지 궁금해서 추가해봤는데, rollback-only라는 식의 문구가 떴습니다. rollback-only 속성이 박혀있는 것이라면, 어느 부분 때문에 박혀있는 것인지 알 수 있을까요?

-> 이 부분은 정확히 어떤 상황에서 어떤 문제가 발생했는지, 보아야 합니다. JPA에서 심각한 문제가 발생하면 커밋을 할 수 없는데요. 그런 상황에서는 커밋을 할 수 없도록 rollback-only라는 마크가 JPA 내부에 찍히게 됩니다. 그래서 커밋시 해당 오류가 나오면서 커밋에 실패하게 됩니다.

 

6. test쪽 application.yml에 아무 것도 적지 않아도 자동으로 memory DB로 돌려준다고 말씀주시면서, jdbc:h2:mem~~으로 쓰인 부분을 보여주셨습니다. test 실행 시에 test쪽 application.yml이 있어 main 쪽 application.yml을 덮어서 실행한다면, 1) 어떤 것을 보고 h2인 것을 아나요? 2) 그리고, h2에서 memory DB로 실행하는 방법은 어떻게 알고 있나요?

-> test 케이스를 실행하면, test쪽 application.yml이 우선권을 가집니다. 2번은 스프링 부트가 설정 정보가 없으면 자동으로 h2 데이터베이스를 메모리 모드로 실행합니다.

감사합니다.

고운 코끼리님의 프로필 이미지
고운 코끼리

작성한 질문수

질문하기