ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Maplestory openAPI적용 오류 및 해결과정
    spring 2024. 2. 1. 17:00
    반응형

     

    도입

     

    2023년 12월 부터 Nexon사의 콘텐츠에 대한 data가 API형태로 받아볼 수 있게 되었다.

    그 중에서 mapleStory의 API를 이용하여 개발을 하고자 하였다.

    Spring을 기반으로 하여 개발을 진행하였다.

     

    본문

     

    API를 이용하기 위해서 https://openapi.nexon.com/ 사이트에 로그인하여 애플리케이션 등록을 한 후 API KEY를 발급 받아야한다.

     

    API KEY만 있으면 호출이 가능한 상태가 된다.

     

    예시로 GET /maplestory/v1/id 라는 캐릭터 식별자(ocid) 조회 api가 있다.

    이는 캐릭터 식별자(ocid)를 조회해주는 api다.

    모든 api 호출에는 Header에 x-nxopen-api-key 라는 이름의 key에 발급 받은 API KEY 값이 들어가 있어야 한다.

    캐릭터 식별자조회 api의 경우 추가로 queryparam에 character_name값이 들어오면 식별자 조회가 가능하다.

    단, 전체 url은 https://open.api.nexon.com/maplestory/v1/id 가 되기 때문에 이점 유의가 필요하다.

     

    간단하게 postman을 통해 확인하기 위해서 url에 https://open.api.nexon.com/maplestory/v1/id를 넣고 param의 key 값에  character_name value에 조회하고 싶은 캐릭터 닉네임을 적어준다.  그 후 Header설정에서 x-nxopen-api-key를 추가해서 API KEY를 value에 넣어준다. 이러면 반환되는 값으로 {"ocid":"ocid 값"}이 나오게된다. 

     

    이를 실제 spring 서버 controller에서 사용하기 위해 다음과 같은 과정을 거쳤다.

     

    1. application.yml 파일 설정

    yml 파일에 API KEY값을 저장해 두고 @Value를 사용하여 값을 가져오는 방식을 택했다. 이는 편의성과 보안성 모두를 위한 방법이라 생각한다.

    설정 방법은 

    external:

                   api:

                         key:  API KEY 값 적기 

    위와 같이 적으면 된다. 주의점은 들여쓰기와 띄어쓰기에 유의해야 한다.

    추가로 yml 파일에서 server:  

                                            port: 8080 등의 설정을 통해 port 설정도 바꿀 수있으므로 알아두어야 한다.

     

     

    2. Controller class 설정

    @RestController 가 붙은 Controller class에서 작성한다.

     

    @GetMapping("/maplestory/v1/id")
    public ResponseEntity<String> getOcid(@RequestParam String characterName) {

    try {
    String apiUrl = "https://open.api.nexon.com/maplestory/v1/id";

    String fullUrl = UriComponentsBuilder.fromUriString(apiUrl).queryParam("character_name", characterName).build().toUriString();
    HttpHeaders headers = new HttpHeaders();
    headers.set("x-nxopen-api-key", apiKey);

    ResponseEntity<String> responseEntity = new RestTemplate().exchange(fullUrl, HttpMethod.GET, new HttpEntity<>(headers), String.class);
    return responseEntity;
    } catch (Exception exception) {
    return ResponseEntity.status(500).body("에러 발생: " + exception.getMessage());
    }
    }

     

    위의 코드를 보면 엔드포인트는 OpenApI에서 설정한 형식 "/maplestory/v1/id"이다. 

    닉네임을 인자로 받기 때문에 @RequestParam을 받았다.

    그후 API URL 전체 경로를 하드코딩 하였다. 추후 겹치는 경로 부분을 따로 불러와서 조정하는 방법으로 변경할 예정이다.

    parm이 적용된 fullUrl로 수정이 된 후 Header에 API Key 값을 적용한다.

    그 후 RestTemplate().exchange() 를 사용하여 HTTP 요청을 보내고 응답을 받는다.

    이때 나의 경우 유효하지 않은 api key라는 exception이 계속 반환되었다.

    이유는 처음에는 new HttpEntity<>(headers) 부분에 null을 넣고 실행하였다. 일반적으로 GET 방식의 경우 null 인 경우가 많지만 header에 있는 key 값이 반드시 필요한 상황이기 때문에 이부분이 null이면 오류가 생기는 것이었다.

     

    이 부분의 오류를 수정하고 실행을 해보면 위에서 설정한 header의 내용이 반영되어 정상적으로 동작함을 확인할 수 있다.

     

     

     

     

     

     

    GE

    반응형

    댓글

Designed by Tistory.