티스토리 뷰
0. 스프링 부트에서 RestTemplate을 사용하기 위해 필요한 Dependency는 Spring Web밖에 없다.
1. RestTemplate은 Rest API를 호출하기 위해 사용한다.
2. 다른 서비스 정의와 동일한 방식으로 구현하면 된다. 사실 서비스이다.
2-1. integration 패키지에서 호출할 REST API 기능을 정의하기 위해 RestClient 인터페이스를 생성한다.
import pe.pilseong.flightcheckin.integration.dto.Reservation;
import pe.pilseong.flightcheckin.integration.dto.ReservationUpdateRequest;
public interface ReservationRestClient {
Reservation findReservation(Long id);
Reservation updateReservation(ReservationUpdateRequest request);
}
2-2. 구현 클래스에 @Component를 지정하여 스프링 컴포넌트로 등록한다.
2-3. 인터페이스를 구현하는 구현 클래스를 만든다.
2-3-1 여기서 중요한 부분은 RestTemplate에서 호출하는 HTTP Method와
2-3-2 실제 Rest Api 서비스의 HTTP Method를 일치 시켜야 한다.
2-3-3 맞지 않으면 "Method Not Allowed","message":"Request method 'POST' not supported" 가 발생한다.
2-3-3-1 이 부분이 까다로운 이유는 호출하는 쪽의 Controller가 전혀 실행되지 않기 때문이다.
2-3-3-2 분명히 @PostMapping("/completeCheckin")가 정의되어 있는데도 발생하기 때문에 상당히 까다롭다.
2-3-4 아래 findReservation은 GET을 사용하고 updateReservation은 POST를 사용하고 있다.
2-3-5 이는 RestTemplate에서 사용하는 method를 보면 알 수 있다.
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import pe.pilseong.flightcheckin.integration.dto.Reservation;
import pe.pilseong.flightcheckin.integration.dto.ReservationUpdateRequest;
@Component
public class ReservationRestClientImpl implements ReservationRestClient {
private static final String FLIGHTRESERVATION_RESERVATIONS =
"http://localhost:8080/flightreservation/reservations/";
@Override
public Reservation findReservation(Long id) {
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(FLIGHTRESERVATION_RESERVATIONS+id, Reservation.class);
}
@Override
public Reservation updateReservation(ReservationUpdateRequest request) {
RestTemplate restTemplate = new RestTemplate();
return restTemplate.postForObject(FLIGHTRESERVATION_RESERVATIONS, request, Reservation.class);
}
}
3. 정의한 RestClient를 Controller에서 사용자에 요청에 따라서 적절하게 사용한다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import pe.pilseong.flightcheckin.integration.ReservationRestClient;
import pe.pilseong.flightcheckin.integration.dto.ReservationUpdateRequest;
@Controller
public class CheckinController {
@Autowired
ReservationRestClient client;
@GetMapping("/showCheckin")
public String showCheckinInput() {
return "showCheckin";
}
@PostMapping("/showCheckin")
public String displayReservationInfo(@RequestParam("reservationId") Long reservationId, Model model) {
model.addAttribute("reservation", this.client.findReservation(reservationId));
return "displayReservationDetails";
}
@PostMapping("/completeCheckin")
public String completeCheckin(
@RequestParam("reservationId") Long id,
@RequestParam("numberOfBags") int numOfBags) {
System.out.println("\n\ntest\n\n" + id +" " + numOfBags);
ReservationUpdateRequest request = new ReservationUpdateRequest();
request.setCheckedIn(true);
request.setId(id);
request.setNumberOfBags(numOfBags);
this.client.updateReservation(request);
return "completeCheckin";
}
@GetMapping("completeCheckin")
public String complete() {
return "completeCheckin";
}
}
4. RestTemplate과 상관은 없지만 Mapping 설정에서 끝 부분은 '/' 스프링의 다른 부분처럼 상당히 예민하다.
4-1 아래처럼 /reservations 라고 정의 되어 있으면 client 호출 시 /reservations 이나 /reservations/ 둘 다 동작하지만
4-2 /reservations/ 라고 정의 된 경우는 클라이언트에서 /reservations로 호출하면 mapping 되지 않는다.
4-2-1 즉 항상 뒤에 '/'가 없어야 한다는 의미다.
@PutMapping("/reservations")
public Reservation updateReservation(@RequestBody ReservationUpdateRequest request) {
Reservation reservation = this.reservationRepository.findById(request.getId()).get();
reservation.setNumberOfBags(request.getNumberOfBags());
reservation.setCheckedIn(request.getCheckedIn());
return this.reservationRepository.save(reservation);
}
'Spring > Spring Boot' 카테고리의 다른 글
Spring Boot : Logger 사용 기본 절차 및 레벨 설정 (0) | 2020.05.01 |
---|---|
Spring Boot : PDF Generator(itextpdf) 사용하기 + Email 전송 (0) | 2020.04.30 |
Spring Boot : Data JPA - DTO 사용 할 때 (0) | 2020.04.29 |
Spring Boot : Data JPA - @Query 사용하기 (0) | 2020.04.29 |
Spring Boot : Email 보내기 (0) | 2020.04.26 |
- Total
- Today
- Yesterday
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib
- hibernate
- 스프링
- login
- MYSQL
- RestTemplate
- crud
- WebMvc
- Spring
- 설정
- one-to-one
- spring boot
- Angular
- mapping
- 외부파일
- Security
- Rest
- 자바
- Validation
- 매핑
- 설정하기
- Spring Security
- XML
- one-to-many
- form
- 상속
- 로그인
- 하이버네이트
- jsp
- 스프링부트
- Many-To-Many