chae._.chae

(1) 스프링부트 Controller 기본 동작 방식 본문

스프링/인스타그램 클론코딩

(1) 스프링부트 Controller 기본 동작 방식

walbe0528 2022. 7. 7. 23:30
728x90
반응형

@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로 넣어준 값이 출력된다. 

728x90