묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 고급편
ContextV1 은 템플릿 콜백 패턴이 아닌가요?
ContextV2는 템플릿 콜백 패턴이라고 하셨는데ContextV1 은 템플릿 콜백 패턴이 아닌가요?
-
미해결스프링 핵심 원리 - 고급편
aop에서 DB 접근?
안녕하세요 영한님 강의를 토대로 개인프로젝트를 진행하다가 생긴 의문점입니다스프링 시큐리티의 @Preauthorize를 공부하다가 생긴 의문인데, 만일 여러 컨트롤러의 메서드에서 단순히 User의 ROLE_XXX 뿐만이 아니라, 현재 유저에게 이 리소스를 사용할 자격이 있는지? 를 검사하는 공통된 로직이 필요하다면 (리소스 단순 CRUD 뿐만이 아니라 더 세부적인 로직들이 있다면), 여기에 aop를 적용하는 의의가 있을까요?만일 의의가 있다면, 권한이 있는지를 알려면 DB에 다녀와야 하는데 AOP에서 데이터소스에 접근하는별로 좋은 방법이 아니라고 들었습니다.간단한 예시긴 하지만, 대충 이런 로직을 구현하려고 합니다@CheckOwner어노테이션이 붙어있고, postId를 인자로 받은 경우에선 post.Member.id가 현재 세션의 memberId와 같은 경우에만 이후 로직이 진행되게 하려는 의도입니다.@Around("@annotation(CheckOwner) && args(postId,..)") public Object checkPostOwner(ProceedingJoinPoint joinPoint, Long postId) throws Throwable { log.info("test"); //DefaultTransactionDefinition def = new DefaultTransactionDefinition(); //TransactionStatus status = tr.getTransaction(def) MockPrincipal principal = (MockPrincipal)SecurityContextHolder.getContext() .getAuthentication() .getPrincipal(); Post post = postRepository.findById(postId).orElseThrow(NoPostException::new); if (!post.getMember().getId().equals(principal.getId())) { throw new AccessDeniedException("권한이 없다고"); } Object result = joinPoint.proceed(); log.info("test"); //tr.commit(status); return result; }
-
해결됨C개발자를 위한 최소한의 C++
반환유형이 클래스형 참조
안녕하세요 강사님, 반환 유형이 클래스 참조일 때 질문이 있습니다.반환유형이 클래스형인 것보다는 메모리 효율을 위해서 클래스형 참조로 선언을 하는데, 반환하는 참조가 함수 내부에서 생성된 지역 인스턴스의 참조라면 함수 스코프를 벗어나면 해당 인스턴스는 소멸되므로 main함수에서는 참조를 못하게 되는 것 아닌가요?이런 경우에는 반환 유형을 클래스형 참조가 아닌 클래스형으로 선언하는게 적절할까요? 감사합니다!
-
해결됨C개발자를 위한 최소한의 C++
강사님 질문 드립니다.
만약 함수내에서 func(ClassA a) { // 여기서 a 는 클래스임 } 과 같이 작성하면 ClassA 의 생성자는 호출되지 않지만 소멸자는 호출됩니다.그 이유를 알고 싶습니다.
-
미해결스프링 핵심 원리 - 고급편
동기화와 동시성 차이
동시에 traceId의 공유변수에 접근하니까 문제가 생겨서그걸 동시성 문제라고 하는데동기화에 문제가 있다는건 무슨말일까요?
-
해결됨C개발자를 위한 최소한의 C++
virtual 함수와 관련하여 질문 있습니다.
만약 기본 메서드로 virtual a() 를 정의한 후 첫번째 파생 클래스에서는 a() 로 정의를 하였습니다.마지막 파생 클래스에서도 a() 로 정의했다면 어떻게 동작하는지 궁금해서 여쭤 봅니다. 제 생각에는 기본하고 첫번째 파생 사이에는 virtual 처럼 즉 기본을 호출해도 파생이 호출될 거 같은데두번째 파생시에는 virtual 의 성격이 사라질 거 같습니다. 확인 부탁드립니다. 강사님
-
해결됨C개발자를 위한 최소한의 C++
생성자와 소멸자의 호출
04_Constructor 테스트 중에 질문 드립니다.Test test01; 과 같이 선언하면 생성자와 소멸자가 모두 호출되는데Test test02 = new Test(); 와 같이 호출하게 되면 소멸자는 호출되지 않습니다. 그 이유가 뭔지 궁금합니다.친절한 강의 감사드립니다.
-
미해결스프링 핵심 원리 - 고급편
멋지지 않나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]우리의 멘토꽤 멋지심
-
미해결스프링 핵심 원리 - 고급편
질문은 아니고 후기는 강의를 다듣고 남길려고 하는데
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)영한님의 강의력에 정말 감탄이 나오는군요 한마리의 백조같은 유려하고 우아한 설명이에요
-
해결됨C개발자를 위한 최소한의 C++
강사님 질문 드립니다.
opArithmetic 교육시에 "=" 오퍼레이터의 반환자를 *this 로 하지 않으면 문제가 생길거라 하셨는데 구체적인 문제 설명이 없으셔서 궁금합니다.
-
미해결스프링 핵심 원리 - 고급편
콜백 패턴 반환 타입 T가 두번 쓰이는 이유
public class TraceTemplate { private final LogTrace trace; public TraceTemplate(LogTrace trace) { this.trace = trace; } public <T> T excute(String message, TraceCallBack<T> callback){ TraceStatus status = null; try { status = trace.begin(message); //로직 호출 T result = callback.call(); trace.end(status); return result; } catch (Exception e) { trace.exception(status, e); throw e; } } } 위 콜백 템플릿 에서 메서드 반환이 T 제네릭인건 이해가 되는데왜 반환이 T가 2번 쓰이는걸까요?
-
해결됨C개발자를 위한 최소한의 C++
강사님 질문 드립니다.
임시객체와 보이지않는 복사생성 과정 프로그램에서- 제가 임의로 복사생성자 부분의 프로그램을TestData(const TestData& rhs){ cout << "TestData(const TestData&)" << endl;}- 위와 같이 수정하고- F11키로 디버깅 추적을 해보면 복사생성자가분명 위의 생성자에서는 nData 를 접근하는 명령이 없는데도 아래 부분에 있는private 😀int nData = 0;부분을 수행합니다.왜 그런지 질문 드립니다. 아울러 제가 초기화 부분 "= 0" 를 없애 버리면 수행되지 않습니다.
-
해결됨C개발자를 위한 최소한의 C++
R-value 참조에 대해서 질문이 있습니다.
r-value 참조에 대해서 질문이 있습니다. (02-rvalueRef 예제 강의 기준 r-value 참조 (임시 객체와 유효범위) 8분)코드를 포인터를 볼 수 있게 조금 수정했습니다.int testFunc(int param){ int result = param * 2; std::cout << &result << std::endl; return result;}int&& result = testFunc(10); std::cout << result << "pointer: " << &result << std::endl;임시 객체의 주소를 지우지 않고 가져다 쓰는것이라 하셔서 testFunc 함수의 return 하는 result 의 포인터를 확인 후 받는 result의 포인터가 같은지를 확인해 보았습니다. print된 2개의 result의 포인터 값이 다른 것을 확인했습니다. 혹시 임시 객체라는 것이 함수의 return result 값을 또 다른 포인터로 옮긴 뒤 받기 때문에 return result와 다르게 되는건가요?
-
미해결스프링 핵심 원리 - 고급편
ThreadLocal 관련 질문입니다.
traceId = traceId.createPreviousId(); // traceIdHolder.set(traceId.createPreviousId());두 코드의 결과에는 큰 차이가 없는 것 같은데, 굳이 traceIdHolder.set 을 사용해야 하는 이유가 있을까요??
-
미해결스프링 핵심 원리 - 고급편
Logtrace를 main함수에 등록하는 이유가 무엇인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]ProxyApplication 메인함수에 @bean을 사용해 @Bean public LogTrace logTrace(){ return new ThreadLocalLogTrace(); } 이런식으로 logTrace를 등록해주는데, InterfaceProxyConfig가 아니라 main함수에 따로 등록해주는 이유가 무엇인가요?
-
해결됨스프링 핵심 원리 - 고급편
콘크리트프록시를 구현시 원본 구체를 파라메터로 받는이유
콘크리드프록시를 생성 할 때 기존 구체를 상속을 받고 오버라이딩 할 때 아래 예시와 같이 부모 메소드를 super를 통해서 호출이 가능한데요public class OrderControllerConcreteProxy extends OrderControllerV2 { private final LogTrace logTrace; public OrderControllerConcreteProxy(OrderServiceV2 orderService, LogTrace logTrace) { super(orderService); this.logTrace = logTrace; } @Override public String request(String itemId) { TraceStatus status = null; try { status = logTrace.begin("OrderController.request()"); //target 호출 String result = super.request(itemId); logTrace.end(status); return result; } catch (Exception e) { logTrace.exception(status, e); throw e; } } @Override public String noLog() { return super.noLog(); } }이렇게 super를 통해서 호출하지 않고 OrderControllerV2를 따로 new 해서 멤버 변수로 받고 그 원본 구현체를 호출하는 이유가 있을까요?
-
미해결스프링 핵심 원리 - 고급편
execution 강의 듣다가 execution와 관련된건 아니지만 궁금증이 생겨 문의남깁니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요execution 강의 듣다가 execution와 관련된건 아니지만 궁금증이 생겨 문의남깁니다.AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();강의에서는 pointcut을 위 코드와 같이 전역으로 선언하고 사용하고 있더라구요. pointcut을 전역으로 선언 후 테스트에서 사용하는데 beforeEach에서 초기화를 하지 않으면 다른 테스트에 영향이 갈 수 있지 않나? 생각이 들어서 , 한 번에 모든 테스트를 실행시켜 debug point를 찍으며 확인해봤는데요. 그런데 자동으로 테스트마다 pointcut이 초기화 되더라구요 이유가 있을까요??
-
미해결스프링 핵심 원리 - 고급편
스레드 / traceId 구분
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]스프링부트 자체에서 찍어주는 log를 보면 스레드ID로 이미 충분히 구분이 되고 있는데, 선생님께서 진행해주시는 강의에서는 traceId를 추가해서 개발자가 직접 구분을 또 해주는 이유가 뭔지 알 수 있을까요?
-
해결됨스프링 핵심 원리 - 고급편
템플릿 콜백 패턴 V5 실행 관련 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.v5 코드를 작성했을 때, 아래와 같은 에러가 발생해서Description: Parameter 0 of constructor in hello.advanced.app.v5.OrderRepositoryV5 required a bean of type 'hello.advanced.trace.callback.TraceTemplate' that could not be found. Action: Consider defining a bean of type 'hello.advanced.trace.callback.TraceTemplate' in your configuration. Process finished with exit code 1TraceTemplate 클래스에 @Component 애노테이션을 추가했는데요.@Component @RequiredArgsConstructor public class TraceTemplate { private final LogTrace trace; public <T> T execute(String message, TraceCallback<T> callback) { TraceStatus status = null; try { status = trace.begin(message); T result = callback.call(); //로직 호출 trace.end(status); return result; } catch (Exception e) { trace.exception(status, e); throw e; } } }pdf에는 빈 등록과 관련된 부분이 없는 것 같은데, 빈 등록을 하지 않아도 실행이 되어야 하는 것인가요?스프링 부트 3.1.7 버전 사용하고 있습니다.감사합니다.
-
해결됨C개발자를 위한 최소한의 C++
예외 클래스에서 catch 안의 데이터형이 참조자인 이유
안녕하세요. 강의 잘 보고 있습니다.강의를 듣다가 궁금한 것이 생겨서 질문 드립니다. catch(MyException &exp) { // 생략 }이 강의 예제에서 catch의 예외 데이터형에 클래스 참조자를 받도록 하였는데 만약 아래처럼 참조자를 사용하지 않으면 복사생성이 되나요?catch(MyException exp) { // 생략 }