[TIL] 230627 Spring: 어떻게 데이터를 가져오지?

CountryGirl·2023년 6월 27일
0

TIL

목록 보기
10/80

📌 데이터를 Client 에게 반환하는 방법

JSON 형태는 서버에서 읽을 수 없다.

  1. JSON 형태로 내보내고 싶으면 String 으로 JSON 형태로 만들어서 내보내야한다.
    return {"\"name\":\"Kim\",\"age\":10}";

    이렇게 내보내게 되면 생긴 형태는 JSON 이지만 HTTP에서는 text 형태라고 인식한다.

  2. @ResponseBody annotation 을 달아준다.
    자바 객체로 반환하게 되면 JSON 으로 반환한다. (Spring 내부에서 자동적으로)
    하지만 자동적으로 Controller는 html 을 찾기 때문에 "html 이 아닌 데이터를 반환할 것 이다!" 라는 의미로 @ResponseBody annotation 을 달아주어야 데이터를 내보낼 수 있다.

  3. @RestController annotation 을 달아준다.
    @Controller 가 아닌 @RestController 를 달아주면 @ResponseBody annotation 을 달지 않아도 자동으로 데이터를 반환해준다.


📌 Jackson

자바의 객체를 JSON 타입의 Stirng 으로 변환해줄 수 있고 JSON 타입의 String 값을 자바의 객체로 변환해줄 수 있다.

객체 ⇄ JSON 타입의 String

** build.gradle 에서 추가하지 않아도 자동으로 추가가 된다.

✅ 객체 ➔ JSON 타입

ObjectMapper(Jackson라이브러리)를 사용한다.

ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper(객체이름)

🚨 변환할 때 ObjectMapper가 Getter를 사용한다₩.
그러므로 객체에 get method가 필수로 있어야한다.

✅ JSON 타입 ➔ 객체

ObjectMapper(Jackson라이브러리)를 사용한다.
먼저 String 으로 JSON 형태 문자열을 만들어준다.

String json ={\“name\“:\“Kim\“,\“age\“:10};
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(json, Person.class);

🚨 객체에 기본생성자가 필수로 있어야한다.
🚨 Getter 나 Setter 둘 중 하나가 필수로 있어야한다.
🚨 객체의 필드이름과 JSON 형태의 key 값과 동일해야한다. 일치하지 않으면 찾을 수 없기 때문에 오류가 발생한다.


📌 Path Variable과 Request Param

😎 Path Variable

보내려고 하는 데이터를 브라우저 경로 넣어 놓는 방법
http://localhost:8080/hello/person/Kim/age/10

메서드 파라미터에 @PathVariable annotation 을 달아준다.

@GetMapping(/hello/person/{name}/age{age})
@ResponseBody
public String helloRequestPath (@PathVariable String name, @PathVariable int age) {
	return String.format("name = %s, age = %d", name, age);
}

😎 Request Param (Query String)

물음표로 데이터를 보내고 & 로 데이터를 구분한다.
http://localhost:8080/hello/form/param?name=Kim&age=10
메서드 파라미터에 @RequestParam 이라는 annotation 을 달아준다.

@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age){
	return String.format("name = %s, age = %d", name, age);
}

@RequestParam은 생략이 가능하다.

🚨 GET 방식에서 들어오는 데이터가 있을 수도 있고 없을 수도 있다.
그 때마다 새로운 메서드를 만들 순 없기 때문에 @RequestParam 에 required = false 라는 옵션을 추가해준다.
그러면 그 데이터가 포함되지 않아도 오류가 발생하지 않으면서 null 로 초기화가 된다.

POST는 GET 과 달리 Body(Payload) 부분을 가지고 있다.
GET 방식은 경로에서 데이터를 확인할 수 있지만 POST는 Payload 안에서 확인할 수 있다.


📌 HTTP 데이터를 객체로 처리하는 방법

[POST : Query String]
Body 에 데이터가 들어왔을 때
@ModelAttribute annotation 을 사용하면 Body 에 들어온 Query String 방식의 데이터를 객체에 mapping 해서 가져올 수 있다.

[GET]
@ModelAttribute annotation 사용해서 Query String 방식으로 받아올 수 있다.

🚨 Setter 또는 오버 로딩된 생성자가 꼭 필요하다.
그래야 데이터를 받아올 수 있기 때문에 만약에 없다면 null 값으로 초기화가 된다.

👍🏻 데이터 종류가 적으면 괜찮지만 데이터가 name, age, birth, height, … 이렇게 많이 들어오면 하나하나 @RequestParam &로 작성해야하기 때문에 객체로 한번에 받을 수 있도록한다.

[POST : JSON]
HTTP Body에 JSON형태로 데이터가 넘어왔을 때 @RequsetBody annotation 을 이용해서 💬 "JSON형태로 받아와주세요!" 라고 알려야한다. 역시 객체의 필드명과 클라이언트에서 보내는 데이터와 동일해야한다. 동일하지 않으면 null 이 나온다.

profile
💻🌾시골소녀의 엉망징창 개발 성장일지🌾💻 (2023.05.23 ~)

0개의 댓글