묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
빈 이름으로 조회 테스트 관련 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]빈 이름으로 조회하는 test를 작성할 때 강사님께서 "memberService가 MemberServiceImpl의 인스턴스 이면 성공" 이라고 하셨는데1. AppConfig의 memberService 메소드가 실행되고 반환된 MemberServiceImpl이 memberService 객체에 저장됨그러므로 memberService가 MemberServiceImpl의 인스턴스임 성공의 의미가 맞을까요?아니면 AppConfig의 memberService 메소드가 MemberServiceImpl의 인스턴스라는 걸까요..? 이건 말이 안 된다고 생각해서요..
-
미해결스프링 핵심 원리 - 기본편
statefulService 참조를 2개 선언하는 이유
싱글톤 방식의 문제점 코드에서, @Test void statefulServiceSingleton() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); StatefulService statefulService1 = ac.getBean("statefulService", StatefulService.class); StatefulService statefulService2 = ac.getBean("statefulService", StatefulService.class); // 스레드 A: A 사용자가 10000원 주문 statefulService1.order("userA", 10000); // 스레드 B: B 사용자가 20000원 주문 statefulService2.order("userB", 20000); // ThreadA: A 사용자 주문 금액 조회 int price = statefulService1.getPrice(); //ThreadA: 사용자A는 10000원을 기대했지만, 기대와 다르게 20000원 출력 System.out.println("price = " + price); assertThat(statefulService1.getPrice()).isEqualTo(20000); }다음과 같이 statefulService1, statefulService2 로 StatefulService의 참조 변수를 2개 선언해주는데 이렇게 선언해주신 이유가 뭔가요? 다른 스레드라도 어차피 같은 참조를 호출하게 되지 않나요..? 단순히 스레드의 개념을 보여주시기 위해 Service 참조변수를 여러개 선언하신 건가요?
-
미해결스프링 핵심 원리 - 기본편
AppConfig 가 스프링 빈으로 등록되는 과정이 궁금합니다.
강의 내용을 보면 AppConfig 클래스의 경우 스프링 빈으로 등록이 될 때 임의의 클래스를 만들어서 AppConfig 를 한번 상속 받고 CGLIB 라이브러리를 이용해 바이트코드를 조작한 후 스프링 컨테이너에 빈으로 등록된다고 말씀하셨습니다.이전 강의에서는 스프링 컨테이너에 빈이 등록될 때 beandefinition이 먼저 생성되고 beandefinition에 등록된 메타정보를 바탕으로 빈을 생성하여 스프링 컨테이너에 등록된다고 말씀하셨었는데요.그렇다면 AppConfig 클래스의 경우에는beandefition 생성 -> 임의의 클래스 생성 후 상속 및 CGLIB 를 이용한 바이트코드 조작 ->스프링 컨테이너에 bean 등록과 같은 절차가 진행되는건가요??
-
미해결스프링 핵심 원리 - 기본편
NoUniqueBeanDefinitionException 에러
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: rateDiscountPolicy,getDiscountPolicy이 에러가 나서 원인을 찾아보니 AppConfig의 @Bean public DiscountPolicy getDiscountPolicy() { //return new FixDiscountPolicy(); return new RateDiscountPolicy(); }이 부분과@Component public class RateDiscountPolicy implements DiscountPolicy {}이 부분때문에 RateDiscountPolicy 빈이 2개로 등록되어서 그런 것 같아 AppConfig에서 @Bean어노테이션을 주석처리하니 정상적으로 테스트가 됐는데요. 궁금한 점은 AutoAppConfig 에서 AppConfig에 대한 부분은 제외를 시켰는데 왜 중복이 되는가입니다....@Configuration @ComponentScan( basePackages = "hello.core.member", excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) // 기존 AppConfig.java 때문에 컴포넌트 스캔 대상에서 제외시킴 public class AutoAppConfig {}
-
미해결스프링 핵심 원리 - 기본편
Repository는 싱글톤 상태인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]AppConfig 리팩토링 강의에서 질문드립니다!DIP를 지켜주기 위해 AppConfig의 MemberRepository()를 inject하는 과정에서,memberRepository() 메소드가 MemoryMemberRepository() 객체를 생성해서 넘겨주게 되는데,이 경우에, OrderService로 넘어가는 memberRepository와 MemberService로 넘어가는 memberRepository 객체가 동일한 객체인가요??public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } private static MemoryMemberRepository memberRepository() { return new MemoryMemberRepository(); } public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } 제가 생각한 바로는, MemberService, OrderService 각각에 들어가는 객체가 new로 들어가, 다른 repository를 참조하는 것 같아서요! 예시를 위해 이렇게 구현하신 건지.. 아니면 실제 repository가 싱글톤으로 돌아가는지 궁금합니다..!!싱글톤으로 돌아간다 하더라도, 어떻게 각각에 new를 해줬는데 싱글톤일 수 있는지도 궁금하네요..!! 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
@Transactional 안에서 외부 서비스 api call 관련 질문있습니다.
@tranactional 이 붙은 메소드 안에서 외부 서비스 api를 call 해야하는 상황이 있는데컨트롤러 단에서 로직 분리가 힘든 상황입니다. @tranactional 이 붙은 메소드 안에서 아래와 같이 TransactionSynchronizationManager를 선언하고 override한 aftercommit 내부에서 호출하게 될 경우마찬가지로 외부 서비스 api에 장애가 발생했을 때도 본 서비스에 장애로 이어질 수 있을까요?? TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCommit() { // 여기서 외부서비스 api 호출 } });
-
미해결스프링 핵심 원리 - 기본편
프록시와 스코프에 대해
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1.CGLIB 라이브러리 관련 얘기를 싱글톤을 배울 때@Configuration 이 들어간수동 빈 등록 혹은자동 빈 등록@ComponantScan 에 자동으로 CGLIB이 적용 된다고 이해하면 되는걸까요 ?? 2.프록시를 보면서 가짜 프록시 객체를 생성하고 진짜객체를 조회 할 때까지 지연 처리 한다 적혀있는데CGLIB 이 적용된 @Bean 을 생각해 보면스프링 컨테이너에 myLoger 빈이 있으면 그대로 사용없으면 myLogger를 등록 후 리턴해서 싱글톤 보장이 된다고 이해를 했는데.request 스코프 빈은 요청이 와야 생성할 수 있으며Proxy,Provicder 가 지연 처리를 하며 ( localhsot~~~~ log-demo 들어갈때까지)CGLIB 기능(빈이 있으면 사용 없으면 새로 생성해서 리턴)myLogger@CGLIB(상속받은객체) 가 프록시 객체에 들어가며'가짜 프록시 객체는 실제 요청이 오면 그때 내부에서 실제 빈을 요청하는 위임 로직이 들어있다.'→ 가짜 프록시 객체 실행 시(myLogger.log 등..) @Componant 진짜 myLogger 빈을 사용해서기능 실행제가 이해한 Proxy,Provider 역할이 맞을까요 ? 3. @Scope는 싱글톤 스코프가 기본값으로 적용 되어있는데 여태까지 로직처리나 그런 부분은 따로@Scope를 설정 안했는데 DB연결 이나 네트워크 관련(페이지 이동? 로그인?) 일 때 주로 사용하는게 맞나요 @Scope에 대해서 어려움이 있어 질문 남깁니다..ㅠ
-
미해결[코드팩토리] [입문] Dart 언어 4시간만에 완전정복
초급자 질문
안녕하세요 dart강의로 코딩을 시작해보려고 강의를 들어봤습니다 제가 너무 초급자라서 그런지 잘 이해를 못하는 것 같은데 선행으로 하면 좋을 언어가 있을까요?
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
9강 실제 메모리에 존재하는 것과 무관하게 게터와 세터를 만들 수 있다
안녕하세요. 9강 마지막 요약 부분에서 '실제 메모리에 존재하는 것과는 무관하게 getter,setter를 만들 수 있다.' 라고 말씀해주신 부분에 대해서 질문 드립니다.쭉 이어서 설명해주신 것처럼, 코틀린으로 작성한 getter.setter가 byte코드 변환 시 함수로 생성되는데요. 그럼 실제 메모리에는 함수로 존재하는거 아닌가요?..아니면 코틀린에서 그부분은 캡슐화?.. 처럼 내부구현을 가려놔서 사용자인 개발자들은 메모리에 없는 것처럼 느낀다? 라고 말씀해주신 걸까요?? 궁금해서 질문드려봅니다!
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
인스턴스에 대해
안녕하세요~ 공부를 하다가 막히는 부분이 생겨 질문 드립니다. 인스턴스와 인스턴스 변수는 서로 다른건가요? 검색해보니 인스턴스 변수는 인스턴스가 생성될 때 생성된다. 라고 나와있는데 잘 이해가 가지 않습니다. 그리고 인스턴스 메소드도 잘 이해가 가지 않습니다.. BlackBox b1 = new BlackBox(); 에서 b1이 새로운 객체(인스턴스)인 것 까지는 알겠는데 단어가 비슷하다보니 잘 이해가 가지 않네요..!!
-
미해결스프링 핵심 원리 - 기본편
컨테이너 생성시 파라미터 전달하여 빈 등록하기
@Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class); DiscountService discountService = ac.getBean(DiscountService.class); DiscountService.class 를 파라미터로 넘기면서 해당 클래스를 자동으로 스프링 빈으로 등록한다고 알고 있습니다 .static class DiscountService { private final Map<String, DiscountPolicy> policyMap; public DiscountService(Map<String, DiscountPolicy> policyMap) { this.policyMap = policyMap; DiscountService 클래스가 빈으로 등록되었으니 그럼 여기 DiscountService 생성자는 @Autowired 가 생략되어있다고 볼수 있는건가요? @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class); DiscountService discountService = ac.getBean(DiscountService.class);@Component static class DiscountService { private final Map<String, DiscountPolicy> policyMap; @Autowired // 생성자가 1개인 경우 생략 가능 public DiscountService(Map<String, DiscountPolicy> policyMap) { this.policyMap = policyMap; 위의 코드와 아래 코드는 동일하다고 볼 수 있나요?
-
해결됨스프링 핵심 원리 - 기본편
PrototypeBean 생성시점 질문입니다.
@Test void singletonClientUsePrototype() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); } static class ClientBean { private final PrototypeBean prototypeBean; @Autowired public ClientBean(PrototypeBean prototypeBean) { this.prototypeBean = prototypeBean; } }이 코드에서 new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);이때 ClientBean은 싱글톤이어서 스프링 컨테이너에 생성되고 PrototypeBean은 프로토타입이라 생성되지 않습니다. (조회시점에 생성되므로 - getBean)static class ClientBean { private final PrototypeBean prototypeBean; @Autowired public ClientBean(PrototypeBean prototypeBean) { this.prototypeBean = prototypeBean; } }하지만 여기서 (의존관계 자동주입 시점)에 스프링컨테이너에 프로토타입빈을 요청하면 스프링컨테이너는 프로토타입빈을 생성해서 반환합니다.반환된 프로토타입빈을 ( 클라이언트 빈의 생성자를 통해) this.prototypeBean=prototypeBean; 에 의해서 내부필드에 주입되어서 보관합니다.라고 이해를 했는데 맞는지 궁금합니다.답변해주시면 정말 감사하겠습니다.
-
미해결스프링 핵심 원리 - 기본편
스프링 빈을 수동 등록하여 문제 해결
강의 4분 35초 즈음에 스프링 빈을 수동 등록하여 문제를 해결한다 함은,application.properties 파일에서 override true 설정 뒤spring.main.allow-bean-definition-overriding=true AutoAppConfig.class 파일에서@Configuration @ComponentScan( basePackages = "hello.basic.member", basePackageClasses = AutoAppConfig.class, excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { @Bean("discountPolicy") DiscountPolicy fixDiscountPolicy() { return new FixDiscountPolicy(); } }상기 코드와 같은 방법으로 진행한다는 말씀일까요..?
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
강사님 질문 있습니다!
항상 이 부분에서 이해가 안되서 답답한 마음을 안고 지내고 있습니다 🥲구문 1.Reportable factoryCam = FactoryCam();구문 2.FactoryCam factoryCam = FactoryCam(); 구문 1과 구문 2의 차이점이 무엇인지 알 수 있을까요? 기능적인 부분은 이해했습니다. 구문 1의 경우, FactoryCam 이 Reportable 인터페이스를 상속받았으니, Reportable 로 참조를 해서 접근할 수 있다.. 라고는 이해를 했는데요.저 두 개가 달라지는 것에 대한 개념을 좀 설명 부탁드려도 괜찮을까요?제가 어렴풋이 이해하는 개념은 접근 경로 같은 개념인데, 이게 맞을까요?
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
Thread 강의 질문
안녕하세요,Thread 강의 따라서 코드작성후 cleanThread.start를 실행했을때 출력이 나도코딩님과 다르게 나와서 질문드립니다.Thread가 들어가긴 한거 같은데 동시에 cleanThread.run 한것처럼 직원분과 사장님이 따로 청소를 합니다.(하지만 run과 다르게 직원분이 아닌 사장님이 먼저 청소를 하고 직원분이 청소를 함)밑에 출력결과 첨부합니다! -- 사장 청소 시작 --(사장)1번방 청소 중(사장)3번방 청소 중(사장)5번방 청소 중(사장)7번방 청소 중(사장)9번방 청소 중-- 사장 청소 끝 ---- 직원 청소 시작 (Thread) --(직원)2번방 청소 중(직원)4번방 청소 중(직원)6번방 청소 중(직원)8번방 청소 중(직원)10번방 청소 중-- 직원 청소 끝 (Thread) --
-
미해결Java TPC (생각하고, 표현하고, 코딩하고)
강사님 추상메소드에서 전달하는 매개변수도 재정의 할때 반드시 구현하는건가요?
JDBC 예시를 듣고있는데 getConnection 내부에 있는 매개변수들도 반드시 자식 클래스의 재정의된 메서드에서 저 매개변수의 타입와 개수를 동일하게 해줘야 하는건가요?
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
접근 제어자(전반전) 강의 내용 질문
ctrl +c / ctrl+ r 으로 문자 치환하는 부분 입력이 안됩니다. ctrl + r 눌러도 아무것도 실행이 안되는데 뭐가 문제일까요..
-
미해결아무것도 모르고 시작하는 C#
form에 비트맵 이미지 추가
안녕하세요초보 수강생입니다..!저는 비트맵 이미지를 추가하려고 하는데System.OutOfMemoryException: '메모리가 부족합니다.'이 메시지가 계속 뜨더라구요.. 실제로 PC에 메모리는 충분한데 왜 뜨는것인지 알 수 있을까요..? using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Drawing { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Form fm = new Form(); fm.Text = "샘플"; PictureBox pb = new PictureBox(); pb.Image = Image.FromFile("C:\\45347.bmp"); pb.Top = 100; pb.Parent = fm; Application.Run(fm); } } }
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
제네릭스 질문이있습니다.
기존에 제네릭스를 사용하기 위해Wrapper클래스를 사용하여 Integer, Double과 같이 정의한 뒤에 사용했었는데 현 강의에서는 public static <T, V> void orderCoffee(T name, V coffee){ System.out.println(coffee + " 준비 완료 : "+name); }이와같이 선언 한뒤orderCoffee(27, "라떼")와 같이 호출을 하는데 Wrapp를 사용해주어야하는 경우와 아닌 경우가 구분이 잘 가지 않습니다...
-
미해결Java TPC (생각하고, 표현하고, 코딩하고)
강사님 abstract 부분 궁금한점 있습니다!!
abstract 메서드를 포함한 부모클래스는단독적으로 사용이 불가능 하다고 하셨는데예시로 보여주신 것처럼move라는 일반 메서드가 있어도Animal ani = new Animal();ani.move(); 라고도 사용이 불가능한건가요??