Spring 152

HTTP Request Message

단순 텍스트 Request Parameter와 다르게, HTTP Message Body를 통해 데이터가 직접 넘어오는 경우는 @RequestParam, @ModelAttribute를 사용할 수 없다. 먼저 단순한 텍스트를 HTTP Message Body에 담아서 전송하고, 이를 InputStream으로 읽어보자. Spring 공식 문서를 참조하면 알 수 있듯이, InputStream과 OutputStream을 직접 받을 수 있다. 따라서 아래와 같이 코드를 작성할 수 있다. 스프링 MVC는 다음 파라미터를 지원한다. HttpEntity : HTTP header, body 정보를 편리하게 조회 메시지 바디 정보를 직접 조회 요청 파라미터를 조회하는 기능과 관계 없음 HttpEntity는 응답에도 사용 가능..

Spring/Spring MVC 2021.05.09

HTTP Request Parameter

HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법에 대해 공부해보자. 클라이언트에서 서버로 요청 데이터를 전달할 때 주로 사용하는 3가지 방법 GET - 쿼리 파라미터 /example?username=son&age=25 메시지 바디없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달 검색, 필터, 페이징등에서 많이 사용 POST - HTML Form content-type : application/x-www-form-urlencoded 메시지 바디에 쿼리 파라미터 형식으로 전달 username=son&age=20 회원 가입, 상품 주문, HTML Form 사용 HTTP message body에 데이터를 직접 담아서 요청 HTTP API에서 주로 사용, JSON / XML / TE..

Spring/Spring MVC 2021.05.07

HTTP 요청 - 헤더 정보

애노테이션 기반의 스프링 컨트롤러는 다양한 파리미터를 지원 HTTP 헤더 정보를 조회하는 방법에 대해 공부해보자 이미지가 잘려있지만 headerMap은 모든 헤더 정보가 Map안에 key-value형태로 담겨있다. Locale은 지역의 언어, 국가 등의 정보를 갖고 있는 객체 헤더 정보 중 host라는 키 값으로 value를 가져옴(특정 헤더 조회) required 속성을 통해 필수 값 여부를 설정 @CookieValue 또한 required 속성을 통해 필수 값 여부 설정 가능 MultiValueMap은 Map과 유사하지만 하나의 키의 여러 값을 받을 수 있다. HTTP header, HTTP Query Parameter와 같이 하나의 키에 여러 값을 받을 때 사용 get을 통해 값을 꺼내면 해당 키에..

Spring/Spring MVC 2021.05.07

요청 매핑

@RequestMapping은 위와 같이 다중 값 설정이 가능하다. /hello-basic과 /hello-basic/은 다른 URL이지만, 스프링은 이를 같은 요청으로 매핑한다. 또한 앞서 공부했듯이 method 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게 모두 호출된다. 이는 method 속성에서 HTTP 메서드를 지정해주는 방식으로 해결할 수 있다. 더 편리하게 제공되는 GetMapping 애노테이션으로 더욱 직관적으로 나타낼 수 있음. PathVariable(경로 변수) 위와 같이 변수를 사용하여 매핑시키고 들어온 변수를 PathVariable을 통해 꺼낼 수 있다. 최근 HTTP API는 다음과 같이 리소스 경로에 식별자를 넣는 스타일을 선호 /mapping/userA /..

Spring/Spring MVC 2021.05.06

로깅 간단히 알아보기

보통 println() 같은 시스템 콘솔을 사용하여 디버깅을 진행하였는데, 실무(실제 운영시스템)에서는 별도의 로깅 라이브러리를 사용하여 로그를 출력한다. 로깅 라이브러리 스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리(spring-boot-starter-logging)가 함께 포함된다. 스프링 부트 로깅 라이브러리는 기본으로 다음 로깅 라이브러리를 사용 SLF4J Logback 로그 라이브러리는 Logback, Log4J, Log4J2 등등 수많은 라이브러리가 있는데, 그것을 통합해서 인터페이스로 제공하는 것이 바로 SLF4J 라이브러리이다. 로그 선언 private Logger log = LoggerFactory.getLogger(getClass()); private static fin..

Spring/Spring MVC 2021.05.03

Spring MVC

스프링이 제공하는 컨트롤러는 애노테이션 기반으로 동작하므로 매우 유연하고 실용적이다. @RequestMapping 스프링은 애노테이션을 활용한 매우 유연하고 실용적인 컨트롤러를 만들었는데 이것이 바로 @RequestMapping을 사용하는 컨트롤러이다. 실무에서도 거의 이 방식의 컨트롤러를 사용 @controller 스프링이 자동으로 스프링 빈으로 등록(내부에 @Component 애노테이션이 있어 컴포넌트 스캔의 대상) 스프링 MVC에서 애노테이션 기반 컨트롤러로 인식 @RequestMapping 요청 정보를 매핑 해당 URL이 호출되면 이 메서드가 호출된다. 메서드의 이름은 임의로 작명 ModelAndView 모델과 뷰 정보를 담아서 반환 application.properties에 prefix와 suf..

Spring/Spring MVC 2021.05.01

ViewResolver

위와 같이 ModelAndView에 논리주소를 담아 반환하여 해당 url로 접속해보면 위와 같은 404페이지가 뜨는데 이는 현재 ViewResolver가 없기 때문에 매칭되는 뷰를 찾지못했다는 오류이다. 뷰 리졸버 : InternalResourceViewResolver 스프링부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하는데, 이때 application.properties에 등록한 spring.mvc.view.prefix (접두사), spring.mvc.view.suffix(접미사)를 사용하여 등록한다. 위와 같이 application.properties에 등록해두면 우리가 ModelAndView에 넣은 논리주소인 new-form과 더해져서 /WEB-INF/vi..

Spring/Spring MVC 2021.05.01

Handler Mapping & Handler Adapter

현재는 @Controller라는 애노테이션을 사용하여 컨트롤러를 사용하지만 과거에는 아래와 같은 딱딱한 방식의 컨트롤러를 제공했었다.(지금은 사용 X) @Component를 통해 해당 컨트롤러는 /springmvc/old-controller라는 이름의 스프링 빈으로 등록 빈의 이름으로 URL을 매핑 http://localhost:8080/springmvc/old-controller 주소로 접속하면 콘솔창에 출력이 찍힐 것이다. HandlerMapping 핸들러 매핑에서 해당 컨트롤러를 찾을 수 있어야함. ex)스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑 HandlerAdapter 핸들러 매핑을 통해 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요 ex) Controller 인터페이스를 실..

Spring/Spring MVC 2021.04.30

Spring MVC 전체 구조

앞서 직접 만들어보았던 MVC 프레임워크와 구조가 굉장히 유사하다. FrontController ==> DispatcherServlet handlerMappingMap ==> HandlerMapping MyHandlerAdapter ==> HandlerAdapter ModelView ==> ModelAndView viewResolver ==> ViewResolver MyView ==> View DispatcherServlet 구조 살펴보기 스프링 MVC도 프론트 컨트롤러 패턴으로 구현되어 있다. 스프링 MVC의 프론트 컨트롤러가 바로 DispatcherServlet 이것이 스프링 MVC의 핵심이다. 상속관계를 다이어그램으로 살펴보면 DispatcherServlet도 결국 HttpServlet을 상속받아 ..

Spring/Spring MVC 2021.04.30

유연한 컨트롤러

현재는 어떤 컨트롤러 interface를 사용할 것인지 지정되어 있기 때문에 컨트롤러에 따라 다른 interface를 사용하는 것이 불가능하다. 만약 각각의 컨트롤러에 따라 다른 interface를 사용하고 싶다면 이때 사용하는 것이 어댑터이다. 어댑터 패턴을 사용하여 프론트 컨트롤러가 다양한 방식의 컨트롤러 interface를 처리하도록 해보자. 핸들러 어댑터 : 중간에서 다양한 종류의 컨트롤러를 호출할 수 있는 어댑터 역할 핸들러 : 컨트롤러에 국한된 개념이 아니라 어떤 것이든 해당하는 종류의 어댑터만 있다면 다 처리 가능 어댑터 Interface supports : 어댑터 목록을 조회하여 해당 컨트롤러를 처리할 수 있는지 판단하는 메서드 True / False 값 반환 handle : 실제 컨트롤러..

Spring/Spring MVC 2021.04.28
반응형