티스토리 뷰

반응형

해당 글의 소스코드는 링크 걸어 두었습니다.

 

GitHub - dolgogae/TIL: Today I Learned

Today I Learned. Contribute to dolgogae/TIL development by creating an account on GitHub.

github.com

 

이전 글에서 넘어와 Post를 알아보도록 하자.

 

Post로는 조금 더 복잡한 예제를 찾아봤다.

그래도 복잡하다 해봤자 request나 response 타입이 좀 더 복잡할 뿐이다.

 

 

앞선 예제보다 조금더 복잡해보이지만 변수 묶음인 keywordGroups는 객체로 만들어주면 되고 

나머지는 예제에 나와있는 자료형으로 해주면 된다.

 

DatalabTotalSearchRequest.java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class DatalabTotalSearchRequest {
    
    private String startDate;
    private String endDate;
    private String timeUnit;
    private List<KeywordGroup> keywordGroups;
    private String device;
    private String gender;
    private List<String> ages;

}

 

KeywordGroup.java

@Data
public class KeywordGroup{
    private String groupName;
    private List<String> keywords = new ArrayList<>();

    public KeywordGroup setGroupName(String groupName){
        this.groupName = groupName;
        return this;
    }

    public KeywordGroup addKeywords(String keyword){
        keywords.add(keyword);
        return this;
    }
}

 

keywordGroups는 응답 객체에서도 쓰이기 때문에 따로 분리해서 객체로 만들어주었다.

아래는 만들기 편하게 builder처럼(?) 만들어주었다.

 

그리고 응답의 경우에는

다음과 같은 spec을 볼 수 있고,

 

DatalabTotalSearchResponse.java

@Data @ToString
@NoArgsConstructor
@AllArgsConstructor
public class DatalabTotalSearchResponse {
    

    private String startDate;
    private String endDate;
    private String timeUnit;
    private List<Result> results;

    @ToString
    @Data
    public static class Result{
        private String title;
        private List<String> keywords;
        private List<DataObject> data;

        @ToString
        @Data
        public static class DataObject{
            private String period;
            private String ratio; 
        }
    }
}

 

특이한 점은 Result안에도 data라는 객체를 넣어야 한다는 점이다.

 

마지막으로는 앞서 Get방식과 거의 동일하게 Post 통신을 구현해주면 된다.

 

@Component
public class NaverDatalabClient {
    
    @Value("${naver.client.datalab.id}")
    private String id;

    @Value("${naver.client.datalab.secret}")
    private String passwd;

    @Value("${naver.url.datalab.total}")
    private String url;

    public static<T> ResponseEntity<T> search(
        Object request,
        ParameterizedTypeReference<T> responseType,
        String url, String id, String passwd) throws JsonProcessingException{

        URI uri = UriComponentsBuilder.fromUriString(url)
            .build().encode().toUri();
        
        HttpHeaders header = getHttpHeaders(id, passwd, MediaType.APPLICATION_JSON);

        String params = new ObjectMapper().writeValueAsString(request);

        HttpEntity<String> httpEntity = new HttpEntity<>(params, header);

        var responseEntity = new RestTemplate().exchange(
                uri,
                HttpMethod.POST,
                httpEntity,
                responseType
        );

        return responseEntity;
    }

    public static HttpHeaders getHttpHeaders(String id, String passwd, MediaType contentType){
        HttpHeaders header = new HttpHeaders();
        header.set("X-Naver-Client-Id", id);
        header.set("X-Naver-Client-Secret", passwd);
        header.setContentType(contentType);
        return header;
    }

    public DatalabTotalSearchResponse searchDatalab(DatalabTotalSearchRequest request) throws JsonProcessingException{
        var responseType =  new ParameterizedTypeReference<DatalabTotalSearchResponse>() {};
        var responseEntity = search(request, responseType, url, id, passwd);

        return responseEntity.getBody();
    }
}

 

Get방식에서 대부분을 다뤘기에 조금 다른 부분만 언급하도록 하자.

 

String params = new ObjectMapper().writeValueAsString(request);

HttpEntity<String> httpEntity = new HttpEntity<>(params, header);

 

요청 값을 String으로 바꾼 뒤에 HttpEntity에 넣어준다. 나머지는 Get방식과 거의 동일하다.

 

호출하는 Test를 만들어보자

{
  "startDate": "2017-01-01",
  "endDate": "2017-04-30",
  "timeUnit": "month",
  "keywordGroups": [
    {
      "groupName": "한글",
      "keywords": [
        "한글",
        "korean"
      ]
    },
    {
      "groupName": "영어",
      "keywords": [
        "영어",
        "english"
      ]
    }
  ],
  "device": "pc",
  "ages": [
    "1",
    "2"
  ],
  "gender": "f"
}

네이버에서 제공해주는 예제는 다음과 같다.

 

@Autowired
NaverDatalabClient naverDatalabClient;

@Test
void searchTest() throws JsonProcessingException{
    DatalabTotalSearchRequest request = new DatalabTotalSearchRequestBuilder()
        .setStartDate("2017-01-01")
        .setEndDate("2017-04-30")
        .setTimeUnit("month")
        .addKeywordGroups(new KeywordGroup().setGroupName("한글").addKeywords("한글").addKeywords("korean"))
        .addKeywordGroups(new KeywordGroup().setGroupName("영어").addKeywords("영어").addKeywords("english"))
        .setDevice("pc")
        .addAge("1").addAge("2")
        .setGender("f")
        .build();

    String params = new ObjectMapper().writeValueAsString(request);

    System.out.println("request:" + params);

    DatalabTotalSearchResponse resposne = naverDatalabClient.searchDatalab(request);

    String res = new ObjectMapper().writeValueAsString(resposne);

    System.out.println("response: " + res);
}

 

위처럼 나의 경우에는 Builder를 만들어서 조금 편하게 넣어 주었다.

그리고 다음처럼 결과값이 출력되면 완성이다.

request:{"startDate":"2017-01-01","endDate":"2017-04-30","timeUnit":"month","keywordGroups":[{"groupName":"한글","keywords":["한글","korean"]},{"groupName":"영어","keywords":["영어","english"]}],"device":"pc","gender":"f","ages":["1","2"]} response: {"startDate":"2017-01-01","endDate":"2017-04-30","timeUnit":"month","results":[{"title":"한글","keywords":["한글","korean"],"data":[{"period":"2017-01-01","ratio":"47.00101"},{"period":"2017-02-01","ratio":"53.23619"},{"period":"2017-03-01","ratio":"100"},{"period":"2017-04-01","ratio":"85.327"}]},{"title":"영어","keywords":["영어","english"],"data":[{"period":"2017-01-01","ratio":"40.0881"},{"period":"2017-02-01","ratio":"36.69942"},{"period":"2017-03-01","ratio":"52.11792"},{"period":"2017-04-01","ratio":"44.4595"}]}]}
728x90
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
250x250