@beforeEach 를 사용하면 모든 테스트는 자신이 실행되기 전에 이 작업을 수행 한다 라고 되어있는데 MemberServiceTest 부분에서 @beforeEach를 안쓰고 MemberService memberService; AppConfig appConfig = new AppConfig(); memberService = appConfig.memberService(); 위와같이 쓰니 오류(Unknown class: 'memberService')가 났습니다. MemberService memberService; @BeforeEach public void beforeEach(){ AppConfig appConfig = new AppConfig(); memberService = appConfig.memberService(); } 위의 코드처럼 @BeforeEach 사용해야 appConfig와 memberService를 정의 할 수 있는 이유가 궁금하며 @BeforeEach가 없으면 왜 오류가 나는지 궁금합니다. 답변주시면 정말 감사하겠습니다.
안녕하세요 영한님 강의 잘 듣고 있습니다^^ 전부터 궁금해 왔던 것인데요, 팩토리를 만들 때 정적으로 올리는 이유에 대해서 궁금합니다 영한님이 다른 QnA에서 추천해 주신 내용들을 읽어보았으나 굳이 왜 "정적"영역으로 보내는 가에 대한 의문은 쉽게 풀리지 않습니다 ㅜㅜ 일단 정적 팩토리 메서드로 보내면 생성자들에 대한 응집도가 크게 떨어지는 느낌입니다. "엘레강트 오브젝트"라는 책을 보면 생성자는 10~15개 까지도 만들고 퍼블릭 메서드를 최대한 적게 가져가라고 가이드를 주는데요, 정적 영역으로 보내면 주/부 생성자로 보낼 수 없기 때문에 그 많은 생성자들이 다 흩어지고, 생성자들 간 관계를 맺을 수 없기 때문에 유연성이 떨어지고 코드 중복이 자주 일어나는 효과가 나는 것 같습니다 이는 굳이 정적 영역으로 보내지 않고 주/부 생성자로 구분하면 쉽게 해결될 일이 아닌가? 하는 생각도 들어 질문을 드립니다
토비님 질문이 있습니다. 디자인 패턴이며 oop며 다들 지향하는게 추상화에 의존하라 즉 인터페이스에 의존하는 내용이 많은데요 그 부분을 스프링 빈 사이의 의존성에 연관을 지으니까 조금 의아한 부분이 있더라구요 이 회차 강좌에서 말씀해주신거 처럼 HelloController가 인터페이스(HelloService)를 의존한다고 해도 결국에는 런타임시 SimpleHelloService에 의존적인거죠? 만약 런타임시 CompleHelloService에 의존으로 하려면 결국에는 HelloController 소스를 수정해야하는거죠?
서블릿과 파일 업로드2 를 학습하던 중 삭제가 불가능하다는 예외가 발생하면서 여러 방법을 시도해도 해결되지 않아 문의 드립니다. 개발 환경 window 사용중인 스프링 부트 버전 : 2.7.8 자바 언어 버전 : 11 properties 설정 경로 설정은 위의 사진처럼 했습니다. 에러 로그를 보면 삭제를 할 수 없다고 뜨면서 예외가 발생합니다. 로그 속에 있는 경로로 들어가 직접 파일 제거 시도 -> 서버가 내려갈 경우 파일이 삭제되는 것 확인 가능 해당 부분이 문제라고 생각됩니다. 해결하기 위해 했던 노력 관리자 권한으로 프로그램 실행 결과 : 실패 강의 자료 코드 그대로 옮겨 오기 결과 : 실패 강의 소스 코드 그대로 옮겨 오기 결과 : 실패 경로 바꿔 보기 결과 실패 총 4가지의 시도 결과 전부 실패해 문의 드립니다. 에러 발생 로그 내가 생각하는 로그 핵심 문제 원인 2023-01-22 21:42:00.789 WARN 31328 --- [nio-8080-exec-3] s.w.m.s.StandardServletMultipartResolver : Failed to perform cleanup of multipart items 2023-01-22 20:48:55.796 ERROR 28536 --- [nio-7070-exec-3] o.apache.coyote.http11.Http11Processor : Error processing request java.io .UncheckedIOException: Cannot delete C:\Users\lgh94\AppData\Local\Temp\tomcat.7070.1452951454340902875\work\Tomcat\ localhost \ROOT\upload_ee1add48_92d9_4d5b_8495_af18bb01c136_00000000.tmp at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.delete( DiskFileItem.java:431 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.core.ApplicationPart.delete( ApplicationPart.java:54 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.connector.Request.recycle( Request.java:483 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.connector.CoyoteAdapter.service( CoyoteAdapter.java:441 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.http11.Http11Processor.service( Http11Processor.java:399 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.AbstractProcessorLight.process( AbstractProcessorLight.java:65 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process( AbstractProtocol.java:891 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.net .NioEndpoint$SocketProcessor.doRun( NioEndpoint.java:1784 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.net.SocketProcessorBase.run ( SocketProcessorBase.java:49 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1191 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run( ThreadPoolExecutor.java:659 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run( TaskThread.java:61 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at java.base/java.lang.Thread.run( Thread.java:829 ) ~[na:na] Caused by: java.io .IOException: Cannot delete C:\Users\lgh94\AppData\Local\Temp\tomcat.7070.1452951454340902875\work\Tomcat\ localhost \ROOT\upload_ee1add48_92d9_4d5b_8495_af18bb01c136_00000000.tmp ... 13 common frames omitted 2023-01-22 20:48:55.796 DEBUG 28536 --- [nio-7070-exec-3] o.apache.coyote.http11.Http11Processor : Error state [CLOSE_CLEAN] reported while processing request java.io .UncheckedIOException: Cannot delete C:\Users\lgh94\AppData\Local\Temp\tomcat.7070.1452951454340902875\work\Tomcat\ localhost \ROOT\upload_ee1add48_92d9_4d5b_8495_af18bb01c136_00000000.tmp at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.delete( DiskFileItem.java:431 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.core.ApplicationPart.delete( ApplicationPart.java:54 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.connector.Request.recycle( Request.java:483 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.connector.CoyoteAdapter.service( CoyoteAdapter.java:441 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.http11.Http11Processor.service( Http11Processor.java:399 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.AbstractProcessorLight.process( AbstractProcessorLight.java:65 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process( AbstractProtocol.java:891 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.net .NioEndpoint$SocketProcessor.doRun( NioEndpoint.java:1784 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.net.SocketProcessorBase.run ( SocketProcessorBase.java:49 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1191 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run( ThreadPoolExecutor.java:659 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run( TaskThread.java:61 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at java.base/java.lang.Thread.run( Thread.java:829 ) ~[na:na] Caused by: java.io .IOException: Cannot delete C:\Users\lgh94\AppData\Local\Temp\tomcat.7070.1452951454340902875\work\Tomcat\ localhost \ROOT\upload_ee1add48_92d9_4d5b_8495_af18bb01c136_00000000.tmp ... 13 common frames omitted 2023-01-22 20:48:55.798 ERROR 28536 --- [nio-7070-exec-3] o.a.coyote.http11.Http11NioProtocol : Error reading request, ignored java.io .UncheckedIOException: Cannot delete C:\Users\lgh94\AppData\Local\Temp\tomcat.7070.1452951454340902875\work\Tomcat\ localhost \ROOT\upload_ee1add48_92d9_4d5b_8495_af18bb01c136_00000000.tmp at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.delete( DiskFileItem.java:431 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.core.ApplicationPart.delete( ApplicationPart.java:54 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.connector.Request.recycle( Request.java:483 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.connector.CoyoteAdapter.log( CoyoteAdapter.java:515 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.http11.Http11Processor.service( Http11Processor.java:429 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.AbstractProcessorLight.process( AbstractProcessorLight.java:65 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process( AbstractProtocol.java:891 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.net .NioEndpoint$SocketProcessor.doRun( NioEndpoint.java:1784 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.net.SocketProcessorBase.run ( SocketProcessorBase.java:49 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1191 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run( ThreadPoolExecutor.java:659 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run( TaskThread.java:61 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at java.base/java.lang.Thread.run( Thread.java:829 ) ~[na:na] Caused by: java.io .IOException: Cannot delete C:\Users\lgh94\AppData\Local\Temp\tomcat.7070.1452951454340902875\work\Tomcat\ localhost \ROOT\upload_ee1add48_92d9_4d5b_8495_af18bb01c136_00000000.tmp ... 13 common frames omitted 2023-01-22 20:48:55.799 ERROR 28536 --- [nio-7070-exec-3] org.apache.tomcat.util.net .NioEndpoint : Error running socket processor java.io .UncheckedIOException: Cannot delete C:\Users\lgh94\AppData\Local\Temp\tomcat.7070.1452951454340902875\work\Tomcat\ localhost \ROOT\upload_ee1add48_92d9_4d5b_8495_af18bb01c136_00000000.tmp at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.delete( DiskFileItem.java:431 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.core.ApplicationPart.delete( ApplicationPart.java:54 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.connector.Request.recycle( Request.java:483 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.connector.CoyoteAdapter.log( CoyoteAdapter.java:515 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.catalina.connector.CoyoteAdapter.checkRecycled( CoyoteAdapter.java:539 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.http11.Http11Processor.recycle( Http11Processor.java:1439 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.AbstractProtocol$ConnectionHandler.release( AbstractProtocol.java:1098 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process( AbstractProtocol.java:1056 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.net .NioEndpoint$SocketProcessor.doRun( NioEndpoint.java:1784 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.net.SocketProcessorBase.run ( SocketProcessorBase.java:49 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1191 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run( ThreadPoolExecutor.java:659 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run( TaskThread.java:61 ) ~[tomcat-embed-core-9.0.71.jar:9.0.71] at java.base/java.lang.Thread.run( Thread.java:829 ) ~[na:na] Caused by: java.io .IOException: Cannot delete C:\Users\lgh94\AppData\Local\Temp\tomcat.7070.1452951454340902875\work\Tomcat\ localhost \ROOT\upload_ee1add48_92d9_4d5b_8495_af18bb01c136_00000000.tmp ... 14 common frames omitted
<div th:each="user : ${users}"> <div> 사용자 이름1 <span th:text="${user.username}"></span> 사용자 나이1 <span th:text="${user.age}"></span> </div> <div> 요약 <span th:text="${user.username} + ' / ' + ${user.age}"></span> </div> </div> <th:block> -> <div>로 바꾼 코드입니다. th:block 태그를 사용하지 않고 div 태그 2개를 반복할 수 있는 방법이 존재할 것 같아서 바꿔본 것인데, 가장 바깥 <div> 태그가 출력된다는 점을 제외하면 눈에 보이는 결과물은 동일합니다. 제가 아직 경험이 부족해서 <th:block>가 유용하게 사용되는 경우를 모르는 것이겠죠...? ㅠㅠ
스프링 부트 쓸때는 그냥 편하게 스프링 빈 가져왔는데 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy",DiscountPolicy.class); 본 강의에서는 이처럼 ac 객체만들고 ac.getBean()해서 들고오는 이유가 뭐죠 ?? 제 생각에는 클래스 2개가 둘다 스프링 빈 등록시 그냥 편하게 가져와서 쓰면 된다. 하지만 만일 A클래스는 스프링빈 등록 x, B클래스는 스프링 빈 등록 시 A에서 B객체를 들고 올때는 강의와 마찬가지로 ac.getBean()으로 들고와야 한다 혹시 맞나요 ??
강의 교안을 보면 '응답의 경우에도 @ResponseBody를 사용하면 해당 객체를 HTTP 메시지 바디에 직접 넣어줄 수 있다.'고 작성되어 있습니다. 여기에서 '객체를 HTTP 메시지 바디에 넣는다'는 말에 대해 여쭤보고 싶은데요, HTTP 메시지 컨버터에 의해 문자열로 바뀐 것이 바디에 실린다는 뜻이 맞을까요?
안녕하세요! 항상 좋은 강의 감사드립니다. 선생님의 강의를 보며 코드를 따라치는데, protected와 default 접근제한자가 붙어있는 경우에도 @Transactional이 적용되어 조금 찾아보았습니다. ProxyTransactionManagementConfiguration에서 다음과 같이 스프링 6.0 부터는 protected와 default 메서드에도 @Tx가 적용되도록 바뀌었다는것을 알게되어 말씀드립니다. 관련 커밋 링크도 함께 남기겠습니다. https://github.com/spring-projects/spring-framework/commit/37bebeaaaf294ef350ec646604124b5b78c6e690 스프링부트 강의도 너무 기대하고 있습니다. 항상 좋은 강의 감사합니다!
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 테스트를 run 하니깐 갑자기 jupiter does not exist 라고 뜹니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. 강의 듣다가 질문 사항이 있어 글 남깁니다. 위 코드는 회원 가입을 하고, 그 결과를 보여주는 servlet 클래스입니다. @WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save") public class MvcMemberSaveServlet extends HttpServlet { private MemberRepository memberRepository = MemberRepository.getInstance(); @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); int age = Integer.parseInt(request.getParameter("age")); Member member = new Member(username, age); memberRepository.save(member); // Model에 데이터 보관 request.setAttribute("member", member); String viewPath = "/WEB-INF/views/save-result.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); } } 저는 request 객체를 통해 회원 정보(이름, 나이)가 서버에 전달됨. 해당 정보를 통해 비즈니스 로직(회원가입)이 실행됨. response 객체를 통해 실제 회원 가입된 정보(Member 객체)를 view(jsp)에 전달. jsp가 전달 받은 정보를 참고하여 jsp 작성을 완료하여 클라이언트에게 화면을 보여줌. 이런 로직으로 진행될 것으로 생각했습니다. 그런데 제 생각과는 다르게, jsp에 데이터를 전달하는 model의 역할을 response 객체가 아닌 request 객체가 하는지 궁금증이 생겼습니다. 제가 추측하기로는 dispatcher를 통해 서버 내부에서 jsp를 호출하는 과정이 추가적으로 진행되기 때문에, 그 호출 과정에서 request 객체가 사용되는 것 같은데, 제 추측이 맞는지, 틀렸다면 request 객체가 model 역할을 하는 것은 어떤 이유 때문인지 질문 드립니다. 감사합니다.
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] cmd창에서 dir입력하고 gradle은 있는데 gradlew는 나오지 않네요... C드라이브 안에 study 폴더가 있고, 그안에 hello spring이 있는 상태인데 어느 부분에서 잘못한 것일까요? ㅠㅠ