안녕하세요
AOP 중 궁금한점이 생겨 질문드립니다!
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
질문을 쭉 봤는데 해당 내용이 없었습니다.
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
네
[질문 내용]
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
네
[질문 내용]
이부분에서 찍어보면
다음과 같이 EnhancedBySpring~
이부분이 스프링이 AOP 를 처리하기 위해 프록시로 복제된 객체로, AOP를 사용하게되면 사용된다는 내용으로 이해했습니다.
강의 자료에 보면, 다음과 같은 내용이 있는데,
AOP와 관련된 코드들 (예제에서는 시간을 측정하는 코드, 시간측정하는 클래스를 주입하는 코드)을 제거 한 후에도 MemberController 에서 Service 클래스를 sout 으로 찍어볼 경우, 똑같이 EnhancedBySpring~ 하는 객체가 찍혀 나옵니다.
이 부분이 위에 AOP 적용 전 그림
에서 진짜 객체들만 사용한다는 위 그림과 과 맞지 않는데,
그렇다면 Spring 에서는 AOP 관련된 코드가 없어도 자동적으로 AOP를 위해 프록시 객체를 사용하도록 강제(?) 처리 되는건지 궁금합니다.
안녕하세요. Space님, 공식 서포터즈 David입니다.
build 폴더 내 파일을 삭제 후 다시 빌드하시고 실행해보시겠어요?
감사합니다.
답글
Space
2022.03.19 오후 6:05Build 폴더를 삭제하고 실행해보고,
Gradle의 clean 도 해보았는데
~~package.service.MemberService$$EnhancerBySpringCGLIB$$9a4bda50
이런식으로 찍히는걸 확인할 수 있었습니다.
Build 폴더를 삭제하고 실행해보고,
Gradle의 clean 도 해보았는데
~~package.service.MemberService$$EnhancerBySpringCGLIB$$9a4bda50
이런식으로 찍히는걸 확인할 수 있었습니다.
답글
David
2022.03.20 오전 1:22조금 더 상세히 살펴볼 수 있게 아래 참고하셔서 프로젝트 남겨주실 수 있으실까요?
---
전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
https://bit.ly/3fX6ygx
주의: 업로드시 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.
감사합니다
예제와 Package명만 다르고 그대로 실습했던 파일입니다.
여기서 AOP를 사용하는 메소드별 시간측정하는 메소드인
TimeTraceAop.java 가 주석처리 되어있고,
SpringConfig.java 에서
해당 부분을 사용하지 않도록 하였습니다.
https://drive.google.com/file/d/1Wy3KoElrnRFd4GIverdi0MwAWfScwGrt/view?usp=sharing
실행방법 : Intellij IDE에서, SpaceSpringApplication 실행
실행시 콘솔 로그에
memberService = class space.spacespring.service.MemberService$$EnhancerBySpringCGLIB$$
해당 부분이 AOP를 사용할때 나온다고 강의에서 말씀해 주셨는데,
AOP 관련 부분을 제거한 뒤(build 파일 제거 후 리빌드) 에도 EnhancerBySpring~ 문구가 나옵니다 .
답글
David
2022.03.20 오후 6:45확인해보니 MemberService 내 @Transactional 애노테이션이 붙어있네요.
해당 애노테이션은 AOP를 활용해 트랜잭션을 동작시키므로 프록시 객체가 생성됩니다.
해당 애노테이션을 제거하시고 실행해보시면 프록시 객체가 아닌 일반 객체임을 확인하실 수 있습니다.
Space
2022.03.21 오전 7:49감사합니다!!