묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 고급편
수동으로 빈 등록하는 부분에서 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Slf4j @Configuration @Import({AppV1Config.class, AppV2Config.class}) public class BeanPostProcessorConfig { @Bean public PackageLogTracePostProcessor logTracePostProcessor(LogTrace logTrace) { return new PackageLogTracePostProcessor("hello.proxy.app", getAdvisor(logTrace)); } private Advisor getAdvisor(LogTrace logTrace) { //pointcut NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut(); pointcut.setMappedNames("request*", "order*", "save*"); //advice LogTraceAdvice advice = new LogTraceAdvice(logTrace); return new DefaultPointcutAdvisor(pointcut, advice); }위와 같이 코드를 작성하셨을 때, @Import 코드가 잘 이해가 안됩니다 "AppV1Config와 AppV2Config는 수동으로 스프링 빈으로 등록해야 동작한다" 근데 AppV1Config와AppV2Config 코드를 보면 아래와 같습니다.근데 @Configuration이 붙은 클래스는 컴포넌트 스캔의 대상이 되고, 필드에 있는 @Bean이 붙은 메소드의 반환 값은 빈으로 자동 등록된다라고 이해를 하고있었습니다. 근데, 강사님께서 말씀하신 "@Import로 수동으로 빈으로 등록한다"라는 부분이 잘 이해가 안됩니다. 설명 부탁드립니다 ! @Configuration public class AppV1Config { @Bean public OrderControllerV1 orderControllerV1() { return new OrderControllerV1Impl(orderServiceV1()); } @Bean public OrderServiceV1 orderServiceV1() { return new OrderServiceV1Impl(orderRepositoryV1()); } @Bean public OrderRepositoryV1 orderRepositoryV1() { return new OrderRepositoryV1Impl(); }@Configuration public class AppV2Config { @Bean public OrderControllerV2 orderControllerV2() { return new OrderControllerV2(orderServiceV2()); } @Bean public OrderServiceV2 orderServiceV2() { return new OrderServiceV2(orderRepositoryV2()); } @Bean public OrderRepositoryV2 orderRepositoryV2() { return new OrderRepositoryV2(); }여기에 질문 내용을 남겨주세요.
-
미해결스프링 핵심 원리 - 고급편
AspectJ 동작원리 궁금
@Aspect public class A{ @Before("B.methodB()호출하기전에 적용") public Object lock(final ProceedingJoinPoint joinPoint) throws Throwable { } } public class B{ private void methodB(){ } }이런식으로 작성할 경우, 당연히 Before은 ProceedingJoinPoint를 사용할 수 없기때문에 lock이 호출이 안될겁니다.그런데 왜 안되는지 궁금해서 한번 실행시켜봤는데,스프링 실행 자체는 되나, 아무런 예외없이 정상적으로 lock함수를 호출하지 않더라고요그래서 호출스택을 따라가보았더니, 아예 호출 자체를 안하는것을 확인 할 수 있었습니다.그렇다면 왜그럴까 추측을 해보자면 아예 methodB에 프록시로 lock()을 등록하지 않은것일텐데(맞나요..?)어디서 이와 관련된 처리를 하는지 찾다가 포기하고 질문을 올립니다.AspectJProxyFactory에서 lock()을 advisor로 만드는것 까진 확인했으나, 이것을 어디서 활용하는지 모르겠네요 ㅠ어떤 클래스를 보면 알수있다 정도로도 좋으니 혹시 아시는게 있다면 알려주시면 감사드리겟습니다.
-
미해결스프링 핵심 원리 - 고급편
필터와 인터셉터에서 스레드 로컬 clear
안녕하세요 강의 끝부분에서 스프링 필터나 인터셉터에서 스레드 로컬 값들 클리어해주는게 베스트인 뉘앙스로 얘기해주셨는데요.(혹은 원칙대로 최소 remove() 호출해주거나요) remove() 호출을 생각할 때, 보관된 값 제거는 스레드 로컬이 적용된 특정 인스턴스 필드값을 알아야 가능해보입니다.e.g. traceIdHolder.remove()필터 및 인터셉터에서는 이 인스턴스 변수를 알 수 없을 것 같은데, 어떻게 스레드 로컬에 보관된 값을 제거할 수 있을까요?머릿속에 잘 그려지지 않아서 질문 드립니다.
-
해결됨스프링 핵심 원리 - 고급편
logTrace를 파라미터로 받는 이유 ?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.InterfaceProxyConfig에서 logtrace를 파라미터로 받아오는 특별한 이유가 있을까요 ? logtrace를 이런식으로 생성자 주입으로 받아서 사용한다면 문제가 생길까요 ? 정상작동은 하는데 궁금합니다. @RequiredArgsConstructor @Configuration public class InterfaceProxyConfig { private final LogTrace logTrace; @Bean public OrderControllerV1 orderController(){ OrderControllerV1Impl controllerImpl = new OrderControllerV1Impl(orderService()); return new OrderControllerInterfaceProxy(controllerImpl,logTrace); } @Bean public OrderServiceV1 orderService(){ OrderServiceV1Impl serviceImpl = new OrderServiceV1Impl(orderRepository()); return new OrderServiceInterfaceProxy(serviceImpl,logTrace); } @Bean public OrderRepositoryV1 orderRepository(){ OrderRepositoryV1Impl repositoryImpl = new OrderRepositoryV1Impl(); return new OrderRepositoryInterfaceProxy(repositoryImpl,logTrace); } }
-
해결됨스프링 핵심 원리 - 고급편
ProxyApplication 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.LogTrace를 @Bean등록할때 ProxyApplication 쪽에 등록한 특별한 이유는 없는건가요 ? 그냥 InterfaceProxyConfig안에 등록해도 상관은 없는거죠 ? @Configuration public class InterfaceProxyConfig { @Bean public OrderControllerV1 orderController(LogTrace logTrace){ OrderControllerV1Impl controllerImpl = new OrderControllerV1Impl(orderService(logTrace)); return new OrderControllerInterfaceProxy(controllerImpl,logTrace); } @Bean public OrderServiceV1 orderService(LogTrace logTrace){ OrderServiceV1Impl serviceImpl = new OrderServiceV1Impl(orderRepository(logTrace)); return new OrderServiceInterfaceProxy(serviceImpl,logTrace); } @Bean public OrderRepositoryV1 orderRepository(LogTrace logTrace){ OrderRepositoryV1Impl repositoryImpl = new OrderRepositoryV1Impl(); return new OrderRepositoryInterfaceProxy(repositoryImpl,logTrace); } @Bean public LogTrace logTrace(){ return new ThreadLocalLogTrace(); }이런식으로요. 생각해보면 logtrace는 proxyconfig쪽이랑은 크게 연관성이 없는거같긴한데 궁금해서요 ..
-
해결됨스프링 핵심 원리 - 고급편
데코레이터 패턴에서 Component 코드 질문 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.아래와 같은 코드에서 MessageDecorator 클래스는 Component 인터페이스를 구현하면서 operation 메서드를 구체화한 것은 이해를 했습니다.근데 데코레이터 패턴에서 MessageDecorator 클래스가 Component 클래스를 구현하면서 Component 클래스를 필드로 갖는 이유가 무엇인지 잘 이해가 안됩니다 설명 부탁드립니다 package springHigh.advanced.pureproxy.decorator.code; import lombok.extern.slf4j.Slf4j; @Slf4j public class MessageDecorator implements Component{ private Component component; public MessageDecorator(Component component) { this.component = component; } @Override public String operation() { log.info("MessageDecorator 실행"); // data => *** data **** String result = component.operation(); String decoResult = "******" + result+"*******"; log.info("MessageDecorator 적용"); return decoResult; } }
-
해결됨스프링 핵심 원리 - 고급편
스프링 빈으로 수동으로 등록이 안됩니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 위와같이 설정했을 때, http://localhost:8080/v1/request-proxy?itemId=hello로 접근했는데 올바르게 컨트롤러가 인식이 안되는데 원인이 무엇인가요?
-
미해결스프링 핵심 원리 - 고급편
예외 처리 부분 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]항상 강의 잘 보고 있습니다. 감사합니다.강사님 자료 중에 "throw e: 예외를 꼭 다시 던져주어야 한다. 그렇지 않으면 여기서 예외를 먹어버리고, 이후에 정상 흐름으로 동 작한다. 로그는 애플리케이션에 흐름에 영향을 주면 안된다. 로그 때문에 예외가 사라지면 안된다"라는 문장에서예외를 다시 던져준다와 예외를 먹어버린다 등의 표현이 잘 이해가 안되는데 설명 부탁드립니다. 감사합니다
-
미해결스프링 핵심 원리 - 고급편
실무에서 어떻게 모니터링을 하는지 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]항상 훌륭한 강의 잘 보고 있습니다.다름이 아니라, 강사님께서 "모니터링 툴을 도입하면 많은 부분이 해결되지만, 해결하지 못하는 부분도 있다"라고 말씀하셨습니다.그러면 실무에서는 모니터링 툴 + 스프링을 활용하는건가요?아니면 모니터링 툴만 사용하는건가요? 실무에서 스프링을 활용한 로그 추적이 어떻게 사용되는지 궁금합니다!
-
미해결스프링 핵심 원리 - 고급편
로그구분을 위한 traceId에 질문이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]제가 생각한 로그는 사용자 별로 어떤 행위를 하였는지 추적하기위해서 로그를 사용하는걸로 알고 있었습니다.현재 강의에서 설명해주신 로그는 사용자를 특정하지 않고 요청에대한 로그만 uuid로 구분하여서 어떤 행위를 하였고 어떤 예외가 발생하였는지 파악하기 위한 로그인거 같습니다. 만약 사용자의 행위를 추적하기 위한 로그를 남기려면 traceId를 uuid가 아닌 사용자의 ip나 pk를 id로 사용하여 로그를 남기게 하면 되는건가요? 그리고 로그는 따로 보관하여 관리해야 할거 같은데 그럴때는 데이터베이스를 사용하나요 아니면 파일입력을 통해 디렉터리에 보관하나요?
-
해결됨C개발자를 위한 최소한의 C++
쓸데없지만 질문드리고싶습니다
안녕하세요. 항상 양질의 강의 감사합니다.link 오류시, 컴파일러가 맹글링 해놓은 함수의 진짜 이름이 출력되고, 이러한 오류를 dll 을 사용함에 있어서 자주 볼 수 있다고 말씀하셨는데 리눅스에서 라이브러리든 실행파일이든 용량을 조금이나마 줄이기위해 stip??? 명령어를 사용해 디버깅 심볼을 없앨 수 있었던 것으로 기억합니다.근데, 디버깅 심볼에는 변수, 함수이름, 소스코드 줄 번호등 다양한 정보가 들어가 있다고 배웠었는데, 해당 명령어로 디버깅 심볼을 없애버린 라이브러리 파일을 사용하여 만든 소스파일을 빌드하는 경우에서, 링크 오류가 나게되면 어떠한 현상이 이뤄지는지 궁금합니다
-
미해결코딩으로 학습하는 GoF의 디자인 패턴
혹시 다음강의는 언제쯤..
이펙티브시리즈2탄까지나왔었죠?한1년기다린거같은데 아직 안나와서 한번 질문을 여기서..
-
미해결스프링 핵심 원리 - 고급편
Spring bean 등록방법
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용][필드 동기화 - 적용]부분에서 FieldLogTrace를 @Configuration 을 이용해서 spring bean에 등록한 이유가 있을까요?@Component로 등록해도 충분했을것같은데다른의도가 있을까 궁금합니다.
-
해결됨C개발자를 위한 최소한의 C++
복사 생성자 질문 드립니다.
21분37초의 코드와 결과를 보면 testFunc(10)에서 반환한 인스턴스가 블록을 벗어남과 동시에 소멸을 하게 되어서 ~TestData(10)이 먼저 나와야 할 것 같은데 결과는 ~TestData(100)이 먼저 프린트 되고 있습니다. 강의 중간 부분까지는 강사님이 "객체는 블록을 벗어나면서 소멸되고, 복사 생성자가 호출이 되어서..." 이런 방법으로 설명해주시다가 21분 37초의 코드는 결과만 보여주고 넘어가셔서. 정확히 어떤것 때문에 저런 결과가 나왔는지 궁금합니다!
-
미해결스프링 핵심 원리 - 고급편
private 프록시
[질문 내용]private가 aop에 적용되지 않는다 함은 생성되는 프록시 객체에 해당 메서드가 생성되지 않기 때문에 프록시 객체에서 실제 객체의 메서드를 호출하는 방법이 없는건가요 ?
-
해결됨C개발자를 위한 최소한의 C++
생성자 궁금한거 있습니다
#include <iostream>using namespace std;class MyClass {public:MyClass(int a) : m(a) {cout << "base" << endl;}MyClass(const MyClass& rhs) : m(rhs.m) {cout << "copy" << endl;}~MyClass() {cout << "delete:" << m << endl;}void print() {std::cout << m << std::endl;}private:int m;};MyClass test(MyClass rhs){return rhs;}int main() {MyClass a = 10;MyClass b = MyClass(50);MyClass c = a;return 0;}결과로 base, base, copy, delete: 10, delete: 50, delete: 10이 출력됐습니다.[질문]MyClass a = 10;MyClass b = MyClass(50);이 둘의 차이가 무엇인가요? 특히 MyClass b = MyClass(50);의 base만 출력은 이해가 되지 않습니다.일단 임시객체를 만들었으니 base, 그리고 임시객체를 const MyClass& rhs의 인자로 넘겨줘서 copy, 그리고 다음줄로 넘어가면 쓸모없어진 임시객체 MyClass(50)이 삭제되서 delete 이렇게 3개가 출력될줄 알았는데 base만 출력돼서 이해가 되지 않습니다.. (이 부분은 찾아보니까 복사 엘리전이라고 하는데 맞나요?? 그래서 복사 생성자를 안쓴다는데 헷갈리네요 ㅠㅠ)그리고MyClass b = MyClass(50);MyClass c = a; 이 둘의 차이도 알고싶습니다.b,c 둘다 객체를 인자로 받고있습니다. 근데 b는 base를 출력하고 c는 copy를 출력합니다. 왜 b가 base를 출력하나요? 이와같은 복잡함을 덜기위해 explicit를 사용하는건가요?
-
해결됨[유니티 게임 개발] 핵심 기술과 디자인 패턴
override, virtual 변수는 어떻게 하나요?
상속 강의에서 'override - 자식 클래스에서 부모 클래스의 virtual로 정의된 함수 혹은 변수를 변경을 진행하기 위해서 사용'라고 적혀 있던데요. 강의에선 함수만 예로 보여주고 변수는 안보여줘서 찾아보니까 잘 안나오네요.override, virtual 키워드로 검색하면 함수 내용만 나와요. 변수 예도 알려주시면 감사하겠습니다.
-
해결됨스프링 핵심 원리 - 고급편
createNextId()시 새로운 객체를 반환하는 이유가 있나요?
public TraceStatus beginSync(TraceId beforeTraceId, String message) { TraceId nextId = beforeTraceId.createNextId(); Long startTimeMs = System.currentTimeMillis(); log.info("[{}] {}{}", nextId.getId(), addSpace(START_PREFIX, nextId.getLevel()), message); return new TraceStatus(nextId, startTimeMs, message); }위 코드를 아래와 같이 사용하면 어떤 단점이 있나요?public TraceStatus beginSync(TraceId traceId, String message) { traceId.increaseId(); Long startTimeMs = System.currentTimeMillis(); log.info("[{}] {}{}", traceId.getId(), addSpace(START_PREFIX, traceId.getLevel()), message); return new TraceStatus(traceId, startTimeMs, message); }객체를 새로 만들어서 반환하지 않고 id만 증가시켜서 그대로 사용하는 것은 지양되어야 하나요?
-
해결됨[유니티 게임 개발] 핵심 기술과 디자인 패턴
CSV 강의 스크립트 파일
스크립트 파일은 어디서 받을 수 있을까요?
-
해결됨[유니티 게임 개발] 핵심 기술과 디자인 패턴
[3분 17초] 2차원 배열 구조 그림 예시
행과 열을 반대로 그리신 것 같아요.