강의

멘토링

커뮤니티

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

kimoon Hong님의 프로필 이미지
kimoon Hong

작성한 질문수

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

코드 다듬기

"MemberFinderTest, MemberRegisterTest" record관련

작성

·

80

0

스크린샷 2025-09-07 오전 1.52.23.png.webp

record + 클래스 레벨 @Transactional에서
에러가 발생합니다.!
질문은 record 예약어는 final 클래스라서 상속이나 프록시 생성이 불가능한거 같은데
@Transactional 어노테이션은 Spring AOP기반이라 프록시 객체 생성이 안되서 에러가 발생하는거 같은데... 강의에서는 통과가 되더라구요 제가 어떤 부분이 놓쳤을까요?

답변 2

1

토비님의 프로필 이미지
토비
지식공유자

@Transational은 두 가지 다른 목적으로 사용됩니다. 이 중에서 프록시를 만들어서 AOP로 트랜잭션 기능을 부여하는 경우의 사용에는 final 클래스를 쓰면 안 됩니다. 따라서 record도 사용할 수 없죠.

그런데 테스트 코드에 붙는 @Transactional은 동작 방식이 전혀 다릅니다. 테스트 프레임워크가 JUnit의 테스트 실행 프로세스에 참여해서 트랜잭션을 시작하고 테스트를 수행하는 방식으로 동작하기 때문에 상속을 통해서 트랜잭션을 만드는 메인 코드의 @Transactional과 제약조건이 전혀 다릅니다. 따라서 record와 같은 final 클래스를 사용해도 아무런 문제가 없습니다.

IntelliJ에는 이에 대한 검증 경고를 에러처럼 표시하는 버그가 있습니다. 하지만 실행해보면 아무 문제 없이 트랜잭션이 적용된 테스트가 수행되죠. 강의에서 한번 이에 대해서 설명을 드리긴 했습니다.

저는 IntelliJ의 스프링 코드 검증 기능은 가능한 끄는 것이 좋다고 생각됩니다. 의존관계 관련 에러나 경고 표시도 불필요한 것이 너무 자주 등장합니다. 이럴 때는 해당 에러 메시지에 디테일에서 validation을 off 시키는 것을 권장드립니다. IntelliJ의 이런 버그들이 빨리 고쳐지면 좋겠네요.

0

안녕하세요, 인프런 AI 인턴입니다.

질문에 따르면, @Transactional 어노테이션 사용시 발생하는 프록시 관련 문제로 인해 테스트가 실패하는 것 같습니다. record는 Java 14부터 도입된 기능으로, 기본적으로 불변(finite) 클래스로 설계되어 있어 @Transactional과 같은 AOP 어노테이션을 활용한 프록시 생성이 어려울 수 있습니다.

강의가 통과하는 이유는 여러 원인이 있을 수 있습니다:
1. 강의 설정 차이: 강의에서는 다른 설정이나 환경이 원활하게 동작하도록 되어 있을 가능성이 있습니다. 예를 들어, 강의는 다른 데이터베이스 설정이나 AOP 설정이 있을 수 있습니다.
2. Spring 버전 차이: 사용 중인 Spring 버전 차이에 따라 @Transactional 프록시 동작 방식이 달라질 수 있습니다.
3. 동일한 컴포넌트 설정: 강의에서는 record 대신 클래스를 사용하거나 테스트 메서드 단위에서 다른 어노테이션으로 문제를 해결했을 수 있습니다.

해결책으로는 다음을 시도해볼 수 있습니다:
- record 대신 일반적인 클래스를 사용하여 테스트 해보세요.
- 명시적으로 AOP 관련 설정을 조정하여, CGLIB(Dynamic Proxy) 방식을 고려해 보세요. 이는 @Transactional 프록시 생성에 적합할 수 있습니다.
- 만약 특정 테스트에서만 문제라면, 해당 테스트를 분리하거나 직접 트랜잭션을 관리해 보세요.

다음 링크에서 유사한 상황에 대한 해결 방법을 확인하실 수 있습니다:

제가 유도해드린 방향대로 혹은 링크된 질문을 참고하시고, 해결되지 않는 부분이나 더 궁금하신 점이 있으시면 다시 질문해 주세요. 😊
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

kimoon Hong님의 프로필 이미지
kimoon Hong

작성한 질문수

질문하기