
이번에 준비중인 서비스에서는 서비스 이용 보상으로 스탬프를 준다. 그런데, 그 스탬프 획득 조건이 여러 가지이다. 연속 학습을 했을 때 주는 스탬프도 있고, 특정 날짜에 들어왔을 때 주는 스탬프도 있고. 스탬프 기능을 구현하면서 이걸 JPA로 구현할 때 어떻게 하면 좀 더 객체지향적으로 할 수 있을지 고민했다. 이런식으로 서비스 이용 보상이 주어지는 경우는 많으니까 다른 분들은 어떻게 하실지 모르겠지만, 나는 아래와 같이 했다. 우선 스탬프 획득 조건이 크게 세 종류라고 생각하고 진행했다.CountCondition: 어떤 행동을 일정 횟수하면 주어지는 조건TimeRangeCondition: 어떤 기간동안 어떤 행동을 하면 주어지는 조건DateRange: 어떤 날짜에 어떤 행동을 하면 주어지는 조건 획득 ..

방금 있었던 일이다. 내가 초창기부터 런칭, 그리고 꽤 최근까지도 담당한 우리 회사의 서비스 상용 서버가 내려갔다. 그리고 약 15분만에 서버를 복구했다.(중간에 다른 문제로 시간이 좀 걸렸는데 그 문제만 아니었으면 더 빠르게 복구했을 것이라고 생각한다.) 사실 이렇게 서버 다운에 대응이 가능했던 이유가 있는데, 내가 서버 인프라 환경을 구축할 때 Prometheus + Grafana로 모니터링 시스템을 구축하며 서버가 다운될 경우를 대비해 메일이 전송되도록 해놨기 때문이다.(물론 서버 재시작 스크립트도 준비해놨다.) 사실 우리 회사는 자체 서비스가 처음이고, 작은 회사이니 해당 서비스 인프라 구축을 전적으로 내가 알아서 했는데, 모니터링 시스템을 구축해야겠다고 생각했었던 건 내가 다른 프로젝트들을 하며..
상황 EC2는 총 세대가 있다. 두 대는 서비스용, 한 대는 서비스 관리용으로 프로메테우스 + 그라파나가 실행중이다. 그런데 이 EC2끼리 보안을 이유로 https로 통신하도록 만들어야 하는 상황이 있었다.문제 AWS에서 인증서 발급을 무료로 해주긴 하지만, 그건 도메인이 존재하는 경우였고, 도메인이 있어서 발급을 받는다해도 AWS에서는 인증서 파일을 제공하지 않을 뿐더러 인증서는 EC2에 바로 연결할 수 없고, 로드밸런서 등을 연결해야 했다. 하지만 더 큰 문제가 있었는데 우선 서버 자체가 https로 실행되어야 하기 때문에 서버 자체에 인증서 파일이 필요했다. 이제 서버 자체에 인증서 파일을 어떻게 만드느냐가 문제였다. Caddy를 사용할까 했지만 이것도 애초에 self-signed 인증서이고, 설정..

원래는 서버1 + 서버2가 붙어 있는 구조로 개발했었다. 그래서 EC2 두 대에 각각 서버 2가 있었던 상황이다. 이 상황에서 서버2만 한대로 따로 다른 EC2로 가게 되었다. 그런데 서버2는 이미 다른 사람들이 사용중이었다. 이 상황에서 어떻게 눈치채지 못하게 서버2를 다른 EC2로 갈아끼웠을까에 대한 이야기이다.서버 소스 분리 우선 서버 소스를 분리하는 작업이 먼저였다. 이 부분은 원래 분리를 고려하고 개발이 되었어서 그다지 어렵진 않았다. 서버1과 서버2의 url도 앞부분도 분리되어 있는 상태였다.새로운 EC2에 서버 세팅 새로운 EC2를 만들고 서버를 세팅했다. DB 연결에 문제가 있었지만 보안그룹 문제였다.ALB로 특정 경로만 다른 서버로 호스팅 설정 로드밸런서로 가서 [리스너 및 규칙]에서 설..
프로젝트에서 suneditor를 사용중인데 이미지 업로드를 구현할 일이 생겼다. 그래서 multer를 이용하여 이미지 업로드를 구현했는데 이 부분은 구글에 찾아봐도 잘 안 나와서 혼자 해결해서 누군가도 헤맬 것 같아 여기에 정리해둔다.MulterModule 설정@Module ({ imports: [ MulterModule. register({ storage: diskStorage({ destination: '/public/uploads', // public 하위의 uploads 폴더에 이미지가 저장됨. filename: (req, file, callback) => { const uniqueSuffix = Da..
오늘 아침에 막 출근해서 이슈를 처리하려는데 서버에 문제가 생겼다. 서버 로그를 살펴보니 DB에 연결되지 못하고 있었고, Unable to connect to the database(lock)이 발생하고 있었다.RDS 상태와 로그를 확인하자 제일 먼저 RDS 상태와 로그를 확인하기 위해 콘솔에 접속했다. RDS 상태는 정상. 에러로그에도 별다른 사항이 없었고, 모니터링 지표를 봐도 문제가 될 부분이 없었다.lock이 실제로 걸려 있는가? 원래 잘 작동되고 있던 서버였고, lock 관련해서는 이미 테스트를 했던터라 갑자기 발생한 게 의아했다. 우선 RDS의 상태가 정상인지 확인했는데 정상이었고, datagrip으로 접속해서 lock이 걸려 있는지 확인했다. 그런데 걸려 있는 락이 없었다.최후의 방법, 재기..

최근에 애드몹 설정을 한 앱을 앱스토어에 출시했다. 그 과정 중에 내가 찾아봐도 안 나왔거나 몰랐던 정보들이 있어서 이곳에 정리한다.미리보기는 테스트 화면으로 하지 말자 앱스토어에 앱을 검색하면 나오는 앱 사용 화면이 있다. 앱을 출시하려면 이걸 준비해야 하는데, 난 잘 몰라서 플러터로 실행하면 나오는 debug 리본이 노출되고, 애드몹 테스트 광고가 노출된 화면으로 캡처를 해서 제출했다. 결과는 반려. 스크린샷은 실제 사용하는 것처럼 보여야 한다고 한다. 그래서 debug 리본도 안 보이도록 처리하고, 애드몹 광고 영역도 가리고 스크린샷을 제출해서 심사 통과했다.애드몹 앱 등록을 위한 준비를 미리 하자 나도 그냥 앱에 애드몹 설정만 하면 되는 줄 알았는데, 알고보니 그게 아니라 앱스토어에 등록한 이후에..

서비스 오픈을 준비하면서 내가 가장 걱정했던 것인 AWS에 서버 구축하기를 마쳐서 그 과정을 정리해본다. 우선 구축하려는 아키텍처는 아래와 같았다.EC2 인스턴스 만들기 EC2 인스턴스를 만드는 과정은 다른 블로그에 잘 나와 있으므로 생략한다. 서버1을 먼저 인스턴스 생성으로 만든 후에 서버1을 이미지화하여 템플릿 생성 후 템플릿으로 인스턴스를 복제하여 서버2를 생성했다. 이때, 서버1을 접속하기 위한 .pem 파일을 함께 사용할 수 있었다. 만약 각 서버마다 다른 .pem 파일로 관리하기를 원한다면 새로 만들어주는 수 밖에 없는 듯하다.RDS로 Master-Slave 만들기RDS로 DB를 하나 만든 후, 그 DB를 선택하고 읽기 전용 복제본 생성을 선택한다. 이렇게 되면 Master로는 CRUD가 전부..