여태까지 진행한 토이 프로젝트를 컨테이너화 시켰습니다. 레포는 링크에 있어요. 저는 이 레포를 가져온 다음에, docker-compose up만 입력해서, 컨테이너로 돌아가게끔 만들었습니다. 이것을 가지고 python request를 이용한 rest api를 호출하고, 결과를 가져오는 연습을 하고 있었어요.

 

 그런데, 연습을 하다가 415가 떨어지는 이상한 상황이 발생했는데요. 400, 401, 403, 404, 405 정도에만 익숙했던 저는 415가 낯설어서 당황하였습니다. 어떤 상황이였는지 보겠습니다.

 


 

 get_access_token인 것으로 보아서, 로그인을 해서 접근을 위한 토큰값을 가져오는 모양이에요. 제 도서관 api는 로그인이 성공하면 access_token을 가져와서 인증 처리를 하게 되어요. login_data에서 userName과 userPw를 받는데요. 맵 형태를 json으로 떨어트려서 넘겨주게 됩니다.

 

 28번째 줄인, verify는 인증서가 self signed라서, False로 처리해 주었습니다.

 

 

 이제, 이미 등록되어 있는 유저 정보를 가지고 access_token을 얻어봅시다.

 

 

 status_code가 415가 찍혔습니다. 이 코드는 처음 보던 코드였습니다. Unsupported Media type인데요. 문서를 보면, Content-type이나, Content-encoding이 원인이 되는 경우가 많다고 되어 있어요. 저는 억세스 토큰을 가져오는 get_access_token 메서드를 올바르게 수정해서 토큰 값을 얻어오는 것이 목표입니다.

 

 


 localhost:7780/swagger-ui.html로 접속해서, 어떻게 curl이 호출되고 있는지 보겠습니다.

 

 

 /login api를 설명하는 부분에서 Try-it-out을 누르고, Execute를 눌러서 실행해 보겠습니다.

 

 

 그러면, 뭔가 이상한 옵션들이 줄줄이 달려 나오는 것을 볼 수 있는데요. -H는 header를 뜻합니다. 그리고 -d는 데이터 부분을 뜻합니다. 헤더 부분을 보면 Content-Type 부분이 있는데요. 이 부분이 "application/json"으로 되어 있어요. 제 파이썬 프로그램은, 이 정보를 뺀 채로 보냈습니다.

 


 컨테이너 내부에서는 어떻게 처리했을까요? compose가 된 것을 보니까 2개의 컨테이너가 있네요.

 

 이 중에서, postgres에는 아무 것도 없을 거 같으니, maven 이미지를 이용한, gh_spring_library_api_web_1의 log를 보도록 하겠습니다.

 

 

 에러 메세지를 보니까, HttpMediaTypeNotSupportedException이 뜨는데요. Content type ~ 가 not supported가 뜹니다. 로그로 확인해 보면, application/octet-stream이라고 되어 있는데요. 이 문서를 보시면, 알려지지 않은 파일 타입, 모든 경우를 위한 기본값 정도로 설명하고 있어요.

 

 이러한 상황으로 미루어 보았을 때, 컨텐츠 타입이 헤더에 없었으니, default 값으로, 컨텐츠가 octet-stream 타입으로 보냈다고 해석이 되었습니다. 제 library 서버에 있는 login api가 해당 타입을 서버에서 지원하지 않으니, 로그인 요청을 보낼 때에는 다른 타입으로 보냈다는 정보를 헤더에 포함해라. 정도로 해석하면 되지 않을까 싶어요. 이미지 첨부 기능은 추후에 추가될 기능이니, 저 타입은 익숙해질 필요가 있어보이긴 하네요.

 

 


 이제, 415를 해결하기 위해, 무엇을 해야 할 지 알았습니다. Content-Type 정보를 헤더에 추가해 봅시다.

 

 컨텐츠 내용이 application/json이라는 정보를 헤더에 포함해서 보내보겠습니다. 그러면, 제가 data를 보낼 때, data가 json 형식으로 보내졌다는 정보가 헤더에 들어가게 됩니다.

 

 

 그러면, status_code가 415가 아닌, 200이 떨어짐을 알 수 있어요. 제 library 서버는 application/json 형식으로 login api를 호출하는 것을 지원하는 모양입니다. 그리고, 이미 등록된 유저 정보이니, 로그인도 성공적으로 이루어 졌을 겁니다. 만약에 실패했다면 401이나 403 등이 떨어졌을 겁니다.

 

 이제, 목적에 맞게 로그인에 성공하면 accessToken을 가져오게끔 프로그램을 작성해 봅시다. Responses의 Description을 봅시다.

 

 

 response에는 accessToken과 refreshToken이 있습니다. 헤더를 보겠습니다.

 

 

 response headers를 보겠습니다. content-type이 application/json인 것으로 보아, response도 json type으로 떨어짐을 알 수 있어요. 컨텐츠가 json으로 떨어진다면, json 메서드로 손쉽게 가공 처리를 할 수 있습니다.

 

 

 29번째 줄이 그러한 일을 수행합니다. response.json()으로 json 형태로 떨궈진 것을 dict 형태로 가지고 옵니다. 딕셔너리는 키 값으로 접근이 가능한데요. accessToken이 있었으니, response.json()['accessToken']으로 접근해서 접근하기 위한 토큰 값을 가지고 오면 됩니다.