작성
·
447
0
안녕하세요. Spring Data Jpa Repository의 구현체에 대해서 공부하다가 궁금한 점이 생겨서 질문 드립니다.
우선 기본적인 CRUD 쿼리를 위한 MemberRepository를 만들고 Repository가 스프링 빈으로 등록될 때 SimpleJpaRepository 타입으로 등록되는지 확인 해보고 싶어서 테스트 코드를 짰습니다.
우선 ApplicationContext를 @Autowired로 주입 받고 그 안에 MemberRepository 타입의 스프링 빈을 반환 받아서 인스턴스 참조값과 클래스 타입을 각각 출력해 봤습니다.
결과 값은 다음과 같았습니다. MemberRepository 타입으로 JDK 동적 프록시를 이용해 만들어진 프록시 객체가 스프링 컨테이너에 등록되어 있는 것을 확인했습니다.
여기서 2가지의 질문이 생겼는데요.
첫 번째로, 제가 알고 있는 지식 내에서는 프록시 객체를 생성하는 이유가 JPA의 예외를 스프링 예외로 전환하는 기능을 추가하기 위해서 인데 이것이 맞는지,
두 번째로, 첫 번째가 맞다면 구현 클래스가 존재하는데 왜 스프링의 프록시 생성 기본 전략인 CGLIB를 사용하지 않고 JDK 동적 프록시를 사용 했는지가 궁금합니다.
좋은 강의 들려주셔서 항상 감사드립니다!
답변 1
0
안녕하세요, 인프런 AI 인턴이에요. 스프링 데이터 JPA Repository에 관해 질문 주셔서 감사합니다.
첫 번째 질문에 대해서는 프록시 객체를 생성하는 이유 중 하나로 JPA 예외를 스프링 예외로 변환하는 기능이 있습니다. JPA에서 발생하는 예외는 스프링과 연동하여 처리할 수 있도록 스프링 예외로 변환되며, 이를 위해 프록시 객체가 사용됩니다. 프록시 객체는 Repository의 메서드가 호출됐을 때 실제 로직을 처리하면서 JPA 예외를 스프링 예외로 변환하는 역할을 합니다.
두 번째로, 스프링의 프록시 생성 기본 전략은 CGLIB이지만, JDK 동적 프록시를 사용한 이유는 인터페이스를 기반으로 프록시를 생성하기 때문입니다. Spring Data JPA는 인터페이스를 기반으로 Repository 인터페이스의 구현 클래스를 동적으로 생성하므로, JDK 동적 프록시를 사용합니다. 또한, CGLIB의 경우 상속을 통해 프록시를 생성하기 때문에 final 클래스나 final 메서드에는 적용할 수 없고, 인터페이스만 있을 경우에만 사용 가능하다는 제약이 있습니다.
좋은 강의를 제공해주셔서 감사합니다. 계속해서 도움이 필요하시면 언제든지 질문해주세요!