서론 프로그래머스 - 2020 카카오 인턴십 보석쇼핑 https://school.programmers.co.kr/learn/courses/30/lessons/67258 해당 문제를 풀었을 때, set를 사용하여 시간을 단축시키려 했으나 효율성 테스트에서 실패했다. 많은 글들을 찾아봤으나 '해당 문제는 배열의 길이가 최대 100,000이므로 탐색 횟수를 줄여야 한다, 그러므로 투포인터를 사용해야 한다'는 설명만 있고, 어떤 방식을 사용해야 탐색 횟수를 가장 많이 줄일 수 있는지에 대한 설명은 없었다. 본 글쓴이는 탐색 시간을 줄이기 위해 투포인터와 set()를 사용했고, 이를 통해 탐색 시간을 어느정도 줄일 수 있었지만, 그것이 Best solution은 아니었던 것 같다. set를 사용해서도 시간을 줄일..
서론 배달 어플리케이션 제작 중에 소비자의 위치 근처에 있는 음식점만 보여줘야 하는 기능이 필요했다. 이를 구현하기 위해 특정한 알고리즘을 Service layer에서 구현할 수도 있었으나, 개발 소요 시간을 줄이기 위해 MongoDB에서 제공하는 Geo-Spatial query를 활용하기로 했다. Geo-Spatial query는 특정 위치 조건에 해당하는 데이터만 가져오도록 해주는 MongoDB에서 제공하는 기능이다. Geo-spatial query에는 현재 크게 네 가지의 쿼리가 제공되고 있다. $geoIntersects 주어진 geometry 공간과 교차하는 geometry 영역의 데이터를 반환해주는 쿼리. $geometry 쿼리를 함께 써줘야 한다. 조금이라도 교차하는 polygon이 있다면 모..
서론 프로젝트 기능과 관련하여 클라이언트가 입력한 주소에서 위도 및 경도 좌표를 추출해야할 일이 생겼다. 주소에서 위도 및 경도를 꺼내기 위해서는 직접 주소에 위도 및 경도 정보를 매칭한 데이터를 소장하고 있거나, 배포된 API를 활용하여 주소 정보를 보내고 위도 및 경도 정보를 받는 방법이 있다. 개인 프로젝트에서는 API를 활용하여 주소에 대응하는 좌표값을 받는 것이 현실적인 방안일 것이다. 주소를 좌표로 변환하기 위한 API 종류 주소를 좌표로 변환하기 위해 활용할 수 있는 API는 아래와 같은 옵션이 존재한다. 1. 오픈 API - GeoCoder API 2.0 https://www.vworld.kr/dev/v4dv_geocoderguide2_s001.do 국토교통부에서 제공하는 공식 오픈API이..
서론 프로젝트에서 DynamoDB에 연결하여 데이터 저장할 일이 있었다. DynamoDB CRUD의 Example을 검색했으나, DynamoDBMapper를 사용하여 데이터를 기록하거나, Spring Data dynamoDB를 사용하더라도 local DynamoDB에 연결하여 local에 기록하는 예시들이 대부분이었다. 즉, AWS 서버 DynamoDB에 Spring-data-dynamoDB를 통해 데이터를 기록하는 예시는 찾아보기 어려웠다. 글쓴이는 장시간의 검색과 삽질 끝에 AWS 서버의 DynamoDB에 연결하여 Spring-data-dynamoDB에 데이터 쓰기를 성공했다. 막상 성공하고 보니 코드도 간단하고 정말 별거 아닌데, 작성되어있는 예시가 없다보니 한참을 헤맸던 것이다. 본 글은 이 글을..
서론 지난 글에서 API gateway에 권한 부여한 후 Cognito 인증하여 백엔드 리소스인 Lambda에 접근하는 것을 실습해봤다. 하지만 실제 어플리케이션이 사용자를 인식하여 동적으로 정보를 보여주기 위해서는 이것만으로는 충분하지 않을 것이다. 유저 맞춤형으로 정보를 제공해주기 위해서는 각 API 요청에서 헤더에 담겨있는 유저 정보를 꺼낼 수 있어야 한다. 이번 글에서는 Cognito로 생성한 JWT를 API gateway 뒤에 있는 백엔드 리소스 단에서 추출하여 사용자 정보를 인식하고 사용자 맞춤형 정보를 제공하는 실습을 진행한다. 시스템 구조 및 가정 현재 프로젝트의 시스템의 구조는 아래 그림과 같다. 본 글에서는 이와 같은 연결 설정이 모두 완료되었다고 가정하고 글을 진행할 것이다. 만약 그..
서론 프로젝트를 진행하다보면 기존의 VPC를 삭제하고 새로운 VPC를 생성하여 인스턴스 환경을 바꿔야 할 필요가 있다. 하지만 VPC를 삭제하는 과정에서 VPC 내부에 사용되는 ENI가 남아있어서 삭제가 안 되는 문제가 종종 발생한다. 이 글은 그 중에 빈번하게 발생하는 원인 중 하나인 API gateway 관련 eni 문제 때문에 VPC가 삭제되지 못하는 문제와 해결책을 기록해놓은 것이다. VPC가 삭제되지 않은 원인 '네트워크 인터페이스가 포함되어있습니다.' AWS는 VPC가 삭제되지 않을 때 그 원인을 직접적으로 알려준다. 아래와 같이 VPC에 현재 사용되고 있는 eni가 있어서 삭제되지 않는다고 한다. '네트워크 인터페이스가 포함되어 있습니다.' 를 클릭하면 현재 삭제되지 않는 VPC에 관련된 E..
서론 Cognito의 역할 Cognito는 아래 그림과 같이 동작한다. - 클라이언트 측에서 특정 경로로 접속하려고하는데, 그 경로가 권한이 부여되어있다면 접근이 제한된다. - 클라이언트는 Cognito의 앱 클라이언트로 들어가서 로그인을 실행한다. - 로그인에 성공하면 Cognito에서 인증 토큰을 발급하여 클라이언트 측으로 전송한다. 그리고 Cognito에 의해 Callback URL로 redirect되어 API gateway에 다시 접근하게 된다. - HTTP API gateway는 JWT 권한 부여자를 통해 헤더의 JWT를 인식하고 이를 Cognito에 보내서 알맞은 토큰인지 검증 요청한다. - 토큰이 알맞은 토큰일 경우 라우팅으로 접속하여 어플리케이션을 실행시켜 응답을 클라이언트에게 돌려준다. ..
서론 지난 포스팅에서 AWS ECR까지 생성하는 것을 진행해보았다. 이번 글에서는 내용을 이어서 VPC Endpoint를 생성하여 AWS ECR과 AWS ECS를 연결하고, 컨테이너 인스턴스를 구동하여 동작이 되는 것까지 확인해보도록 하겠다. VPC Endpoint 생성 VPC Endpoint를 통해 Private subnet 상에 있는 ECS와 ECR을 서로 연결해주면 ECR에 있는 이미지를 ECS가 가져와 쓸 수 있다. 인터페이스 엔드포인트 생성 앞서 VPC 엔드포인트는 크게 인터페이스 엔드포인트와 게이트웨이 엔드포인트가 있다고 하였다. 우리는 Private link를 사용하여 AWS ECR 과 ECS를 연결해야 하므로 인터페이스 엔드포인트를 생성하겠다. 이름은 임의로 입력한다. ECR은 AWS의 서..
서론 프로젝트를 진행하면서 HTTP API gateway와 Network Load Balancer를 통합해봤다. 하지만 이 통합 방식에는 단점이 하나 있었는데, API gateway의 라우팅 주소가 실제 어플리케이션 코드에서 라우팅 주소와 정확히 일치해야 정상 작동하는 것이었다. 문제를 그림으로 설명하면 다음과 같다. 현재 프로젝트 서비스 구조는 다음과 같이 세가지 개별적 VPC에 API gateway가 라우팅 하는 형태로 되어있다. API gateway의 리소스 "/customer"에 접근하면, 소비자 서비스의 루트 경로로 들어가고 "/restaurant"에 접근하면, 음식점 서비스의 루트 경로로, "/rider"에 접근하면 배달기사 서비스의 루트 경로로 접근하게 하고 싶다. 원하던 동작 API gat..
서론 지난 글에서 NAT gateway를 사용하여 private subnet에서 Docker Hub에 요청을 보내어 docker image를 가져오는 실습을 진행해봤다. 글을 마치면서 NAT gateway 단점으로 비용이 많이 발생한다는 것을 언급하였다. 실제로 서비스를 이용해보니 NAT gateway의 비용이 상당하게 부과되는 것을 경험하였다. 아래는 글쓴이의 AWS Billing Dashboard의 청구서 페이지를 일부 캡쳐한 것이다. NAT Gateway를 361시간 사용하고 21.3달러가 청구되었다. NAT gateway는 시간당 0.059 달러 비용이 발생하는 것이다. (리전마다 비용이 다르다.) 이는 꽤 부담스러운 가격이다. NAT gateway가 얼마나 비싼지 감이 안 온다면 아래 표도 참고..