묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
싱글톤 테스트
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의에서 싱글톤은 유연하게 테스트가 어렵다고 말씀해 주셨는데요.어려운 이유가 static이기 때문인가요?클래스가 메모리에 로드될 때 생성되는거라서 유연하지 않은건지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
강의 로드맵 순서 질문있습니다!
영한님 강의 로드맵을 보고 메모 후 밑의 강의들을 모두 구매한 상태입니다. 1.스프링입문 2.스프링 핵심원리-기본편3.모든 개발자를 위한 http 웹 기본지식 4.스프링 웹 MVC 1,2편5.스프링 DB데이터 접근 기술 1,2편 6.스프링 핵심원리-고급편7.실전! 스프링 부트부트+jpa 현재 2번 스프링 핵심원리- 기본편까진 완강한 상태이고마지막 다음으로 강의에선 기본편 마치고 웹 MVC, DB 접근 기술, 부트까지 가는 방향으로 생각하고 있다고 해주셨는데20년 강의순서 답변과 제가 봤던 로드맵과 마지막 강의에서 추천해주시는게 다 달라서추천해주신대로 바로 다음 스프링 부트와 JPA 실무 완전 정복 로드맵 후에MVC DB로 가면 되는거지학습 순서와 강의 구성을 어떻게 하면 좋을지 여쭙고자 질문 올렸습니다 !
-
해결됨스프링 핵심 원리 - 기본편
스프링 없이
스프링 없이 순수 자바 코드로 런타임 시점에 dependency injection이 가능하게 구현할 수 있나요??
-
미해결스프링 핵심 원리 - 기본편
현 스프링 스타터 셋팅 항목좀 알려주세요 영상이랑 전혀 달라서 손을 못대고 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.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. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 url이 null에 뜨는거에 관해서 질문드립니다.이전에 수정자 주입에 관해서 강의하신거를 보고 이 강의도 다시보고 질문드립니다. 여기서 수정자 주입이 그냥 @Bean밑에 수정자를두면 당연히 그냥 될줄알았는데 구체적으로 왜 안되는지 단계별로 알려주실수있나요? @Autowire가 없어서 안된건가요? 만약 @Autowired를 썻으면 됬을까요? 생성자를 호출하고 setUrl로 들어가는게 안되는건 알거같기도한데 왜 안되는지 구체적으로 질문해도될까요? 12분50초부근에서 보고 제가 이해한게 잘못된거같아서 혼동이 와서 질문드립니다
-
미해결Java/Spring 주니어 개발자를 위한 오답노트
안녕하세요 아랫분 질문에 서 궁금한점이 있어서 질문드립니다
교정하면 Service Class에서 Repository를 이용해서 Member를 가져옵니다. Repository는 MemberEntity를 Member로 변환한 도메인 모델을 반환해야 합니다. 서비스는 MemberEntity를 알지 못해야 합니다. 이렇게 말씀해주셨는데 1 .이렇게 분리하는 이유는 서로의 결합을 낮추기 위해서인가요? 이렇게 분리를하면 어쩔수없이 서비스 메서드 안에도메인클래스로 변환하는 로직이들어가 오히려 코드가 길어져서가독성을 해치지는않나요?현재 저는 서비스에서 레파지토리에서 엔티티를 가져온후dto 객체로 변환시켜서 (바로 변환을 시키거나 어셈블리라는 클래스를 만들어 여기서 변환 작업을 따로해주는 객체를 만들거나)컨트롤러로 넘겨줍니다. 보편적으로 이방식을 많이했는대따로 도메인 클래스를 생성해서 변환해서 비즈니스로직을 처리하고 dto 객체로 넘겨서 컨트롤러로 전달하는지 왜? 이런건지좀더 자세히 설명해주시면감사하겟습니다 ( 제가 수업을 좀더 열심히듣지않아 질문이 무례한게있음 용서해주세요 ㅠ ㅠ)
-
미해결자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 2(마스터편)
컬렉션 프레임워크에서 get()
ArrayList<String> a = new ArrayList<>(); a.add("1"); a.add("2"); a.add("3"); int[] arr = {1, 2, 3}; arr[0] = 4; // 가능 a.get(0) = "one"; // 불가능위와 같이 배열도 ArrayList 객체도 모두 Reference type입니다. 배열에 대한 인덱스 접근은 r-value, l-value로 모두 기능할 수 있는데 ArrayList에 대한 get()은 r-value(값으로만 사용)로써만 기능하고 있습니다.get()의 반환형이 E로 제네릭(객체)인데 read only로 취급되는건가요...?get()으로 해당 위치를 참조하는게 아닌건가요?해당 메모리가 아닌 메모리의 값을 꺼내오는건가요? HashMap<String, String> h1 = new HashMap<>(); h1.put("1", "one"); h1.get("1") = "하나"; // 불가능다른 컬렉션 프레임워크지만 동일한 문제입니다.put(key, value)를 사용해 값을 저장하고 get(key)를 사용해 value를 가져올 때 get()으로 값을 바꿀 수는 없는 건가요? HashMap<String, ArrayList<String>> hashMap = new HashMap<>(); hashMap.get(date).add(Obj); // 가능이 경우에는 get()으로 참조한 메모리에 대해 다시 참조하여 메서드 사용이 가능했습니다. 이러한 동작이 get()으로 값을 반환하는 것이 아니라 객체 메모리에 접근한다고 생각했습니다. 위에 질문과 함께 조금 더 직관적인 질문 드립니다. public static void main(String[] args) { // Calendar calendar = new Calendar(); // calendar.run(); HashMap<String, String> h = new HashMap<>(); h.put("1", "before"); System.out.println(h.get("1").equals("1")); // 참조하여 메서드 동작 확인 h.get("1") = "after"; // 불가능 => 왜 안되는지? String str = "before"; System.out.println(str.equals("before")); // 참조하여 메서드 동작 확인 System.out.println(str); str = "after"; // 변경 가능 => 왜 되는지? System.out.println(str); }위 코드에서 각각 get()과 참조 변수 자체로 접근하였습니다.get()으로는 메서드까지는 접근이 가능하나 값 변경이 안되었고참조변수는 메서드 접근은 물론 값 변경(엄밀히 말하면 참조 변경)까지 되었습니다.이유가 궁금합니다. 감사합니다.
-
해결됨스프링 핵심 원리 - 기본편
빈 등록 안 된 상태에서 @Autowired 사용
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8&unitId=55380&category=questionDetail&tab=community&q=602806 저랑 같은 궁금증을 가진 분의 질문을 보았습니다. new AnnotationConfigApplicationContext(); 인자 속에 DiscountService.class만 존재하는 경우, DiscountService 생성자의 매개 변수 타입이 빈 등록이 안 되어 있어 주입해 줄 타입의 빈이 존재하지 않아 오류가 발생해야 한다고 생각하는데 오류가 안 나는 이유는 스프링 컨테이너에서는 Map, List를 주입해 줄 때 내부적으로 빈 Map, List를 먼저 만들고,아무런 빈이 존재하지 않으면 빈 Map, List가 주입하게 되는 것이기 때문에 오류가 발생하지 않는다고 하셨는데 Map, List가 아닌 일반적인 경우와 비교되지 않아 아직 확실히 이해가 되지 않았습니다. 그러면 스프링 컨테이너에서 Map, List가 아닌 일반적인 빈을 주입해 줄 때는Map, List랑 다르게 내부적으로 무언가를 미리 만들어 두지 않기 때문에, 존재하는 빈이 스캔되지 않을 경우 아무 것도 주입할 수 없어서 오류가 나는 것이고, Map, List는 스캔되는 빈들이 따로 없어도 내부적으로 스프링이 만든 비어 있는 Map, List이 있어서 그걸 주입하므로 오류가 안 난다고 이해하면 되는 건가요? 그리고 답변 내용 중에 '스프링 컨테이너에서는 Map, List를 주입해 줄 때 내부적으로 빈 Map, List를 먼저 만들고, ' '빈 Map, List'라는 것은비어 있는 Map, List인가요Bean Map, List인가요?'비어 있는'이랑 '빈(Bean)'이랑 헷갈려서 질문드립니다.
-
해결됨스프링 핵심 원리 - 기본편
AllBeanTest (조회한 빈이 모두 필요할 때, List, Map)
Map을 통해 Bean 이름을 key, Bean 객체를 value로 받고원하는 할인 정책(discountCode)과 key를 매칭시키면 할인 정책을 골라서 사용할 수 있다는 거잖아요Map의 쓰임새는 알겠는데 List를 왜 써야하는지 모르겠어요 List 없이 Map만 사용해도 오류 없이 정상 작동되던데 List의 용도는 무엇인가요?조회한 빈이 모두 필요할 때는 List와 Map이 세트처럼 작용하는 건가요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
int 와 Integer
안녕하세요 선생님, 강의 너무 잘 듣고있습니다^^int와 Integer 둘다 정수 자료형이지만 각각의 차이점이 있다는 점을 배웠는데요!각각을 어느 상황에서 써야할지 조금 헷갈립니다! 제가 생각했을 때 Integer를 써야하는 이유 중 한가지는선언한 변수를 형변환 하는 등 함수가 필요하면 Integer를 쓰는 것 같습니다명확하게 이땐 int를 쓰고, 이땐 Integer 를 쓰는거다 라는 명확한 기준이 있다면 알고싶습니다! 감사합니다^^
-
해결됨스프링 핵심 원리 - 기본편
프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]학습 자료의 생성자 주입을 선택하라는 내용에서 '누락' 설명하는 부분에 써진 내용을 보고 질문 드립니다. 아래는 학습 자료에 있는 내용 복붙한 거입니다.프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우에 다음과 같이 수정자 의존 관계인 경우 @Autowired가 프레임워크 안에서 동작할 때는 의존 관계가 없으면 오류가 발생하지만, 지금은 프레임워크 없이 순수한 자바 코드로만 단위 테스트를 수행하고 있다. 이렇게 테스트를 수행하면 실행은 된다. 그런데 막상 실행 결과는 NPE(Null Point Exception)이 발생하는데, memberRepository, discountPolicy 모두 의존 관계 주입이 누락되었기 때문이다 여기서 말하고자 하는 바는"프레임워크 없이 순수한 자바 코드를 단위 테스트 하는 경우엔 수정자 주입 방법의 경우 문제가 생긴다."가 아니라"수정자 주입을 하면 만일 개발자의 실수로 뭔가를 누락할 경우 발견하기 어려울 수 있다. 그러므로 수정자 주입을 안 하는 게 좋다."라는 게 맞나요? 즉 수정자 주입으로 해도 테스트할 수는 있지만 여러모로를 따졌을 때 생성자 주입이 실수할 확률이 적어서 낫기 때문인지 궁금합니다. 단위 테스트할 때 set 메서드를 직접 호출하면 수정자 주입의 경우에도 자바로 단위 테스트 할 수는 있는 거죠? 제가 코드를 짰을 땐 되는 것 같은데 제가 제대로 코드를 짠 게 아닐 수 있어서 검증이 제대로 된 건지 모르겠어서 질문드립니다.
-
해결됨스프링 핵심 원리 - 기본편
setter와 생성자 모두에 @Autowired를 하면 주입이 중복해서 되나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]수정자 주입 설명하시는 강의 내용 중9:55 부분부터 setter에 있는 @Autowired 2개를 지우고 실행했더니 아무 것도 출력이 안 되었는데, 생성자 부분에서 soutv를 다시 추가하고 실행해 보니 생성자 주입은 정상적으로 되는 것 같더라고요. 그런데 setter에 @Autowired를 붙이고,soutv는 setter와 생성자 모두에 넣고 AutoAppConfigTest를 실행하면setter의 soutv와 생성자의 soutv 모두 실행되고 다음과 같이 출력됩니다.memberRepository = hello.core.member.MemoryMemberRepository@4e70a728discountPolicy = hello.core.discount.RateDiscountPolicy@b7838a9memberRepository = hello.core.member.MemoryMemberRepository@4e70a728discountPolicy = hello.core.discount.RateDiscountPolicy@b7838a9 그럼 setter 주입도 되고, 생성자 주입도 된 건가요? 불필요하게 또 주입을 하게 되었다는 뜻인가요? @Component public class OrderServiceImpl implements OrderService { private MemberRepository memberRepository; private DiscountPolicy discountPolicy; @Autowired public void setMemberRepository(MemberRepository memberRepository) { System.out.println("memberRepository = " + memberRepository); this.memberRepository = memberRepository; } @Autowired public void setDiscountPolicy(DiscountPolicy discountPolicy) { System.out.println("discountPolicy = " + discountPolicy); this.discountPolicy = discountPolicy; } @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { System.out.println("memberRepository = " + memberRepository); System.out.println("discountPolicy = " + discountPolicy); this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; }
-
해결됨스프링 핵심 원리 - 기본편
@SpringBootApplication가 붙은 CoreApplication를 실행할 때
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]@SpringBootApplication 내부에 @ComponentScan이 있기 때문에@SpringBootApplication가 붙은 CoreApplication을 실행하면 컴포넌트 스캔을 하게 되는 거 맞죠? 그런데 만약 @Service, @Controller, @Component @Autowired 등을 전혀 사용하지 않고오로지 설정 클래스의 @Configuration, @Bean을 통해 빈을 등록한다면 CoreApplication을 실행했을 때컴포넌트 스캔이 동작하긴 하지만, 컴포넌트 스캔을 통해 등록되는 빈은 없다고 보면 되나요? 즉, @Bean을 통해 등록되는 빈들은 있어도, 컴포넌트 스캔은 동작은 하되, 스캔을 통해 등록되는 빈은 이 경우엔 없다고 보면 되나요?
-
미해결스프링 핵심 원리 - 기본편
코드를 똑같이 따라쳤는데 사용자 등록 빈 전체가 안 나와요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]직접 등록한 빈에서 이렇게만 나옵니다.AppConfig 설정 정보의 모든 메서드들이 나오지 않고 클래스만 나오네요.name = appConfig object=hello.core.AppConfig@3cce5371
-
미해결스프링 핵심 원리 - 기본편
강의 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. 강의를 들으며 헷갈리는 부분 질문 남깁니다. 회원을 가입하고 조회할 수 있다. 회원은 일반과 VIP 두 가지 등급이 있다.회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)먼저 회원은 가입하고 조회할 수 있는 기능이 있고 이를 역할과 구현으로 구분하기 위해 역할인 MemberService와 구현인 MemberServiceImpl을 생성했다고 이해했습니다. 그 다음부터 헷갈리기 시작하는데요. 여기서부터 질문입니다. MemberRepository 라는 interface를 생성했는데. 일단 저는 Repository를 현업에서 거의 사용한 적이 없어서 명칭부터가 익숙치 않았는데요. 제가 이해하기로는 주로 외부와의(DB) 통신을 담당하는 친구로 DAO와 유사한 역할을 하는 것으로 이해했습니다. 맞나요? 다만, 자체 DB를 구축할지 외부시스템과 연동할지 정해지지 않았기 때문에 Interface로 생성한거고, 만약 정해져 있다면 굳이 Interface로 생성하지 않아도 될 것 같은데 맞나요? 제가 현업에서 일하면서 Service와 DAO를 연결할때는 보통 같은 기능명칭을 사용했는데 여기서는 join을 save로, findMember를 findById로 사용하더라구요. 명칭을 다르게 하는 이유가있나요?
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 이름을 같게 해도 에러가 뜨지 않아요 ㅠ (자동)
MemberServiceImpl, OrderServiceImpl 이름을둘다 service로 이름을 설정했는데AutoAppConfigTest 에서 돌려봐도 테스트가 통과하고에러가 뜨질 않네요왜 이럴까요? 영한님 강의 너무 잘 듣고 있습니다 좋은 강의 찍어주셔서 감사합니다!
-
해결됨자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 2(마스터편)
synchronized 과정
public synchronized String lendBook() throws InterruptedException{ while (bookList.size() == 0) { wait(); } String book = bookList.remove(0); System.out.println(Thread.currentThread() + " 학생이 책을 빌렸습니다."); return book; } 위 코드의 경우 synchronized method로 처리하였습니다.이 경우 shared resource(예제의 경우 this 객체)에 접근하는 3개의 thread에 대해서도 하나의 쓰레드가 차지한 경우 lock을 걸고 사용이 끝나면 다음 쓰레드가 사용하는 과정을 거치나요? (이러한 과정이 굉장히 빨라서 동시에 일어나는 것 처럼 보일 뿐)
-
해결됨스프링 핵심 원리 - 기본편
@Autowired 필드 명, @Qualifier, @Primary 강의에서 오류가 저는 BeanDefinitionTest에서 납니다ㅠ
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]선생님 저는 BasicScan 테스트가 아니라 엉뚱한 곳에서 오류가 납니다 ㅠorg.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderService' defined in class path resource [appConfig.xml]: Unsatisfied dependency expressed through constructor parameter 1: Ambiguous argument values for parameter of type [hello.core.discount.DiscountPolicy] - did you specify the correct bean references as arguments? 빈이 2개 일 경우 첫번째 방법으로 @Autowired 생성자에서 파라미터명을 rateDiscountPolicy로 바꾸는 방법을 따라했는데 왜 저런 오류가 날까요? AppConfig.xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="memberService" class="hello.core.member.MemberServiceImpl"> <constructor-arg name="memberRepository" ref="memberRepository" /> </bean> <bean id="memberRepository" class="hello.core.member.MemoryMemberRepository" /> <bean id="orderService" class="hello.core.order.OrderServiceImpl"> <constructor-arg name="memberRepository" ref="memberRepository" /> <constructor-arg name="discountPolicy" ref="discountPolicy" /> </bean> <bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy" /> </beans> OrderServiceImplpackage hello.core.order; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.Member; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component //@RequiredArgsConstructor 롬복 public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = rateDiscountPolicy; } @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itemPrice); return new Order(memberId,itemName,itemPrice,discountPrice); // 최종 생성된 주문을 반환 } //테스트용 public MemberRepository getMemberRepository(){ return memberRepository; } } BeanDefinitionTestpackage hello.core.beandefinition; import hello.core.AppConfig; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.GenericXmlApplicationContext; public class BeanDefinitionTest { //AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); GenericXmlApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml"); @Test @DisplayName("Bean 설정 메타정보 확인") void findApplicationBean(){ String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName); if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){ System.out.println("beanDefinitionName = " + beanDefinitionName + "beanDefinition = " + beanDefinition); } } } } package hello.core.xml; import hello.core.member.MemberService; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericXmlApplicationContext; import static org.assertj.core.api.Assertions.assertThat; public class XmlAppContext { @Test void xmlAppContext(){ ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml"); MemberService memberService = ac.getBean("memberService", MemberService.class); assertThat(memberService).isInstanceOf(MemberService.class); } }
-
미해결스프링 핵심 원리 - 기본편
MemberRepository의 주소값이 똑같은이유가 싱글톤 때문인가요?
안녕하세요 강의 잘 듣고있습니다 다름이아니라 memberRepository1(), memberRepository2() 둘의 메서드의 value값의 주소가 사진처럼 똑같은데요 이게 싱글톤이라서 주소를 공유하기때문에 주소값이 똑같은건가요?
-
미해결스프링 핵심 원리 - 기본편
@Component로 자동 빈 등록시 생성자가 2개인 경우 생성자를 선택하여 Bean을 생성할 수 있나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요.강의 내용중 궁금증이 있어 질문 올립니다.만약 @Component로 자동 빈 등록시 빈으로 등록될 class에 생성자가 2개인 경우생성자를 선택하여 Bean을 생성할 수 있나요?예를 들면 아래와 같습니다.@Componentpublic class MemberServiceImpl implements MemberService {private final MemberRepository memberRepository;@Autowiredpublic MemberServiceImpl(MemberRepository memberRepository) {this.memberRepository = memberRepository;}/* MemberRepository 객체를 인자로 2개 받는 생성자를 호출 가능한지? */@Autowiredpublic MemberServiceImpl(MemberRepository memberRepository1, MemberRepository memberRepository2) {this.memberRepository = memberRepository;}} getBean 으로 빈 조회를 할때MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class); MemberServiceImpl 클래스의 두번째 생성자(인자값 두개)를 호출하여 생성하는 방법이 있나요?@Bean 메서드를 만들어서 강제로 new MemberServiceImpl(MemberRepository memberRepository1, MemberRepository memberRepository2);위 방식으로 하면 될것 같은데 혹시 @Bean을 사용하지 않고 생성하는 다른 방법이 있을까요?