Spring

Response 내려주는 방법

개발자 김혜린 2022. 4. 19. 23:00

TEXT로 내려주기 / JSON으로 내려주기 /  200 & 201 Status로 내려주기

package com.example.response.controller;


import com.example.response.dto.User;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class ApiController {

    // TEXT
    @GetMapping("/text")
    public String test(@RequestParam String account){
        return account;
    }

    //JSON
    //user라는 객체를 @RequestBody로 받아 User로 리턴한다.
    //request가 오면, object mapper를 통해 object로 바뀌게 된다.
    //그리고 아래 method를 타게 되고, response 나갈 때 object를 던진다.
    //그럼 도다시 object mapper를 통해 json으로 바뀌게 되어 response로 내려간다.
    //req->object mapper->object->method->object->object mapper->json->response
    @PostMapping("/json")
    public User json(@RequestBody User user){
        return user; // 200 ok
    }

    //put으로 생성되었다고 하면 201, 불러오면 200? 아무튼 200/201 둘다 내려옴
    @PutMapping("/put")
    public ResponseEntity<User> put(@RequestBody User user){
        //ResponseEntity로 제네릭을 설정해줘서 response를 내려줄 때 status를 정해줄 것이다.

        return ResponseEntity.status(HttpStatus.CREATED).body(user); //생성 시 명확하게 201 코드내려주고 body 싣기
            // body에 user 데이터 보내는데 이것도 object mapper를 통해 json으로 바뀜

        //응답에 대한 커스터마이징이 필요하면, ResponseEntity를 사용하면 된다
    }
}

 

 

HTML 페이지 돌려주는 컨트롤러

 

 

PageController에서 JSON으로 내려주기(중요 : 원래는 보통 html만 내려줌!)

package com.example.response.controller;

import com.example.response.dto.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller //HTML 파일을 찾게 됨
public class PageController {

    @RequestMapping("/main")
    public String main(){
        return "main.html"; //@Controller는 String으로 return 하면 리소스파일을 찾게 됨
    }

    // ResponseEntity

    @ResponseBody //객체 자체를 return했을 때 리소스를 안찾고, ResponseBody를 만들어 보내겠다는 뜻
    @GetMapping("/user")
    public User user(){

        //원래는 User user = new User();
        var user = new User(); //자바 11버전부터 추가, 타입을 추론하여 축약됨
        user.setName("Kim Hyerin");
        user.setAddress("달리는 공룡");
        return user;
    }
}

 

public String으로 돌려주면,

return "main.html"; 을 하면

자동으로 resources 폴더의 static안의 html 파일을 찾아 내려주게 된다.  

그렇다면 이 부분에서 Json은 어떻게 내려줄 것인가? 

 

PageController에서 Json을 내려주려면

@ResponseBody

로 내려보내주면 된다.

 

 

Null로 리턴하지 않기

int는 primitive 값으로 입력하지 않으면 0이 들어간다.

Null로 리턴하고 싶으면 Integer로 타입을 지정해준다.

 

Null값 포함하지 않고 Response 내려주기

@JsonInclude(JsonInclude.Include.NON_NULL)

package com.example.response.dto;


import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

@JsonNaming(value= PropertyNamingStrategy.SnakeCaseStrategy.class)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
    private String name;
    private Integer age;

    @JsonProperty("phone_number")
    private String phoneNumber;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", phoneNumber='" + phoneNumber + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}