개인프로젝트/기능프로그램_오늘뭐입지

20240517_MSA(2)

일일일코_장민기 2024. 5. 17. 17:01
728x90

1에서는 하위모듈 프론트가 다른 하위 모듈 백엔드와 연결했다. (좀 이상하긴 하지만)
2에서는 하위모듈 백에서 다른 하위 모듈 백엔드와 연결했다.

계속 안 돼서 Kafka로 처리할까 하다가 결국에는 됐다.

 

 

문제는 Member 모듈 백엔드에서 Weather 모듈 백엔드로 데이터가 안 넘어가는 문제였다.

 

원인은 2가지였다.

1. 데이터를 넘길 때는 JSON / XML로 넘겨야 하는데 WeatherareavoDTO로 넘기려고 했다는 것

 

 @PostMapping("/viewGptAnswer")
    public String viewGptAnswer(WeatherareavoDTO weatherareavoDTO, Integer userid) throws JsonProcessingException {

        String url = "http://localhost:9002/selectWeatherDataForQuestionToGPT";
        ResponseEntity<String> response = restTemplate.postForEntity(url, weatherareavoDTO, String.class);

 

이런 식으로 되어 있으면 통신은 되는데 받은 곳에서 WeatherareavoDTO의 데이터들이 null로 나온다

 

2. 받는 측에서 @RequestBody 어노테이션이 있어야 한다는 것

@CrossOrigin(origins = "http://localhost:9001")
@ResponseBody
@PostMapping("/selectWeatherDataForQuestionToGPT")
public List<Object> selectWeatherDataForQuestionToGPT(@RequestBody WeatherareavoDTO weatherareavoDTO) {


모놀리틱으로 할 때는 @RequestBody가 없어도 잘 되었는데 명시적으로 선언해주지 않으면 못 받는 것 같다.



WeatherApiController

@CrossOrigin(origins = "http://localhost:9001")
@ResponseBody
@PostMapping("/selectWeatherDataForQuestionToGPT")
public List<Object> selectWeatherDataForQuestionToGPT(@RequestBody WeatherareavoDTO weatherareavoDTO) {
    List<WeatherDataDTO> weatherDataDTOList = connectToWeatherApi(weatherareavoDTO);
    List<WQ> wqList = new ArrayList<>();
    for(WeatherDataDTO weatherDataDTO : weatherDataDTOList){
        WQ wq = new WQ();
        BeanUtils.copyProperties(weatherDataDTO, wq);
        wqList.add(wq);
    }
    PQ pqList = dustApiController.selectDustDataForQuestionToGPT(weatherareavoDTO.getCountry(), weatherareavoDTO.getArea());
    List<Object> returnList = new ArrayList<>();
        returnList.add(pqList);
        returnList.add(wqList);
    return returnList;
}

 

DustApiController

@CrossOrigin(origins = "http://localhost:9001")
@ResponseBody
@PostMapping("/viewTodayDust")
public PaticulatemattervoDto viewTodayDust(String country, String area){
    PlaceDto placeDto = placeService.findByCountryAndArea(country, area);
    return dustApiService.findByStationname(placeDto);
}

 

이후 처리는 msa(3)에서...

 

 




@RequestBody가 있어야 받아오는 이유???

더보기

 

- @RequestBody 어노테이션은 HTTP 요청의 본문(body)에 있는 데이터를 Java 객체로 변환하는 데 사용된다

- 같은 모듈끼리는 Spring에서 알아서 본문(body)으로부터 파라미터를 자동으로 추출하여 메서드의 매개변수에 매핑해준다.

--> @RequestBody가 있어야 받아오는 이유???

1. 다른 모듈끼리는 자동으로 추출해서 매핑해주지 않는다

2, 요청 형식이 잘못되어서 자동으로 추출해서 매핑해주지 않았다

열심히 찾아보고 있는데 아직 잘 모르겠다...