묻고 답해요
129만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 고급편
args 표현식을 이용한 매개변수 전달 개념 문의
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 포인트컷 표현식을 이용하여 매개변수를 전달하는 것을 공부했습니다. 이 개념과 본래 포인트컷의 개념이 헷갈려서 문의드립니다. @Around("allMember() && args(arg, ..)") public Object logArgs2(ProceedingJoinPoint joinPoint, Object arg) throws Throwable { log.info("[logArgs2]{}, arg={}", joinPoint.getSignature(), arg); return joinPoint.proceed(); } 포인트컷은 조인 포인트를 필터링하기 위한 개념으로 공부했습니다. 위 코드에서 args(args, ..) 부분의 args가 매개변수를 나타내는 것은 이해가 됩니다. 하지만 ArgsTest 코드에서 학습했을 때는 args() 표현식 안에 String, Object, java.io.Serializable 등등과 같은 타입을 적어줘서, 매개변수의 타입을 필터링했었거든요. 그러면 args는 어떤 타입을 필터링하는 포인트컷인가요? 무엇이든 상관없는건가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
외부 함수에 대해 aop 적용 가능할까요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]제가 작성한 함수내에서 System.out.println 을 호출하는 경우, 제가 작성한 함수가 아닌 System.out.println 호출 전후에 시간측정해서 System.out.println 호출하는데 시간이 얼마나 걸리는지도 AOP를 이용해서 측정할 수 있을까요?실제 코드에서는 제가 개발하는 코드내에서, 다른 개발자가 배포한 lib 함수를 호출하는데, 그 외부 library 함수를 호출하는데 얼마의 시간이 걸리는지 알고 싶어서요. (현재 작성된 코드를 수정하지 않고 AOP설정만으로 외부 함수들에 대한 joinPoint 를 잡을 수 있는지 궁금합니다)감사합니다
-
미해결재고시스템으로 알아보는 동시성이슈 해결방법
synchronized 키워드 후 테스트 실패나는 이유
안녕하세요. 실패하는 이유를 간략하게 설명하셨는데 그 이유가 혹시 스프링의 aop 동작인 proxy 때문인가요?저는 트랜잭션을 지우면 값이 decrease 되지 않고 100이 됩니다.트랜잭션이 없기 때문에 100이 되어야 하는거 아닌가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
org.springframework.beans.factory.BeanCreationException 오류
AOP 적용 목차 전까지는 서버 실행해도 문제 없는데 AOP 적용 예제 넣고 돌리면 아래 에러 코드가 뜨네요.. 바로 TimeTraceAop.java 를 넣자마자 BeanCreationException 이 에러가 나오는데 어떻게 해야되죠? 이 에러가 나오는 프로젝트 링크도 같이 올렸습니다.. https://drive.google.com/file/d/1j-eePhGfYIg5oH3p5croYcFI6IhNN4RP/view?usp=sharing 에러 코드 ---------------------------------------------------- START :execution(MemberService hello.hellospring.SpringConfig.memberService()) END :execution(MemberService hello.hellospring.SpringConfig.memberService()) 27ms 2022-08-10 20:22:50.081 WARN 16904 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'memberController' defined in file [C:\Users\36912\Desktop\hello-spring\hello-spring\out\production\classes\hello\hellospring\controller\MemberController.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class hello.hellospring.controller.MemberController: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: No visible constructors in class hello.hellospring.controller.MemberController 2022-08-10 20:22:50.082 INFO 16904 --- [ main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2022-08-10 20:22:50.087 INFO 16904 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2022-08-10 20:22:50.109 INFO 16904 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 2022-08-10 20:22:50.111 INFO 16904 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2022-08-10 20:22:50.127 INFO 16904 --- [ main] ConditionEvaluationReportLoggingListener : Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-08-10 20:22:50.173 ERROR 16904 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'memberController' defined in file [C:\Users\36912\Desktop\hello-spring\hello-spring\out\production\classes\hello\hellospring\controller\MemberController.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class hello.hellospring.controller.MemberController: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: No visible constructors in class hello.hellospring.controller.MemberController at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:628) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.20.jar:5.3.20] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.20.jar:5.3.20] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.0.jar:2.7.0] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.0.jar:2.7.0] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.0.jar:2.7.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.0.jar:2.7.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.0.jar:2.7.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.0.jar:2.7.0] at hello.hellospring.HelloSpringApplication.main(HelloSpringApplication.java:9) ~[classes/:na] Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class hello.hellospring.controller.MemberController: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: No visible constructors in class hello.hellospring.controller.MemberController at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:209) ~[spring-aop-5.3.20.jar:5.3.20] at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110) ~[spring-aop-5.3.20.jar:5.3.20] at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:480) ~[spring-aop-5.3.20.jar:5.3.20] at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:344) ~[spring-aop-5.3.20.jar:5.3.20] at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:293) ~[spring-aop-5.3.20.jar:5.3.20] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:455) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808) ~[spring-beans-5.3.20.jar:5.3.20] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.20.jar:5.3.20] ... 15 common frames omitted Caused by: java.lang.IllegalArgumentException: No visible constructors in class hello.hellospring.controller.MemberController at org.springframework.cglib.proxy.Enhancer.filterConstructors(Enhancer.java:763) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:662) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.core.ClassLoaderAwareGeneratorStrategy.generate(ClassLoaderAwareGeneratorStrategy.java:57) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:358) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:585) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:110) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:108) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54) ~[spring-core-5.3.20.jar:5.3.20] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:134) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:572) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:419) ~[spring-core-5.3.20.jar:5.3.20] at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:57) ~[spring-aop-5.3.20.jar:5.3.20] at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:206) ~[spring-aop-5.3.20.jar:5.3.20] ... 22 common frames omitted 종료 코드 1(으)로 완료된 프로세스 ----------------------------------------------------
-
미해결스프링 핵심 원리 - 고급편
AOP를 통해서 공통처리로 로그인처리를 할 수 있다고 하는데요,
기존에는 Security를 통해서 로그인처리를 해야만 한다고 생각했는데 다른 방법으로 할 수 있다고 하니 비교를 하고 싶어지더군요. AOP와 Secuirty의 차이점이 무엇이 있을까요? 그리고 로그인처리에는 어떤것이 더 적합할까요?
-
해결됨스프링 핵심 원리 - 고급편
강의 학습 중 공통(부가)기능 처리 방법에 대한 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 스프링 핵심원리 고급편에서 다루는 주요 내용인 핵심기능과 공통(부가)기능을 어떻게 나눌 것인가를 듣다보니 어느덧 AOP 챕터까지 다다르게 되었습니다. 강의를 통해 부가기능의 종류에는 크게 로깅, 트랜잭션처리, 접근권한확인이 있다고 생각이 들었습니다. 이것들은 앞에서 다룬 개발 패턴이나 AOP를 사용하지 않고도 유틸리티성 클래스를 통해 처리가 가능한 것으로도 알고 있지만 SOLID 원칙, 유지보수 효율 증대, 중복 코드 제거 등의 많은 이점을 가져다주기 때문에 AOP와 같은 기술을 사용하는 것은 이해를 했습니다. 그러나 Filter/HandlerInterceptor를 사용해서도 부가기능을 처리할 수 있을 것으로도 생각이 드는데요.(스프링 MVC 강의 학습을 통해 느낀 점입니다.) 저와 비슷한 생각을 가지고 계신 다른 분께서 질문한 글의 답변을 인용하자면 웹과 관련된 공통(부가)기능(특정 메뉴 접근권한 확인, 로그인 여부 확인 등)는 Filter/HandlerInterceptor를 통해 처리하고, 순수한 자바 코드를 통한 공통(부가)기능은 AOP를 이용하는 것이 맞는 것인지 궁금합니다. (참고 질문: https://www.inflearn.com/questions/495293) 물론 더 나아가 시큐리티를 알고 있다면 이런 질문 내용도 다른 방식으로 해결이 가능하겠지만, 만약, 시큐리티를 현재 모르고 있다라는 가정하에 위와 같이 실무에서도 처리하는게 맞는지 첨언 부탁드리겠습니다. 미리 답변 감사드립니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
어노테이션 빨간줄 질문드립니다.
이클립스를 이용해 수업을 듣고 있습니다. AOP나 DB 강의를 듣다 어노테이션을 추가해야할 때 아래와 같이 빨간줄이 뜨는 상황이 계속되고 있습니다. 혹시 어떤걸 확인해봐야 하나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
AOP @Bean 사용시 시간 출력
안녕하세요!! 좋은 강의 제공해 주셔서 정말 감사합니다.이제 막 스프링 공부를 시작하는 와중에, 어떻게 시작해야 할지 모르는 상황에서 정말 많은 도움 됐습니다!!궁금한 점은 AOP를 직접 @Bean으로 등록해 줘서 실행했을 때, 왜 시간 출력물이 나오지 않는 것인지 궁금합니다!SpringConfig에서return new TimeTraceAop(); 으로 새로운 TimeTraceAop()객체를 리턴하는데, TimeTraceAop()의 execut() 메소드가 호출이 안되는 건가요? 시간을 출력하려면 어떻게 해야 할까요? 아래는 @Bean으로 직접 등록하고 실행한 결과입니다!
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
AOP 적용 질문
안녕하세요 AOP 중 궁금한점이 생겨 질문드립니다! [질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 질문을 쭉 봤는데 해당 내용이 없었습니다.3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네[질문 내용] 이부분에서 찍어보면 다음과 같이 EnhancedBySpring~ 이부분이 스프링이 AOP 를 처리하기 위해 프록시로 복제된 객체로, AOP를 사용하게되면 사용된다는 내용으로 이해했습니다. 강의 자료에 보면, 다음과 같은 내용이 있는데, AOP와 관련된 코드들 (예제에서는 시간을 측정하는 코드, 시간측정하는 클래스를 주입하는 코드)을 제거 한 후에도 MemberController 에서 Service 클래스를 sout 으로 찍어볼 경우, 똑같이 EnhancedBySpring~ 하는 객체가 찍혀 나옵니다. 이 부분이 위에 AOP 적용 전 그림 에서 진짜 객체들만 사용한다는 위 그림과 과 맞지 않는데, 그렇다면 Spring 에서는 AOP 관련된 코드가 없어도 자동적으로 AOP를 위해 프록시 객체를 사용하도록 강제(?) 처리 되는건지 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
프록시 관련해서 질문이 있습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]영한님 안녕하세요. JPA로드맵, 스프링 로드맵 모두 들으면서 기초 개념을 잡아가고 있습니다. 감사합니다. 다름이 아니라, 학습을 하면서 프록시 객체의 개념이 많이 등장하는데요, 이런 프록시 객체에 대해 궁금한 점이 생겨서 질문드립니다. 스프링이 빈을 싱글톤으로 관리하기 위해 CGLIB 바이트코드 조작을 통해 가짜 프록시 객체를 스프링 빈으로 등록한다고 알고 있습니다. 그리고 스프링 AOP 적용 시에, Pointcut의 대상이 되는 객체(pointcut 대상 메서드가 포함된 객체)에 Advice를 적용하기 위해 CGLIB 또는 JDK 동적 프록시 기술로 프록시 객체를 만든다 배웠습니다. 마지막으로 여기서 JPA에서 지연로딩을 하기 위해 가짜 프록시 객체를 생성하고 실제 프록시 초기화 시점에 DB에서 쿼리를 불러온다고 보았습니다. (--> 이 프록시 객체는 영속성 컨텍스트가 시작될 때 생성되었다가 사라지는 것 같긴 합니다..) 실제로는 더 많은 사례가 있겠지만, 일단 제가 알기로는 이렇게 3가지가 있었던 것 같은데, 이때 생성되는 프록시 객체들은 다 별개의 객체들일까요? 예를 들어 싱글톤 빈으로 등록된 객체가 있는데(CGLIB 프록시), 이 객체가 AOP 적용 대상이라면 CGLIB 혹은 JDK 동적프록시를 통해 또다른 프록시 객체가 생성되는 건지 궁금합니다. 추가로, 지연로딩을 위한 프록시 객체는 영속성 컨텍스트가 시작될 떄 생성되어 영속성 컨텍스트가 종료되면 사라지는 것인지 궁금합니다. 질문이 다소 모호해서 죄송합니다.
-
해결됨스프링 핵심 원리 - 고급편
이번 예제에서 Config 클래스에 @Configuration 을 적용하니, Proxy 래핑/등록이 안되는것 같습니다.
강사님 안녕하세요.저는 지금 예제 구현시 의도와 다르게 약간 틀린 설정으로 생긴예상밖의 결과로 약간 혼동을 겪고있습니다. 이유는 @Configuration 을 실수로 붙였더니, 아래와 같이Proxy 가 적용되지 않은 결과가 나옵니다. Config 클래스에 아래와 같이 @Configuration 선언시 @Configurationstatic class Config { ... ...} child.childMethod(); 실행 후 로그 메세지: child Proxy=class ...AtTargetAtWithinTest$Child(Proxy 적용이 안된 스프링 빈 출력) child.parentMethod(); Parent 는 프록시 처리가 되지 않아 출력되지 않음 관례처럼 사용해오던 @Configuration 을 지우니 강의 예제결과처럼 정상으로 나옵니다.(@Import 를 통해 Config 추가 상태) Aspect 를 빈으로 등록해도 Proxy 변환이 안되는 이 상황이 이해가 되지 않아 부득이하게 질문을 남기게 되었습니다. 질문입니다. 예전 강의에서 @Configuration 은 등록되는 빈 을 대상으로 싱글톤 후처리를 위해 선언되는 것이라 알고있었습니다.( CGLIB 을 통해 프록시 후처리), 그래서 Aspect 가 당연히 적용될 줄 알았는데 @Configuration 을 붙이니,Proxy 처리가 되지 않더라구요. 아래는 두가지 결과 입니다. @Configration Config @Import(Config.class) @Configuration 선언 시, Proxy 후처리가 되지 않는 기묘한 현상에 대한 이해가 잘 되지 않습니다.이런 이유로 Config 클래스에 @Configuration 을 쓰지않고, @Import 로 추가하신 이유가 궁금합니다. 읽어주셔서 감사드립니다.
-
미해결스프링 핵심 원리 - 고급편
AspectJ의 AOP 구현방식에 대해 질문드립니다.
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 영한님 안녕하세요! Spring AOP는 프록시 기반으로 타겟과 aspect를 weaving해서 프록시 객체가 생성된다고 이해했습니다. 그렇다면 또다른 AOP 프레임워크인 aspectJ는 어떤 방식으로 aspect를 타겟에 적용하고 있나요? AspectJ가 적용된 코드에 final을 붙여 실행시켰을 때 오류가 나는 것으로 보아 아마 프록시로 래핑된 객체를 생성하지 않을까 추측이 되는데 확실치 않아 여쭤봅니다. 짜임새 있는 강의 준비해주셔서 항상 잘 듣고 있습니다. 고맙습니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Bean 등록해서 개발시 Around 컨디션, 그리고 Around(AOP) plugin
1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요! 너무 좋은 강의 완강 하면서 정말 재밌습니다. 다음 강의들도 정말 기대됩니다 :) 두가지 질문이 있어서 여쭤봅니다. 1. Around의 Parmeter AOP를 이용할 때, Bean 등록을 해서 이용했을때, 에러가 나서 질문 목록을 찾아보니, 다른 질문자분께서 이미 Around의 컨디션을 코딩해두셨더라고요 (조성백님의 AOP SpringConfig @Bean으로 등록시 에러) 그 글을 참고하고, Around에 Parameter(?)를 업데이트 해준 후에, 에러 없이 동작시킬 수 있었습니다. @Around("execution(* hello.hellospring..*(..)) && !target(hello.hellospring.SpringConfig)") public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { ... } hello.spring 패키지에 모두 적용되고 까지는 이해 되었는데 !target.... 이 부분이 어떻게 연관이 되었는지 궁금합니다. 또 이렇게 Around를 이 형식으로 해주어야만 빈등록을 해서 사용할 수 있는것인가요? 왜 Component 를 사용해서 Run 했을때와는 다른지 궁금합니다. 2. 두번째 질문은, 제 IntelliJ에서는 영한님처럼 Around안쪽 String이 하이라이트 되지 않고 syntax가 인식되지 않는것처럼 나오는데요(Around 안쪽 스트링이 모두 한 스트링으로, intelliJ default 초록색으로 보여집니다), 혹시 어떤 Plugin을 써야하거나 세팅을 다르게 해주어야하나요? 다시한번 좋은 강의 감사드립니다!
-
해결됨스프링 핵심 원리 - 고급편
애노테이션 @Transactional의 위치 질문입니다.(AOP 관련)
안녕하세요 김영한님! 강의를 다 듣고나서 트랜잭션 AOP의 동작원리를 알 수있게 되어 정말 감사합니다. 다만 제가 궁금한건 애노테이션 @Transactional입니다. 주로 서비스의 메소드에 적용하는데 클래스에도 붙일 수 있더군요. @Service@Transactional(readOnly = true)public class ProductService { 강의에서는 AOP 적용위치는 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행 이라고 말씀하셨는데 저 애노테이션은 AOP와 관련이 없는건가요? 아님 내부적으로 클래스 단위에 붙일 때는 클래스 하위 메소드에도 전부 적용하도록 내부 코드에 설정이 되어있는건가요? (흑흑 강의를 다시 들어야하는 걸까요?) 질문 읽어주셔서 감사합니다!
-
미해결스프링 핵심 원리 - 고급편
안녕하세요! 질문이 있습니다.
안녕하세요! 영한님, 언제나 좋은 강의 감사드립니다. 해당 수업을 들으면서 궁금한 사항이 생겨 질문 드립니다. 제가 해당 수업을 듣기 이전에는 그냥 막연하게 스프링 AOP에서는 프록시 객체를 런타임 시점에 바이트 코드를 조작해서 만들어 준다라고 알고 있었는데요. 런타임 시점에 바이트코드를 조작한다는 말은 잘못된 표현이라고 생각할 수 있을까요?? 해당 수업을 듣고 나니, 바이트 코드 자체를 조작하는 위빙은 컴파일 타임 위빙이나 로드 타임 위빙에서 바이트 코드를 조작하는 것이지 런타임 시점에서는 바이트 코드를 조작하는 게 아니라는 생각이 들어서요.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
AOP 적용 후 의존관계
안녕하세요. "AOP 적용" 강의에서 AOP를 적용했을때 프록시로 가짜 MemberService가 생성되는걸 확인 시켜주시기 위해서 MemberController 의 MemberService 주입 부분에서 프린트를 찍어서 보여주시는데요. AOP가 적용되지 않은 상태에서 프린트 찍어도 비슷한 형태로 출력됩니다. 이 부분에 대해서 설명해주실 수 있을까요..?
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
스프링 웹 프로젝트에서 서블릿 필터, 인터셉터, AOP가 선언된 경우 AOP가 동작하는 시점에 대한 질문입니다.
안녕하세요. 스프링 MVC Part.2 강좌에서 필터와 인터셉터를 배우고나서, 서블릿 필터, 스프링 인터셉터, AOP가 모두 선언이 되어 있는 경우 AOP가 동작하는 시점에 대해 질문을 드리고자 글을 남깁니다. [강의 자료에서 가져온 필터, 인터셉터의 동작 과정] HTTP 요청 -> WAS -> 필터 -> 서블릿(디스패처 서블릿) -> 스프링 인터셉터 -> 컨트롤러 동작 과정을 보다가 문득 든 생각입니다. '그럼 AOP는 어느 구간에서 요청을 캐치해서 동작하는거지?' 예를 들어, 공통 관심 사항(메소드 실행시간 체크)을 처리하는 AOP를 @Around(핵심 기능 실행 전/후 동작)로 선언했다면 AOP가 동작하는 과정은 아래 과정이 맞을까요? HTTP 요청 -> WAS -> 필터 -> 서블릿(디스패처 서블릿) -> 스프링 인터셉터 -> AOP -> 컨트롤러 무조건 위 과정이 맞는지 아니면 공통 관심 사항을 적용하는 방법(메소드 실행 전, 후, 전+후)에 따라 바뀌는지 궁금합니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
AOP와 서블릿 필터/스프링 인터셉터의 사용 시점에 대한 질문입니다.
안녕하세요. 서블릿 필터 - 소개 강의 내용 4:45 부분에서 '웹과 관련된 공통 관심사는 AOP보다 서블릿 필터 또는 스프링 인터셉터를 이용하는 것이 좋다.' 라는 말씀을 언급해 주셨는데요. 스프링 입문 강의 파트에서 AOP에 대해서 맛보기로 다룰 때 예제 코드에서는 특정 메소드의 실행 시간을 출력해 보는 용도로써 AOP 기술을 사용해 본 적이 있습니다. 여기서 궁금한 것은 실무에서. 물론 규모에 따라 다르겠지만, 보편적으로 웹과 관련된 공통 관심사를 서블릿 필터와 스프링 인터셉터로 구현했다면 AOP를 사용하여 구현할 공통 관심사항에는 메소드 실행시간 외 어떤 것들이 있는지 궁금합니다. 미리 답변 감사드립니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
프록시와 컨테이너의 동작 원리
안녕하세요 강의 정말 유익하게 잘 들었습니다 선생님 덕분에 개발의 재미를 다시 찾았습니다 감사합니다! 다름이 아니라 조금 쓸데 없는 의문점이 생겨서 질문드립니다 10:57분에 프록시를 실행한 후에 '진짜를 호출해준다'고 하셨는데, 그게 무슨 의미인지 구체적으로 알고 있습니다. 컨트롤러가 프록시 서비스를 받았다가 진짜 서비스를 새로 주입받는 건가요? 아니면 그냥 컨테이너 같은게 서비스의 메소드만 실행해주는 건가요? 컨테이너의 모습이 너무 복잡해서 어떻게 동작되는 건지 알고 싶었습니다. 감사합니다 너무 재밌어서 모든 강의 완강하겠습니다!