계기 회사에서 인증 서버로 Keycloak을 사용하고 있었다. 하지만, Keycloak이 회사의 인증 관련 요구사항을 감당하지 못해서 Keycloak의 Extension 중 하나인 PhaseTwo의 Keycloak-orgs를 사용하고 있었다. 그런데 그 Keycloak-orgs에서 조차도 원하던 모든 기능이 있었던 것이 아니다. 우리는 SSO를 지원해야하고, 고객이 로그인하는 순간 본인이 속한 조직 중에서 어떤 계정으로 로그인할 지 결정할 수 있어야했다. Keycloak이나 Keycloak-orgs에는 이런 기능이 존재하지 않았다. 그래서 그냥 내가 그 기능을 구현해버렸다. 바야흐로 Active Organization SPI SPI를 Keycloak에 붙여서 해당 기능이 잘 동작하는 것을 확인했고, 이 ..
개요 본 글에서는 Spring Boot와 Android Studio를 사용하여 서버에서 안드로이드 스마트폰으로 알림을 전송하는 간단한 웹 어플리케이션을 만들어 본다. 글을 쓰게 된 계기 서버를 만들다 보면 웹 뿐만 아니라 앱에 알림을 보내는 기능을 만들어보고 싶은 때가 있다. FCM은 Android와 IOS에 통합적으로 알림을 보낼 수 있는 서비스를 제공하므로 FCM을 이용하면 간편하게 알림을 보낼 수 있다. 문제는 Firebase는 입문하는 과정에서 정보를 얻기가 참 어렵다는 점이다. 공문서를 뒤져봐도 공문서 내용의 Android 버전이 예전 버전인 경우가 많아 바로 적용하기 어려운 부분이 있었다. 결국 알림을 원하는 대로 전송할 수 있었지만, 정보를 찾기 어려워서 상당한 시간을 소요한 것에 아쉬움이 ..
서론 지난 글에서 Kafka cloud에 연결하여 String으로 메시지를 주고 받았었다. 이번에는 Json으로 데이터를 주고 받는 코드를 구현할 것이다. 만약 Kakfa Cloud에 연결하기 위해 Configuration 설정하는 법이 알고 싶다면 지난 글을 참고하시길 바란다. https://bascat-code.tistory.com/21 Spring Boot로 Kafka cloud(Confluent, Conduktor 등)에 연결하여 데이터 주고 받기 (Configuration 방법 2가지) 서론 spring Boot를 사용하여 kafka에 연결하여 데이터를 주고 받으려고 Reference 자료들을 검색해보는데, 대부분의 자료들이 localhost:9092에 접속하여 로컬 컴퓨터에 있는 Kafka를 ..
서론 Local에서 개발할 때 Secret을 관리하려고 .env 파일을 사용하곤 한다. 해당 파일을 .gitignore에서 지정해두면 github의 공개 저장소에 올라가지 않기 때문이다. 하지만 개발을 완료한 서비스를 배포할 때는 .env 파일이 배포 서버에 존재하지 않기 때문에 해당 서비스가 정상적으로 작동하지 않는다. 물론 .env 파일을 함께 배포 서버(AWS EC2 등)에 업로드할 수도 있겠으나 그다지 좋은 방법은 아니다. 누군가가 EC2 인스턴스의 접근할 수 있게 되었다면 .env 내용이 탈취되어 보안 상의 문제가 발생하기 때문이다. 보안 상의 문제를 방지하기 위해 secret을 관리하는 방법에는 여러가지가 있다. 대표적으로 AWS Secrets manager를 사용하는 방법과 Docker Se..
서론 지난 편에서 Spring boot에서 Docker image를 만들고 Docker image를 Docker Hub에 등록하는 것까지 해봤다. 이번에는 등록한 이미지를 끌어와 ECS에서 구동하는 법을 실습해본다. 해당 실습은 AWS 계정이 있고 해당 계정이 IAM에서 VPC 접근 권한과 ECS 접근 권한이 허용되어있어야 한다. 주의사항 프리티어를 제공하는 EC2와는 다르게 ECS는 프리티어가 제공되지 않는다. 컴퓨팅 서비스를 띄우는 시간에 비례하여 요금이 청구되기 때문에 이에 유념하며 사용하자. 사용하지 않는 Task는 중지시켜 요금을 절약할 수 있다. ECS 구성 요소 ECS를 생성하여 컨테이너를 구동하기 전에 ECS가 어떻게 구성되어있는지 살펴본다. ECS는 다음과 같이 구성되어있다. 클러스터 컨..
서론 spring Boot를 사용하여 kafka에 연결하여 데이터를 주고 받으려고 Reference 자료들을 검색해보는데, 대부분의 자료들이 localhost:9092에 접속하여 로컬 컴퓨터에 있는 Kafka를 사용하는 예시를 보여주고 있었다. 현재 수많은 Kafka Cloud들이 존재하고 편리한 UI를 제공하여 데이터를 확인하기 좋게 편의성을 제공하고 있는데, Kafka Cloud에 연결하는 Spring 예문을 찾아보기 어려운 점은 상당히 아쉽게 느껴졌다. localhost에 접속할 때와는 Configuration 설정에서 조금 다른 부분이 있기 때문이다. 실제로 kafka를 직접 로컬 서버에 띄워서 사용하기보다는 cloud를 통해 데이터를 관리하는 경우가 많으므로, cloud에 연결하여 데이터를 주고..
역직렬화하는 과정에서 ClassCastException이 뜬 것을 경험했다면, 잘 찾아오셨다. 각 데이터 타입별로 역직렬화하는 방법을 간략하게 소개하고자 한다. 서론 - Json을 역직렬화할 때 겪는 문제 MSA에서 각 서비스간 비동기 메세지를 주고 받을 때 Json 형식으로 데이터를 주로 보내게 된다. Json으로 보낼 때는 Java 객체의 정보를 직렬화(serialization)하여 보내고, Json으로 받으면 다시 역직렬화(deserialization)하여 java 객체로 돌려놓게 된다. java에서는 아래 dependency를 사용하면 json을 java로 쉽게 매핑 할 수 있다. implementation 'org.json:json:20230227' 해당 dependency는 JSONObject..
서론 메시지 큐를 사용하는 용도는 다양하다. 외부 서비스에 특정 정보나 상태 변경을 알리기 위해 비동기적으로 알림을 보내야 할 때 또는 MSA에서 각각의 서비스 정보 교환이 이뤄질 때 각 서비스의 의존성을 낮추는 느슨한 결합을 구현하기 위해 종종 사용한다. 수많은 Kafka, RabbitMQ 등 많은 메시지 큐 서비스가 있지만, 여기선 AWS의 SQS를 사용하여 비동기 메시징을 구현했다. SQS 역시 메시지 큐의 일종으로 어플리케이션 코드를 통해 해당 큐에 메세지를 보내거나 메세지를 받아올 수 있다. 아래 본문에서는 SQS를 Spring으로 사용하는 법을 설명한다. AWS 콘솔에서 SQS 사용 준비하기 IAM 액세스키 발급 IAM을 통해 SQS를 사용할 사용자 계정을 생성하고 해당 계정의 보안 자격 증명..
Spring interceptor란 spring의 controller는 각 사용자가 해당 url 경로로 접속 했을 때 각 경로에 맞는 서비스 로직을 매칭해주는 첫번째 관문이다. @RestController @RequestMapping("/customer/{foodKind}/store") public class StoreController { private final MemberService memberService; private final StoreService storeService; public StoreController(MemberService memberService, StoreService storeService) { this.memberService = memberService; this...
서론 프로그래머스 - 시소 짝꿍 https://school.programmers.co.kr/learn/courses/30/lessons/152996 유사한 문제가 자주 나옴에도 불구하고 비슷한 실수를 반복하는 것 같아 기록하고자 글을 작성한다. 해당 문제에서 주어진 제한사항은 배열의 길이가 100,000으로 상당히 탐색에 시간이 많이 소요될 것이다. 이런 경우 완전 탐색으로는 시간 초과가 발생하므로, 이진 탐색, dfs 등 여러 옵션을 생각할 수 있다. 하지만 이렇게 단순 값을 비교하는 문제는 해시부터 시도해보는 것이 좋다. 문제 풀이 1차 시도 - combinations 사용 결과: 시간 초과 from itertools import combinations def solution(weights): ans..