자아 해결해볼까요
해결방법 1. 서비스 타입 일치시키기
주입되는 ***Service의 타입이 실제 구현체인 ***ServiceImpl 이어야하는데 프록시 객체로 주입된거니까
프록시를 ***ServiceImpl 타입으로 캐스팅하려고 할 때 문제가 생긴 것
프록시 객체가 ***ServiceImpl 로 제대로 처리될 수 있게 AOP 설정을 확인!
해결방법 2. @Transactional 어노테이션 확인
만약 트랜잭션 처리가 필요하다면, AOP가 작동해서 프록시를 만든 것일 수 있어.
이때 @Transactional 어노테이션을 사용했을 때는, 프록시 객체를 주입받는 문제가 생길 수 있어.
@Transactional이 붙은 메서드를 호출할 때, AOP 프록시가 적용되기 때문에 그런 문제가 발생할 수 있어.
AOP부터 프록시를 알아야한다고 합니다
AOP 하나도 모르거든요 저
1. AOP(Aspect-Oriented Programming)
특정 기능을 자동으로 추가하는 방법
예시)
게임을 만든다고 가정, 게임에는 주인공이 적을 처치하는 기능이 있음
모든 게임에서 "게임 시작할때마다 점수를 기록"하거나, "게임 끝날때마다 저장" 같은 작업을 해야함
AOP는 게임의 주기능과는 별개로 점수 기록이나 저장을 자동으로 추가해줘
게임을 시작할때 점수기록을 매번 작성할 필요없이 AOP가 자동으로 처리해줌
2. 프록시 (Proxy)
프록시는 그냥 대리인이라고 생각하면 됨 = 분신
예시)
내가 친구에게 숙제를 대신해달라고 부탁.
친구는 대리인이 되어 내가 할 일을 대신 해줌
프록시 객체는 진짜 객체 대신에 대리인 역할을 하면서 그 사이에 필요한 작업 추가한다!
3. AOP와 프록시를 함께 사용할 때
AOP는 부가적인 작업을 자동으로 추가해주고, 프록시는 그 작업을 대리인처럼 대신 해주는 것
4. 한줄 요약
AOP는 할일 목록이고, 프록시는 그걸 해줄 분신이다.
'Spring' 카테고리의 다른 글
Spring 디버깅 하는 법 (0) | 2023.04.05 |
---|---|
Spring Eclipse 파일 위치 (0) | 2023.03.30 |