월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨스프링 웹 MVC
PATCH의 Idempotent에 대한 질문
안녕하세요 백기선님 설명해주신 HTTP Method 중, PATCH의 Idempotent에 대한 궁금증이 생겨 질문을 드립니다. 영상과 노트에서는 PATCH method가 멱등성을 가진다고 설명해주셨는데, 다른 레퍼런스에서는 PATCH가 멱등성을 가지지 않는다는 설명이 있어서 어떤게 올바른지 알고 싶습니다. 감사합니다.
- 해결됨스프링 웹 MVC
2:51초 질문입니다.
SampleController 클래스에 @Validated 어노테이션을 추가하였고, Event 클래스에서 name에 @NotBlank와 limit에 @Min(value = 0)을 추가하였습니다. 코드는 다음과 같습니다.Event.classpackage com.springMvc.N04_handlerMethod; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; public class Event { private Integer id; @NotBlank private String name; @Min(value = 0) private Integer limit; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getLimit() { return limit; } public void setLimit(Integer limit) { this.limit = limit; } } SampleController.classpackage com.springMvc.N04_handlerMethod; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @Controller public class SampleController { @GetMapping("/events/{id}") @ResponseBody public Event getEvent1(@PathVariable Integer id){ Event event=new Event(); event.setId(id); return event; } @GetMapping("/events/form") public String eventsForm(Model model){ Event newEvent=new Event(); newEvent.setName("action"); newEvent.setLimit(30); model.addAttribute("event", new Event()); return "/events/form"; } @PostMapping("/events") public String getEvent(@Validated @ModelAttribute Event event, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return "/events/form"; } return "/events/list"; } }SampleControllerTest.classpackage com.springMvc.N04_handlerMethod; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import static org.junit.jupiter.api.Assertions.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @RunWith(SpringRunner.class) @WebMvcTest class SampleControllerTest { @Autowired MockMvc mockMvc; @Test public void postEvent() throws Exception { mockMvc.perform(post("/events") .param("name", "krille") .param("limit", "-1")) .andDo(print()) .andExpect(status().isOk()) .andExpect(model().hasErrors()); } }Event.class에서 설정한 validation과 SampleController.class의 getEvent() 메소드의 @Validated, BingingResult에 따르면 test에서 입력된 param값에 따라 limit가 음수로 나오면 model().hasError()로 인해 테스트가 통과가 되어야 할텐데 java.lang.AssertionError: Expected binding/validation errors가 나오면서 계속 테스트가 통과되지 않습니다. 오류를 해결하기 위해 구글링, chatGPT를 검색해보았지만 결국 해결하지 못해 이렇게 질문하였습니다.사용한 스프링 프레임워크 부트는 3.1.2 버전입니다. 추가로 지금까지 수업을 들으며 다른 질문도 하려고 합니다.1. Test 작성시 mockMvc.perform()을 사용할 때 마다 자동으로 import를 하고 싶은데 어떤 키를 눌러야 하나요?2. junit이 start.spring.io에서 제공하지 않나요? @RunWith(SpringRunner.class) 어노테이션을 작성할 때마다 수동으로 junit 의존성을 추가합니다.3. 개인적인 질문인데 코딩을 하다가 계속 막히면 화가 너무나서 감정 컨트롤이 너무 힘든데 강사님은 어떻게 감정을 다스리는지 궁금합니다.
- 미해결스프링 웹 MVC
만약 어플리케이션컨텍스트에 필터를 설정하지 않으면 어떻게되나요?
안녕하세요. 좋은 강의 만들어주셔서 정말 감사합니다.덕분에 너무 흥미롭게 스프링 공부를 하고있어요! 제목처럼, 만약 부모,자식의 어플리케이션 컨텍스트에 필터를 설정하지 않으면 같은 빈이 두개 이상의 웹 어플리케이션 컨텍스트에 동시에 등록되는 걸까요? 직접 해보면 좋은데..회사에서 눈치보며 공부중이라 여쭤보아요.^^
- 미해결스프링 웹 MVC
web.xml에 위치한 애플리케이션 web.xml 내에서 파싱 오류 발생
19; Error at (11, 19) : Can't convert argument: null 어떤 에러인지 해결이 안되네요 ㅜㅜ
- 미해결스프링 웹 MVC
Spring Boot 2.6 이상 버전에서의 DispatcherServlet
안녕하세요 강사님! 실무에서 강사님의 강의를 들으며 많은 도움을 받고 있는 쥬니어 개발자입니다. 다름이 아니라 Spring Boot 로 된 프로젝트를 진행하며 DispatcherServlet에 대해 의문점이 생겨 질문을 남겨봅니다. 개발 중 Filter 부분에서 HttpServletRequest가 어떤 Handler에 맵핑 되었는지 확인해야 할 일이 생겨 HandlerMapping 인터페이스의 getHandler 메소드를 사용하여 해결하였습니다. 하지만 문제는 개인적으로 진행하는 토이프로젝트에서는 같은 로직으로 구현하였을 때 에러가 발생하였습니다. 좀 더 구글링해본 결과 2.6 이상 버젼에서 발생하는 문제로 Matching-Strategy가 달라 발생한 문제라고 하여 기본값을 ant-path-matcher 로 바꿔 해결하였습니다. 여기서 저의 의문점은 2.6 버젼 이상에서의 PathPatternParser 맵핑 기반 DispatcherServlet은 기존 방식의 Handler를 가져오는 방식과 달라진걸까요? 요청이 들어왔을 때 DispatcherServlet이 가지고 있는 모든 Mapping객체들을 for 문을 통해 getHandler를 호출해보아도 핸들러가 반환되지 않고 구글링해봐도 딱히 자료가 없어 이렇게 여쭙습니다. 긴글 읽어주셔서 감사합니다.
- 해결됨스프링 웹 MVC
Event`Xxx`Controller 분리할때의 기준에 관한 질문입니다.
CRUD 의 C , U 기능을 합한Event`Update`Controller 로 공통기능을 추출 하셨는데요, 그렇다면, 컨트롤러 핸들러 들의 공통기능 묶는 기준은,HttpMethod 종류에 따라 분리하는 방식이 일반적인지, 어떤식으로도 또 나눌수 있는지 궁금합니다. 읽어주셔서 감사합니다.
- 해결됨스프링 웹 MVC
11분 57초 쯤, `returnValueHandlers` 들의 네이밍컨벤션 관련 질문입니다.
이런 부분까지 질문해야 되나 싶지만, webmvc 를 만든 측의 의견을 제가 알수없어서, 네이밍 컨벤션? 에 대한 강사님의 생각이 궁금해 질문 하게 되었어요. 11분 57초 쯔음, 아래 목록에서는 `Handler` 라는 역할을`Handler` 와 `Processor` 로 나누어 놓았습니다.이것이, Fw 제작간 서로다른 사람이 만들어서 생긴건지, 아닌지 모르겠지만, 무슨 차이가 있나요? 질문입니다. 특정 클래스가 `XxxHandler` 라는 이름을 갖는다면,Class suffix 는 `...Handler` 로 통일하는것이 일반적일텐데, 굳이 Processor 와 Handler 로 의미를 달리하여 구현해놓은 이유가 궁금합니다. 제가 Processor | Handler 또는 Resolver 이들의 역할을 정확히 알지 못해 질문하게 된것 같아요.(한글로는 `처리자` 요런식으로 밖에 해석이 안되어 각각의 차이를 모르겠어요. 저런 이름의 클래스들이 Spring 진영에서 쓰이는 의미를 어떻게 해석해야 될지요?) 읽어주셔서 감사드립니다.
- 미해결스프링 웹 MVC
@EnableWebmvc 설정을 하면
webconfig에 @EnableWebmvc 설정을 하면DelegatingWebMvcConfiguration.class때문에json컨버터도 자동으로 추가가 되는거죠??
- 미해결스프링 웹 MVC
springframework와의 차이점
안녕하세요! 강의를 듣다 모르겠어서 질문 드려요!지금 수업하고 계신 servlet프로젝트하고springFramework로 만든거랑은 어떤 차이점이 있는건지궁금합니다.contextLeaderListener로 ApplicationContext 를 만드는 순간servlet -> springFramework로 되는건가요?
- 해결됨스프링 웹 MVC
@RequestBody의 바인딩에러를 잡는 방법
안녕하세요 기선님, 좋은 강의를 해주셔서 감사합니다. 다름이 아니라, event 의 limit을 integer가 아닌 string으로 요청을 보냈을 때, @ModelAttribute 로 요청 파라미터로 보낼 때는 데이터바인딩 에러를 감지해서 BindingResult에 에러가 담겼는데, @RequestBody 로 요청 바디로 보낼때는 BindingResult에 에러가 담기지 않고, 400 에러를 발생시켰습니다. 제 예상으로는 HttpMessageConverter에서 데이터 변환을 할 때 발생하는 에러는 BindingResult에 담기지 않는 것 같은데, 이러한 바인딩 에러를 핸들러에서 받아서 처리할 수 있는 방법이 있을까요? 그리고 @RequestBody와 함께 사용하는 BindingResult는 Validation 체크에 대한 에러만 담기는 건지 궁금합니다. ==테스트 코드== @RestController public class TestController { @PostMapping("/events/ma") public Event maEvent(@ModelAttribute Event event, BindingResult bindingResult) { return event; } @PostMapping("/events/rb") public Event rbEvent(@RequestBody Event event, BindingResult bidningResult) { return event; } } ============== @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class TestControllerTest { @Autowired MockMvc mockMvc; @Test public void createEvent() throws Exception { String json = "{\"name\":\"juni\",\"limit\":\"juni\"}"; mockMvc.perform(post("/events/rb") .contentType(MediaType.APPLICATION_JSON) .content(json)) .andDo(print()) .andExpect(status().isBadRequest()) ; System.out.println("==============================="); mockMvc.perform(post("/events/ma") .param("name", "juni") .param("limit", "juni")) .andDo(print()) .andExpect(status().isOk()) ; } } ===================== public class Event { private String name; private Integer limit; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getLimit() { return limit; } public void setLimit(Integer limit) { this.limit = limit; } }
- 미해결스프링 웹 MVC
안녕하세요 기선님 강의를 보다 서블릿에 궁금증이 생겨 질문 드립니다
강의중 '서블릿은 프로세스가 아니라, 한 프로세스 내의 자원을 공유하는 스레드를 만들어서 요청을 처리한다' 라고 말씀 해주셨는데요 이때 이 프로세스 라는 부분은 '실행중인 서블릿 어플리케이션' 이라고 해석해도 될까요? 또 여러 참고 자료를 보던중 여러 개의 톰캣 인스턴스가 쓰레드 별로 생성되고 관리되는데 라는 글을 봤는데요 '톰캣 인스턴스'라는건 서블릿 컨테이너에의해 실행된 서블릿 이라고 해석하는게 맞을까요? 좋은 강의 내주셔서 감사합니다 많은 도움이 되고 있습니다!
- 미해결스프링 웹 MVC
HelloService의 값을 전달을 못 받습니다.
* 질문 HelloService의 값을 못 가져오고 500 에러가 나는 이유는 뭔가요 ??? 1) 에러 메시지 2) web.xml 3) AppConfig 4) HelloService 5) HelloServlet
- 미해결스프링 웹 MVC
ServletContext와 WebApplicationContext의 관계 질문
영상 7분 40초쯤에 contextLoaderListener가 webapplicationcontext를 만들어서 servletContext에 등록하는 과정이 나오는데요. servletContext.setAttribute(~~,this.context) 궁금해서 조금 찾아보니 servletContext는 스프링에 관계없이 servlet에 기반한 java web application이 가지고 있는것이고, 반대로 applicationContext(WebApplicationcontext가 상속한)는 spring의 것이고 spring bean들을 가지고 있는 컨테이너 라는 설명이 나왔습니다.(https://stackoverflow.com/questions/31931848/applicationcontext-and-servletcontext) 제가 이해한게 맞다면 둘은 완전히 다른것인데 contextLoaderListener에서 servletContext에 WebApplicationcontext를 등록하는 이유는 WebApplicationContext에 등록된 bean들을 servlet들이 사용할수있게 하는 것이 맞나요? 그럴때 servletContext와 WebApplicationContext의 관계에서 부모 자식 같은 관계 혹은 관계가 없는 독립적인것인지 궁금합니다.
- 미해결스프링 웹 MVC
하나의 서비스에, 두개의 리포지토리도 연결이 되나요?
듣다가 궁금해져서 여쭤봅니다!
- 미해결스프링 웹 MVC
view name 리턴에 대해
handler단에서 String으로 뷰 파일의 path를 return하는데, 강의 때도 말씀해주신 것처럼 String으로 작성한다는 것 자체가 위험성이 있다고 생각이 드는데요, 혹시 이것을 보완하기 위해 자동으로 뷰 네임과 매칭되는 상수를 참조할 수 있다던가 하는 방법이 있을까요?
- 미해결스프링 웹 MVC
Formatter print 질문 드립니다.
Formatter parse 함수를 이용해서 컨트롤러로 요청이 들어오는 경우 자동으로 person으로 변환이 됐는데 @GetMapping("hello/{name}")public String hello(@PathVariable("name") Person person) { return print 함수는 컨트롤러에서 어떻게 사용하는건가요? 혹시 샘플 코드가 있을까요? 감이 잘 안오네요 ^^;
- 미해결스프링 웹 MVC
에리 메시지가 한글입니다.
form.html에서 한글을 적은 적이없는데 에러메시지가 알아서 한글로 변환되어서 나오는데요, 이런 타임리프 엔진에서 처리해준건가요 ??? error has occued부분은 fileds.hasAnyErrors() 시험삼아 동작시킨 부분입니다. 이 부분은 제가 적은 영어로 잘 나옵니다.
- 미해결스프링 웹 MVC
java 클래스파일로 설정되어 있던 것을 web.xml로 바꾸는 경우
기선님 안녕하세요.. 제가 java class 파일(WebAppInit.java, WebSecurityConfig.java )로 되어 있던 설정을 web.xml, security-context.xml방식으로 바꾸어보았는데요.. 바꾸고 나서 서버를 재시작 해보니까 classnotfoundexception이 뜨면서 Caused by: java.lang.NoClassDefFoundError: com/legalcounsel/javaprj/config/WebSecurityConfig at com.legalcounsel.javaprj.config.WebAppInit.getRootConfigClasses(WebAppInit.java:22) 이런 오류가 발생하는데요.. 왜 그런걸까요??? 원래 서버 시작하면 톰켓이 -> web.xml가서 먼저 읽고 그다음 -> dispatcher-servlet.xml 읽는거 아닌가요'?? spring security까지 추가해 놓을 경우 web.xml 후에 filter가 먼저 실행되고, dispatcher servlet.xml이 그다음 실행되고 그 후에interceptor실행된 후 controller 실행되는 걸로 아는데요... 처음부터 xml로 가지 않고 왜 기존에 설정되어 있던 자바클래스(webAppInit.java랑 WebSecurityConfig.java) 지웠냐고 에러가 발생하는데.. 당연히 xml방식으로 바꾸면 xml로 대체할 수 있는 거 아닌가요?? ㅜㅜ
- 미해결스프링 웹 MVC
@RequestParam
안녕하세요. 잘 듣고 있습니다. form 을 만드실때 input 아래와 같은 형태로 만드셨습니다. <input type="text" title="name" th:field="*{name}" /> 이때 @requestParam 에 매칭되는 key 값은 input 태그의 title 속성이 아니라 name 속성인 것으로 알았는데.. title 속성이 맞는 건가요 ?
- 해결됨스프링 웹 MVC
@Retention 질문
안녕하세요. 항상 잘 듣고 있습니다. 어노테이션은 계속 상속되는게 아닌가요? 그러니까 @RequestMapping 어노테이션도 @Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Mappingpublic @interface RequestMapping { String name() default ""; 위 코드처럼 @Retention 이 지정되어 있으므로 @RequestMapping(method = RequestMethod.GET)public @interface GetHelloMapping { 위 같은 커스텀 어노테이션을 사용해도 자동으로 @Retention이 적용되야 하는게 아닌가 궁금합니다.