전체 글 82

Multi Tenancy 아키텍처에서 Serverless로 Cron Job 수행하기

회사를 들어온 지 2주 남짓 지났나, 회사에서 운영하는 앱에 있던 하나의 서비스를 똑 떼서 다른 앱에도 붙일 수 있게 멀티 태넌시(SaaS)를 구축하는 업무를 맡았다. 그중 일정 데이터를 산출하는 통계작업을 serverless로 크론으로 돌리면서 설계부터 많은 우여곡절과 고민을 하였다. 정리를 해본다. 일단 멀티 태넌트가 수행하는 요구사항은 독립적이지만, 정 반대로 크론 잡은 모든 db에 일괄적으로 시행을 해야 해서 머리가 복잡했다. 요구 사항 멀티태넌시 아키텍처를 가진 시스템에서의 매일 정오 시행 되는 크론 작업 모든 태넌트들의 DB에 시행 멀티 태넌트는 논리적 DB 로 분리 서버리스(serverless)로 시행 아키텍처 고민 하나의 cron 서비스에서 모든 태넌트의 db 관리 비즈니스 로직에 멀티 태..

카테고리 없음 2024.04.10

단일 장애 지점 (SPOF) 문제와 해결책

1. 백엔드 개발에서의 SPOF 단일 장애 지점(Single Point Of Failure) 은 시스템이나 네트워크의 한 부분이 고장 났을 때 시스템의 가동이 멈추는 현상을 말한다. 이런 지점은 시스템의 취약점으로 작용하고 이를 해결하지 못하면 전체 시스템이 마비될 수 있다. 가장 흔한 예로는 데이터베이스 서버, 핵심 네트워크 스위치, 애플리케이션 서버가 하나만 존재할 때 발생한다. 이런 중요한 구성 요소가 장애를 일으키면 서비스가 정지되는 위험이있다. 예를 들어 모든 웹 트래픽을 단일 서버가 처리하는 경우나, 모든 데이터를 한 개의 데이터베이스 서버에 저장하는 경우가 있다. 코드 레벨에서도 발생할 수 있다. 특정 서비스나 라이브러리에 과도하게 의존하는 코드는 그 서비스나 라이브러리가 실패했을 때 전체 ..

카테고리 없음 2024.02.25

[플로니] Mysql에서는 이모지를 몇 글자로 인식하나요?🦄🍀🍀

문제 발생다음은 플로니가 출시되고 만난 에러 중 하나이다.로그 파일에 들어가서 보면 Date too long for column 'name' at row 1라는 메시지의 Sql Exception이 터져있다. 문제가 있는 name 컬럼은 가계부 이름 칼럼이고, 우리의 비즈니스 로직 상, 가계부 이름은 10자로 제한 돼 있어 DB도 크기가 varchar(10)으로 설정 돼있었다. 이상한 건, 분명 프런트에서도 가계부 이름을 10자로 제한하고 있을 텐데 에러가 터질 리가 없었다. 그래서 사용자가 요청했던 로그를 보니, 가계부 이름은 10자를 넘지 않았지만, 이모지(🍀)가 들어가 있었다. 그렇게 테스트를 해보았다. DB에서 이모지가 몇글자로 인식되는가? 다음과 같이 ✅❣️ 를 넣으면, 우리 눈엔 두 글자지만 m..

Floney 2024.01.16

인턴을 종료하며..

지난 7월부터 12월까지 한 보안기업에서 학점 연계 인턴을 했다.(나는 컴퓨터 보안 전공이다). 비록 서비스 기업이 아닌, 보안기업이지만 처음으로 ‘개발자’로서 어딘가 소속된다는 사실은 기뻤다. 더욱이 NestJs를 사용하는 팀이라니…!! 꺅 넘 좋다 어떤 일을 했었나 보안기업이라는 도메인 특성상 포기해야 할 일도 많았다. 트래픽을 경험하고 빠른 성능을 고려해야 한다기보다는 si로서 제품을 얼마나 견고하게 만들고 에러가 없느냐가 우선이었다. 그럼에도 어떤 기능을 짤 때마다 사용자 입장에서 이게 맞아? 사용자가 편해?라고 물어봐주는 팀장님 덕에 사용자 입장에서 생각해 볼 수 있었다. 내가 했던 큰 두 가지 업무는 다음과 같았다 (1) NestJs로 레거시시스템을 마이그레이션. 기존 운영하던 레거시 시스템을..

[플로니] 에러에 대비하는 서비스 만들기

플로니가 출시되고 약 1달이 흘렀다. 되게 오래된 것 같은데 1달밖에 안된 건가 싶기도 하고..ㅎ 향로님의 홍보( 경쟁력 있는 신입 포트폴리오 (tistory.com) 감사합니다..🫶) 그리고 소중한 지인들에게 강매(?)하고 지인들이 홍보해 준 덕에 다운자 수 약 300명과 가계부 내역은 약 1500개가 쌓이는 기적으로 인해 서비스 운영이라고 할 수 있게 되었다..!🍀🍀 플로니 팀은 런칭 이후 그동안, 재정비 시간, ver1에 대한 수정사항 및 ver2 일정을 의논했다. 그중 재정비 기간 동안, 서버팀은 에러에 대응하는 몇 가지 인프라 환경을 구축했다. 이 부분은 앱 런칭 전에, 운영을 위한 조언받은 것 중 하나였다. 그 당시엔 필요할까 싶었지만, 막상 운영을 하니 터지는 이슈마다, 아 그게 그 말이었구..

Floney 2024.01.05

[플로니] 드디어 런칭했습니다 + 회고 .. 앞으로 나는

12/1일 드디어 만들어오던 앱이 런칭했다. IOS에서 만나볼 수 있어요! 많관부 앱을 만들기로 합류한 게 4/3일이었다 그리고 11/30일 오후 10시쯤 앱을 심사에 올렸다 그리고 다음날 새벽 1시에 accepted 메일을 받았다 약 8개월 동안 참 많은 일이 있었다. 그 이야기를 약간의 소주제로 나누어 두서없이 적어볼까 한다.[어떻게 프로젝트를 구하게 되었나요?] 우선 왜 앱을 만들었니?라고 하는 분들이 많다 예전 회고에도 나올 텐데, 진짜 뻥 안치고 향로님께 멘토링을 받다 멘토님의 한마디 “사용자가 있는 서비스를 해보세요”라는 말 한마디에 시작했다. 자세한 건.. 나의 과거 회고록을 참고하세요(홍보) 2023.07.12 - [이런저런이야기] - 2023년 상반기 회고 학교 에타에 런칭까지 하고 유지..

Floney 2023.12.03

[플로니] 가계부 금액 타입 정하기 (double vs decimal)

1. 우리 가계부는 999억까지 최대 금액으로 입력이 가능하다. 2. 우리 가계부는 다양한 화폐단위를 지원한다. 따라서, 소수점이 필요하다 거의 막바지에 발견했지만 크리티컬한 이슈가 있었다 바로, 화폐 단위를 고려하지 않고 금액 타입을 long으로 설정하는 바람에... 소수점이 불가능해졌다. 따라서 급하게 수정을 해야했다. 사실 처음에 아무 생각이 없이... 정밀도를 고려하지 않고 단순히 실수형이니깐 float로 저장을 했다가 재수정이 요해졌다. float는 정밀도가 7 자리기에, 999억을 저장하게 되면 오차가 발생한다. 정말 기본이 중요함을 여기서 깨닫고 반성 차 글을 써본다 1. float float는 4바이트(32bit)까지 표현이 가능하다. 부호(1bit) + 지수(8bit) + 가수(23bit..

Floney 2023.11.12

[DB] View 테이블이란?

요즘 회사에서 레거시 시스템을 typescript와 Nest JS를 가지고 마이그레이션을 하고있다. 예전 레거시 시스템을 파헤치다가 처음 보는 view로 이루어진 테이블이 있어 작성해본다. view 테이블이란? 하나의 가상 테이블이라고 생각하면 된다. 물리적으로 존재하지 않는다 조회는 가능하지만, 삽입/갱신/삭제에는 제약이 따름 특정 뷰가 다른 뷰를 참조하여 생성 가능하다 뷰가 참조하는 기본 테이블이 삭제되면 같이 삭제 됨. 실제 데이터가 저장되는 것이 아니다. 뷰를 통해 데이터를 관리할 수 있다. 독자적인 인덱스 불가 view 의 사용 목적 복잡한 쿼리문의 간소화, 중복 발생하는 쿼리문의 관리(사용자 편의) 보여주는 컬럼의 제한 (보안성) 또한 추가적인 목적(데이터베이스 보안) 쿼리 CREATE 생략가..

카테고리 없음 2023.11.03

[플로니] 데이터 동시성 제어하기

런칭 때가 되니..끝이라고 생각했지만, 처리해야할 게 하나둘 생긴다 오늘은 이러한 이슈를 생각해봐야한다. 만약, 동시에 가계부 내역을 고쳐서 동시성 문제가 생기면 어떻게 하나요???? 우리의 가계부는 공유 가계부라 해당 동시성 문제를 매우매우 신중히 봐야한다. 팀원과 미팅을 통해..일단 동시성 제어가 필요한 코드가 어디인가를 생각해보았다. 처음에 접근은 이랬다. 가계부 내역을 수정하는 과정중에 다른 사람이 가계부 내역이 삭제된다면? 이걸 동시성 제어를 해서, 가계부 내역을 수정할 때 다른 '쓰기'행동을 막아야하는가? 근데 이제 이건 아닌 것 같단 생각을했다. 왜냐하면 각 사용자의 입장에서 생각해보면 '공유'가계부 측면에서 생각하면, 뭔가 어? 왜 내가 수정했는데 수정이 안되고, 삭제 되었어!는 개발자의 ..

Floney 2023.10.08

[플로니] 서버야 왜 자꾸 죽니

최근 플로니 앱의 론칭을 앞두고 베타테스트에 들어갔다. 그래서 그런지..AWS 프리티어를 사용하는 서버가 자꾸 터진다. 여러 원인이 있겠지만 로그는 다음과 같이 찍힌다 결국 같은 백엔드 팀원과 비상 회의가 열렸다. (1) 추측 1 - HIkari pool이 모자란걸 보아, 한 번의 요청에 여러 Pool이 쓰이나? 근데 난 Hikari Pool이 뭔지부터 알아야했다. 1. 전통적인 WAS 와 DB 연결 방법 회사에서 레거시 시스템을 담당하는 중이라 아주 잘 안다 ㅎㅎ.. 보통 드라이버를 로드 하고, conntection을 열어서 query를 직접 날린다 근데, 매 쿼리마다 이렇게 하면 비용이 많이 든다. DB나 웹서버나 서로서로 TCP 커넥션을 생성해야 함 2. Connection Pool Hikari P..

Floney 2023.10.03
728x90