YML(YAML)은 '사람이 읽을 수 있는 데이터 직렬화 언어' 라고 불린다. XML/JSON 과 같은 사람이 읽을 수 있는 언어이지만 이 둘보다더 세팅에서 쉽고 보기 좋다는 강점이 있다.
키와 밸류로 구성된 파일이고 JSON과 상위 호환이 된다는 장점이 있다
공백은 반드시 '/' 혹은 스페이스 바로 구성되어야 하고 키와 밸류 사이에 공백이 존재해야함.
키와 밸류의 매핑은 ':'으로 구분
다시돌아와 YML(혹은 properties)는 스프링부트로 개발을 할 때 스프링부트 설정에 대한 사용법을 기술 해놓은 페이지라고 볼 수 있다. 그리고 그 페이지에 기술되있지 않은 것들은 작동에 오류를 일으킨다던지 하는 것 (포트번호/컨텍스트패스/UTF-8설정/MVC 설정/DB 설정/JPA 설정 등)
03 스프링부트의 핵심 컨트롤러 이해
스프링부트의 핵심은 앞단에서 어떻게 컨트롤러를 나누는 가 이다. 원래 가장 기본적인 개념은 요청(REQUEST)이 오면 거기에 맞는 JAVA 파일('Front Controller.java)'이 불러지는 것인데 개수가 점점 늘어나면 하나의 컨트롤러에 엄청난 부담이 간다. 그래서 나눈것이 도메인 별로 컨트롤러를 분기화 시키는 것. 즉, 로그인/회원가입 등 사용자에 대한 요청은 'UserController.Java'가 처리하고 글쓰기/글삭제 등은 'BoardController.java'가 처리하게 하는 등의 방식이다
도메인으로 분기화 시킨 후에 각각의 요청을 어디 컨트롤러에 보내야 하는지에 대한 도움을 주는 것이 'Dispatcher'(Servlet/Request Dispatcher)
스프링부트의 프레임워크는 이 디스패처/컨트롤러를 만들 필요 없이 직접 제공해 준다.
즉 스프링부트에서 컨트롤러에 대한 이해만 잘하면 개발을 잘 할 수 있다!!
04 HTTP의 4가지 요청 방식
요청이란 클라이언트(사용자-웹브라우저)가 서버에 요청을 한다는 것.
보통 웹서버(DB)는 SELECT/INSERT/UPDATE/DELETE 요청을 받고 거기에 대해 응답을 함
클라이언트가 요청하는 종류는 4가지 GET - 데이터 요청 POST - 데이터 전송 PUT - 데이터 갱신 DELETE - 데이터 삭제
웹 프로세스 축약을 하면 1) 클라이언트 요청-GET(http://ip주소/user/ssar) - 유저 'ssar'에 대한 정보 요청 (엔드포인트라 불리며 서버에 어떤 요청을 하는지 보여주는 형태) 2) 웹 서버는 엔드포인트에 맞게 DB에 요청(SELECT) 3) 웹 서버는 DB에 받은 데이터를 HTML/데이터 등으로 클라이언트가 파싱 가능한 형태로 돌려준다 4) 파싱이 가능한 이유는 GET/DELETE는 단순 요청이기때문에 데이터 없이 응답이 돌아가고 POST/PUT의 경우에는 HTTP 바디에 데이터 및 데이터 형식을 담아 요청하기때문에 거기에 맞춰 응답이 가능하므로 파싱이 된다.
04-1 HTTP 4가지 요청 실습
실습 기본 세팅
Spring Web -> WEB MVC 패턴의 기본적인 요소를 가지고 있고 내장형 톰켓을 컨테이너로 기본 탑재
Spring Boot DevTools -> 파일변경이되면 자동 재실행하여 프로젝트 갱신
컨트롤러 세팅
@RestController
public class HttpController {
@GetMapping("/get")
public String get() {
return "<h1>GET 요청</h1>";
}
@PostMapping("/post")
public String post() {
return "POST 요청";
}
@PutMapping("/put")
public String put() {
return "PUT 요청";
}
@DeleteMapping("/delete")
public String delete() {
return "DELETE 요청";
}
}
@RestController는 데이터 응답 및 return의 문자열 응답
@Controller를 붙이면 return에 적은 파일 형태로 응답
@.....Mapping을 통해 요청 주소를 정의 → "http://localhost:8080/get"
테스트굿!
중요포인트 - 웹브라우저에서는 GET요청 밖에 되질 않는다. 포스트맨으로 뿌려보자
굿!
05 - 쿼리스트링/주소 변수 매핑(path variable)
구체적인 데이터 요청시에 쿼리스트링 혹은 주소변수매핑이 필요하다
둘다 HTTP 프로토콜 기반으로 되어있고 주소 맨 뒷 부분에 구체적 데이터를 표시한다 (쿼리스트링 → '8080?name=ssar' / 주소변수매핑 → '8080/ssar')
테스트 - 컨트롤러 세팅
@RestController
public class QueryPathController {
@GetMapping("/name")
public String nameQuery(String name) {
return name+" 요청(쿼리스트링)";
}
@GetMapping("/name/{name}")
public String namePath(@PathVariable String name) {
return name+" 요청(주소변수매핑)";
}
}
굿!
주소변수매핑방식이 가독성면에서나 개발자의 실수를 줄이는 면에서나 훨씬 편하다
06 HTTP 바디 분석
HTTP 바디를 보기전 HTTP 헤더부분의 Content-Type을 이해할 필요가 있다.
헤더는 요청/응답에 대한 정보를 담고 있다. 즉 어떤 종료의 요청이며 어떤 데이터 형식으로 요청이 오는지 나와있고 거기에 맞게 응답을 HTTP 바디에 넣어 해주면 되는 것
POST/PUT요청시에 헤더에 컨텐트 타입이 프로토콜 규약으로 반드시 표시되어야함
스프링 부트는 기본적으로 'x-www-form-urlencoded' 타입 (키=밸류)로 되어있는 데이터타입을 파싱(분석) 해준다
많이 쓰이는 방식들은 x-www-form, text/plain, application/json
실습 - 컨트롤러 세팅
@RestController
public class HttpBodyController {
private static final Logger log = LoggerFactory.getLogger(HttpBodyController.class);
@PostMapping("/body1")
public String xwwwformurlEncoded(String username) {
log.info(username);
return "key=value 형식의 데이터 요청옴";
}
@PostMapping("/body2")
public String plainText(@RequestBody String data) {
log.info(data);
return "단순 텍스트 형식의 데이터 요청옴";
}
@PostMapping("/body3")
public String applicationJson(@RequestBody String data) {
log.info(data);
return "JSON 형식의 데이터 요청옴";
}
}
기본전략 xwwwform 형태는 아무것도 안붙이고 파라미터만 넣어주면 알아서 파싱을 해주고, 나머지는 @RequestBody라는 데이터 받기용 어노테이션을 붙여야 데이터가 넘어온다.
@RequestBody - 클라이언트가 보내는 HTTP 요청 본문(JSON 및 XML 등)을 Java 오브젝트로 변환하는 것
스프링부트의 기본적략으로 인해 변수명을 똑같이 맞추면 알아서 파싱을 해준다
다른 방식들
하지만 통상 JSON을 많이쓰고 데이터가 넘어온 형태는 JSON 전체형태로 넘어왔기때문에 다르게 받아 보자
데이터의 필요한 값만 받기 위한 데이터용 클래스
public class User {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
컨트롤러 수정
@PostMapping("/body4")
public String applicationJson2(@RequestBody User user) {
log.info(user.getUsername());
return "JSON 형식의 데이터 요청옴";
}