오류 CASE 1 입력 상황 AWS ECR에서 제공하는 인증 토큰 가져오는 명령어를 그대로 입력했을 때 해당 오류가 발생했다. 오류 로그 An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:iam::ACCOUNT_NUMBER:user/MY_USER is not authorized to perform: ecr:GetAuthorizationToken on resource: * 원인 두 가지 원인이 있다. 첫 번째 원인 액세스 키로 연결된 사용자에게 AWS ECR 권한이 없음 오류 로그에 나온 대로 사용자의 IAM 권한에 ECR에 대한 GetAuthorizationToken..
Private Subnet에서 배포하면서 생긴 문제 프로젝트 진행 중에 AWS ECS가 생성되지 않는 문제가 발생했다. 현재 프로젝트 설계 구조는 다음과 같이 VPC 내 프라이빗 리소스를 통해 API gateway - Load balancer - Container Service 가 연결되어있는 구조다. 보안상의 이유로 어플리케이션인 ECS에는 외부에서 접속하지 못하게 해야한다. 우리 어플리케이션의 인증/인가는 API gateway와 Cognito에서 이뤄지기 때문에 ECS에는 인증/인가 프로세스가 없기 때문이다. 그래서 허가되지 않은 외부 사용자는 ECS에 접근할 수 없어야 한다. Private subnet에서 ECS를 생성하려고 하면 딜레이가 발생하다가 생성되지 않는 문제가 발생한다. 이 문제를 해결하..
서론 Spring 프로젝트를 도커 이미지로 만들어 클라우드에서 구동하려고 했으나 이에 관련하여 one way로 깔끔하게 정리되어있는 문서를 보지 못한 것 같아서 정리해두려고 한다. 또한 코드를 업데이트하고 나서 BootJar로 빌드 하지 않아서 코드의 변경사항이 반영되지 않는 실수를 방지하고자 한다. 해당 글은 build 도구로 Gradle을 사용하며, IDE로 IntelliJ를 사용하는 것을 기준으로 한다. 또한 해당 실습을 하기 위해서는 Docker Hub 계정이 있고, Docker가 local 환경에 설치되어 있어야 한다. Spring Project로 Docker image 만들기 프로젝트 생성 컨트롤러를 생성해서 RestContoller를 사용하여 라우팅한다. 현재 프로젝트는 루트 주소에 대해서만..
서론 Spring을 이제 막 배우던 때에, @RequestMapping 기능을 막 익혔을 때의 이야기다. 다음과 같이 컨트롤러에서 @GetMapping과 @PostMapping의 URL을 "/login"과 "/login/confirm"으로 정했지만, 마음 한 켠 찝찝한 기분이 느껴졌다. > 'URL을 이렇게 정해도 괜찮은 건가?' GET은 로그인 사이트에 사용자가 접속했을 때 보는 정보가 담겨져있고, POST에는 사용자가 로그인을 위해 입력한 ID와 패스워드 정보가 담겨있다. 어쨌든 이 둘의 기능은 이렇게 구분되므로 이렇게 이렇게 "/confirm"이라는 URL로 구분지었지만, 이것이 알맞은 방법인지는 조금 의문이 들었다. 관련된 정보를 알기 위해 'RESTful API' 키워드로 검색했지만, - 동사가..
캐시가 무엇? system 설계를 하다가 'Cache'라는 용어를 잘못 사용하다가 멘토에게 지적을 받은 적이 있다. 상황을 대략 설명하자면, system에 Spring으로 구현한 WAS가 여럿 있었고, 거기에 세션을 관리할 Redis가 붙어있었는데, 그 Redis를 '웹캐시'라고 칭하다가 지적을 받은 것이다. 구글에 '캐시 DB'라고 검색하면 Redis에 대한 블로그 글이 많이 나온다. 그러다보니 'Redis = 캐시 DB'라고 잘못 인식한 것 같다. 하지만 엄연히 따져보니, Redis는 캐시 DB가 아니다. Redis는 캐시의 역할을 할 수 있는 in-memory DB인 것이다. 즉, Redis를 캐시로 사용할 순 있어도 Redis 그 자체를 캐시라고 칭하는 건 잘못된 것이다. 또한, 설령 잘못 칭한다..
서론 알고리즘 문제를 풀다보면, 어느 한 문제에서는 사용해야 풀 수 있던 어떤 기능이 다른 문제에선 오히려 그 문제를 푸는데 악영향을 끼치기도 한다. 이번에 논의할 max()와 min()도 바로 그러한데, max()와 min()는 처리되는데 O(n)의 시간이 걸리므로 무턱대고 반복문 내에서 사용했다간 시간을 엄청나게 잡아먹어버린다. 우선 max()와 min()의 시간복잡도를 먼저 알아보고 그 이후 예시와 함께 어떤 문제에서 이 기능을 활용하면 좋을지 살펴보기로 한다. max(), min()의 시간복잡도 max()와 min()함수에는 입력값으로 배열을 넣을 수 있고, 배열을 넣게 되면 해당 함수는 모든 원소의 값을 비교해서 가장 큰 값을 반환해준다. 이렇게 max()와 min()은 함수 내부에서 모든 원소..