| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- rest api
- Merge sort
- 너비우선탐색
- 비지도학습
- 지도학습
- HTTP
- 스택과 힙
- BOJ
- 프로그래머스
- 딥러닝
- 코딩테스트
- 자바
- 코딩
- 캐싱
- 강화학습
- post
- 깊이우선탐색
- 파이썬 오류
- 오버라이딩
- 멱등
- 이진탐색
- 코테
- 파이썬 알고리즘
- bineary search
- 파이썬
- 알고리즘
- 백준
- 해시
- 머신러닝
- 딕셔너리
- Today
- Total
chae._.chae
(1) 스프링부트 Controller 기본 동작 방식 본문
@RestController : data를 응답하는 컨트롤러(클라이언트가 핸드폰이면 data를 응답)
@Controller : file을 응답하는 컨트롤러 (클라이언트가 브라우저이면 .html을 응답해야 함)
웹브라우저에서는 GET요청만 확인 가능하다. (나머지는 postman을 활용하자!)
(1) http쿼리 스트링(querystring) , 주소 변수 매핑(path variable)
- 구체적인 데이터 요청시에 쿼리 스트링이나 주변변수 매핑이 필요하다
- 스프링부트에서는 주소변수 매핑을 주로 사용한다.(훨씬 편리함)
- querystring : GET & http://localhost:8080/get?type=양념 (주소 뒤에 물음표와 함께 구체적인 요청을 한다.)
- path variable : GET & http://localhost:8080/get/양념
쿼리 스트링과 주소변수 매핑 방법을 사용해 두가지 컨트롤러를 만들어준다.
@RestController
public class QueryPathController {
@GetMapping("/chicken")
public String chickenQuery(String type){
return type + "배달갑니다.(쿼리스트링)";
}
@GetMapping("/chicken/{type}")
public String chickenPath(@PathVariable String type){
return type + "배달갑니다.(주소변수매핑)";
}
}


쿼리 스트링을 이용할때 URL주소에 값을 넣어주지 않으면 null이 전달된다. 물음표를 사용해 값을 넘겨준다.

주소 변수 매핑은 "/양념"을 뒤에 붙여준다. (거의 이 방법 위주로 사용한다.)
(2) http body 데이터 전송하는 법
- http header의 Content-Type : http body에 어떤 종류의 데이터가 들어있는지 알려준다.
- body 데이터를 전송할때 Content-Type을 함께 알려줘야 받는 쪽에서 수월하게 처리할 수 있기에, htttp 헤더에 프로토콜로 존재한다.(무조건 있어야 한다.) POST/PUT 요청시에 명시해줘야 한다.
스프링부트는 기본적으로 x-www-form.unlencoded 타입으로 인식하고, 파싱해준다.
- x-www-form.unlencoded : "key=value"의 형태
- text/plain : 일반적인 메시지 형태("안녕")
- application/json : {"username" : "cos" }의 json형태
세가지 타입에 대해 컨트롤러를 만들어준다. (정상 전달 확인을 위해 log를 찍어서 확인해본다)
@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 "plain/text 옴";
}
@PostMapping("/body3")
public String applicationjson(@RequestBody String data){
log.info(data);
return "json 전송옴";
}
@PostMapping("/body4")
public String applicationjsonToObject(@RequestBody User user){
log.info(user.getUsername());
return "json 전송옴";
}
/body4에 사용될 User
public class User {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}

메서드에서 파라미터로 받는 username과 postman으로 전송시 key값인 username의 변수명이 동일해야 한다.
변수명이 달라지면 값을 받지 못해 null이 출력된다.

plain/text 전달시 key값이 없기 때문에, @RequestBody 어노테이션을 사용하여 받아준다.

JSON 또한 @RequestBody 어노테이션을 사용한다.

username을 꺼내기 위해서 Object로 받아주고, User 클래스를 만들어 Getter/Setter를 만들어 이름을 꺼내준다.
(3) http 요청을 JSON으로 응답하기
@GetMapping("/resp/json")
public String respJson(){
return "{\"username\":\"cos\"}";
}
@GetMapping("/resp/json/object")
public User respJsonObject(){
User user = new User();
user.setUsername("한채연");
return user;
}

확장프로그램인 JSON Viewer를 설치하면 왼쪽처럼 결과를 예쁘게 출력할 수 있다.(미설치시 줄바꿈 없이 출력된다)

MessageConverter가 자동으로 자바 객체(user)를 JSON으로(구: xml) 변경해서 통신을 통해 응답한다.
@RestController 일때만 MessageConverter가 작동한다.
(4) http 요청을 파일로 응답하기
- .txt 파일로 응답하기 (기본경로는 scr/main/resources/static)
- 스프링부트가 지원하는 .mustache파일로 응답하기
- 스프링부트가 쓰지 않는 .jsp파일로 응답하기
.mustache와 .jsp파일은 html파일에 java코드를 쓸 수 있는 템플릿 엔진을 갖고 있다.
@Controller
public class HttpRespController {
@GetMapping("/txt")
public String txt(){
return "a.txt";
}
@GetMapping("/mus")
public String mus(){
return "b";
}
}

resources/static/a.txt파일이 리턴되어 파일 안의 내용을 브라우저가 읽어 나타난다.
프레임워크를 사용하기에 틀이 이미 정해져 있어 resources/static이 디폴트 경로이다.
templates 폴더안에 .mustache를 만들어 두면, b.mustache가 아니라 확장자 없이 파일 이름만 적어도 알아서 자동으로
찾아간다.
확장자를 적어주면 static폴더를 찾아가고, 적지 않으면 templates폴더를 찾아간다.
jsp 엔진 사용시 src/main/webapp 폴더가 디폴트 경로이다.

spring:
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
위의 경로의 c.jsp파일을 찾고 싶으면 application.yml에서 설정을 변경해준다. (뷰 리졸버-VIewResolver가 해준다)
즉, /WEB-INF/views/c.jsp를 찾는다.
=> mustache는 스프링부트가 지원을 해주기에 따로 설정을 해주지 않고 사용이 가능하고, jsp는 지원해주지 않기에 따로 변경해줘야 한다.
@GetMapping("/jsp/java/model")
public String jspToJavaToModel(Model model){ // 함수의 파라미터에 Model을 선언해주고
User user = new User();
user.setUsername("한채연");
model.addAttribute("username", user.getUsername()); // addAttribute함수로 전달
return "e";
}
e.jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1> This is e </h1>
<h3> ${username} </h3>
</body>
</html>
username이라는 key 값이 e.jsp로 전달이 되어 사용 가능하다. Model을 통해서 html페이지로 자바코드를 전달할 수 있다.
addAttribute로 넣어준 값이 출력된다.
'스프링 > 인스타그램 클론코딩' 카테고리의 다른 글
| (8) 프로필 페이지 - 사용자에 따라 페이지 다르게 보여주기 + 구독자수, 구독 여부 나타내기 (0) | 2022.07.19 |
|---|---|
| (7) 프로필 페이지 - 이미지 보여주기 (0) | 2022.07.19 |
| (6) 프로필 페이지 - 이미지 업로드 및 예외처리 (0) | 2022.07.19 |
| (3) 로그인하기 - UserDetailsService (0) | 2022.07.18 |
| (2) 시큐리티 세팅 및 회원가입 구현 (+예외처리) (0) | 2022.07.13 |