본문 바로가기

👨‍💻 프로그래밍62

무중단, 카나리 배포 환경에서 DB Schema 수정하기 문제 상황 자주 있는 상황은 아니지만 DB의 Column을 수정해야 할 일이 있습니다. 굳이 왜 수정해야 하나? 어차피 이름만 다른거 아니야? 하실 수 있지만 이름과 사용 용도가 다르면 장기적으로는 인지 비용이 높아져 팀 전체의 자원이 더 많이 들게 됩니다. 무중단의 핵심은 이 작업으로 인해 에러를 만나는 유저가 1명도 없어야 한다는 것입니다. 그럼 가장 먼저 떠올리는게 DB Column 변경과 배포를 딸깍딸깍 동시에 진행하면 되지 않을까 생각할 수 있습니다. 솔직히, 팀 리소스가 부족한 상황에서는 좋은 해결책이라 생각합니다. 새벽 시간 트레픽이 없을 때를 틈타 작업하면 큰 문제가 없을 수도 있습니다. 하지만 서비스의 중요도가 높거나 카나리 배포를 하고 있는 환경에서는 이것도 어렵습니다. 이 상황에서 정.. 2024. 2. 25.
다양한 로그인 방법을 알아보자 (OAuth, Open ID, OIDC, SSO, SFA, 2FA, MFA, OTP, PassKey) 🐜 큰 그림 우선, 로그인이란 나만 아는 정보를 제공해서 모두가 접근할 수 없는 특정 정보를 접근하는 것을 말합니다. 당연히 보안이 좋기 위해서는 나만 알 수 있는 정보들을 최대한 많이 제공하는게 좋겠죠. 하지만 로그인 할 때 마다 아이디/비밀번호를 입력하고, 지문이나 얼굴 인증을 하고, OTP 코드를 입력한다면 너무 불편해서 거의 쓰지 않겠죠? 그래서 보안과 편의성 사이의 저울질이 중요합니다. 🐜 분류하기 SFA, 2FA, MFA = 1번만 인증을 하냐, 여러번 인증을 하냐? 로그인 할 때 아이디/비밀번호든, 생체인증 (얼굴, 지문 등)이든, 1개의 인증정보만 제공하면 SFA (Single Factor Authentication)입니다. 여기에 더해 추가로 흔하게는 OTP (One-Time Passwo.. 2024. 2. 8.
Kotlin Sequence (스퀸스) 에 대해 알아보자 🐜 Sequence, 본질적으로 뭘까? Type Kotlin의 Sequence는 Type입니다. Collection 처럼 값을 담고 있지만 Eager하게 만드는게 아닌 Lazy하게 만들어 대량의 데이터를 효율적으로 다루거나 무한히 계속되는 데이터를 다룰 수 있게 해 줍니다. 예를들어 아래와 같이 특정 연산을 하고 난 결과의 1번째 값을 가져오는 코드가 있다고 해 봅시다. (100 until 2_000_000) .map { it * 2 } .filter { it % 3 == 0 } .first() 이 코드의 내부 동작을 살펴보면 우선 map으로 모든 원소를 2배 한 후, filter로 모든 원소의 나머지를 계산해 0인 원소만 남긴 뒤, 여기서 첫 번째 원소를 가져옵니다. Eager 하게 동작하기 때문에 이.. 2024. 2. 4.
핵사고날? 클린 아키텍처? DDD? 🐜 취준생들의 단골멘트 취준생들의 이력서에 단골로 등장하는 단어가 있습니다. 이름도 멋진 헥사고날 Architecture입니다. 처음 헥사고날 Architecture류의 용어들 (헥사고날 Architecture, DDD, Clean Architecture)를 접했을 때 저는 쓸데없이 복잡하고 혼란스러운 이것들을 왜 써야 하는지 도저히 이해할 수가 없었습니다. 그도 그럴게, 헥사고날 Architecture가 왜 좋은지 알려면 Business Logic이 꽤 복잡한 애플리케이션을 다뤄야 하기 때문입니다. 간단한 CRUD 애플리케이션에 핵사고날 아키텍처를 써 봤자 쓸데없이 복잡할 뿐이죠. 그럼 헥사고날 Architecture가 왜 태어났고 왜 유용한지 여태까지 이해하고 경험한 내용들을 써 보겠습니다. 🐜 용어.. 2024. 1. 28.
☁️ Swift Data를 써서 iCloud 연동 기능 만들기 Swift Data 간단 소개 Apple의 ORM (Object Relational Mapping) ORM이란 Application 내부 객체와 DB 상의 객체를 연결시켜 주는 기술입니다. 어떤 언어나 어떤 DB를 써도 쉽게 찾아볼 수 있는 기술이지만, Apple의 레전드라면 이게 이번년도 (2023년)에 나왔다는 것입니다... 즉, Swift Data를 쓴 프로젝트를 구동하려면 iOS 15 이상이 필요하고, 자연스럽게 개인 토이 프로젝트 아니면 현실적으로 쓸 수 없습니다. 하지만 저는 토이 프로젝트를 하니 과감하게 iOS 15 미만은 고객에서 포기하고 써 봤습니다. Swift Data를 쓰기 위해서는 3가지 단계를 거치면 됩니다. Model을 정의 ModelContainer를 주입 context나 Pr.. 2023. 12. 24.
CQRS (Command Query Responsibility Segregation) 알아보기 CQRS(Command Query Responsibility Segregation)가 뭔데 CQRS는 영어 줄임말 그대로 Command와 Query를 분리한다는 개념입니다. Command가 뭐고, Query는 또 뭐고, 왜 분리해야 할까요? Query - 읽는 동작입니다. 읽기만 할 뿐 데이터나 상태를 절대 변경시키면 안 됩니다. Command - 변경하는 동작입니다. 보통 내부 상태나 데이터를 구체적으로 어떻게 변경할지는 명시하지 않고 도메인에 맞는 동작을 전해주는 경우가 많습니다. 여기서 Command에 대해 자세히 알아봅시다! Command가 상태를 변경한다고 해도 이를 명시적으로 하면 결국 어떤 동작을 해야 할지 각각의 도메인에 가서 다 확인해야 합니다. 예를들어 배송 시스템이 있다고 하고 유저가.. 2023. 12. 8.
🐶 신입 개발자가 3개월 현업에서 굴러본 후기 오랫동안 꿈꿔왔던 토스에 취업해서 일한지도 3개월이 지났습니다. 아직까지는 하루하루 뛰어난 분들 곁에서 일한다는게 감사하고, 세상에 도움이 되고 있다고 믿는 제품에 기여하는 것도 즐겁습니다. 서당개도 3년이면 풍월을 읊는다고 하니, 서당개 달성률 10%가 지난 시점에서 지난 3개월을 회고해 봅니다. 취업준비 할 때 중요할 거라 생각했던 것들과 실제로 중요한게 너무 다르다 취업준비를 위해 저는 여러 새로운 기술과 포트폴리오를 만드는 것에 집중했습니다. K8S, ES, QueryDSL, Kafka 같은 여러 최신 기술들을 공부하고, 필요하다고 생각하지는 않지만 배움을 위해 포트폴리오를 MSA로 만들기도 했습니다. 하지만 이런 기술들의 기반을 적극적으로 개발하고 최적화 하는 팀이 회사에 얼마나 있을까요? 적어.. 2023. 11. 26.
😵 1달동안 MSA 다시 Mono로 전환한 후기 취준생 시절에 열심히 만들었던 책잇아웃이라는 독서 관련 사이트 있습니다. 처음에는 취업을 위해서 시작했지만 갈수록 제품에 애정이 생겨 취업 후에도 계속 운영하고 있었는데요. (운영이라고 해도 AWS에 서버 띄어 놓는 게 다이지만...) 문제는 프로젝트가 상당히 크고 복잡해서, 유지보수는 커녕 운영도 힘들다는 것이었습니다. 일단 서버 비용이 1달에 거의 20만원 가까이 나왔습니다... 9개의 서버를 동시에 띄워야 하는 MSA 구조 때문이었는데요, 서버 비용뿐만 아니라 여러 이유로 MSA 구조였던 프로젝트를 다시 Monolithic 구조로 전환하기로 하였습니다. 1달 동안 회사를 다니면서 주말에 틈틈이 프로젝트를 진행했는데, 없는 시간 쪼개서 하는 거니 기왕이면 뭔가를 더 하고 싶어 모두 Kotlin으로 재.. 2023. 11. 13.
Kotlin의 inline 함수 알아보기 inline이 뭐하는 걸까? 우리가 코딩을 할 때 적극적으로 의식하지는 않지만, 함수를 호출하는건 어느정도 Overhead를 동반합니다. 보통은 현대 컴퓨터 성능이 워낙 좋고, 컴파일러가 최적화를 최대한 해 줘서 굳이 의식할 필요는 없습니다. 하지만 Kotlin에서는 함수가 일등시민이기 때문에, Parameter에 함수를 Argument로 넘기거나, 함수를 Return Type으로 가지는 함수가 있을 수 있습니다. 이는 자바에서는 FunctionN 객체를 만들거나 Closure를 사용할 경우 함수를 호출하는 방식으로 처리합니다. 이 경우 Kotlin에서 함수형 스타일의 코드가 성능에 어느정도 영향을 줄 수 있겠죠? 그럴때 inline을 쓰면 함수 호출 부분을 없애고 코드안에 함수 내용을 넣어 줍니다. I.. 2023. 10. 9.