강의 수강 중 궁금한 부분이 있어 질문 남깁니다. 빈이 두개 일때를 가정한다면 필드 주입의 경우 @primary 기준으로 우선순위를 정해 사용하겠지만 생성자 주입을 사용하게 될 경우 외부에서 객체를 주입하게 되어 @primary가 의미 없게 되지 않나요?? OrderServiceImpl orderService = new OrderServiceIm 또한 생성자 주입을 사용할 시 인스턴스를 생성할 때마다 객체를 주입해야하게 되는데, 그렇다면 주입할 객체를 변경하게 될때 모든 코드를 수정해야하는 단점이 있는거 아닌가요?? 어느 부분을 놓친건지 모르겠네요 ㅠㅠ
안녕하세요 강의 듣던 중 궁금함이 생겨 문의드립니다. @Configuration은 CGLIB을 이용하여 스프링컨테이너의 싱글톤을 보장해준다로 이해하였습니다. 그런데 "@Autowired은 타입이 같은 bean을 찾아 자동주입해준다"를 듣고보니 Autowired가 있을 경우에도 싱글톤이 보장될 거 같아 테스트를 해보니 실제로 싱글톤을 보장해주고 있었습니다. 그렇다면 @Componentscan과 @autowired를 조합할 경우 configuration은 불필요한 애노테이션인가요? 아래 코드에서 Service와 Member에 주입된 Repo 인스턴스가 동일한 인스턴스였습니다. package mytest; public class MyTestClass{ @ComponentScan static class MyAutoConfig{ } @Component static class Repo{ public Repo(){ System.out.println("Created!"); } } @Component static class Service{ private final Repo repo; @Autowired public Service(Repo repo){ this.repo = repo; } public Repo getRepo(){ return this.repo; } } @Component static class Member{ private final Repo repo; @Autowired public Member(Repo repo){ this.repo = repo; } public Repo getRepo(){ return this.repo; } }
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. OrderServiceTest 실행 시 NullPointException이 발생합니다. (OrderServiceTest) orderService.createOrder() 부분에서 발생하는데, 더 파고들면, discount() 메서드에서 발생합니다. (OrderServiceImpl) 강의와 똑같이 코드를 작성하였는데, 오류가 계속 뜨네요. 제가 생각한 오류의 이유는 test 클래스 작성 시 MemberServiceImpl에서 생성하는 MemoryMemberRepository 객체와 OrderServiceImpl에서 생성하는 MemoryMemberRepository 객체가 일치하지 않기 때문에, 서로 다른 객체에서 memberId를 저장하고 조회하기 때문에 오류가 발생하는 것으로 보입니다. 해서 객체 주소를 찍어보는 코드를 넣어보았는데요, (OrderServiceImpl) (MemberServiceImpl) 이렇게 해서 test를 실행하면 다음과 같이 나옵니다. 위 두 줄 마지막에 MemberServiceImpl에서 생성한 MemberRepository 객체와 OrderServiceImpl에서 생성한 MemberRepository 객체가 상이합니다. 이와 관련하여 코드를 변경해야 한다면, 어떻게 변경하여 적용하는 것이 좋을지 조언 부탁드립니다. 혹시 제가 놓친 부분이 있으면 말씀 부탁드립니다. 감사합니다.
@PostConstruct의 경우 주석처리 하면 init 메서드가 실행되지 않더라구요. 근데 @PreDestory의 경우 주석처리를 해도 close 메서드가 실행되던데 @Bean 애노테이션을 이용하여 NetworkClient를 등록 할 때 destoryMethod가 생략됐고, 추론형이 발동해서? 실행되는 거 맞나요? 그렇다면 반대로 @PostConstruct의 경우에는 추론형이 없을까요? 없다면 이유는 무엇인가요? 이 @Postconstruct와 @PreDestory는 언제 사용하나요? Bean의 생명 주기를 알아야 할 필요가 있을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 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. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] java.lang.AssertionError: Expecting actual: hello.core.member.MemoryMemberRepository@2796aeae and: hello.core.member.MemoryMemberRepository@1fa1cab1 to refer to the same object 도와주세요~~ assertThat(orderService.getMemberRepository()).isSameAs(memberRepository);
강의 21분쯤에 스프링에서 돌리는게 아니라 순수하게 돌리기 때문에 널포인트 익셉션이 터진다고 말씀하시는데 스프링 컨테이너인 ApplicationContext.getBean()을 통해 인스턴스를 가져오는게 아니라 new OrderServiceImpl() 를 했기 때문에 @Autowired가 동작하지 않게 된 것 맞나요 ? 24분쯤 설명을 보시면 스프링 테스트코드를 이용할 수 있다고 하시면서 CoreApplicationTest를 보여주시는데 CoreApplicationTest 클래스를 제외한 test코드를 작성하는 클래스 에서는 스프링 컨테이너가 작동하지 않는 것인가요? 일반 메서드 주입이랑 생성자 주입이랑 차이점이 무엇인가요? 메서드명을 init으로 하느냐, 클래스 이름으로 하느냐의 차이인가요? 메서드 주입의 이점이 있나요?
안녕하세요 영한님! 강의 너무 잘 수강하고있습니다. 다름이 아니라 제가 테스트코드를 작성하는 부분들에서 JUnit에 대한 학습이 전무한 상황에서 테스트 코드를 작성하는 부분의 강의를 들어도 괜찮은걸까요?ㅠㅠ 그냥 영한님의 코딩을 베껴서 치는 코딩원숭이가 된 기분입니다 ㅠㅠㅠ..... 모든것을 다 한번에 학습을 할 수는 없다는것을 알지만... 이런 상태로 로드맵을 계속 쫓아가도 될지 여쭤봅니다..!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. BeanA beanA= ac.getBean("beanA", BeanA.class)에서 "beanA"는 메서드 이름 자리 아닌가요?? 클래스만 지정하고 beanA라는 메서드를 지정한적이없는데 이게 어떻게된것인지요?
스프링 컨테이너가 객체 인스턴스를 싱글톤으로 관리한다. 라고 이해를 했습니다. 그렇다면 사용자가 10명이 존재하고 이 사용자 10명 전부가 memberService 이름을 가지는 빈 객체를 호출 한다고 했을때 첫번째 사용자가 호출해서 memberService 객체를 사용하고 있을때 나머지 사용자 9명은 첫번째 사용자의 memberService 객체 사용이 끝날때까지 대기하고 있어야 하나요? 만약 1번 처럼 대기하고 있는게 맞다면 사용자가 100만명과 같이 대규모 사용자일때도 스프링 컨테이너가 객체 인스턴스를 싱글톤으로 잘 관리를 할 수가 있나요? 성능적인 부분에서 부하가 오지는 않을까요?
안녕하세요!! 좋은 강의 듣게 해주셔서 감사합니다 !!복습 중 이해가 안되는 부분이 있어 질문합니다!! //세로크기 10 가로크기 15에 해당하는 영화관 좌석 //세로크기 10 가로크기 15에 해당하는 영화관 좌석 String[][] seats3 = new String[10][15]; // 선언만 할 때에는 크기를 명시 String[] eng = {"A","B","C","D","E","F","G","H","I","J"}; for (int i = 0; i < seats3.length ; i++) { // 세로 for (int j = 0; j < seats3[i].length; j++) { seats3[i][j] = eng[i]+(j+1); System.out.print(seats3[i][j] + " "); } System.out.println(); } // 표 구매 seats3 [7][8] = "__"; // H9 seats3 [7][9] = "___"; // H10 // 영화관 좌석 확인 for (int i = 0; i < seats3.length ; i++) { // 세로 for (int j = 0; j < seats3[i].length; j++) { // 가로 System.out.print(seats3[i][j] + " "); // A1,A2,A3... } System.out.println(); } //영화관 좌석 확인 부분 에서 String[][] seats3 = new String[10][15]; String[] eng = {"A","B","C","D","E","F","G","H","I","J"}; for (int i = 0; i < seats3.length ; i++) { // 세로 for (int j = 0; j < seats3[i].length; j++) { seats3[i][j] = eng[i]+(j+1); System.out.println(seats3[i][j] + " "); } } 위 코드 fori 구문을 두번 반복한 뒤 System.out.print(seats3[i][j] + " "); 을 사용해 나타내었는데, 이러지 않고 밑에 코드 블럭 처럼 <바로 sout을 통해 좌석번호를 나타낸다면 틀린 코드인지 궁금합니다. ...> 제가 해보았을 때 같은결과가 나와서... String[][] seats3 = new String[10][15]; // 선언만 할 때에는 크기를 명시 String[] eng = {"A","B","C","D","E","F","G","H","I","J"}; for (int i = 0; i < seats3.length ; i++) { // 세로 for (int j = 0; j < seats3[i].length; j++) { seats3[i][j] = eng[i]+(j+1); System.out.print(seats3[i][j] + " "); } System.out.println(); } 요러케요!!
//세로 크기 10 x 가로 크기 15에 해당하는 영화관 좌석 정보 String[][] seats3 = new String[10][15]; //선언만 할때에는 크기를 명시해주자 String[] eng = {"A","B","C","D","E","F","G","H","I","J"}; for ( int i=0;i<seats3.length;i++) { for ( int j=0;j<seats3[i].length;j++) { seats[i][j] = eng[i]+(j+1) ; 선생님 eng[i][j+1] 이 아닌지 궁금합니다. ㅠㅠ System. out .println(seats); } }
얕은 지식을 가진 제가 감히 강사님께 수정을 요청드려도 될 지 모르겠지만, coffees[2] = "에스프레소"; // 값 변경 에서 많은 학습하는 사람들이 주석에 쓰인 "값 변경"을 C나 C++에서 쓰인 value로 해석할 여지가 있으실 것 같아서 이것을 "참조값 변경"으로 수정해주시면 감사드리겠습니다. 왜냐하면 Java는 미리 public class로 선언한 부분에서 String class를 coffees로 객체명을 지어서 객체를 생성할 수 있고, 우측의 {"아메리카노", "카페모카", "라떼", "카푸치노"}; 인 참조 객체를 객체 변수에 할당하는 것이기 때문입니다. 저는 강사님의 넓고 깊은 지식을 강의를 들을 때마다 매번 감탄하면서 배우는 입장인데, 제가 주제넘었다면, 이 글은 바로 삭제하겠습니다. 항상 퀄리티 높은 강의를 제공해주셔서 감사합니다 😄