[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 강의에서 김영한 선생님께서 테스트할 땐 public을 지워도 된다고 하셨는데 혹시 지우는 게 더 좋은 건가요? 테스트 성능이라든가.. 특정 측면에서 public을 지우는 게 더 나은 건가요? 강의에선 public을 지워도 된다고만 말씀하시고 지우는 게 낫다는 말씀은 따로 안 하시긴 했는데, 클래스를 새로 만들 때 자동으로 생기는 public을 일부러 지우시길래 혹시 지우는 게 더 나은 거라서 일부러 지우시는 건지, 아니면 지워도 그만 안 지워도 그만이지만, 지워도 상관없다는 걸 보여주시고 싶어서 지우시는 건지 모르겠습니다. public을 써도 크게 상관없나요? 아니면 지우는 게 낫나요? class ApplicationContextInfoTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("모든 빈 출력하기") void findAllBean() {
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 5:35에서 왜 DiscountPolicy discountPolicy = new RateDiscountPolicy(); 가 아닌 RateDiscountPolicy discountPolicy = new RateDiscountPolicy(); 로 작성하나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하십니까 강의 너무 유익하게 잘 보고 있습니다. 사진에 첨부해 드린것과 같이 강의 자료에서는 별도의 Appconfig가 import 되지 않은 채로 실행되는데 저의 환경에서는 자동적으로 import가 됩니다. 혹시 버전의 차이때문이 아니라면 설명한번 부탁드리겠습니다. 감사합니다!
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 교재에 보면 참고: 부분에 '@Bean에서 파라미터에 의존관계는 자동주입된다. 수동 등록시 자동등록된 빈의 의존관계가 필요할 때 문제를 해결 할 수 있다' 되어있습니다. 앞의 @Bean에서 의존관계 자동주입되는것은 생성자주입(어노테이션이 없어도되는)을 통해 의존관계가 자동으로 주입된다고 이해했습니다. 그런데 다음 문장에서 수동등록시 자동등록된 빈의 의존관계가 필요할 때 문제를 해결한다라는 내용 자체가 정확히 이해가 되지않습니다. 빈을 수동등록한다는건지 의존관계를 수동등록한다는건지 아예 감이 안잡힙니다. 아래 OrderService 예시를 가지고 구체적으로 설명해주시면 감사하겠습니다.
스프링 핵심 원리 - 기본편 섹션7 - 의존관계 자동 주입 관련 질문입니다. 강의 실습내용 중 AllBeanTest 클래스를 생성하여 모든 빈을 조회하는 부분이 있는데, 강의에서는 정상적으로 실행이 되지만 제가 해봤을 때는 하나의 빈을 기대 했지만 2개가 발견된다는 오류메세지가 발생합니다. 강의 내용 상 해당 실습 부분에서는 빈이 2개 이상 일 때 조치를 취해주지 않아도 정상적으로 실행되어야 하는 것으로 보이는데 무엇이 문제인지 모르겠습니다. 이 부분이 혹시 버전에 따라 다를 수도 있나 싶습니다. 강의에서는 springframework 2.3.1 버전을 사용한 것으로 아는데 저는 해당 버전을 쓸 수 없어서 2.7.15 버전으로 진행 중 입니다. 아래는 해당 코드입니다. 답변 부탁드립니다. 감사합니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 2:30 부분부터 ApplicationContext에 대한 설명이 나오고 이게 스프링 컨테이너라고 하시는데 무료 입문 강의인 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술'에선 스프링을 실행했을 때도 ApplicationContext라는 걸 입력한 기억이 없는데요 ApplicationContext를 직접 쓰는 거랑 안 쓰는 거랑 어떤 차이가 있는 건가요?
랜덤 실수 부분 설명하실 때 random.nextDouble()에는 범위 지정이 안된다고 하셨는데 제가 괄호 안에 10.0을 넣어서 해보니 오류 없이 잘 실행이 되는데 왜 그럴까요?? 그리고 로또 번호 하실 때 random.nextInt(45) + 1 이라고 하시고 괄호로 감싸셨는데 괄호를 안쓰면 341 같은 백의 자리 숫자가 나오더라고요 왜 그런건가요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 강의에선 아래 코드처럼 beforeEach() 내부에 AppConfig가 선언되어 있는데요. public class OrderServiceTest { MemberService memberService; OrderService orderService; @BeforeEach public void beforeEach() { AppConfig appConfig = new AppConfig(); memberService = appConfig.memberService(); orderService = appConfig.orderService(); } 아래 코드처럼 AppConfig는 beforeEach() 밖에서 미리 선언해 두면 안 되나요? 테스트 실행해 봤을 땐 오류는 없는데, 실무에선 안 좋은 코드인가요? 그렇다면 이유가 궁금합니다. MemberService memberService; OrderService orderService; AppConfig appConfig = new AppConfig(); @BeforeEach public void beforeEach() { memberService = appConfig.memberService(); orderService = appConfig.orderService(); }
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. package hello.core; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration @ComponentScan( basePackages = "hello.core", excludeFilters = @ ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) public class AutoAppConfig { } package hello.core; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class CoreApplication { public static void main(String[] args) { SpringApplication.run(CoreApplication.class, args); } } package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository; import hello.core.order.OrderService; import hello.core.order.OrderServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean //MemoryMemberRespository 객체로 초기화된 MemberServiceImpl 객체 반환 public MemberService memberService() { System.out.println("call AppConfig.memberService"); return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { System.out.println("call AppConfig.orderService"); return new OrderServiceImpl ( memberRepository(), discountPolicy() ); } @Bean public MemberRepository memberRepository() { System.out.println("call AppConfig.memberRepository"); return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy() { return new RateDiscountPolicy(); } } ㅇCoreApplicaton 클래스(@SpringBootApplicaton) 을 실행하면, @SpringBootApplicaton 에 @ComponentScan이 포함되어 있기 때문에 CoreApplication 의 패키지 하위를 전부 scan 합니다. 그 과정에서 AppConfig 와 AutoAppConfig 를 만날텐데 @ ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) AutoAppConfig에 @Configuration 은 스캔하지 말라고 되어있습니다. Q1. 그러면 AppConfig 는 스캔 되지 않고 빈으로 생성되지 않는 건가요? Q2. AutoAppConfig도 @Configuration이 등록되어있는데 그렇다면 AutoAppConfig도 빈으로 생성되지 않는건가요? Q3. @Configuration public class AppConfig { @Bean //MemoryMemberRespository 객체로 초기화된 MemberServiceImpl 객체 반환 public MemberService memberService() { System.out.println("call AppConfig.memberService"); return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { System.out.println("call AppConfig.orderService"); return new OrderServiceImpl ( memberRepository(), discountPolicy() ); } @Bean public MemberRepository memberRepository() { System.out.println("call AppConfig.memberRepository"); return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy() { return new RateDiscountPolicy(); } } AppConfig 를 컴포넌트 스캔 대상에서 제외해버리면 AppConfig의 수동 빈 등록 내용도 전부 무시되어 얘네들이 빈으로 생성되지 않는건가요? Q4.CoreApplicaotn 에도 @Configuration 이, AutoAppConfig에도 @Configuration이 설정되어있는데 이 경우 충돌이 일어나지는 않나요? Q5. 만약 Q4에서 충돌이 일어나지 않는다면, 두개의 Configuraiton 내용이 둘다 프로젝트에 적용되는 건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] RateDIscountPolicy로만 불러오는게 아니라 왜 private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); 처럼 인터페이스로부터 불러 오나요? 인터페이스는 구현체를 만들때에만 쓰이는게 아닌가요?
자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 1(기초편)
싱글톤 패턴으로 클래스 작성시 private static Company company = new Company(); 라고 작성을 하였는데 프로그램 실행 부터 메모리에 올라가는 static 필드가 바로 인스턴스를 생성하는건가요? static 필드와 인스턴스의 생성 시점이 충돌하지는 않나요? 클래스 로딩과 static 필드 중 어떤게 먼저 메모리에 잡히는지 궁금합니다.
예전에 조영호님의 '오브젝트' 서적을 읽고 "어떻게 비즈니스 모델을 더 변경에 부드럽게 설계할 수 있을까?"에 고민을 했습니다. 그때의 기억으로는 "역할은 책임을 위한 최소한의 정보만 가지고 있자"라고 제가 이해를 했고 @Entity가 달린 class를 "역할"로 보고 코드 작성을 하니 1개의 RDB Table이 2개 이상의 Entity Class로 매핑이 되었습니다. 평소에 1개 Entity Class가 1개 Table와 매핑하는 것과 달라 괴리감이 들었습니다. 핵사고날 아키텍쳐를 적용하면 비즈니스 모델과 JPA의 Entity를 분리할 수 있지만 팀원들과의 합의도 필요해서 적용할 수 없었고 주니어라 해당 기술 도입으로 생산성이 올라갈 것이라고 장담할 수도 없었습니다. 두서가 없이 말이 많았는데 궁금한 점은! "RDB의 1개 Table을 2개 이상의 Entity로 매핑해서 운영을 하는게 보편적인 방식인가요?" 입니다. ++ 개인적인 질문입니다만 객체의 협력 관계를 먼저 설계하는 것과 DB 설계하는 것 어떤 것이 우선인가요?
Quiz 6을 풀고 답을 봤는데 결과는 같지만 과정이 조금 달라서 왜 그런지 찾아보는데 아무리 봐도 이해가 잘 안가네요 ㅠㅠ String[] size0 = new String[10]; for (int i = 0; i < size0.length; i++) { int shoeSize = 250 + (5 * i); System.out.println("사이즈 " + shoeSize + " (재고 있음)"); } int[] sizeArray = new int[10]; for (int i = 0; i < sizeArray.length; i++) { sizeArray[i] = 250 + (5 * i); } for (int size : sizeArray) { System.out.println("사이즈 " + size + " (재고 있음)"); } 위에것이 제가 한거고 아래가 선생님인데요 둘다 결과는 같게 출력이 됩니다. 아래의 sizeArray[i] 를 하는 이유랑 아래 for문 하나 더 해서 for(int size : sizeArray) 를 쓰는 이유가 이해가 잘 안가서용.. PS. Quiz를 푸는데 머리에서 바로바로 응용할 수가 없어서 앞에서 배운 부분들을 다시 돌려보고 찾아보면서 quiz 를 입력하는데 괜찮은건가요?? (마치 오픈북처럼...) 물론 안보고하면 최고긴 할텐데 그렇게 하려면 완전 달달 외우고있어야 하는것 같아서요
[질문 내용] 프로토타입 빈은 스프링 컨테이너에 요청시 새로 생성하고 반환한다. 이때 싱글톤 빈과 함께 사용이 되면 싱글톤 빈은 한번만 생성이 되므로 싱글톤 빈이 자동으로 의존관계 주입을 하게 되면 싱글톤 빈이 프로토타입 빈 한개를 계속 사용하게 된다 왜냐면 싱글톤 빈에서 의존관계 주입은 한번만 발생하기 때문이다. 따라서 싱글톤빈이 매번 새로운 프로토타입 빈을 사용하는게 아니라 의존관계를 주입할때 가져온 프로토타입 빈을 싱글톤 빈의 생명주기에 맞춰서 사용하게 된다. 다만 clientA, clientB 여러 싱글톤 빈들이 프로토타입 빈을 주입 받을때는 주입 받는 시점에 각각 새로운 프로토타입 빈이 생성되서 주입을 받으므로 각 싱글톤 빈들이 가지는 프로토타입 빈은 다르다. 하지만 결국에는 각각의 싱글톤 빈들이 위와 같은 문제를 가지게 된다. 감사합니다.
안녕하세요. JAVA만 꽤 오래 사용하다가, 이번에 이직하면서 코틀린을 하게 되어 강사님 강의를 들으며 공부하고 있습니다. 많이 부족하지만 너무 자세히 설명해주시고 친절하게 설명해주셔서 덕분에 잘 따라가고 있습니다. 궁금한 내용은 아래와 같습니다. Enum과 static (Companion) 의 차이가 무엇일까, 언제 다르게 사용할까 라는 궁금증이 생겼습니다. 자바를 사용하다가 코틀린 강의를들으면서 가장 인상깊었던 부분인 when 부분입니다. enum과 sealed를 어떻게 실무에서 dto와 사용하는지 예시를 알고 싶습니다. Sealed를 어떤 경우에 사용해야할지 감이 안잡히네요. 혹시 조금 만 더 자세하게 설명을 해주실 수 있을까요? 바쁘실텐데 감사합니다. ps. 강사님 발음에 매번 취하고 있습니다.. :)
해당 강의에서 ObjectProvider를 사용하여 DL 방식으로 컨테이너에서 PrototypeBean 객체를 찾고 PrototypeBean은 prototype 스코프이므로 새로운 객체를 생성하고 반환해준다고 이해했습니다. 새로운 객체를 생성하여 반환하는 것이라면 굳이 ObjectProvider를 사용하지 않고 new 객체를 생성하여 사용해도 되지 않을까요? 이 부분이 궁금해서 질문드립니다. 제 생각에는 ObjectProvider를 사용하면 만약 prototype 스코프의 객체가 다른 객체를 자동으로 주입받아야 할 때 new 객체는 사용자가 의존관계를 주입해주어야 하므로 문제가 생깁니다. 따라서 스프링의 DI 기능을 사용하기 위해 사용하는 것 같다고 생각됩니다.<ObjectProvider 사용> @Scope("singleton") static class ClientBean { @Autowired private ObjectProvider<PrototypeBean> prototypeBeanProvider; public int logic() { PrototypeBean prototypeBean = prototypeBeanProvider.getObject(); prototypeBean.addCount(); return prototypeBean.getCount(); } } <new 객체 사용> @Scope("singleton") static class ClientBean { public int logic() { PrototypeBean prototypeBean = new PrototypeBean(); prototypeBean.addCount(); return prototypeBean.getCount(); } }