Skip to content

한국관광공사 고캠핑 API 호출 #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,18 @@ dependencies {
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

// webclinet 설정
implementation 'org.springframework.boot:spring-boot-starter-webflux'
// m1 netty 로컬 설정
implementation("io.netty:netty-resolver-dns-native-macos:4.1.75.Final:osx-aarch_64")
}

dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:2022.0.3"
}
}

dependencyManagement {
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/com/catcher/batch/CampingController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.catcher.batch;

import com.catcher.batch.core.dto.CampingApiResponse;
import com.catcher.batch.service.CampingApiService;
import com.catcher.batch.service.RestApiService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
@RequiredArgsConstructor
@RequestMapping("/camping")
public class CampingController {
private final CampingApiService campingApiService;
private final RestApiService restApiService;

@GetMapping("/webclient")
public Mono<ResponseEntity<CampingApiResponse>> testWebClient() {
return campingApiService.getOpenApi()
.map(ResponseEntity::ok)
.defaultIfEmpty(ResponseEntity.notFound().build());
}

@GetMapping("/resttemplate")
public ResponseEntity<CampingApiResponse> testRestTemplate() {
CampingApiResponse response = restApiService.getOpenApi();
return ResponseEntity.ok(response);
}
}
29 changes: 29 additions & 0 deletions src/main/java/com/catcher/batch/JsonConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.catcher.batch;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class JsonConverter {
private ObjectMapper objectMapper;

@PostConstruct
public void init() {
objectMapper = new ObjectMapper().registerModule(new JavaTimeModule());
}

public <T> T jsonToObject(String json, Class<T> clazz) {
T obj = null;
try {
obj = objectMapper.readValue(json, clazz);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
return obj;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.catcher.batch.core.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
return new RestTemplate(factory);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.catcher.batch.core.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.util.DefaultUriBuilderFactory;

@Configuration
public class WebClientConfig {

@Value("${catcher.api.url}")
private String BASE_URL;

DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory();

@Bean
public WebClient webClient(){
factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);

return WebClient.builder()
.baseUrl(BASE_URL)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
}
}
121 changes: 121 additions & 0 deletions src/main/java/com/catcher/batch/core/dto/CampingApiResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package com.catcher.batch.core.dto;

import lombok.Getter;

import java.util.List;

@Getter
public class CampingApiResponse {
private Response response;

@Getter
public static class Response {
private Header header;
private Body body;
}

@Getter
public static class Header {
private String resultCode;
private String resultMsg;
}

@Getter
public static class Body {
private Items items;
private String numOfRows;
private String pageNo;
private String totalCount;
}

@Getter
public static class Items {
private List<CampingItemDTO> item;
}

// TODO 응답값 추후 필요한 것만 걸러내야 함
@Getter
public static class CampingItemDTO {
private String contentId;
private String facltNm;
private String lineIntro;
private String intro;
private String allar;
private String insrncAt;
private String trsagntNo;
private String bizrno;
private String facltDivNm;
private String mangeDivNm;
private String mgcDiv;
private String manageSttus;
private String hvofBgnde;
private String hvofEnddle;
private String featureNm;
private String induty;
private String lctCl;
private String doNm;
private String sigunguNm;
private String zipcode;
private String addr1;
private String addr2;
private String mapX;
private String mapY;
private String direction;
private String tel;
private String homepage;
private String resveUrl;
private String resveCl;
private String manageNmpr;
private String gnrlSiteCo;
private String autoSiteCo;
private String glampSiteCo;
private String caravSiteCo;
private String indvdlCaravSiteCo;
private String sitedStnc;
private String siteMg1Width;
private String siteMg2Width;
private String siteMg3Width;
private String siteMg1Vrticl;
private String siteMg2Vrticl;
private String siteMg3Vrticl;
private String siteMg1Co;
private String siteMg2Co;
private String siteMg3Co;
private String siteBottomCl1;
private String siteBottomCl2;
private String siteBottomCl3;
private String siteBottomCl4;
private String siteBottomCl5;
private String tooltip;
private String glampInnerFclty;
private String caravInnerFclty;
private String prmisnDe;
private String operPdCl;
private String operDeCl;
private String trlerAcmpnyAt;
private String caravAcmpnyAt;
private String toiletCo;
private String swrmCo;
private String wtrplCo;
private String brazierCl;
private String sbrsCl;
private String sbrsEtc;
private String posblFcltyCl;
private String posblFcltyEtc;
private String clturEventAt;
private String clturEvent;
private String exprnProgrmAt;
private String exprnProgrm;
private String extshrCo;
private String frprvtWrppCo;
private String frprvtSandCo;
private String fireSensorCo;
private String themaEnvrnCl;
private String eqpmnLendCl;
private String animalCmgCl;
private String tourEraCl;
private String firstImageUrl;
private String createdtime;
private String modifiedtime;
}
}
34 changes: 34 additions & 0 deletions src/main/java/com/catcher/batch/service/CampingApiService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.catcher.batch.service;

import com.catcher.batch.JsonConverter;
import com.catcher.batch.core.config.WebClientConfig;
import com.catcher.batch.core.dto.CampingApiResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

@Service
@RequiredArgsConstructor
public class CampingApiService {

@Value("${catcher.api.key}")
private String SERVICE_KEY;

private final JsonConverter jsonConverter;
private final WebClientConfig webClientConfig;

public Mono<CampingApiResponse> getOpenApi() {
return webClientConfig.webClient().get()
.uri(uriBuilder -> uriBuilder
.path("/basedList")
.queryParam("serviceKey", SERVICE_KEY)
.queryParam("MobileOS", "ETC")
.queryParam("MobileApp", "AppTest")
.queryParam("_type", "json")
.build())
.retrieve()
.bodyToMono(String.class)
.map(json -> jsonConverter.jsonToObject(json, CampingApiResponse.class));
}
}
39 changes: 39 additions & 0 deletions src/main/java/com/catcher/batch/service/RestApiService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.catcher.batch.service;

import com.catcher.batch.core.config.RestTemplateConfig;
import com.catcher.batch.core.dto.CampingApiResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.util.UriComponentsBuilder;

import java.net.URI;

@Service
@RequiredArgsConstructor
public class RestApiService {

// TODO 하드코딩 수정
private final String BASE_URL = "https://apis.data.go.kr/B551011/GoCamping";

@Value("${catcher.api.key}")
private String SERVICE_KEY;

private final RestTemplateConfig restTemplateConfig;

public CampingApiResponse getOpenApi() {
URI apiUrl = UriComponentsBuilder
.fromUriString(BASE_URL).path("/basedList")
.queryParam("serviceKey", SERVICE_KEY)
.queryParam("MobileOS", "ETC")
.queryParam("MobileApp", "AppTest")
.queryParam("_type", "json")
.build()
.encode()
.toUri();

ResponseEntity<CampingApiResponse> responseEntity = restTemplateConfig.restTemplate().getForEntity(apiUrl, CampingApiResponse.class);
return responseEntity.getBody();
}
}