# MVC1

Spring MVC
Java 백엔드 개발자를 희망하고 있는 나는 Spring 프레임워크를 다루는 일이 많았다. 그래서 더 자세히 이해하고 다루기 위해 공부하고 기록한다. MVC 패턴 소프트웨어 공학에서 사용하는 디자인 패턴 중 하나로 Model, View, Controller의 앞 글짜를 따서 MVC 디자인패턴이라고 한다. MVC Model 어플리케이션의 정보나 데이터, DB등을 뜻함. 백그라운드에서 동작하며, 사용자가 원하는 데이터나 정보 제공함. View 사용자에게 보여지는 화면, UI를 뜻함. 모델로부터 정보를 받아 표출. Controller의 데이터와 비즈니스 로직 사이의 상호 동작을 관리함. 모델과 뷰를 통제하며 MVC 패턴에서 View와 Model이 직접 상호 통신을 하지 않도록 관리함. 기본적인 흐름 유저(클라이언트)가 원하는 정보를 얻기 위해 Controlle

Mybatis-mvc1
mybatis-config.xml -> mybatis-db 설정 board DB 생성 DB 컬럼에 맞춰서 VO 파일 작성 https://velog.io/@dlwldbs/MyBatis
RedirectAttributes
강의 chap7-2 RedirectAttributes > #### 1. RedirectAttributes redirectAttributes 객체에 addAttribute를 통해 url을 지정해준다. 여기서는 itemId는 return문 안에 쓰였고(pathVariable) status는 안 쓰였지만 자동으로 status를 뒤에 붙여준다.(쿼리 파라미터 지원) RedirectAttributes를 사용하면 URL 인코딩도 해주고, pathVariable, 쿼리 파라미터까지 처리해준다. 출처 인프런 강의 - 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
PRG패턴 Post/Redirect/Get
강의 chap7-1 PRG패턴 Post/Redirect/Get > #### 1. 문제 상품을 등록하고 새로고침을 누르면 중복해서 상품이 계속 등록된다. 현재 흐름 -- 상품 등록 버튼을 누르면 post로 add를 호출한다. 그 후 결과물이 post로 남아있다. -- 마지막으로 요청한 것은 POST/add 이다. -- 그 결과 새로고침을 하면 마지막 요청이 반복되므로 id만 증가하고 중복된 상품이 등록된다. -- 웹 브라우저의 새로 고침은 마지막에 서버에 전송한 데이터를 다시 전송한다.
요청 매핑 핸들러 어댑터 구조
강의 chap6-14 요청 매핑 핸들러 어댑터 구조 > #### 1. SpringMVC 구조 HTTP 메시지 컨버터는 스프링 MVC 어디에서 동작하는지 확인해본다. 모든 애노테이션 기반의 컨트롤러는 @RequestMapping을 처리하는 핸들러 어댑터(RequestMappingHandlerAdapter)에 있다. > #### 2. RequestMappingHandlerAdapter 동작 방식 애노테이션 기반의 컨트롤러는 매우 다양한 파라미터를 사용할 수 있다. 이렇게 유연한 파라
HTTP 메시지 컨버터
강의 chap6-13 HTTP 메시지 컨버터 > #### 1. ResponseBody를 사용 HTTP Body에 문자 내용을 그대로 직접 반환한다. viewResolver 대신에 HttpMessageConverter가 동작한다. 기본 문자처리: StringHttpMessageConverter 기본 객체처리: MappingJackson2HttpMessageConverter > #### 2. HTTP 메시지 컨버터 HTTP API처럼 JSON 데이터를 HTTP 메시지 바디에서 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 사용하면 편리하다. HTTP 요청: @RequestBody , HttpEntity(RequestEntity) HTTP 응답
HTTP 응답 - HTTP API, 메시지 바디에 직접 입력
강의 chap6-12 HTTP 응답 - HTTP API, 메시지 바디에 직접 입력 > #### 1. 컨트롤러 > #### 2. responseBodyJsonV1 ResponseEntity를 반환한다. HTTP 메시지 컨버터를 통해서 JSON 형식으로 변환되어서 반환된다. > #### 3. responseBodyJsonV2 반환 객체를 입력해서 사용한다.(가장 많이 사용) @ResponseStatus(HttpStatus.OK) 애노테이션을 사용하면 응답 코드도 설정할 수 있다. > #### 4. @RestController 클래스 레벨에 @Controller 대신 @RestController를 넣으면 모든 메서드에 @ResponseBody가 적용된다. Rest API(HTTP API)를 만들 때 사용하는 컨트롤러이다. 출처 인프런 강의 - 김영한 스프링 MVC 1편 -
HTTP 응답 – 정적 리소스, 뷰 템플릿
강의 chap6-11 HTTP 응답 – 정적 리소스, 뷰 템플릿 > #### 1. 응답 데이터 스프링 서버에서 응답 데이터를 만드는 방법 3가지 정적 리소스 -> HTML, css, js를 제공할 때 사용 뷰 템플릿 사용 -> 동적인 HTML 제공할 때 사용 HTTP 메시지 사용 -> HTTP API를 제공할 때 사용, HTTP 바디에 JSON 같은 형식의 데이터를 실어 보낸다. > #### 2. 정적 리소스 /static , /public , /resources , /META-INF/resources > #### 3. 뷰 템플릿 src/main/resources/templates 뷰 호출 컨트롤러 String으로 반환 -> @ResponseBody가 없으면 response/hello 로 뷰 리졸버가 실행되어서 뷰를 찾고, 렌더링 한다. -> @ResponseBody가 있으면 뷰 리졸버를
HTTP 요청 메시지 – JSON
강의 chap6-10 HTTP 요청 메시지 – JSON > #### 1. HttpServlet 이용 > #### 2. @RequestBody - String > #### 3. @RequestBody – 객체 ObjectMapper를 이용해 변환할 필요가 없다. @RequestBody 를 사용하면 HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체 등으로 변환해준다. 입력한 데이터가 {"username":"hello", "age":20}이므로 application/json으로 자동 인식해준다. @RequestBody는 생략하면 안된다.( @RequestBody 를 생략하면 @ModelAttribute 가 적용되어버린다) > #### 4. HttpEntity > #### 5. @RequestBody – 반환도 객체로 > #### 6. 정리 ![]
HTTP 요청 메시지 – 단순 텍스트
강의 chap6-9 HTTP 요청 메시지 – 단순 텍스트 > #### 1. HTTP message body 요청 파라미터와 다르게 HTTP 메시지 바디를 통해 데이터가 직접 넘어오는 경우 @RequestParam, @ModelAttribute를 사용할 수 없다. 단, HTML Form 형식으로 전달되는 경우 요청 파라미터로 인정된다. InputStream을 통해 읽을 수 있다. > #### 2. Input, Output 스트림 InputStream(Reader): HTTP 요청 메시지 바디의 내용을 직접 조회한다. OutputStream(Writer): HTTP 응답 메시지의 바디에 직접 결과 출력한다. > #### 3. HttpEntity HttpEntity: HTTP header, body 정보를 편리하게 조회할 수 있다. -> 메시지 바디 정보를 직접 조회한다. -> 요청 파라미터를 조회하는 기능
HTTP 요청 파라미터 - @ModelAttribute
강의 chap6-8 HTTP 요청 파라미터 - @ModelAttribute > #### 1. @ModelAttribute 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주는 것을 자동화해준다. > #### 2. 매핑 HelloData Controller @ModelAttribute가 HelloData 객체를 생성한다. 요청 파라미터의 이름으로 HelloData객체의 프로퍼티(getter, setter)를 찾는다. > #### 3. 프로퍼티 객체에 getUsername() , setUsername() 메서드가 있으면, 이 객체는 username 이라는 프로퍼티를 가지고 있다. username 프로퍼티의 값을 변경하면 setUsername() 이 호출되고, 조회하면 getUsername()이 호출된다. > #### 4. 생략 @ModelAttribute는 생략 가능하다.
HTTP 요청 파라미터 - @RequestParam
강의 chap6-7 HTTP 요청 파라미터 - @RequestParam > #### 1. @RequestParam 요청 파라미터를 쉽게 사용할 수 있다. @ResponseBody : View 조회를 무시하고 HTTP message body에 직접 해당 내용을 입력할 수 있다.(여기서는 “ok”) > #### 2. 생략 버전 요청 파라미터 변수명을 같게 하면 @RequestParam() 안에 요청 파라미터를 생략할 수 있다. 이 경우 @RequestParam도 생략할 수 있다. 단 String, int, Integer 등의 단순 타입이여야 한다. 하지만 애노테이션 생략은 명확하지 않아서 생략하지 않는 것이 좋다. > #### 3. 파라미터 필수 여부(requestParamRequired) Default : true Username은 꼭 있어야 하고 age는 없어도 된다. True : 꼭 필요, Fals
HTTP 요청 파라미터 – 쿼리 파라미터, HTML Form
강의 chap6-6 HTTP 요청 파라미터 – 쿼리 파라미터, HTML Form > #### 1. 클라이언트에서 서버로 요청 데이터를 전달하는 방법 GET – 쿼리 파라미터 /url?username=hello&age=20 POST – HTML Form content-type: application/x-www-form-urlencoded 메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20 HTTP message body에 데이터를 직접 담아서 요청 HTTP API에서 주로 사용, JSON, XML, TEXT 데이터 형식은 주로 JSON 사용 POST, PUT, PATCH > #### 2. 쿼리 파라미터(GET) GET 쿼리 파리미터 전송 방식이든, POST HTML Form 전송 방식이든 둘다 형식이 같으므로 구분없이 조회할 수 있다. HttpServletRequest가 제
HTTP 요청 – 기본, 헤더 조회
강의 chap6-5 HTTP 요청 – 기본, 헤더 조회 > #### 1. HTTP 헤더 정보 조회 애노테이션 기반의 스프링 컨트롤러는 다양한 파라미터를 지원한다. 헤더 정보를 log를 통해 조회한다. HttpMethod : Http 메서드를 조회한다.(GET, POST..) Locale : Locale 정보를 조회한다.(ko) MultiValueMap : 하나의 키에 여러 값을 받을 수 있다. @RequestHeader MultiValueMap headerMap : 모든 HTTP 헤더를 MultiValueMap 형식으로 조회한다. @RequestHeader("host") String host : 특정 HTTP 헤더를 조회한다. ->
요청 매핑 – API
강의 chap6-4 요청 매핑 – API > #### 1. 시나리오 회원 목록 조회 : GET : “/users” 회원 등록 : POST : “/users” 회원 상세 조회 : GET : “/users/{userId}” 회원 수정 : PATCH : “/users/{userId}” 회원 삭제 : DELETE : “/users/{userId}” > #### 2. Controller 출처 인프런 강의 - 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
요청 매핑
강의 chap6-3 요청 매핑 > #### 1. 요청 매핑 어떤 요청이 왔을 때 어떤 컨트롤러가 호출이 돼야하는지 매핑하는 것이다. > #### 2. MappingController @RequestMapping("/hello-basic") : /hello-basic URL 호출이 오면 이 메서드가 실행되도록 매핑한다. 대부분의 속성을 배열[] 로 제공하므로 다중 설정이 가능하다. {"/hello-basic", "/hello-go"} > #### 3. HTTP 메서드 @RequestMapping 에 method 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게 호출된다. POST, GET, PUT 등 다 보내준다. @GetMapping으로 특정 지어서 설정해주는 것이 좋다. > #### 4. @PathVariable(경로 변수) 사용 url자체에 값이 있는 경우 @PathVariable의
로깅
강의 chap6-2 로깅 > #### 1. 로깅 설정 SLF4J 라이브러리를 사용한다. SLF4J는 인터페이스이며 구현체로 Logback을 사용한다. SLF4J의 Logger를 사용한다. @RestController : 일반 @Controller는 뷰를 반환하지만 @RestController는 return 타입을 그대로 반환한다. 다양한 정보를 찾을 수 있다.(시간, 로그 레벨, 프로세스 ID, 쓰레드 명, 클래스명, 로그 메시지) Trace, debug, info, warn, error는 각각의 레벨로써 기본 설정은 info이기 때문에 info, warn, error를 출력한다. Application.properties에 설정 // 전체 로그 레벨 설정(기본 in
스프링 MVC – 실용적인 방식
강의 chap5-6 스프링 MVC – 실용적인 방식 > #### 1. 목표 지금까지 ModelView를 개발자가 직접 생성해서 반환했다. 이를 편리하게 개발할 수 있도록 한다. 실무에서 많이 사용하는 방식을 사용해본다. > #### 2. 컨트롤러 애노테이션 기반의 컨트롤러는 ModelView를 반환해도 되고 문자열을 반환해도 된다. @RequestParam을 사용함으로써 파라미터를 직접 받을 수 있다. 단점 : GET, POST를 구분하지 않았다. > #### 3. GET/POST @RequestMapping(value = "/new-form", method = RequestMethod.GET) @RequestMapping(value = "/save", method = RequestMethod.POST) @RequestMapping(method = RequestMethod.GET) 이렇게 제약
스프링 MVC – 컨트롤러 통합
강의 chap5-5 스프링 MVC – 컨트롤러 통합 > #### 1. 목표 V1의 방식은 메서드에 @RequestMapping을 적용했다. 컨트롤러 클래스에 하나로 통합하여 유연하게 한다. > #### 2. 컨트롤러 그동안 다른 클래스에 구현했던 메서드들을 하나의 컨트롤러 클래스로 구현한다. 클래스 레벨의 @RequestMapping에 중복된 url을 담아둔다. 출처 인프런 강의 - 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링MVC – 시작하기
강의 chap5-4 스프링MVC – 시작하기 > #### 1. @RequestMapping 스프링이 제공하는 컨트롤러는 애노테이션 기반으로 동작하므로 매우 실용적이다. > #### 2. 회원 등록 @Controller : 내부에 @Component가 있어서 자동으로 Component scan에 의해 spring bean에 등록된다. RequestMappingHandlerMapping가 이를 통해 핸들러 매핑 대상으로 인식하게 된다. @RequestMapping : 요청 정보를 매핑한다. RequestMappingHandlerMapping은 @RequestMapping 또는 @Controller가 클래스 레벨에 붙어 있는 경우에 매핑 정보로 인식한다. > #### 3. 회원 저장 > #### 4. 회원 목록 출처 인프런 강의 - 김영한 스프링 MVC 1편 -