묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 고급편
런타임 시점의 정확한 의미는?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 을 제거해도 이건 잘 작동합니다.눈으로 봐서는 도저히 차이점을 모르겠습니다.
-
해결됨C개발자를 위한 최소한의 C++
이동생성자 관련
안녕하세요. 선생님 이동 생성자 강의 내용 중 질문이 있습니다. (아래 코드 참고) delete pnData를 하면, 포인터 변수가 해제되어pnData = rhs.pnData;를 실행할 수 없는 것이 아닌지 궁금합니다. 실재로는 포인터 값은 그대로고, 가리키는 값(int 0)만 삭제되는 것인가요? 포인터 값은 놔두고 가리키는 값만 없애는 문법은 어떻게 되나요? delete를 안하고, pnData = nullptr; 로만 수정해도 됬을 것 같습니다. class TestData { public: TestData(){ pnData = new int(0); } ... TestData(TestData&& rhs) noexcept{ delete pnData; pnData = rhs.pnData; rhs.pnData = nullptr; } ... TestData& operator=(TestData&& rhs) noexcept{ delete pnData; pnData = rhs.pnData; rhs.pnData = nullptr; } }
-
미해결스프링 핵심 원리 - 고급편
쓰레드로컬이 제공하는 별도의 저장소와 싱글톤의 관계
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요, 쓰레드 로컬이 가지는 별도의 보관소 개념이 정확하게 이해가 되지 않아 질문을 남깁니다. 1. 쓰레드 로컬이 만드는 별도의 전용 보관소라는 것은 하나의 객체를 생성하여 그곳에 정보값을 저장해 두었다가 해당 쓰레드가 싱글톤으로된 객체의 정보값을 호출할 때마다 참고하게 되는 것인지, 아니면 다른 방식으로 설계된 것인지 궁금합니다. 2. 결국 특정 쓰레드마다 별도의 저장소를 통해 정보값을 보관하게 한다면, 그리고 그 보관하는 것이 객체를 생성하는 방식이라면, 동시성 문제를 발생시키는 싱글톤 대신 프로토타입을 사용하면 되는 것이 아닌가 생각이 드는데 프로토타입이 아닌 쓰레드 로컬로 해결해야하는 이유가 무엇인지 궁금합니다.
-
미해결스프링 핵심 원리 - 고급편
동적 프록시 질문 (jdk 동적 프록시 - 인터페이스가 있지만, 인터페이스에 없는 메서드)
안녕하세요, 동적 프록시 강의 듣는 중에 질문 드립니다 (~섹션 6수강 중)jdk 동적 프록시의 경우, 인터페이스가 있는 경우에만 사용할 수 있는 것으로 배웠는데요.구현 클래스에 인터페이스에 포함되지 않은 메서드가 추가로 구현되어 있다면, 해당 메서드에는 프록시를 통한 호출이 불가능한데요. 그래서 프록시를 원하는 target에 대해서 전부 proxy가 적용될 수 없다면, 인터페이스 유무에 관계없이, cglib을 사용하는 것이 좋지 않을까 의문이 들었습니다.질문을 요약하자면,1. 구현 클래스의 모든 메서드를 지원하지 못할 가능성이 있음에도 jdk 동적 프록시 기술을 사용하는 이유가 궁금합니다.2. (중복 같지만..) cglib을 사용하는 것이 jdk 동적 프록시에 비해 단점이 있어서, 1번 질문의 단점에도 불구하고 사용되는 걸까요?감사합니다
-
미해결스프링 핵심 원리 - 고급편
로그
[질문 내용]스프링 3.2대 사용중입니다.다름이 아니라 강의를 보고 따라하던 중 로그가 강의처럼 찍히지 않고 request만 찍히는 걸 발견했습니다.스프링 버전 차이인가요 ? 아니면 제가 뭘 놓치고 있는 걸 까요 ?
-
미해결스프링 핵심 원리 - 고급편
component 중복초기화 부분 추상클래스로 변경2
이렇게 구조를 바꾸었습니다이러면 프록시 체인이 되어서 잘 실행되던데 문제없는거겠죠?테스크 코드도 프록시 체인으로 똑같이 했습니다
-
미해결스프링 핵심 원리 - 고급편
쓰레드 로컬 vs 프로토타입 빈
결국 traceID가 서로 다른 쓰레드에서 같은 값을 가지게 되니쓰레드로컬을 이용해서 따로 traceId를 관리 하는거잖아요?그런데 그냥 애초에 Trace클래스 자체의 빈스코프를 프로토타입으로 해버리면각각의 쓰레드가 Trace클래스를 DI받을때마다 쓰레드마다 다른 Trace클래스가 생성되니따로 관리를 할 필요가 없지 않나요?이렇게되면 어떠한 오버헤드가 발생하나요?
-
미해결스프링 핵심 원리 - 고급편
쓰레드 로컬 데이터 저장위치 질문
ThreadLocalLogTrace는 싱글톤이잖아요?그러므로 A와 B에서 참고하는 ThreadLocalLogTrace 참조값은 같은 값을 가리킬꺼같은데,여기서 ThreadLocal<TraceId> 필드는각 A쓰레드 B쓰레드 각각의 공유하지 않는고유의 데이터영역에 저장되는것인가요?(JVM에서 STACK과 PC Register처럼)아니면 일종의 해시함수처럼 작용하여A쓰레드에서의 요청이면 알아서 A의 데이터B쓰레드에서의 요청이면 알아서 B의 데이터를 주는것인가요?만약 전자라면 이게 어떻게 가능한것인지?
-
해결됨스프링 핵심 원리 - 고급편
var 사용에 관한 김영한 선생님의 생각이 몹시 궁금합니다
[질문 내용]안녕하세요 스프링부트 프로젝트를 진행중입니다. 김영한님께서는 var를 자주 쓰는 편인지 궁금합니다. 사실 저는 매우 코드 리뷰할 때 불편하다고 생각하는데 회사에서는 어떤가요? 물론 Intellij 에서 setting 변경을 해주면 옆에 hint로 나오긴 하지만 기업에서는 이런 걸 허용하는지 궁금합니다 감사합니다
-
해결됨C개발자를 위한 최소한의 C++
new/ delete 질문
포인터 new 시, 주소값과 가리키는 Data 메모리도 동시 할당되나요?포인터 delete 시, 주소값과 가리키는 Data 도 메모리도 해제? 혹은 주소값만 해제되나요?
-
미해결스프링 핵심 원리 - 고급편
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; }