9-2. Spring 기반 REST Service 구현

동동주·2024년 6월 7일
0

spring 기말고사

목록 보기
4/11

🥠 JSON

  • 속성 이름-값 쌍으로 이루어진 데이터(객체)들을 전달하기 위한 텍스트 형식의 데이터 포맷
  • JavaScript의 구문 형식을 따르지만, 언어나 플랫폼에 독립적
  • 클라이언트-서버 간의 비동기 통신(Ajax)에서 사용됨

⚡ Data Types

  • 수(number): 정수, 실수

  • 문자열(string): 큰 따옴표(")로 구분

  • 배열(Array): 0개 이상의 원소들로 구성된 순서 있는 리스트

    • 원소는 JSON data type
    • 대괄호 []로 나타내며, 각 원소는 쉼표로 구분
  • 객체(Object): 순서가 없는 이름-값 쌍의 집합 (map과 유사)

    • 이름(키)은 문자열(반드시 큰 따옴표 사용)
    • 값은 JSON datatype
      중관로 {}로 나타내며, 각 이름-값 쌍들은 쉼표로 구분
    • 이름과 값은 콜론(:)으로 구분
  • null: 값이 없음

  • JSON 예시

{
  "user": {
    "id": 12345,
    "name": "John Doe",
    "email": "johndoe@example.com",
    "age": 30,
    "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "state": "CA",
      "postalCode": "12345"
    },
    "phoneNumbers": [
      {"type": "home","number": "555-123-4567"},
      {"type": "work","number": "555-987-6543"}
    ],
    "isActive": true,
    "roles": [],
    "googleId": null,
    "createdAt": "2023-01-01T12:00:00Z",
    "lastLogin": "2023-06-07T08:45:00Z"
  }
}

🥠 Jackson2를 이용한 JSON 처리

  • Jackson2: Java 객체와 JSON 형식의 데이터 간의 변환 실행 (데이터 바인딩 가능)

⚡Controller: GET 요청 처리

  • Java 객체를 JSON 데이터로 변환하여 응답 메시지로 전송
@RestController
@RequestMapping("/api")
public class MessageController {

    @GetMapping("/messages")
    public List<Message> getMsgsInJson() {
        List<Message> messages = new ArrayList<>();

        messages.add(new Message(1, "Hello, World!", "Alice", "2023-06-07T10:00:00Z"));
        messages.add(new Message(2, "Spring Boot is awesome!", "Bob", "2023-06-07T10:05:00Z"));
        messages.add(new Message(3, "RESTful APIs are powerful.", "Charlie", "2023-06-07T10:10:00Z"));

        return messages;
    }
}
  • Request handler method가 Java 객체(List)나 HashMap을 return할 경우, Spring이 MappingJackson2HttpMessageConverter를 이용하여 return 객체를 JSON 데이터로 변환함

⚡Controller: POST 요청 처리

  • 요청 메시지를 통해 전송된 JSON 데이터를 Java 객체로 변환하여 사용
@RestController
@RequestMapping("/api")
public class MessageController {

    private List<Message> messages = new ArrayList<>();

    @PostMapping("/messages")
    public Message postMsgsInJson(@RequestBody Message message) {
        messages.add(message);
        return message;
    }
}

@ResponseBody(@RestController)가 필요한 이유
메소드의 반환값이 자동으로 JSON 또는 XML 같은 형식으로 직렬화되어 클라이언트에게 전달됨. 이 과정에서 Jackson 라이브러리 등이 사용됨

@JsonIgnore

JSON 변환 제외 처리할 때 @JsonIgnore 이용

  • JSON 데이터에 포함시키지 않을 필드 지정
  • 그럼 응답 메시지에 출력 XX

@JsonFormat

날짜 형식 변환 처리할 때 @JsonFormat 이용

  • Date나 LocalDateTime 타입의 필드 값을 ISO-8601 형식이나 임의의 패턴의 문자열로 변환 지정 가능
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC")
    private Date timestamp;
  • 응답 ➡️ "timestamp": "2023-06-07T10:15:00.000Z"

🥠 RestTemplate

‼️ Parameterized URL (Path variable) 사용

  • 가변 길이 인자 사용
Product product = restTemplate.getForObject(
	"http://localhost:8080/category/{catId}/product/{prodId}",
    Product.class, "c1", "p1");
  • Map 이용
 // URI 변수 값을 설정하는 Map
 Map<String, String> uriVariables = new HashMap<>();
 uriVariables.put("catId", "c1");
 uriVariables.put("prodId", "p1");

 // getForObject 메소드 호출
 Product product = restTemplate.getForObject(
 "http://localhost:8080/category/{catId}/product/{prodId}",
 Product.class, uriVariables);

0개의 댓글