안녕하세요. 항상 좋은 답변 주셔 감사합니다. Proxy Mode 객체 관련 문의드릴 것이 있어 질문글을 적습니다. 영한님께서 강의 중에 Proxy Mode 객체는 계속 생성이 되니, 싱글톤 스코프처럼 사용 시 문제가 발생할 수 있으니 주의를 해야한다고 말씀을 해주셨는데... 조금 헷갈려서.. 관련해서 질문드리고 싶습니다. 1. Proxy Mode를 사용했을 때, CGLIB를 활용한 빈 객체는 스프링 컨테이너가 생성될 때 최초로 단 한 번만 생성된다. 프록시 객체가 호출되면, 호출될 때 마다 진짜 객체를 만든다. 위의 내용처럼 이해를 하는 것이 맞을까요? 그리고 싱글톤 스코프처럼 사용 시 문제가 발생할 수 있다는 것은 프록시 객체는 단 한번 생성되나, 진짜 객체는 매번 생성되고 소멸되니 그것에 대한 COST가 비싸다는 것으로 이해를 하면 될까요? 2. 이 강의해서 사용된 REQUEST 스코프의 동작 방식이 궁금합니다. 사용된 코드 동작방식을 보면 HTTP REQUEST가 들어오면 REQUEST SCOPE 객체를 만들고 나갈 때까지객체를 유지하고, 나간다면 다음으로 들어온 HTTP REQUEST를 입력받아서 동작하는 것처럼 보입니다. 즉, 항상 HTTP REQUEST SCOPE 객체는 스프링 컨테이너에 하나만 존재하는 것처럼 보입니다. 그런데 예를 들어 정말 동시에 HTTP REQUEST가 들어오면, 어떻게 동작하는지 알 수 있을까요? 동시에 들어오면 HTTP REQUEST SCOPE 빈이 스프링 컨테이너에 다수 개가 생성될 것 같아서... 기존에 컨트롤러와 서비스가 동작하던 것처럼 동작하지 않을 것 같습니다. 항상 좋은 답변 달아주셔서 감사합니다.
테스트를 해 보니 전체 공통 레이아웃을 만들어서 사용을 할 때 layoutFile.html 파일에서 title, content를 넘기고 받는 페이지에서 <title>, <content> 테그를 사용해서 레이아웃을 페이지별로 랜더링을 하는데.. 만약 받는 파일에서 section 으로 받아서 적용을 시킬 때 받는쪽 html 에서 section이 여러개 있을 경우에는 section을 사용하는 여러 테그영역 모두가 바뀌어 버리는데 여러개의 section을 사용을 할 경우에는 특정 section중 원하는 section을 선택해서 적용을 할 수 있는 방법이 있을까요??? 그리고 사용할 수 있는 테그는 html에 있는 테그들만 사용을 할 수 있나요?? 아니면 <breadcrumb></breadcrumb> 이런식으로 임의로 만들어서 사용을 할 수도 있는건가요?? 만약 임의로 만들어서 사용을 한다면 html표준에 맞지 않는데.. 전체 레이아웃을 유지한 상태에서 군데군데 바꿔야 하는 부분이 여러군데이고, 겹치는 테그들이 있을 경우에는 어떤식으로 사용을 하는것이 가장 좋을까요?
안녕하세요, 항상 강의 잘 보고 있습니다. 강의 복습하던 도중, 도무지 동작이 이해가 안되는 부분이 있어 문의드리고자 글을 적습니다. static class DiscountService { private final Map<String , DiscountPolicy> discountPolicyMap ; private final List<DiscountPolicy> discountPolicyList ; // AutoWired 를 활용한 주입 . public DiscountService (Map<String , DiscountPolicy> discountPolicyMap , List<DiscountPolicy> discountPolicyList) { this . discountPolicyMap = discountPolicyMap ; this . discountPolicyList = discountPolicyList ; } 문의 드리고자 하는 부분은 위의 생성자 부분입니다. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig. class, DiscountService. class ) ; 위처럼 DiscountService.class를 AnnotationConfigContext에 등록하면, 스프링 컨테이너에서 DiscountService.class에 대한 스프링 빈을 등록하는 것으로 알고 있습니다. DiscountService의 생성자를 통해 스프링 빈을 등록할 때, discountPolicyMap, discountPolicyList는 어디서 주입을 받는지 모르겠습니다. 왜냐하면 다른 클래스 코드에서 @ComponentScan을 통해서 등록하는 것은 FixDiscountPolicy, RateDiscountPolicy 빈 객체를 등록하는 것이지 MAP 혹은 LIST 형태로 빈 객체를 등록하지 않는 것으로 알고 있기 때문입니다. 그렇다면 지금 스프링 컨테이너의 빈 저장소에는 FixDiscountPolicy와 RateDiscountPolicy만 빈 객체로 저장이 되어있을텐데, 이 녀석들이 어떻게 discountPolicyMap 형태로 변경이 되어서 생성자 주입이 되는지 동작을 세분화해서 알려주시면 너무 감사드리겠습니다. 항상 좋은 답변 주셔서 감사합니다.
안녕하세요 ! AutoAppConfig 클래스에서 @Configuration을 사용하는 이유가 너무 궁금했는데, 이전에 질문글에 답변을 보고 @ComponentScan 기능이 AutoAppConfig 클래스가 스프링 빈으로 등록돼야 활성화 되기 때문이라고 이해했습니다. (@Configuration 내부에 @Componet가 있기 때문에) 질문 1. 보통 애노테이션을 사용할 때 @Service, @Controller처럼 내부에 들어있는 기능은 비슷하지만 해당 클래스가 가진 역할을 명시하는 역할도 하는 것 같아요 ! AutoAppConfig도 사실 @Component를 사용해도 되지만 개발자들이 더 명시적으로 이해할 수 있도록 @Configuration을 사용하게 된건가요? (이전 강의를 통해서 스프링 빈을 컨테이너에 등록해서 싱글톤을 위함인 이유는 알고 있습니다 ㅎㅎ , 그런데 @Bean을 사용해도 싱글톤이 유지되는데 @Configuration을 사용하는 이유는 잘 모르겠네요.. ㅠㅠ 이것또한...명시적인 이해를 위함일까요??) 질문 2. CoreApplication 클래스 즉, 실행 클래스에 @SpringBootApplication 애노테이션 내부를 보면 @ComponentScan이 있는데요 ! AutoAppConfig에서 @ComponentScan을 해준 이유는, 스프링 빈을 등록할 범위를 제한하기 위함이었나요? ㅎㅎ 사실 처음에는, @ComponentScan을 하게되면 스프링 컨테이너에 @Component가 붙은 클래스가 스프링 빈으로 등록되는데, AutoAppConfig에서 컴포넌트 스캔 어노테이션을 붙이게 되면, 해당 클래스에 빈이 등록되는..터무니 없는 생각을 하게 되었습니다 ㅋㅋ... 보통 실무에서 @Configuration @ComponentScan 조합을 사용하는지, 아니면 CoreApplication에서 @SpringBootApplication 애노테이션으로 빈을 등록하게 되는 경우가 많은지 궁금하네요 ㅎㅎ 혹시 제가 언급한 것 중에 잘못된 지식이 있다면 가감없이 지적 부탁드리겠습니다 !! 긴 글 읽어주셔서 감사합니다 ㅎㅎ
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요 선생님 강의 즐겁게 잘 보고 있습니다! 4:40부터 회원저장소와 회원서비스 인터페이스에 메서드를 작성하는 것부터 흐름이 진행되기 시작하는 곳을 무작정 외우려다가 이해하고 싶어서 질문드립니다. 1. Member의 getId()를 쓰지않고 findById()를 쓰신 이유가 궁금합니다. 2. 1이 어떻게 가능한건지 잘 이해가 가지 않습니다. 저의 어떤 기초지식이 부족해서 이해를 못하는 건지 파악이 안 되는 상황이고 도움을 요청드립니다
https://www.inflearn.com/questions/53961 이 글을 보고 git bash를 설치해서 인텔리제이에 적용하여 사용중입니다, 윈도우 환경에 자바 버전은 11입니다. java -jar 명령어를 사용해서 .jar 파일을 실행하는 과정이 잘 되지가 않습니다. 파일 이름이 demo-0.0.1-SNAPSHOT.jar 라서 java -jar demo-0.0.1-SNAPSHOT.jar 라는 명령어를 계속 입력했는데 아무 반응도 일어나지 않습니다. 뭐가 잘못된 걸까요?
안녕하세요! https://www.inflearn.com/questions/343778 이 부분 질문과 답변 보고 궁금한 점이 생겼습니다. jdk 동적 프록시, CGLib 모두 런타임에 리플렉션을 통해 프록시 객체를 생성하는 걸로 알고 있었습니다. 그런데 CGLIB를 사용해서 컴파일 타임에 바이트 코드를 생성한다는 언급이 있습니다. CGLIB는 런타임과 컴파일타임 모두 바이트코드를 조작할 수 있는건가요??
1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요, 강의 내용 중에 이해가 가지 않는 부분이 있어 질문드리고자 질문 글을 작성했습니다. @Scope("singleton") static class SingletonBean{ @PostConstruct public void init(){ System.out.println("SingletonBean.init"); } @PreDestroy public void destroy(){ System.out.println("SingletonBean.destroy"); } } 안녕하세요, 강의 내용 중 이해가 가지 않는 부분이 있어 문의드리고자 글을 작성했습니다. 위의 코드는 싱글톤 스코프로 테스트 코드를 작성하는 강의 내용입니다. 제가 이해가 잘 되지 않는 부분은 테스트 코드에 어노테이션으로 싱글톤 스코프를 단 것이 어떻게 ComponentScan의 대상이 되는지 이해를 할 수 없어서입니다. 수업에서 Component Scan으로 읽어온다고 설명해주셔서 더 의문이 있습니다. 앞에서 배웠을 때는 AutoAppConfig 같은 class를 따로 만든 후, 해당 클래스에 ComponentScan을 위한 값을 설정하고, 그 Scan을 바탕으로 @Component 어노테이션을 포함한 것들을 자동으로 Scan해서 빈을 등록하는 것으로 이해하고 있습니다. 하지만 위의 코드는 테스트 코드 자체에 어느 곳에도 ComponentScan이 들어가지 않았는데, 어떻게 ComponentScan으로 자동 빈이 등록되는 것인지 과정을 자세히 알려주실 수 있으실까요? AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class); 강의 중에는 위의 코드에서 클래스 명을 직접 넣는 것 자체가 ComponentScan이라고 하신 것 같은데, 앞선 강의에서 @Configuration + @Bean을 직접 등록하거나, @ComponentScan을 직접 등록한 것과 비교했을 때 ApplicationContext를 만드는데 코드상 차이점이 없어 보입니다. 혹여나 질문 내용이 잘 이해가 안되시면 피드백 주시면, 좀 더 내용을 보완해서 다시 한번 질문글 적겠습니다. 감사합니다.
안녕하세요 스프링부트환경에서 junit 으로 테스트 케이스를 작성하고 테스트를 하는데 시간이 너무 오래걸리는데 단축할 수 있는 방법이 있는지 알고 싶습니다 테스트 케이스에서 @Autowired 로 서비스를 가져다 쓰고 있는데 실행할때마다 프로젝트의 모든 스프링빈들이 다 올라가고 테스트가 실행되는 것 같습니다 보통 실무에서는 어떻게 하는지 궁금합니다 어쩔 수 없는 부분인건지 아니면 실무에서는 테스트케이스에서 사용하는 서비스만 로딩해서 하는 방법으로 하는건지 잘 모르겠네요 실무에서는 어떤 방법을 써서 테스트 수행시간을 줄이나요? 만약 해당 서비스만 로딩해서 한다면 그 방법도 알고 싶습니다 감사합니다
안녕하세요! 김영한님!! 수업 너무 유익하게 잘 듣고있습니다~!! 동시성 이슈를 막기 위해 ThreadLocal을 사용하는 부분 중에서 궁금한 점이 생겨서 질문 드립니다. String, TraceId의 타입에 대해서는 ThreadLocal을 사용해서 동시성 이슈를 해결하였는데, 필드로 ArrayList, HashMap, HashSet을 사용하고 싶은 경우에는 동시성 이슈를 어떻게 해결하면 될까요 ? 구글링을 했었을 때에는 멀티쓰레드 환경에서는 HashMap 대신에 ConcurrentHashMap을 사용해라고 봤었고, ArrayList 대신에 CopyOnWirteArrayList를 사용해라고 봤었고, HashSet에 대해서는 제대로 찾지 못했습니다. 멀티쓰레드 환경에서 Thread-Safe하게 ArrayList, HashMap, HashSet을 사용하려면 어떻게 해야하나요 ?
안녕하세요. cascade는 동일한 aggregate 에 포함되는 경우에 넣는거겠죠? 저희 예제에서 delivery는 order에서 cascade로 포함했는데 만약 다른 테이블에서 delivery를 참조하고 있으면 order_delivery 라고해서 별도의 테이블을 만들어도 되겠죠? 데이터 중복이지만 ddd에서 바운더리 컨텍스트 그런 개념에서 보면 문제가 없는걸까요?
static class DiscountService { private final Map<String , DiscountPolicy> policyMap ; // map으로 모든 DiscountPolicy 하위 구현체들 주입받기 @Autowired public DiscountService (Map<String , DiscountPolicy> policyMap) { this . policyMap = policyMap ; } } DiscountPolicy의 구현체에는 fixDiscountPolicy, RateDiscountPolicy가 존재합니다. Map을 이용해서 이 두가지 구현체를 모두 주입 받는 방법이 강의내용이였는데, 어떤 원리로 이게 다 주입되었는지 모르겠습니다. 단순히 Map, List처럼 배열(?) 자료형으로 DiscountPolicy(인터페이스)를 주입받으면 스프링에서 알아서 모두 주입해주는것인가요? 질문 내용을 정리하지면, 생성자를 통해서 주입한 policyMap변수에 어떻게 2가지 객체가 주입되었는지 모르겠고, 자세히는 Map의 String 키값이 어떻게 빈이름으로 저장되고, 벨류가 2가지 각 개체의 참고값을 저장한건지 모르겠습니다..ㅠㅠ
AbastractTemplate 클래스의 책임은 변하지 않는 부분인 log 기능을 자식 클래스에게 제공해주고, 자식 클래스는 변하는 부분인 call 메서드를 구현하는 책임을 가지고 있습니다. 서로 책임을 나누어가지면서 두 객체의 기능이 상호작용 함으로서 템플릿 메서드 패턴이 작동하는 것이 아닌지요. 자식클래스는 부모 클래스가 제공하는 execute라는 기능과 추상화된 call 기능을 사용하는 것처럼 보이는데 강의에서 말하는 "부모 클래스의 기능을 전혀 사용하지 않았다"라는 말의 의미가 무엇인지 잘 모르겠습니다.