Open 키워드를 사용해야 하는 이유
안녕하세요 강사님 덕분에 편히 배우고 있습니다.
다름이 아니라 이번 강의 초반에 @Transactional 어노테이션을 사용할 시 open 키워드를 클래스와 매서드에 다 사용해주어야 하고, 만약 이게 싫다면 플러그인을 적용해야 한다고 말씀하셨는데요,
찾아보니 코틀린에서는 기본적으로 모든 클래스가 최종 클래스고, 그렇기 때문에 상속이 되지 않아 open 키워드를 사용해 상속 가능성을 열어두어야 한다는 것 같더라구요.
그런데 왜 이게 @Transactional 어노테이션을 사용할 때도 해당되는 내용인지 잘 모르겠습니다. 프록시 객체가 생성되기 때문인 걸까요?
제가 코틀린 기본 강의를 들었음에도 잘 기억이 나질 않아 질문드립니다. 항상 감사드립니다.
답변 2
0
안녕하세요! foodsmith96님! 좋은 질문 주셔서 감사합니다! 🙂
말씀해주신 "그런데 왜 이게 @Transactional 어노테이션을 사용할 때도 해당되는 내용인지 잘 모르겠습니다. 프록시 객체가 생성되기 때문인 걸까요?" 내용이 정확히 맞습니다.
이 내용은 스프링의 원리와 관련이 있는데요! 제가 <마지막 섹션> - <추가 - 코프링과 플러그인> 에서 프록시 느낌을 갖는(?) 코드와 함께 보다 자세히 설명드리고 있습니다.

그 내용을 두 줄 요약 드려보면
말씀해주신 것처럼 코틀린의 클래스는 기본적으로 상속 불가능하고,
스프링이 프록시 객체를 만드려면 Service class를 상속할 수 있게 만들어야 하다보니
open 키워드를 사용해 상속 가능하게 해주거나, 플러그인을 사용해 상속 가능한 바이트 코드가 생성되도록 해주어야 합니다!
답변이 도움이 되었으면 좋겠습니다.
감사합니다! 🙏
0
안녕하세요, 인프런 AI 인턴입니다.
foodsmith96님의 질문에 대해서는 이미 “@Transactional 사용” 질문에서 유사한 주제에 대한 정리가 이루어졌습니다. 코틀린에서 @Transactional 어노테이션을 사용할 때, 모든 클래스와 메서드가 기본적으로 최종 클래스와 최종 메서드로 선언되기 때문에 프록시 기반의 동작(예: 트랜잭션 관리)을 위해 open 키워드가 필요합니다. 스프링 프레임워크는 동적 프록시를 생성하여 클래스나 메서드에 트랜잭션 관련 로직을 주입하는 방식을 사용하는데, 코틀린에서 클래스와 메서드는 기본적으로 final이기 때문에, 이를 상속 가능(open)으로 만들어주어야 합니다.
이에 대한 보다 구체적인 설명은 다음 링크에서 확인하실 수 있습니다:
- 실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링) - @Transactional 사용 - 질문에 대한 답변에 @Transactional 어노테이션 사용 시 open 키워드가 필요한 이유와 관련하여 클래스가 상속 가능해야하는 이유가 설명되어 있습니다.
해당 내용은 코틀린의 final 키워드와 스프링의 프록시 메커니즘을 이해하는 데 도움이 될 것입니다.
질문과 관련한 궁금증이 해결되길 바랍니다. 추가로 궁금한 사항이 있으시다면 언제든지 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요 혹시 프론트 코드 제공받을 수 있을까요?
0
67
2
실행이 안되네요
0
65
2
프론트 영역 보는법
0
51
2
companion object
0
75
2
Custom 레프직토리 형식
0
56
2
Querydsl 도입
0
67
2
fetch join DISTINCT 중복제거
1
82
2
표준 예외와 커스텀 예외 사용 전략 질문
0
85
3
이 질문이 왜 없는지 이해가 안 되지만 문제 인식 및 해결 방법 남깁니다.
1
177
2
테스트를 위한 코드
1
105
2
프로젝트 실행 에러
0
150
2
PDF 문서에 오타가 있어서 알려드립니다.
1
102
1
enum질문
1
86
1
테스트 후 AfterEach 함수에서 나오는 쿼리
0
136
2
테스트 fixture
1
210
2
./gradlew test 실행시 인식할수 없다고 뜹니다.
0
140
1
test 코드 실행시 경고가 발생합니다.
0
140
1
13강 User Kotlin 변환중
2
169
3
'추가 - 코프링과 플러그인' 강의 7:46 allopen 관련 질문
2
174
1
-
0
141
2
4:28 build.gradle 수정 시 kotlin-reflect관련 implementation 추가 해야할까요?
0
310
3
junit import 불가
0
269
3
테스트 코드와 관련하여 질문이 있습니다.
1
216
1
hibernate가 select를 두번 하는 이유
0
237
1





