묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
질문이 있어요~
안녕하세요! Model에 데이터를 보관할 때 request.setAttribute를 사용하잖아요. 근데 model에 있는 데이터는 응답으로 나가야하는 데이터면 response가 아닐까라는 생각이 들었는데,, request에서 온 파라미터를 꺼내서 객체를 만들고 model에 그 데이터를 보관해서 뷰로 나가는 거니까 request인건가요? 감사합니다..
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
타입 오류 처리 시점에 대해 질문드립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예 [질문 내용]여기에 질문 내용을 남겨주세요. 강사님 안녕하세요! 항상 좋은 수업 감사합니다. 28분 45초 부근에서 타입 오류 처리(필드 타입 Integer인데 사용자가 String으로 입력하는 경우) 스프링 MVC에서 컨트롤러에 진입하기 전에 터진다는 말씀을 듣고 궁금증이 생겨 질문드립니다! 스프링 MVC1 강의에서, ModelAttribute 사용시 요청 파라미터로부터 리소스 객체를 만들고 setXXXX함수가 자동으로 실행되어 필드값이 설정된다고 설명해주셨었습니다. 이 경우, RequestMapping을 통해 컨트롤러에는 진입하지만 setXXXX함수가 실행되는 과정에서 객체의 필드와 타입이 매칭되지 않아 예외를 발생시키는 것이라고 이해하면 될까요? 아니면 타입 오류를 처리하는 별도의 로직이 스프링에 내장되어 있을까요? 제가 이해한 실행 흐름대로면 타입 체크가 들어갈만한 부분이 setXXXX 메서드 말고는 없을것같은데, 또 스프링이 워낙 많은 기능을 제공하다보니 컨트롤러 진입 전에 뭔가 해줄것 같기도 하고 그렇네요 ...ㅎㅎㅎ
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
람다식 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 강의 항상 잘 듣고 있습니다. 또한 항상 수고스럽게 답변해주시는 서포터 분들에게 먼저 감사 말씀 드립니다. 람다식의 용법에 대해서 궁금한 점이 있습니다. private Map<String, String> createParamMap(HttpServletRequest request) { Map<String, String> paramMap = new HashMap<>(); request.getParameterNames().asIterator() .forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName))); return paramMap;} 위의 코드에서 paramName -> paramMap.put(paramName, request.getParameter(paramName))); 의 라인에서 paramName 이라는 매개변수를 어떻게 사용할 수 있는건가요? 람다식이 (파라미터) -> (로직) 의 형태((a,b) -> (a+b)로 사용하는 문법인 걸로 알고 있는데 위의 코드가 paramName이라는 매개변수를 받아서 paramMap에 paramName이라는 Key와 request.getParameter(paramName)이라는 Value를 넣는 것으로 이해했습니다. 그런데 paramName을 선언한 곳은 없는데 어떻게 사용할 수 있을까요? 자바 문법적인 강의는 영한 선생님께서 기본이라 안 해주시지만, 이미 기본서를 읽고 왔고 나름대로 검색을 해봤는데도 해답을 얻을 수가 없어서 질문을 남기게 되었습니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요 localhost:8080/hello 부분 질문드립니다.
안녕하세요 localhost:8080/hello를 요청하는 부분에서 매핑페이지가 없다고 오류가 나옵니다. // hello 서블릿 클래스 입니다. //서버는 8080포트라고 잘 뜹니다. //스프링부트 메인 클래스 입니다. 스프링부트 메인페이지가 최상단에 위치해야 한다고 하여 main 클래스를 확인해보아도 hello.servlet 으로 위치해있고 , 위치를 hello로 바꾸어도 결과는 똑같았습니다. webapp에 만들어놓은 정적 페이지를 요청했을땐 잘 실행이 됩니다. 그 이후에 response 등등 여러 클래스를 만들었던 url로 요청을해도 모두 매핑페이지가 없다고 뜹니다. 감사합니다
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
뷰 관련 파일을 webapp 폴더아래에 넣었을 스프링이 인식하는 과정
예전에 레거시로 스프링 프로젝트를 작성할때는 pom.xml에 폴더 경로를 써줬던 것 같은데 제가 못찾는 것이거나 부트를 사용해서 그런지 그런 설정을 찾아볼 수가 없네요. 혹시 webapp 폴더에 넣어야 한다는 설정을 어디서 찾아볼 수 있을까요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
model 객체를 쓰는이유가 뭔가요?
왜 model에 데이터를 보관해야하는건가요??
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration) 오류가 뜹니다
안녕하세요! 8분 경에 LogTestController를 실행했는데 화면은 정상적으로 출력이 됩니다! 근데 콘솔 출력에 2022-01-13 14:36:41.745 WARN 1632 --- [ main] ion$DefaultTemplateResolverConfiguration : Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration) 라는 오류가 뜨는데 이건 왜 뜨는걸까요???
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
강의 관련하여 질문이 있습니다!
연관된 질문이 있습니다. 1. (2번을 위한 질문입니다) 리엑트 같은 경우 서버에서 쏴준 Json데이터를 통해 클라이언트 웹에서 JS가 받은 데이터를 만져서 결과를 사용자에게 보여주는데 이러한 방식이 Rest API방식이다. 라고 인지하고있는데 맞을까요? 2. 1번이 맞다면 해당 메시지과 국제화에 관련해서, 리엑트에서는 받은 데이터를 가지고 만지기때문에 타임리프를 쓰지않을텐데, 보통 실무에서는 리엑트같은 RESTAPI의 경우 어떤식으로 국제화, 메시지를 관리하는지 궁금합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
강의자료에 있는 내용 중에 궁금한 것이 있어 질문드립니다.
안녕하세요. 이번 강의에서는 Servlet 종속성을 제거하기 위해 'ModelView' 객체를 만들고, 이를 적극 활용하는 컨트롤러를 만드는 것에 대해 다루었는데요. 강의 자료에 다음과 같은 내용이 있었습니다. (빨간색으로 밑줄 그은 내용) 여기서 말하는 "테스트하기 쉽다" 라는 말은 정확히 어떤 의미인가요? 무언가에 종속적이면 테스트 코드를 작성하기 어렵다는 뜻으로 받아들여도 되는걸까요? 조금 더 구체적으로 설명해주시면 정말 감사하겠습니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
클라이언트 dataType 설정 -> Produces 쓰면 되나요?
클라이언트에서 ajax 로 dataType 을 JSON 으로 설정하면 서버에서 Produces JSON 설정하는거 맞나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
DI 방식
안녕하세요, 자바 코드로 스프링 빈 등록하기 강좌에서 질문이 있는데요! 세 가지 질문이 있습니다. 1. @Bean public MemberService memberService() { return new MemberService(MemberRepository()); } 이 뜻은 MemberService와 MemberRepository형의 객체가 의존 관계를 맺고 있다는 뜻이고, 따라서 당연히 MemberService에 가면 MemberRepository형의 멤버변수가 선언되어 있는 걸 볼 수 있는데, 스프링 설정 클래스에서 위와같이 의존관계를 넣어줬으니 MemberService에서는 더이상 @Autowired 어노테이션이 생성자에 필요가 없는 거라고 이해하면 될까요? 조금 더 종합적으로 살펴봤을 때, 컴포넌트 스캔 방식일때는 해당 클래스에서 @Autowired 로 주입받는 객체와의 의존관계를 명시하고 주입해줘야 하는 방법 밖에 없고, 이와 같이 직접 자바 코드로 설정파일 이용해 빈을 등록하는 방식에서는 방법 1 : 수업과 같이 설정클래스에서 위에 작성된 코드로 의존주입한다, 단 저런 방식으로 주입할 경우 MemberService에는 생성자에 @Autowired가 필요없어짐 방법 2 : @Bean public MemberService memberService() { return new MemberService(); } 로 작성하고 MemberService 클래스에서 필드나 생성자에 @Autowired로 MemberRespository 빈 객체 주입 명시 이렇게 두 가지 방법이 있는 것으로 이해하면 될까요? 2. 잠깐 지나가는 말씀으로 세터 메서드에 @Autowired가 붙는 방법을 알려 주셨는데, 세터 메서드는 개발자가 직접 호출하지 않아도 스프링이 알아서 호출해주나요? @Autowired가 붙은 생성자를 저희가 직접 호출해준적은 없는 거 같은데, 세터도 동일한지 궁금합니다. 즉 @Autowired를 멤버변수 필드나 세터나 생성자에 붙이면 개발자가 호출할 필요 없이 알아서 스프링이 자동호출도 해주고 의존객체도 연결해주는 것으로 이해해도 되는지요? 3. 의존 주입을 하는 객체(A)와, 주입을 받는 객체(B)는 모두 빈으로 등록되어야 하는지 궁금합니다. 주입되는 인자(A)는 꼭 빈으로 등록된 객체여야 오류가 안 난다는 것은 수업에서도 알려주셔서 명확히 기억이 나는데, 주입을 받는 객체(B)도 항상 빈으로 등록된 객체여야 하나요? 질문이 많고 긴데 읽어주셔서 감사합니다!
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
2:51 시점 코드실행시 에러발생
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 영한님! 강의 항상 잘 보며 큰 도움 얻고있습니다. 감사합니다 :) 실습진행 중 에러가 발생하였는데, 이유를 찾지못하여 문의글 남기게되었습니다. 02:51 시점 코드 실행시에 아래와 같은 에러메세지가 뜨며 505 status상태입니다. objectMapper.writeValueAsString(helloData); 이 코드에서 문제가 발생한것같은데 , 이유를 모르겠습니다. 실습코드와 동일하게 작성하였는데,, 혹시 이유가 무엇인지 알 수있을까요? 감사합니다! ====================================================== 2022-01-07 18:12:51.795 ERROR 12648 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[responseJsonServlet] : Servlet.service() for servlet [responseJsonServlet] in context with path [] threw exception com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: hello.servlet.basic.HelloData["servletContext"]) at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:392) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:351) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:316) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:782) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4568) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3821) ~[jackson-databind-2.13.1.jar:2.13.1] at hello.servlet.basic.response.ResponseJsonServlet.service(ResponseJsonServlet.java:32) ~[classes/:na] at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.56.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.14.jar:5.3.14] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.14.jar:5.3.14] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.14.jar:5.3.14] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.14.jar:5.3.14] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.14.jar:5.3.14] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.14.jar:5.3.14] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.56.jar:9.0.56] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na] Caused by: java.lang.NullPointerException: null at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:123) ~[tomcat-embed-core-9.0.56.jar:4.0.FR] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:689) ~[jackson-databind-2.13.1.jar:2.13.1] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774) ~[jackson-databind-2.13.1.jar:2.13.1] ... 40 common frames omitted
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
이러한 경우가 쓰레드 풀 대기에 해당한다고 할 수 있을까요?
안녕하세요 좋은 강의 감사드립니다 쓰레드 풀을 설정하고 일정 스레드 개수 이상의 요청이 들어오는 경우 거절하거나 대기할 수 있다... 라고 말씀하셨는데 항상 수강신청할때마다 조마조마하게 바라보던 창이 있었는데 아래 그림의 창이였습니다 혹시 이런 창 또한 스레드 풀에서 스레드 제한을 통해, 대기를 거는 예시에 해당한다고 볼 수 있을까요? 물론 학교 홈페이지 코드를 뜯어보지는 못해서 질문이 추상적일 수 있겠지만 말씀하신 쓰레드 풀의 제한을 통해 저런 기능이 구현이 가능한지 호기심에 여쭤보고자 합니다!
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
itemValidator.supports(item) 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 안녕하세요 선생님!강의 5:20~ 27쯤에 나오는 내용입니다! if(itemValidator.supports(item)) 형태로 supports 로 한번 타입 검증을 하고 코드 진행 하고 싶은데, 선생님 영상에는 오류가 없는데, 저는 타입 미스매치가 나와서요.. <질문> item 위치에 Class<?> 타입이 필요하다는데, (item)이 아닌 다른 값을 넣어줘야하는건가요? 참고로 ItemValidator 쪽의 supports 쪽에는 영상과 동일하게 public boolean supports(Class<?> clazz) { return Item.class.isAssignableFrom(clazz); } 로 오버라이딩했습니다! 시간되실 때 천천히 답변 부탁드리겠습니다 감사합니다
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
Lombok @Data 사용 관련
Lombok @Data 어노테이션은 예측하지 못하게 동작할 수 있기 때문에 핵심 도메인 모델에서 사용하기 위험하다고 하셨지만 단순하게 data 왔다갔다할 때 사용하는 DTO일 경우에는 확인해보고 사용해도 괜찮다고 수업 시간에 언급하셨잖아요. 그래서 되도록이면 @Data 어노테이션 사용은 자제해야겠다고 생각했는데 수업 시간에 예제 코드 작성하실 때는 자주 사용하시더라고요. @Data 어노테이션을 사용해도 되는지 안 되는지 혼란스러운데 이 부분에 대해서 풀어서 설명해주실 수 있나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
HttpSession 과정을 문의드립니다.
안녕하세요! 항상 좋은 답글 달아주셔서 감사합니다! 이번 질문 글에서는 HttpSession의 동작 방식에 대해 어려운 부분이 있어 문의드리고 싶어 글을 적습니다. HttpSession session = request.getSession(); session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);log.info("RESPONSE COOKIE = {} ",response.getHeader("JSESSIONID") );log.info("RESPONSE COOKIE = {} ",response.getHeaders("JSESSIONID") );return "redirect:/"; 제가 궁금한 것은 위의 코드와 관련된 부분입니다. 위의 코드에서는 HttpServletRequest에서 session 값을 얻어서, 그곳에 loginMember를 저장하면서 Session과 Member를 Mapping 해주는 것으로 이해하고 있습니다. 그런데 특이한 점은 Response에 만들어진 Session이 쿠키 형태로 포함되지 않고 나간다는 점입니다. 위 코드를 실행하면 위의 콘솔창에서 볼 수 있듯이, Response에는 어떤 쿠키도 포함되어 나가지 않습니다. 개발자 도구에서도 POST /login에서는 Response에 JESSIONID가 쿠키로 포함되어 오지 않는 것으로 확인이 됩니다. 그렇지만 Redirect를 할 때는 JSSESIONID라는 쿠키가 포함되어 Request 되는 것을 볼 수 있습니다. 내용을 상세히 정리하면 위와 같습니다. 질문을 간단히 정리하면 다음과 같습니다. 1. Request를 통해 얻은 HttpSession은 response가 나갈 때, 쿠키로 클라이언트에 전달되나요? 2. Response로 전달된다면 제가 어떻게 그 부분을 확인할 수 있는지 알려주실 수 있으실까요? 3. Response로 전달되지 않는다면 어떤 형태로 클라이언트에 전달되는지 알려주실 수 있으실까요? 번외 질문 : session.setAttribute("loginMember", loginMember)를 하면 마치 ConcurrentHashMap처럼 저장되는 것으로 이해를 하고 있습니다. "loginMember"만을 저장해둔 ConcurrentHashMap에 session.getId를 key로 value는 loginMember가 저장된다고 이해하면 될까요? 항상 좋은 답변 주셔서 너무 감사합니다. 새해 복 많이 받으세요!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요 영한님 강의를보다 궁금한점이 생겨 질문 남겨봅니다.
서블릿 프로그램에서 스프링을 도입하는 과정을 학습하면서 궁금한점이 생겼는데요 기존 서블릿 프로그램의 경우, 웹서버의 요청을 서블릿 컨테이너가 받아서 해당하는 서블릿을 통해 응답을 했다면 스프링 MVC의 경우 모든 요청을 받는 디스패처 서블릿을 통해 요청을 받는데요, 이때도 마찬가지로 웹서버의 요청은 서블릿 컨테이너가 받게되고 요청에 해당하는 서블릿(디스패처 서블릿)을 싱글톤으로 띄워 관리하고 이 디스패처 서블릿에 대한 삭제라던지 권한은 서블릿 컨테이너가 관리하는게 맞을까요? 그리고 디스패처 서블릿은 컨트롤러를 호출해 일을 수행하는데 이때 컨트롤러는 서블릿이 아닌 기존 서블릿이 하던 역할을 하는 그냥 클래스일뿐인게 맞나요? 요약 1. 스프링을 도입하더라도 웹 서버에 요청은 서블릿 컨테이너를 통해 받는게 맞나요? 2. 이때 서블릿 컨테이너에 존재하는 서블릿은 디스패처 서블릿 단 1개 로 처리되는게 맞나요? 3. 그럼 컨트롤러라고 불리는 클래스는 서블릿의 역할을 할뿐 실제 서블릿이 아니기에 서블릿 컨테이너에 등록이 되지 않나요? 긴 질문 읽어주셔서 감사합니다 (_ _)
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
통합테스트에서 @Autowired
안녕하세요! 강의 너무 잘 듣고 있습니다. 듣다가 잘 모르겠는 점이 있어서 질문을 드립니다. 기존 서비스 테스트코드에서는 @BeforeEach로 의존주입을 했는데, 통합테스트에서는 아래와 같이 @Autowired로 끌어온다고 하셨습니다. 테스트코드인데도 SpringConfig코드에서 아래의 서비스와 레포지토리 객체를 실제로 끌어오는 건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
web 과 domin패키지 구조에 대해 질문이 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 클라이언트에서 값을 받아와서 저장하는 경우는 formDto를 따로 생성해서 modelattribute로 받아온 후 컨트롤러 메서드 안에서 실제 저장 될 entity로 컨버팅해서 서비스단이나 리포지토리로 넘겨주면 되면 웹과 도메인 분리가 가능한데 findById처럼 db에서 엔티티에 값을 담아 서비스를 거쳐 컨트롤러에 뿌려줄 땐 어떻게 해야 할까요? 결국 컨트롤러까지는 Entity자체가 들어오긴 해야 서비스나 리포지토리영역에서 웹 dto에 의존하지 않는것일텐데 컨트롤러 영역에서 가져온 엔티티를 그냥 바로 모델에 add하나요? 아니면 response할 dto를 따로 생성한 후컨트롤러 영역에서 response할 dto객체를 생성해서 가져온 엔티티의 값을 넣어줘서 (setter든 생성자든) dto를 모델에 add하나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
To display the conditions report re-run your application with 'debug' enabled 해결방안
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. run -> edit configuration 으로 들어가서 해봤는데, 잘모르겠어 질문 들립니다... 해결방안 부탁드립니다.