Skip to content

Latest commit

Β 

History

History
354 lines (260 loc) Β· 10.1 KB

File metadata and controls

354 lines (260 loc) Β· 10.1 KB

λͺ©μ°¨



RestTemplate - Quick Start

RestTemplate은 μŠ€ν”„λ§ 3.0λΆ€ν„° μ§€μ›ν•˜λŠ” Spring Rest Client쀑 ν•˜λ‚˜μ΄λ‹€.

RestTemplate은 μŠ€ν”„λ§μ„ 톡해 λ‹€λ₯Έ μ„œλ²„μ— HTTP μš”μ²­μ„ ν•˜κΈ°μ‰½λ„λ‘ μΆ”μƒν™”μ‹œμΌœλ†“μ•˜μœΌλ©°, μ‚¬μš©μžλ‘œν•˜μ—¬κΈˆ μ‰½κ²Œ HTTP μš”μ²­μ„ ν•  수 μžˆλ„λ‘ 도와쀀닀.

이번 글은 RestTemplate을 μ΄μš©ν•˜μ—¬ HTTP μš”μ²­μ„ ν•΄λ³΄λŠ” Quick-Start이닀.

κ°„λ‹¨ν•œ νšŒμ› CRUD μ„œλ²„λ₯Ό λ„μ›Œλ†“κ³ , RestTemplate의 κΈ°λŠ₯듀을 ν…ŒμŠ€νŠΈν•œλ‹€.

ν˜„μž¬λŠ” μŠ€ν”„λ§ 5.0의 WebClientκ°€ λ‚˜μ˜€λ©΄μ„œ Deprecated λ˜μ—ˆλ‹€.

κ·ΈλŸΌμ—λ„ μ•„μ§κΉŒμ§€λ„ RestTemplate을 μ΄μš©ν•˜λŠ” ν”„λ‘œμ νŠΈλŠ” λ§ŽκΈ°μ—.. 이번 글을 μ •λ¦¬ν•˜κ²Œλ˜μ—ˆλ‹€.

λ§Œμ•½ μƒˆλ‘œμš΄ ν”„λ‘œμ νŠΈλ₯Ό μ‹œμž‘ν•˜λŠ” 것이라면 WebClient μ‚¬μš©ν•˜λŠ” 것을 μΆ”μ²œν•œλ‹€. (μ΄μœ λŠ” 이번 κΈ€μ˜ λͺ©μ κ³Ό λ‹€λ₯΄κΈ°μ— 좔후에 μžμ„Ένžˆ 닀룬닀.)


ν…ŒμŠ€νŠΈμš© μ„œλ²„

이번 글은 직접 RestTemplate을 μ΄μš©ν•˜μ—¬ νŠΉμ • μ„œλ²„μ— HTTP μš”μ²­μ„ 보내본닀.

κ·ΈλŸ¬κΈ°μœ„ν•΄μ„  κ°„λ‹¨ν•œ 응닡을 해쀄 μ„œλ²„κ°€ ν•˜λ‚˜ ν•„μš”ν•˜κΈ°μ—, ν•„μžκ°€ κ°„λ‹¨νžˆ νšŒμ› CRUDλ§Œμ„ μ§€μ›ν•˜λŠ” μ„œλ²„λ₯Ό λ§Œλ“€μ—ˆλ‹€.


πŸ’β€β™‚οΈ API λͺ…μ„Έ

μƒμ„±λœ νšŒμ› μ„œλ²„μ˜ API λͺ…μ„ΈλŠ” μ•„λž˜μ™€ κ°™λ‹€.

  • νšŒμ› 쑰회 - GET /users/{id}
  • νšŒμ› 리슀트 쑰회 - GET /users
  • νšŒμ› 등둝 - POST /users
  • νšŒμ› μˆ˜μ • - PUT /users/{id}
  • νšŒμ› μ‚­μ œ - DELETE /users/{id}

μžμ„Έν•œ μ½”λ“œλŠ” μ—¬κΈ°λ₯Ό μ°Έκ³ ν•˜λ©΄ λœλ‹€.

이번 κΈ€μ˜ ν…ŒμŠ€νŠΈλŠ” λͺ¨λ‘ μœ„ μ„œλ²„λ₯Ό 둜컬 (localhost:8080)에 μ‹€ν–‰ν•΄λ‘” μƒνƒœμ—μ„œ μ§„ν–‰λœλ‹€.


자주 μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œ

본격적으둜 RestTemplateκ°€ μ§€μ›ν•˜λŠ” 각각의 λ©”μ„œλ“œλ₯Ό μ‚΄νŽ΄λ³΄κΈ°μ „μ—, 자주 μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œλ₯Ό κ°„λ‹¨νžˆ 정리해본닀.

  • getForEntity() - GET μš”μ²­μ„ μ‹€ν–‰ν•˜κ³  HTTP μ‘λ‹΅μ˜ μƒνƒœ κ°’κ³Ό λ°”λ”” κ°’(μ§€μ •ν•œ 객체둜 λ³€ν™˜ν•˜μ—¬)을 ResponseEntity에 λ„£μ–΄μ„œ λ°˜ν™˜ν•œλ‹€.
  • getForObject() - getForEntity()와 λ™μΌν•˜μ§€λ§Œ, HTTP의 응닡 λ°”λ”” κ°’(μ§€μ •ν•œ 객체둜 λ³€ν™˜λœ)λ§Œμ„ λ°”λ‘œ λ°˜ν™˜ν•œλ‹€.
  • exchange() - GET, POST, PUTκ³Ό 같은 HTTP λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜λ©°, HTTP μ‘λ‹΅μ˜ μƒνƒœ κ°’κ³Ό λ°”λ”” κ°’(μ§€μ •ν•œ 객체둜 λ³€ν™˜ν•˜μ—¬)을 ResponseEntity에 λ„£μ–΄μ„œ λ°˜ν™˜ν•œλ‹€.
  • execute() - exchange()κ³Ό μœ μ‚¬ν•˜μ§€λ§Œ, RequestCallbackκ³Ό ResultSetExtractorλ₯Ό νŒŒλΌλ―Έν„°λ‘œ μ„€μ •ν•  수 μžˆλ‹€.
  • headForHeaders() - HEAD μš”μ²­μ„ μ‹€ν–‰ν•˜λ©°, μ§€μ •λœ URL에 λŒ€ν•œ λͺ¨λ“  HTTP 헀더λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • optionsForAllow() - OPTIONS μš”μ²­μ„ μ‹€ν–‰ν•˜λ©°, Allows 헀더λ₯Ό μ‚¬μš©ν•˜μ—¬ μ§€μ •λœ URLμ—μ„œ ν—ˆμš©λ˜λŠ” HTTP λ©”μ„œλ“œλ₯Ό λ°˜ν™˜ν•œλ‹€.
  • delete() - μ£Όμ–΄μ§„ URL에 DELETE μš”μ²­μ„ μ‹€ν–‰ν•œλ‹€.
  • put() - μ£Όμ–΄μ§„ URL에 PUT μš”μ²­μ„ μ‹€ν–‰ν•œλ‹€. (λ°˜ν™˜ 값은 μ—†λ‹€.)
  • postForEntity() - POST μš”μ²­μ„ 톡해 μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜λ©°, HTTP μ‘λ‹΅μ˜ μƒνƒœ κ°’κ³Ό μƒˆλ‘œ μƒμ„±λœ λ°”λ”” κ°’(μ§€μ •ν•œ 객체둜 λ³€ν™˜ν•˜μ—¬)을 ResponseEntity에 λ„£μ–΄ λ°˜ν™˜ν•œλ‹€.
  • postForObject() - postForEntity()와 λ™μΌν•˜μ§€λ§Œ, HTTP의 응닡 λ°”λ”” κ°’(μ§€μ •ν•œ 객체둜 λ³€ν™˜λœ)λ§Œμ„ λ°”λ‘œ λ°˜ν™˜ν•œλ‹€.
  • postForLocation() - POST μš”μ²­μ„ 톡해 μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜λ©°, μƒμ„±λœ λ¦¬μ†ŒμŠ€μ˜ μ£Όμ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€.

더 λ§Žμ€ λ©”μ„œλ“œλŠ” RestTemplate docsλ₯Ό μ°Έκ³ .


GET λ©”μ„œλ“œ

GET λ©”μ„œλ“œλ₯Ό ν…ŒμŠ€νŠΈν•˜κΈ°μœ„ν•΄ λ¨Όμ € νšŒμ›(User)정보 3개λ₯Ό 미리 μƒμ„±ν•˜κ³  μ§„ν–‰ν•œλ‹€.


getForEntity()

@Test
void Get_getForEntity() {
    // given
    RestTemplate restTemplate = new RestTemplate();

    Long id = 1L;
    String url = LOCAL_URL + "/" + id;

    // when
    ResponseEntity<UserDto> response = restTemplate.getForEntity(url, UserDto.class);
    
    // then
    assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
    assertThat(response.getBody().getId()).isEqualTo(id);
}

응닡 λ°”λ”” 값을 String으둜 λ°›μ•„μ„œ 직접 ObjectMapper둜 λ³€ν™˜ν•΄μ€˜λ„λœλ‹€.

ν•˜μ§€λ§Œ ν•΄λ‹Ή 뢀뢄은 맀번 λ°˜λ³΅ν•΄μ•Όν•˜λŠ” 뢀뢄이기에, RestTemplate은 μ£Όμ–΄μ§„ 객체 νƒ€μž…μœΌλ‘œ μžλ™ λ³€ν™˜ν•΄μ€€λ‹€.


getForObject()

@Test
void Get_getForObject() {
    // given
    RestTemplate restTemplate = new RestTemplate();

    Long id = 1L;
    String url = LOCAL_URL + "/" + id;

    // when
    UserDto response = restTemplate.getForObject(url, UserDto.class);
    
    // then
    assertThat(response.getId()).isEqualTo(id);
}

getForObject()λŠ” getForEntity()와 μœ μ‚¬ν•˜μ§€λ§Œ, ResponseEntityκ°€ μ•„λ‹Œ, 응닡 κ°’λ§Œμ„ λ°˜ν™˜ν•œλ‹€.


exchange()

@Test
void Get_exchange() {
    // given
    RestTemplate restTemplate = new RestTemplate();

    Long id = 1L;
    String url = LOCAL_URL + "/" + id;

    HttpHeaders headers = new HttpHeaders();
    headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);

    HttpEntity<UserDto> request =
            new HttpEntity<>(headers);

    // when
    ResponseEntity<UserDto> response = restTemplate.exchange(url, HttpMethod.GET, request, UserDto.class);

    // then
    assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
    assertThat(response.getBody().getId()).isEqualTo(id);
}

HEAD λ©”μ„œλ“œ


headForHeaders()

@Test
void Head_headForHeaders() {
    // given
    RestTemplate restTemplate = new RestTemplate();

    String url = LOCAL_URL;

    // when
    HttpHeaders response = restTemplate.headForHeaders(url);

    // then
    assertThat(response.getContentType().includes(MediaType.APPLICATION_JSON)).isTrue();
}

POST λ©”μ„œλ“œ


getForEntity()

@Test
void Post_postForEntity() {
    // given
    RestTemplate restTemplate = new RestTemplate();

    String url = LOCAL_URL;
    String name = "test";
    int age = 27;

    HttpHeaders headers = new HttpHeaders();
    headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);

    HttpEntity<UserDto> request =
            new HttpEntity<>(new UserDto(null, name, age), headers);

    // when
    ResponseEntity<Long> response = restTemplate.postForEntity(url, request, Long.class);

    // then
    assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
    assertThat(response.getBody()).isOfAnyClassIn(Long.class);
    System.out.println(response.getBody()); // μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ User의 Entity ID
}

getForObject()

@Test
void Post_postForObject() {
    // given
    RestTemplate restTemplate = new RestTemplate();

    String url = LOCAL_URL;
    String name = "test";
    int age = 27;

    HttpHeaders headers = new HttpHeaders();
    headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);

    HttpEntity<UserDto> request =
            new HttpEntity<>(new UserDto(null, name, age), headers);

    // when
    Long response = restTemplate.postForObject(url, request, Long.class);

    // then
    assertThat(response).isNotNull();
    System.out.println(response); // μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ User의 Entity ID
}

change()

@Test
void Post_exchange() {
    // given
    RestTemplate restTemplate = new RestTemplate();

    String url = LOCAL_URL;
    String name = "test";
    int age = 27;

    HttpHeaders headers = new HttpHeaders();
    headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);

    HttpEntity<UserDto> request =
            new HttpEntity<>(new UserDto(null, name, age), headers);

    // when
    ResponseEntity<Long> response = restTemplate.exchange(url, HttpMethod.POST, request, Long.class);

    // then
    assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
    System.out.println(response); // μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ User의 Entity ID
}

PUT


put()

@Test
void Put_put() {
    // given
    RestTemplate restTemplate = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);

    String url = LOCAL_URL + "/" + 1L;
    String updatedName = "updated_user_name";
    int updatedAge = 27;
    HttpEntity<UserDto> request =
            new HttpEntity<>(new UserDto(null, updatedName, updatedAge), headers);

    // when
    restTemplate.put(url, request);
}

exchange()

@Test
void Put_Put() {
    // given
    RestTemplate restTemplate = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    headers.add("Accept", MediaType.APPLICATION_JSON_VALUE);

    String updatedName = "updated_user_name";
    int updatedAge = 27;
    HttpEntity<UserDto> request =
            new HttpEntity<>(new UserDto(null, updatedName, updatedAge), headers);

    // when
    ResponseEntity<UserDto> response = restTemplate.exchange(LOCAL_URL + "/" + 1L, HttpMethod.PUT, request, UserDto.class);

    // then
    assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
    assertThat(response.getBody().getName()).isEqualTo(updatedName);
    assertThat(response.getBody().getAge()).isEqualTo(updatedAge);
}

DELETE


DELETE()

@Test
void DELETE() {
    // given
    RestTemplate restTemplate = new RestTemplate();

    String url = LOCAL_URL + "/" + 1L;

    restTemplate.delete(url);
}

마치며

이번 글은 κ°„λ‹¨νžˆ RestTemplate을 μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€μ— λŒ€ν•œ Quick-Start에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜λ‹€.

λ‹€μŒ 글에선 RestTemplate의 λ™μž‘ 원리와 μ„€μ •ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ 닀룬닀.