묻고 답해요
129만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 고급편
인터페이스 객체지향에 대해..
김영한님 강의를 듣다보면 객체지향다형성, 인터페이스프로시 이런얘기를 많이들었습니다만ㅠㅠ이해가 안되는거 하나 여쭙고싶네요..보통 스프링 프로젝트 보면컨트롤러에 서비스 인터페이스 선언해두고이를 다시 서비스임플로 구현하자나요이걸 도대체 왜 하는걸까요?ㅠㅠ제 생각엔 인터페이스 둔다는것 자체가구현체를 필요에 따라 갈아끼우겠다는건데..보통 컨트롤러에 선언해둔 서비스 인터페이스의 의도를 알고싶습니다.,../ㅠㅠㅠ
-
미해결스프링 핵심 원리 - 고급편
포인트컷 지시자와 매개변수 전달
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네[질문 내용]매개변수 관련된 부분 학습 중에 헷갈리는 내용이 있어서 질문 드립니다.예를 들어 @annotation은 특정 어노테이션 기반으로 aop 프록시 대상을 정하는 것으로 배웠고, 다음과 같이 사용했습니다. @Around("@annotation(hello.aop.member.annotation.MethodAop)") public Object doAtAnnotation(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[@annotation] {}", joinPoint.getSignature()); return joinPoint.proceed(); }그런데 매개변수 전달에서 @annotation은 특정 annotation을 전달하는 것으로도 보이는데요, @Before("allMember() && @annotation(annotation)") public void atAnnotation(JoinPoint joinPoint, MethodAop annotation) { log.info("[@annotation]{}, annotationValue={}", joinPoint.getSignature(), annotation.value()); }그렇다면 두 번째 경우에, aop 프록시 대상에 @MethodAop를 갖고 있는 대상에 대해서 적용이 되는 걸까요? 해당 어노테이션만 전달하는 건지, 해당 어노테이션을 갖고 있는 경우에 적용하는 기능까지 포함된 건지 (이 경우엔 생략된걸까요?) 궁금합니다
-
미해결스프링 핵심 원리 - 고급편
포인트컷 지정, 매개변수 전달
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 포인트컷 지시자에서 표현식 중 매개변수 전달에 대해서 헷갈리는 부분이 있어서 질문 남깁니다.예를 들어 @annotation 지시자의 경우에는 해당 annotation이 있는 경우에 aop 적용 대상으로 인식하는 것으로 배웠는데요, @Around("@annotation(hello.aop.member.annotation.MethodAop)") public Object doAtAnnotation(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[@annotation] {}", joinPoint.getSignature()); return joinPoint.proceed(); }@annotation을 매개변수 전달로도 사용할 수 있다고 강의에서 배웠습니다.
-
미해결스프링 핵심 원리 - 고급편
Gradle과 Intellij IDEA의 실행 결과 차이가 발생합니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Intellij IDEA를 실행했을때 whitelabel error가 뜨고 Gradle로 실행했을때는 정상적으로 작동이 되는지 잘 모르겠습니다.<Gradle로 실행했을 때><Intellij IDEA로 실행했을 때>2024-04-24T10:14:45.934+09:00 ERROR 11612 --- [advanced] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.] with root causejava.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag. at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.updateNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:187) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.getNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:162) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:108) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:224) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:178) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.6.jar:6.1.6] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.6.jar:6.1.6] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.6.jar:6.1.6] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.6.jar:6.1.6] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.6.jar:6.1.6] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.6.jar:6.1.6] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.6.jar:6.1.6] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.6.jar:6.1.6] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.20.jar:6.0] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.6.jar:6.1.6] at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.20.jar:6.0] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:206) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.20.jar:10.1.20] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.6.jar:6.1.6] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.6.jar:6.1.6] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.6.jar:6.1.6] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.6.jar:6.1.6] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:175) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:150) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.20.jar:10.1.20] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na] Chat GPT로 물어봤는데 이해가 되지 않아서 질문 남깁니다. 두 방식으로 돌렸을 때 왜 이런 차이가 발생하는 건가요??
-
해결됨C개발자를 위한 최소한의 C++
임시 객체와 보이지 않는 복사 생성 강의 질문
임시 객체 개념 자체가 많이 낯설어서 2가지 질문을 해보려고 합니다 ㅠㅠ클래스가 함수의 매개변수나 반환자료형일 경우, 상수형 참조를 하라고 하셨는데특별히 이렇게 해야하는 이유가 있는걸까요??19분쯤에 등장하는 예제에서 함수의 매개변수를 상수형 참조로 바꿔도 여전히 변환생성자가 불러와지는 걸 봤을 때는 특별히 차이점이 있어보이지 않습니다... 17분 50초 쯤에 등장하는 '비const 참조는 lvalue에만 바인딩할 수 있습니다" 라는 오류가 등장하는데 이 오류가 이해가 되질 않습니다..
-
미해결스프링 핵심 원리 - 고급편
어노테이션 내부에 가지는 값을 표기할 때 ()를 사용하는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 감사하게 잘 수강하고 있습니다!어노테이션 내부에 가지는 값을 표기할 때 다음과 같이int value();선언을 하는데, 어노테이션 내부에 선언할 때int value이렇게 하지 않고 꼭 뒤에 소괄호를 붙여야 하는 이유가 있을까요? 어노테이션 내부에 가지는 값을 선언할 때 지켜야되는 당연한 규칙이라고 알고있는데, 왜 이런 규칙이 있는지 내부 동작원리랑 함께 알고싶습니다!
-
해결됨C개발자를 위한 최소한의 C++
섹션8 3번째 강의 (실습 프로젝트 - 문자열 필터개선) 질문
void CMyStringEx::onSetData(const char*& param) { cout << "CMyStringEx::onSetData" << endl; if (param != nullptr) { if (strcmp(param, "FORBID") == 0) { param = "****"; } } CMyString::onSetData(param); return; }실습 코드 관련 질문입니다파라미터가 const char*& 로 되어있는데 아래 param = "****" (강의 코드기준 param="우리귀요미")처럼 매개변수에 대입을 하는 부분이 있는데 const가 붙어있어도 매개변수 값 수정이 가능한가요?
-
미해결스프링 핵심 원리 - 고급편
프록시가 있어야 어드바이스를 적용할 지 말지를 판단한다는게 무엇인지 잘 모르겠습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 내용을 다시 읊어보면," 이번 예제를 보면 execution(* hello.aop..*(..)) 를 통해 적용 대상을 줄여준 것을 확인할 수 있다. args , @args , @target 은 실제 객체 인스턴스가 생성되고 실행될 때 어드바이스 적용 여부를 확인할 수 있다." 여기까지는 이해했습니다.다음 부분부터 이해가 잘 안되는데,==" 실행 시점에 일어나는 포인트컷 적용 여부도 결국 프록시가 있어야 실행 시점에 판단할 수 있다. " 여기서 실행이라는 것이 애플리케이션의 실행을 말씀하시는 것인가요? 아니면 프록시로 생성된 인스턴스의 메소드 실행을 의미하는 것인가요? == =="프록시가 없다면 판단 자체가 불가능하다. 그런데 스프링 컨테이너가 프록시를 생성하는 시점은 스프링 컨테이너가 만들어지는 애플리케이션 로딩 시점에 적용할 수 있다. " 이 부분도 잘 이해가 가지 않습니다. 스프링 컨테이너가 프록시를 생성하는 시점을 애플리케이션 로딩 시점에 적용할 수 있다는 것이 어떤 의미인가요? 스프링 컨테이너가 프록시를 생성하는 시점과, 애플리케이션 로딩 시점이 같다는 의미일까요? ==== " 따라서 args , @args , @target 같은 포인트컷 지시자가 있으면 스프링은 모든 스프링 빈에 AOP를 적용하려고 시도한다. " 예를들어 @target같은 경우는, 주어진 어노테이션이 붙어있는 클래스의 인스턴스가 스프링 빈으로 등록이 되려고 할 때에만 AOP를 적용하려고 시도하는 것이 아닌가요?
-
미해결스프링 핵심 원리 - 고급편
@Retention(RetentionPolicy.RUNTIME) 질문입니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Retention(RetentionPolicy.RUNTIME)을 붙이게 되면 해당 어노테이션이 애플리케이션 실행될 때 까지 살아있다는 것이 정확히 어떤 의미인지 알고 싶습니다!
-
미해결스프링 핵심 원리 - 고급편
JDK 동적 프록시 질문입니다.
JDK 동적 프록시 - 예제 코드해당 강의 수강 중 궁금한 게 있어 질문드립니다.해당 코드에서method.invoke(target, args); 메서드를 사용하여target의 인터페이스 메서드를 실행하게 되는데 target의 인터페이스에 메서드가 여러 개 존재할 시 어떤 메서드를 호출할지는 어떻게 결정하게 되나요?
-
미해결스프링 핵심 원리 - 고급편
ApplicationContext생성을 명시적으로 하지 않으면
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]지금까지 대부분의 테스트에서는 new ApplicationConfigApplicationContext(Config객체) 를 명시하지 않았는데,이렇게 명시하지 않아도 정상적으로 스프링 컨테이너가 생성이 되고 거기다가 빈 등록도 잘 되는걸로 알고 있습니다!.명시하지 않으면 자동으로 위와 같은 코드를 생성해주는 것인가요?>
-
미해결스프링 핵심 원리 - 고급편
런타임 시점의 정확한 의미는?2개?한개?
1. CGLIB에서 말하는 런타임의 정확한 시점이 궁금한데? 프록시를 생성하고 바이트 코드를 조작하는 그 시점이 런타임 이다 라고 하는게 맞나요? 스프링이 빈을 컨테이너에 등록하기 이전에 프록시를 생성해서 빈으로 등록하는 그 시점을 런타임이라고 하는거죠?2. AOP 적용 방식 3가지 중 마지막 런타임시점에 대해여기서 스프링이 쓰는 AOP도 결국 CGLIB인데 그러면 여기서 말하는 런타임의 정확한 의미도 1번과 동일한 시점을 얘기하는건가요?아니면 실제 객체의 메소드를 호출하는 그 시점을 런타임 이라고 얘기하는건가요? 아니면 둘다인가요?
-
미해결스프링 핵심 원리 - 고급편
위빙
위빙이 AOP 적용을 위해 애스펙트를 객체에 연결한 상태라고 하셨는데객체는 실제 타겟 객체이지요?스프링 AOP 는 런타임시점에, 컨테이너 로딩시점에, 프록시 생성시점에 위빙을 한다라고 하셨는데위빙이란게 결국 아래 코드 부분의 부가기능이 타겟 객체 호출(joinPoint.proceed) 앞뒤로 만들어주는걸(프록시 객체를 생성하는 시점에서 바이트 코드를 조작해서 심어줌)말씀하시는건가요?
-
미해결스프링 핵심 원리 - 고급편
섹션 11 @target, @within 중 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요, AOP에서 사용하는 포인트컷 지시자에서, args, @args, @target은 단독으로 사용하게 된다면 스프링 모든 빈에 대해서 적용을 시도하기 때문에, 에러가 나는 것을 강의에서 확인해주셨는데요.그런데, execution을 사용할 때 모든 메서드에 대해서 적용이 가능하도록 execution(* *(..)) 과 같은 식으로 사용해도 스프링 모든 빈에 대해서 적용을 시도하게 되고, 그러면 동일하게 에러가 발생해야되지 않는지 궁금합니다! (test 초반에 에러 안 나는 것은 봤는데 왜일까요 ㅠㅠ)
-
미해결스프링 핵심 원리 - 고급편
CGLIB 와 클래스 로딩시점의 차이..
동적 프록시로 앞에서 배운 CGLIB도바이트 코드를 조작하는거 아닌가요?그런데 CGLIB도 프록시를 사용하는것이자나요? AOP에서 AspectJ의 클래스로딩시점에 바이트 코드을 조작한다는건 무슨차이인가요? 여기서는 프록시를 사용안하고 바이트 코드만 조작한다는거고cglib는 바이트 코드도 조작하고 프록시도 사용하나요..?그런거라면.. 바이트 코드를 어차피 조작할건데 cglib는 왜 프록시를 사용하나요?ㅠㅠ
-
미해결스프링 핵심 원리 - 고급편
concrete proxy controller에는 requestmapping이 없지 않나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]보니까 ControllerV2에는 @Getmapping으로 인해 url매핑이 잘 되어 있는데, 결국 이 controllerv2가 아닌 concrete proxy controller가 스프링 빈으로 등록이 될 것이고, 클라이언트가 url을 입력해 요청하면 이 구체 프록시 컨트롤러로 요청이 갈텐데, 문제는 여기에 @Getmapping이 없어서 요청을 못받지 않나요>? 아니면 이 concrete proxy controller가 controllerv2를 상속받기때문에, controllerv2의 @Getmapping정보까지 같이 가져가게 되는건가요?
-
미해결스프링 핵심 원리 - 고급편
controller나 service나 repository나 어노테이션 하나 붙이면 자동으로 빈 등록되지 않나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]OrderServiceV1, OrderControllerV1, OrderRepositoryV1, AppV1Config각각@Service@Controller@Repository@Configuration이렇게 각각 어노테이션만으로 스프링 빈 자동 등록이 되는걸로 알고있는데, (혹시나 제가 미처 고려하지 못한 이유가 있다면) 수동등록을 선택하신 이유를 알고 싶습니다!
-
미해결스프링 핵심 원리 - 고급편
도대체 동적 프록시란 ㅠㅠㅠㅠ
스프링이 제공하는 빈 후처리기1 강의를 듣고 있습니다..implementation 'org.springframework.boot:spring-boot-starter-aop 추가하고AnnotationAwareAspectJAutoProxyCreator빈 후처리기가 스프링 빈에 자동등록되는데요 궁금한게..동적 프록시라는게 계속 이해가 안갑니다ㅠㅠ인터페이스 기반이나, 구체클래스 기반이나실제 객체말고, 프록시 객체는 언제?어느 시점에 생성이 되는건가요?스프링 실행하면 처음에 로딩 쫙 할때 그때 프록시 객체가 만들어져서 빈으로 주입되는건가요?로딩할때 만들어지는건데 런타임에 만들어진다고하나요..? api 콜 할때 만들어지는게 아닌거죠?ㅠ왜 도대체 동적이라하나요..?ㅠㅠ동적이라는 의미가 생겨나는 코드는 어디부분인가요..?jdk 동적프록시랑 cglib의 프록시 생성차이점은 뭔가요..jdk는 바이트코드 조작이 아니라 리플렉션으로 프록시 객체를 생성하나요?cglib는 리플렉션이 아니라 컴파일된 바이트 코드를 조작해서 프록시객체를 생성하는건가요..?
-
미해결스프링 핵심 원리 - 고급편
ProxyFactory 는 어떻게 인터페이스와 클래스를 구분하나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 내용에서, 프록시로 만들어질 타겟이 인터페이스를 베이스로 하느냐 클래스를 베이스로 하느냐에 따라, InvocationHandler 를 사용할지, CBLIB를 사용할지 결정한다고 하셨습니다. ProxyFactory는 어떻게 인터페이스 베이스인지 클래스베이스인지 구분하는지 궁금합니다!instanceof 메서드같이 구분해주는 메서드가 존재하는 걸까요?
-
해결됨C개발자를 위한 최소한의 C++
차이점을 잘 모르겠습니다.
주신 프로그램 중 constructSelect.cpp 에서 디폴트 생성자를 지우면 에러가 발생하는데 virtualFunction 에서는 디폴트 생성자가 없어도 동작합니다. constructSelect.cpp 에서 선언 방식이 아닌 new 연산자를 사용해서 해봐도 에러가 발생하고객체 내에 멤버메서드가 없어서 그런가 해서 멤버를 만들어도 에러가 발생합니다VirtualFunction 내의 소멸자의 virtual 을 제거해도 이건 잘 작동합니다.눈으로 봐서는 도저히 차이점을 모르겠습니다.