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

정승원B님의 프로필 이미지

작성한 질문수

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

8강. 유저 관련 기능 테스트 작성하기

@Transactional 사용

작성

·

372

1

ㅎㅎ 또 질문이 있습니다~

강의와는 달리 @AfterEach 에서 매번 삭제하지 않고

트랜젝션을 사용하려고 합니다.

@Transactional 을 사용하려는데

@SpringBootTest
@Transactional
open class UserServiceTest @Autowired constructor(
    // constructor 에 @Autowired 를 붙이면 파라미터에 일일이 @Autowired 붙이는 걸 생략 가능!
    private val userRepository: UserRepository,
    private val userService: UserService,
) {

요렇게 class 앞에 open 을 붙여야 한다고 인텔리제이가 경고해 주는데요... 혹시 이게 무엇인지 궁금합니다!

답변 3

1

강의 보다가 Transactional 관련해서 질문이 있습니다.

만약 A객체가 B객체를 oneToMany관계(lazy loading)로 가지고 있을 때

테스트 코드에서 A 엔티티를 불러오고 B객체에 접근을 하게 되면 영속성 컨텍스트가 종료 되어 버려서 지연로딩 객체를 초기화 할 수 없게 되는데 이때 이 문제를 어떻게 해결할 수 있나요?

테스트를 다른 방법으로 짜야하는지 아니면 그냥 코드를 테스트 가능한 코드로 짜지 않은건지 태현님 의견이 궁금합니다!

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요, 차가운물님!! 좋은 질문 올려주셔서 감사드립니다 😊

이 부분은 제가 <테스트 코드와 트랜잭션>이라는 주제의 영상으로 제작해 말씀드리고 싶어 조금만 시간을 양해해주시면 감사드리겠습니다 ㅎㅎㅎ

늦어도 이번 주말까지는 강의 내용에 추가하여 메일로 공유드릴 수 있도록 하겠습니다. 감사합니다! 🙏

1

정승원B님의 프로필 이미지
정승원B
질문자

아하! open 이 그런 의미군요~

시원하게 해결되었습니다 ㅎㅎ 선생님 감사합니다~~!

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요!! 승원님!! 아이고~~ 너무 좋은 질문이십니다 ㅎㅎㅎㅎ

 

@Transactional 어노테이션을 사용하면, 스프링 AOP에 의해 프록시 객체를 만들게 되는데요 이때 프록시 객체를 정상적으로 활용하기 위해서는 클래스가 상속 가능해야 합니다!!

하지만 코틀린에서는 기본적으로 모든 클래스가 상속이 불가능하기 때문에 open 이라는 키워드를 사용해 명시적으로 클래스를 상속 가능하게 열어주어야 하는 것이죠!

 

더 궁금하신 내용 있으시면 편하게 질문 부탁드립니다!! 🙏🙏

감사합니다!!!