묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션 3. 서블릿, JSP, MVC 패턴 질문 2
1.------------------------------------------------------------------------------------ Host: localhost:8080 Connection: keep-alive Content-Length: 18 Cache-Control: max-age=0 sec-ch-ua: "Microsoft Edge";v="125", "Chromium";v="125", "Not.A/Brand";v="24" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Windows" Upgrade-Insecure-Requests: 1 Origin: http://localhost:8080 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Referer: http://localhost:8080/servlet/members/new-form Accept-Encoding: gzip, deflate, br, zstd Accept-Language: ko,en;q=0.9,en-US;q=0.8 Cookie: Idea-9dddef07=3ad833a2-9560-44ed-926b-2edd236efc95 username=leo&age=5] MemberSaveServlet.service 1.------------------------------------------------------------------------------------ 2024-06-14T15:50:37.558+09:00 DEBUG 25172 --- [servlet] [nio-8080-exec-6] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [959] 2024-06-14T15:50:37.558+09:00 DEBUG 25172 --- [servlet] [nio-8080-exec-6] o.a.coyote.http11.Http11InputBuffer : Received [] 2024-06-14T15:50:37.558+09:00 DEBUG 25172 --- [servlet] [nio-8080-exec-6] o.apache.coyote.http11.Http11Processor : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@12d81083:org.apache.tomcat.util.net.NioChannel@7860389b:java.nio.channels.SocketChannel[connected local=/[0:0:0:0:0:0:0:1]:8080 remote=/[0:0:0:0:0:0:0:1]:53734]], Status in: [OPEN_READ], State out: [OPEN] 2024-06-14T15:50:37.633+09:00 DEBUG 25172 --- [servlet] [nio-8080-exec-7] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [959] 2024-06-14T15:50:37.634+09:00 DEBUG 25172 --- [servlet] [nio-8080-exec-7] o.a.coyote.http11.Http11InputBuffer : Received [GET /favicon.ico HTTP/1.1 Host: localhost:8080 Connection: keep-alive sec-ch-ua: "Microsoft Edge";v="125", "Chromium";v="125", "Not.A/Brand";v="24" sec-ch-ua-mobile: ?0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0 sec-ch-ua-platform: "Windows" Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: no-cors Sec-Fetch-Dest: image Referer: http://localhost:8080/servlet/members/save Accept-Encoding: gzip, deflate, br, zstd Accept-Language: ko,en;q=0.9,en-US;q=0.8 Cookie: Idea-9dddef07=3ad833a2-9560-44ed-926b-2edd236efc95 ]늘 불철주야 강의 찍으시느라 고생하시는 지식공유자님과 답글 달아주시는 선생님들의 노고에 항상 감사드리는 마음으로 질문 남깁니다. 상황1, /servlet/members/new-form 에 들어가서 username, age를 입력해서 전송을 누른다.2, 전송 버튼을 누르면 서블릿에서 member를 저장하고 그 결과로 /servlet/members/save의 html메시지를 메시지 바디에 담아서 응답한다.질문1:전송버튼을 누르면 /servlet/members/save url로 요청이 들어가는 게 맞는 건가요? 질문2:위 코드를 2개로 쪼갰습니다. /servlet/members/new-form에서 데이터를 입력하고 전송을 눌렀을 때 부터의 콘솔창 입니다./servlet/members/new-form에서 보낸 요청 -> /servlet/members/new-form에 대한 응답으로 끝나야 하는데 요청이 두 개 들어온 거는 왜 그런 건가요??
-
미해결쥬쥬와 함께 하루만에 끝내는 스프링 테스트
스프링 버전
안녕하세요.수업 잘 듣고 있는 수강생입니다.별개로 회사에서 스프링버전 1버전도 있고 2버전도 있는데요, 그런 경우는 junit5 라이브러리를 따로 임포트 해서 사용하지 못할까요?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션 3. 서블릿, JSP, MVC 패턴
@WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/new-form") public class MemberFormServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.setCharacterEncoding("UTF-8"); PrintWriter w = response.getWriter(); w.write("<!DOCTYPE html>\n" + "<html>\n" + "<head>\n" + " <meta charset=\"UTF-8\">\n" + " <title>Title</title>\n" + "</head>\n" + "<body>\n" + "<form action=\"/servlet/members/save\" method=\"post\">\n" + " username: <input type=\"text\" name=\"username\" />\n" + " age: <input type=\"text\" name=\"age\" />\n" + " <button type=\"submit\">전송</button>\n" + "</form>\n" + "</body>\n" + "</html>\n"); } }http://localhost:8080/servlet/members/new-form에 들어가서 이름하고 나이를 입력하니까 오류가 안나옵니다...아직 /servlet/members/save 를 만들지 않아서 오류 페이지가 나와야 하는데,그리고 제가 입력한 값이랑 다르게 나오는데 왜 이런거죠...ㅠ새로고침을 해도 해결되지 않습니다ㅠㅠ ++ localhost:8080을 치고 들어가도 저 화면이 뜹니다ㅠㅠ
-
미해결스프링 부트 - 핵심 원리와 활용
prometheus.yml 수정 후 prometheus.exe 재실행했더니 튕깁니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]말 그대로입니다. 띄어쓰기 두 번 규칙 잘 적용했는데 튕기는 현상이 발생합니다. 어떤 것이 문제일까요?? yml을 다음 아래와 같이 복붙했습니다.# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090'] #추가 - job_name: "spring-actuator" metrics_path: '/actuator/prometheus' scrape_interval: 1s static_configs: - targets: ['localhost:8080']
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
회원목록 white label
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]회원등록은 되는데 회원목록누르면 white label 뜹니다 ㅜㅡhttps://drive.google.com/file/d/19-IiuPizWAnOi4x22F5cRLRD_8pE-19F/view?usp=drive_link링크입니다!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션 2. 서블릿 GET 쿼리
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param") public class RequestParamServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); System.out.println("username = " + username); String age = request.getParameter("age"); System.out.println("age = " + age); request.getParameterNames().asIterator() .forEachRemaining(paramName -> System.out.println(paramName + ": " + request.getParameter(paramName))); String[] parameterValues = request.getParameterValues("username"); for (String parameterValue : parameterValues) { System.out.println("parameterValue = " + parameterValue); } } }http://localhost:8080/request-param?username=kim&age=20http://localhost:8080/request-param?username=kim&age=20&username=park으로 하면 오류 없이 잘 넘어가는데,http://localhost:8080/request-param 으로 하면 왜 오류가 나는 건가요? Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as a fallback.Thu Jun 13 22:28:48 KST 2024There was an unexpected error (type=Internal Server Error, status=500).여러 번 시도해봤을 때,//코드3 String[] parameterValues = request.getParameterValues("username"); for (String parameterValue : parameterValues) { System.out.println("parameterValue = " + parameterValue); }질문1:코드3 때문에 오류가 나는 거 같은데 왜 오류가 나는지 이유를 모르겠습니다.http://localhost:8080/request-param은 username의 값을 꺼내는 건데, username이 없어서 null이 나올 거고, 그걸 iterator로 돌리면 결국 그냥 null값이 나와야하지 않나 하고 생각했습니다! //코드1 String username = request.getParameter("username"); System.out.println("username = " + username); String age = request.getParameter("age"); System.out.println("age = " + age);이 코드1는 null값을 뱉어내고//코드2 request.getParameterNames().asIterator() .forEachRemaining(paramName -> System.out.println(paramName + ": " + request.getParameter(paramName)));질문2:http://localhost:8080/request-param로 들어가면, 코드2는 콘솔에 아무것도 프린트 되어있지 않습니다. null값이 나와있을 거라 기대했는데 아니었습니다. 왜 이런 건가요??
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션 2. 서블릿 2
private void printHeaderUtils(HttpServletRequest request) { System.out.println("--- header 편의 조회 start---"); System.out.println("[Host 편의 조회]"); System.out.println("request.getServerName() = " + request.getServerName()); System.out.println("request.getServerPort() = " + request.getServerPort()); System.out.println("--- header 편의 조회 end---"); System.out.println(); }실행하면 이 메서드 부분 출력이--- header ���� ��ȸ start---[Host ���� ��ȸ]request.getServerName() = localhostrequest.getServerPort() = 8080--- header ���� ��ȸ end---이렇게 나옵니다 ㅠㅠ한글 표시가 안 돼요ㅠㅠㅠ어떻게 해야하나요? 도와주세요!!run/debug edit configurations에 들어가서 -Dfile.encoding=UTF-8도 입력했고,File Encoding에 가서 UTF-8로 전부 변경도 했고,application.properties에 가서 server.servlet.encoding.force-response=true도 입력했습니다.인텔리제이 콘솔 한글깨짐 - 인프런 (inflearn.com)여기 링크에 나와있는 분 처럼 다해봤는데 안 됩니다...저 링크에 나와있는 것도 확인해 봤는데 안 되고요...뭐가 문제인 거죠ㅠㅠ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
엔티티에서 equals 오버라이딩, fetch join 2번 질문
게시글이 여러 댓글과 이미지를 가지고 있는 경우 게시글을 조회할 때 댓글과 이미지를 한번에 조회하는 것을 구현하고 있었습니다. @SpringBootTest @Transactional @Rollback(value = false) class PostRepositoryTest { @Autowired PostRepository postRepository; @Autowired UserRepository userRepository; @Autowired CommentRepository commentRepository; @Autowired ImageRepository imageRepository; @Autowired EntityManager em; @Test void 게시글조회시_댓글_이미지_함께_조회() { User user = User.builder() .username("tester") .password("password") .build(); userRepository.save(user); Post post = Post.builder() .title("테스트제목") .content("테스트내용") .build(); postRepository.save(post); Comment comment = Comment.builder() .post(post) .user(user) .content("댓글입니다.") .build(); commentRepository.save(comment); Image image = Image.builder() .image("/file/test") .post(post) .build(); imageRepository.save(image); em.flush(); em.clear(); Post findPost = postRepository.findByIdWithCommentsAndImages(post.getId()).get(); assertThat(findPost.getId()).isEqualTo(post.getId()); assertThat(findPost.getTitle()).isEqualTo("테스트제목"); System.out.println(findPost.getComments().get(0).getContent()); assertThat(findPost.getComments()).contains(comment); } } @Query("select p from Post p " + "left join fetch p.comments " + // "left join fetch p.images " + "where p.id = :id") Optional<Post> findByIdWithCommentsAndImages(@Param("id") Long id);우선 OneToMany에서 fetch join을 2번하면 에러가 나더라구요 이 경우에 그럼 Comments와 Images를 따로 fetch join해서 가져와야하나요? 테스트에서 em.flush(); em.clear(); 하면 assertThat(findPost.getComments()).contains(comment);여기서 테스트 fail을 합니다. 영속성에서 제거가 돼서 그런 것 같은데 em.flush를 안하고 테스트를 해도 의미가 있는 건지 궁금합니다. 만약 em.flush를 해야지 의미 있다면 equals와 hashcode를 id값으로 오버라이딩을 해야하나요?강의를 다 듣고 프로젝트에 적용해보려니까 여러군데에서 막히네요.. 개념이 부족한 거겠죠?
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
섹션 2. 서블릿
private void printHeaderUtils(HttpServletRequest request) { System.out.println("--- header 편의 조회 start---"); System.out.println("[Host 편의 조회]"); System.out.println("request.getServerName() = " + request.getServerName()); System.out.println("request.getServerPort() = " + request.getServerPort()); System.out.println("--- header 편의 조회 end---"); System.out.println(); }실행하면 이 메서드 부분 출력이--- header ���� ��ȸ start---[Host ���� ��ȸ]request.getServerName() = localhostrequest.getServerPort() = 8080--- header ���� ��ȸ end---이렇게 나옵니다 ㅠㅠ한글 표시가 안 돼요ㅠㅠㅠ 어떻게 해야하나요? 도와주세요!!
-
해결됨스프링 핵심 원리 - 기본편
섹션 10. 빈스코프 질문 2
public class PrototypeTest { @Test void PrototypeBeanTest() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); System.out.println("find PrototypeBean1"); PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class); System.out.println("find PrototypeBean2"); PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class); System.out.println("prototypeBean1 = " + prototypeBean1); System.out.println("prototypeBean2 = " + prototypeBean2); assertThat(prototypeBean1).isNotSameAs(prototypeBean2); } static class PrototypeBean { @PostConstruct public void init() { System.out.println("PrototypeBean.init"); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } } }결과prototypeBean1 = hello.core.scope.PrototypeTest$PrototypeBean@29caf222prototypeBean2 = hello.core.scope.PrototypeTest$PrototypeBean@29caf222 강의에서 프로토타입 스코프를 코드로 작성하고 실행하는 도중 깜빡하고 스코프 애노테이션을 넣는 걸 깜빡했습니다.그런데 prototypeBean1 과 prototypeBean2 의 참조값이 같게 나왔습니다.@Configuration을 적지 않았는데 왜 싱글톤이 적용이 된 건지 잘 이해가 가지 않습니다...AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);위 코드에서 AnnotationConfigApplicationContext를 생성할 때 PrototypeBean 정보를 넘겨주면 내부적으로 빈 등록 과정이 진행되기 때문입니다.감사합니다.라고 답변을 받았는데,답변에 대한 질문: PrototypeBean.class의 정보를 넘겨주는데 PrototypeBean 클래스에 @Configuration을 적지 않으면 싱글톤이 적용이 안되는 거 아닌가요??ㅠㅠ
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradle 빌드 실패 오류
안내에 따라 --warning-mode all 넣고 gradlew build`--scan` 결과현재 gradle-wrapper.properties에 나오는 gradle 버전은 8.5입니다.The automatic loading of test framework implementation dependencies has been deprecated. This is scheduled to be removed in Gradle 9.0. Declare the desired test framework directly on the test suite or explicitly declare the test framework implementation dependencies on the test's runtime classpath.이 문제를 해결해야 할 것 같은데, gradle 버전을 업그레이드 해야 할까요?
-
미해결스프링부트 시큐리티 & JWT 강의
SpringSecurity JWT 로그인 URL 2개 설정하는 방법
안녕하세요 SpringSecurity를 이용해서 유저 , 관리자 로그인의 대한 로직을 따로 두고싶습니다.SecurityFilter내에서 유저 로그인 URL과 로직을 관리자 로그인 URL과 로직을 어떻게 나눌 수 있을까욤 ㅠㅠ?
-
미해결실전! 스프링 데이터 JPA
이 코드는 순서에 따라 결과가 왜 다른가요?
스프링 데이터 JPA 실습하다가 궁금한점이 있어 질문드립니다.아래와 같은 코드를 실행하면 member 값이 null 나오고, Board와 Member 순서를 바꾸면 제대로된 값이 나오는데 왜 그런건가요? 강의를 듣다가 제가 놓친 부분이 있는거 같은데 어디를 놓친걸까요? 영속성 컨텍스트와 관련있는 걸까요? Board { ... // 단방향 관계 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; ...} 이 상황에서 public String ....() { ... Board board = boardService.findBoard(boardId); Member member = memberService.getMemberByLoginId(memberName); ...} (참고로 둘다 service단에서는 @Transactional이 되어 있습니다. getMemberByLoginId의 경우 memberName과 LoginId를 비교해서 일치하는 member를 주는 메소드입니다.)
-
미해결Practical Testing: 실용적인 테스트 가이드
테스트 케이스 세분화하기 화면이 안나오는 문제
테스트 케이스 세분화하기에서부터 화면이 안나와요검정 화면으로 자막만 나옵니다.다른 질문을 확인했을 때 크롬 하드웨어 가속을 끄면 나온다고 하여 해당 부분을 수정해서 확인하니 강의는 나오지만, 이부분에 대해 저 또한 문제가 발생하고 있음을 말씀 드립니다! 참고로, 맥북 m1 pro 입니다!
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
개인블로그에 강의자료가 올라가도 될까요?
강사님 항상 강의잘 듣고 있습니다. 제가 복습을 진행하다 보니 자료가 너무 커서 한눈에 보기 어려워 블로그에 복습및 학습 목적으로 강의 자료를 올려두려고 하는데 괜찮을까요?물론 강의 링크도 같이 첨부해서 올리겠습니다!
-
미해결스프링과 JPA 기반 웹 애플리케이션 개발
HtmlEmailService 개발하다 생긴 의문입니다
HTML 인증 메일 전송하기 쪽 개발중에 궁금한게 생겼는데요회원 가입후 링크로 인증쪽 url의 토큰 뒤에 & 가 붙더라구요검색해서 확인해보니 & 의 경우 서버 스크립트에서 처리할 때 & 로 변환한다고 하더라구요 그래서 왜 자꾸 & 로 변환 될까 찾던 찰나에HtmlEmailService의 sendEmail 메서드에서 mimeMessageHelper.setText( String text, boolean html) 의 두번째 인자값이 false로 설정되어 있어 & 값이 생겼었던 것입니다.메일의 context 도 html 소스가 문자열 그대로 나오고 html 형태로 나왔었구요.true 로 설정하니 원만히 해결 되었는데이유가 궁금합니다... setText 메서드를 타고 들어가면 htmlText 를 MimePart로 변환해주는 메서드가 있는데정확히 알고 싶습니다..혹은 해당 메서드를 보고 이와 같은 문제를 맞딱드렸을때 알아내는 방법이나 노하우 같은게 있을까요 ?
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
자동키?가 없는 오라클에서 useGeneratedkey 사용하는 방법??
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]오라클의 경우는 시퀀스로 증가하는 방법을 사용하는데, useGeneratedkey를 사용할 방법이 있을까요
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
[동시 세션 제어] invalidSessionUrl, expiredUrl API에 대하여
동시 세션 제어에서,invalidSessionUrl 경로를 지정하고 expiredUrl 경로를 지정하지 않았을 때 'This session has been expired' 메시지가 나오는데, 한 번 더 새로고침을 하면 정상적으로 invalidSessionUrl 경로로 가네요.?continue 경로로 302 응답 후 invalidSessionUrl 200 응답으로 되네요. 제 생각에는 버그가 아닐까 싶긴 합니다.
-
해결됨스프링 핵심 원리 - 기본편
섹션 7. 조회한 빈이 모두 필요할 때, List, Map
이렇게 한 상태에서 코드 돌리실 때 강의에서는 돌아가는데 제가 하니까 오류가 뜹니다...ㅠㅠ선생님께서도 fix하고 rate 모두 @Component 붙이셨고..강의에서 rate에서 @MainDiscountPolicy 제거하셨는데 어떻게 오류없이 돌아가는 건가요ㅠㅠ 왜 저만 오류가....이 강의에서 소스코드가 없어서 선생님하고 어느 부분이 다른지 확인하기도 어렵습니다ㅠㅠ어느 부분에서 잘못된 건지 확인 가능할까요...ㅠㅠhttps://drive.google.com/file/d/1zr_OjcriS2xs6HdrWQCUmuPCV4iAfGaw/view?usp=drive_link 혹은 소스코드를 받을 수 있으면 확인해보고싶습니다... @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); } static class DiscountService { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); }Error creating bean with name 'orderServiceImpl' defined in file [E:\study\core\build\classes\java\main\hello\core\order\OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [E:\study\core\build\classes\java\main\hello\core\order\OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:795) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:237) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1357) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:962) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:93) at hello.core.autowired.AllBeanTest.findAllBean(AllBeanTest.java:22) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:218) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1420) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:904) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:782) ... 17 more No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy at app//org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:218) at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1420) at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353) at app//org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:904) at app//org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:782) at app//org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:237) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1357) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) at app//org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) at app//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at app//org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) at app//org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975) at app//org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:962) at app//org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) at app//org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:93) at app//hello.core.autowired.AllBeanTest.findAllBean(AllBeanTest.java:22) at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) at java.base@21.0.3/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base@21.0.3/java.util.ArrayList.forEach(ArrayList.java:1596)
-
해결됨스프링 핵심 원리 - 기본편
섹션 7. 옵션처리
@Component class Ex1 { private final Member member; @Autowired(request = false) public Ex1(Member member) { this.mamber = member; } }@Aurowired(request = false)를 사용하면 생성자 호출이 되지 않으니까->Ex1은 스프링 빈으로 아예 등록 조차 안 되는 게 맞는 건가요? @NullableOptional<Member>만약 request = false를 사용하지않고,Nullable과 Optional을 사용하면 Ex1은 스프링 빈으로 등록되는 게 맞나요?? 그리고 수정자 주입같은 경우는@Component class Ex1 { private final Member member; @Autowired public void setEx1(Member member) { this.mamber = member; } }member가 스프링 빈에 등록되어 있지 않으면 Ex1을 스프링 빈에 member가 주입되지 않은 상태로 저장하고,member가 스프링 빈에 등록되어면 그때서야 Ex1에 자동으로 주입을 해주는 게 맞나요?