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

foodsmith96님의 프로필 이미지
foodsmith96

작성한 질문수

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

16강. 서비스 계층을 Kotlin으로 변경하기 - UserService.java

Open 키워드를 사용해야 하는 이유

작성

·

223

0

안녕하세요 강사님 덕분에 편히 배우고 있습니다.

다름이 아니라 이번 강의 초반에 @Transactional 어노테이션을 사용할 시 open 키워드를 클래스와 매서드에 다 사용해주어야 하고, 만약 이게 싫다면 플러그인을 적용해야 한다고 말씀하셨는데요,

찾아보니 코틀린에서는 기본적으로 모든 클래스가 최종 클래스고, 그렇기 때문에 상속이 되지 않아 open 키워드를 사용해 상속 가능성을 열어두어야 한다는 것 같더라구요.

그런데 왜 이게 @Transactional 어노테이션을 사용할 때도 해당되는 내용인지 잘 모르겠습니다. 프록시 객체가 생성되기 때문인 걸까요?

제가 코틀린 기본 강의를 들었음에도 잘 기억이 나질 않아 질문드립니다. 항상 감사드립니다.

답변 2

0

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

안녕하세요! foodsmith96님! 좋은 질문 주셔서 감사합니다! 🙂

 

말씀해주신 "그런데 왜 이게 @Transactional 어노테이션을 사용할 때도 해당되는 내용인지 잘 모르겠습니다. 프록시 객체가 생성되기 때문인 걸까요?" 내용이 정확히 맞습니다.

이 내용은 스프링의 원리와 관련이 있는데요! 제가 <마지막 섹션> - <추가 - 코프링과 플러그인> 에서 프록시 느낌을 갖는(?) 코드와 함께 보다 자세히 설명드리고 있습니다.

image

그 내용을 두 줄 요약 드려보면

  1. 말씀해주신 것처럼 코틀린의 클래스는 기본적으로 상속 불가능하고,

  2. 스프링이 프록시 객체를 만드려면 Service class를 상속할 수 있게 만들어야 하다보니

open 키워드를 사용해 상속 가능하게 해주거나, 플러그인을 사용해 상속 가능한 바이트 코드가 생성되도록 해주어야 합니다!

 

답변이 도움이 되었으면 좋겠습니다.

감사합니다! 🙏

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

이해가 되었습니다. 친절한 답변 감사합니다!

0

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

foodsmith96님의 질문에 대해서는 이미 “@Transactional 사용” 질문에서 유사한 주제에 대한 정리가 이루어졌습니다. 코틀린에서 @Transactional 어노테이션을 사용할 때, 모든 클래스와 메서드가 기본적으로 최종 클래스와 최종 메서드로 선언되기 때문에 프록시 기반의 동작(예: 트랜잭션 관리)을 위해 open 키워드가 필요합니다. 스프링 프레임워크는 동적 프록시를 생성하여 클래스나 메서드에 트랜잭션 관련 로직을 주입하는 방식을 사용하는데, 코틀린에서 클래스와 메서드는 기본적으로 final이기 때문에, 이를 상속 가능(open)으로 만들어주어야 합니다.

이에 대한 보다 구체적인 설명은 다음 링크에서 확인하실 수 있습니다:
- 실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링) - @Transactional 사용 - 질문에 대한 답변에 @Transactional 어노테이션 사용 시 open 키워드가 필요한 이유와 관련하여 클래스가 상속 가능해야하는 이유가 설명되어 있습니다.

해당 내용은 코틀린의 final 키워드와 스프링의 프록시 메커니즘을 이해하는 데 도움이 될 것입니다.

질문과 관련한 궁금증이 해결되길 바랍니다. 추가로 궁금한 사항이 있으시다면 언제든지 질문해 주세요.

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

foodsmith96님의 프로필 이미지
foodsmith96

작성한 질문수

질문하기