본문 바로가기

👨‍💻 프로그래밍 82

무중단, 카나리 배포 환경에서 DB Schema 수정하기 무중단, 카나리 배포 환경에서 DB Schema 수정하기 문제 상황 자주 있는 상황은 아니지만 DB의 Column을 수정해야 할 일이 있습니다. 굳이 왜 수정해야 하나? 어차피 이름만 다른거 아니야? 하실 수 있지만 이름과 사용 용도가 다르면 장기적으로는 인지 비용이 높아져 팀 전체의 자원이 더 많이 들게 됩니다. 무중단의 핵심은 이 작업으로 인해 에러를 만나는 유저가 1명도 없어야 한다는 것입니다. 그럼 가장 먼저 떠올리는게 DB Column 변경과 배포를 딸깍딸깍 동시에 진행하면 되지 않을까 생각할 수 있습니다. 솔직히, 팀 리소스가 부족한 상황에서는 좋은 해결책이라 생각합니다. 새벽 시간 트레픽이 없을 때를 틈타 작업하면 큰 문제가 없을 수도 있습니다. 하지만 서비스의 중요도가 높거나 카나리 배포를 하고 있는 환경에서는 이것도 어렵습니다. 이 상황에서 정.. 2024. 2. 25.
다양한 로그인 방법을 알아보자 (OAuth, Open ID, OIDC, SSO, SFA, 2FA, MFA, OTP, PassKey) 다양한 로그인 방법을 알아보자 (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 (스퀸스) 에 대해 알아보자 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? 핵사고날? 클린 아키텍처? DDD? 🐜 취준생들의 단골멘트 취준생들의 이력서에 단골로 등장하는 단어가 있습니다. 이름도 멋진 헥사고날 Architecture입니다. 처음 헥사고날 Architecture류의 용어들 (헥사고날 Architecture, DDD, Clean Architecture)를 접했을 때 저는 쓸데없이 복잡하고 혼란스러운 이것들을 왜 써야 하는지 도저히 이해할 수가 없었습니다. 그도 그럴게, 헥사고날 Architecture가 왜 좋은지 알려면 Business Logic이 꽤 복잡한 애플리케이션을 다뤄야 하기 때문입니다. 간단한 CRUD 애플리케이션에 핵사고날 아키텍처를 써 봤자 쓸데없이 복잡할 뿐이죠. 그럼 헥사고날 Architecture가 왜 태어났고 왜 유용한지 여태까지 이해하고 경험한 내용들을 써 보겠습니다. 🐜 용어.. 2024. 1. 28.
🍎 Swift Data를 써서 iCloud 연동 기능 만들기 🍎 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나 Property.. 2023. 12. 24.
CQRS (Command Query Responsibility Segregation) 알아보기 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개월이 지났습니다. 아직까지는 하루하루 뛰어난 분들 곁에서 일한다는게 감사하고, 세상에 도움이 되고 있다고 믿는 제품에 기여하는 것도 즐겁습니다. 서당개도 3년이면 풍월을 읊는다고 하니, 서당개 달성률 10%가 지난 시점에서 지난 3개월을 회고해 봅니다. 취업준비 할 때 중요할 거라 생각했던 것들과 실제로 중요한게 너무 다르다 취업준비를 위해 저는 여러 새로운 기술과 포트폴리오를 만드는 것에 집중했습니다. K8S, ES, QueryDSL, Kafka 같은 여러 최신 기술들을 공부하고, 필요하다고 생각하지는 않지만 배움을 위해 포트폴리오를 MSA로 만들기도 했습니다. 하지만 이런 기술들의 기반을 적극적으로 개발하고 최적화 하는 팀이 회사에 얼마나 있을까요? 적어.. 2023. 11. 26.
😵 1달동안 MSA 다시 Mono로 전환한 후기 😵 1달동안 MSA 다시 Mono로 전환한 후기 취준생 시절에 열심히 만들었던 책잇아웃이라는 독서 관련 사이트 있습니다. 처음에는 취업을 위해서 시작했지만 갈수록 제품에 애정이 생겨 취업 후에도 계속 운영하고 있었는데요. (운영이라고 해도 AWS에 서버 띄어 놓는 게 다이지만...) 문제는 프로젝트가 상당히 크고 복잡해서, 유지보수는 커녕 운영도 힘들다는 것이었습니다. 일단 서버 비용이 1달에 거의 20만원 가까이 나왔습니다... 9개의 서버를 동시에 띄워야 하는 MSA 구조 때문이었는데요, 서버 비용뿐만 아니라 여러 이유로 MSA 구조였던 프로젝트를 다시 Monolithic 구조로 전환하기로 하였습니다. 1달 동안 회사를 다니면서 주말에 틈틈이 프로젝트를 진행했는데, 없는 시간 쪼개서 하는 거니 기왕이면 뭔가를 더 하고 싶어 모두 Kotlin으로 재.. 2023. 11. 13.
Kotlin의 inline 함수 알아보기 Kotlin의 inline 함수 알아보기 inline이 뭐하는 걸까? 우리가 코딩을 할 때 적극적으로 의식하지는 않지만, 함수를 호출하는건 어느정도 Overhead를 동반합니다. 보통은 현대 컴퓨터 성능이 워낙 좋고, 컴파일러가 최적화를 최대한 해 줘서 굳이 의식할 필요는 없습니다. 하지만 Kotlin에서는 함수가 일등시민이기 때문에, Parameter에 함수를 Argument로 넘기거나, 함수를 Return Type으로 가지는 함수가 있을 수 있습니다. 이는 자바에서는 FunctionN 객체를 만들거나 Closure를 사용할 경우 함수를 호출하는 방식으로 처리합니다. 이 경우 Kotlin에서 함수형 스타일의 코드가 성능에 어느정도 영향을 줄 수 있겠죠? 그럴때 inline을 쓰면 함수 호출 부분을 없애고 코드안에 함수 내용을 넣어 줍니다. I.. 2023. 10. 9.
Logback 간단하게 알아보기 Logback 간단하게 알아보기 Logback이 뭐 하는 걸까? Logback은 Java에서 가장 많이 사용되는 Logging 라이브러리입니다. Logback Home Logback Project Logback is intended as a successor to the popular log4j project, picking up where log4j 1.x leaves off. Logback's architecture is quite generic so as to apply under different circumstances. At present time, logback is divided into three mod logback.qos.ch Logback의 간단한 구조 Logback은 크게 3가지로 구성되어 있습니다. Logger.. 2023. 10. 1.
Redis, RabbitMQ, Kafka를 각각 Message Queue로 사용할 때의 장단점 Redis, RabbitMQ, Kafka를 각각 Message Queue로 사용할 때의 장단점 Message Queue를 신중히 선택해야 하는 이유 MSA 환경에서 비동기로 무언가를 처리하거나, Transaction을 처리하기 위해 많이 쓰이는 방식이 바로 Message Queue를 사용하는 방법입니다. Message Queue, 그거 아무거나 대충 쓰면 되지 왜 신중히 선택해야 할까요? 모든 SW 기술들이 그렇지만, 결국 장단점이 있기 때문입니다. 속도-비용-정합성 사이의 아찔한 줄타기를 이어간 결과, 크게 3가지 선택지가 주어지게 됐는데요. 이 3가지를 비교해 보고 어떤걸 선택해야 할지 알아보겠습니다. Redis의 장단점 아무튼 빠름. 근데 잃어도 알빠? Redis하면 보통 Cache를 떠올리시겠지만, Message Queue의 기능도 지원하기 때문에 Message Queue로도 사용할 수 있.. 2023. 9. 30.
🔒 분산 Architecture에서 Redlock으로 Lock 걸기 🔒 분산 Architecture에서 Redlock으로 Lock 걸기 분산 Architecture에서 Lock 걸기의 어려움 Monolithic Architecture에서도 성능을 고려하면 Lock 걸기가 복잡했습니다. 여러 Transaction Level을 고려하고, 재시도 매커니즘을 고안하고, Deadlock 상황에서 어떻게 해야할지 고려하고.. 근데 여기에 더해 MSA 같은 분산 Architecture에서 Lock을 걸어야 한다면 어떨까요? 성능을 더욱 고려해야 하고, Transaction 거는 것도 훨씬 복잡하고, Deadlock은 밥 먹듯이 있지 않을까요? Redis Instance가 1개일 경우 만약 Redis 1개를 공유하면 Lock을 구현하는건 비교적 간단합니다. Lock 별로 고유한 Key를 정의한 후, setNX를 사용해서 있을 경우 set하고, 없을 경.. 2023. 9. 28.
망분리 (Network Segregation), 왜 필요할까? 망분리 (Network Segregation), 왜 필요할까? 망분리는 말 그대로, 망(네트워크)를 분리한다는 것입니다. 보통 우리가 개인적으로 쓰는 컴퓨터는 아무 제한 없이 인터넷을 접속할 수 있습니다. 그렇기 때문에 바이러스에 감염될 수도 있고, 여러 공격의 대상이 될 수도 있습니다. 하지만 보안적으로 매우 중요한 곳에 이런 컴퓨터로 접근한다면 어떨까요? 나도 모르게 감염된 바이러스가 옮겨지거나, 내 컴퓨터를 통해 공격을 할 수 있을 지도 모릅니다. 그래서 망분리라는 개념이 나왔습니다. 망분리라고 인터넷이 안 되는건 아니다 망분리라고 무조건 인터넷이 안 되는건 아닙니다. 망분리의 핵심은 중요한 곳을 접속할 때 보안을 위해 불필요한 네트워크 접근을 차단하는 것이기 때문에, 꼭 필요할 경우 특정 사이트를 허용할 수는 있습니다. 망분리를 적용하는 여러가지 방법 보안이.. 2023. 9. 27.
MSA 환경에서 Circuit Breaker를 쓰는 이유, 그럼에도 발생하는 문제 Bulkhead로 해결하기 MSA 환경에서 Circuit Breaker를 쓰는 이유, 그럼에도 발생하는 문제 Bulkhead로 해결하기 Circuit Breaker가 뭘까? Circuit Breaker는 회로 차단기입니다. 말 그대로 내리면 정전이 되는 그 회로 차단기를 의미하는 건 아니고, 일종의 비유입니다. MSA 환경에서는 개별 Application의 복잡도는 내려가지만, 인프라 레벨에서의 복잡도는 늘어납니다. Client에게는 1개의 요청으로 보여도, 그 안에는 여러 MS 끼리 네트워크를 통해 요청을 주고 받습니다. 당연히 이 과정에서 실패 확률이 올라갑니다. 만약, 전기를 내리는 회로 차단기처럼 이런 오류를 방지하는 패턴이 없다면 한 MS의 오류가 다른 MS에게 번지기 때문에 이를 예방하기 위해 Circuit Breaker 패턴을 쓰게 됩니다. Circuit Breaker의 작동 방법 Circuit Breaker는 지속적으로 상.. 2023. 9. 24.
🥳 토스 NEXT 2023 합격 후기 (서버 전형, 신입) 🥳 토스 NEXT 2023 합격 후기 (서버 전형, 신입) 🐜 배경 단순히 수학을 좋아해서 수학과에 입학했지만, 점점 현실을 보게 되면서 내가 어떤 직업을 가져야 할까에 대한 고민이 깊어졌습니다. 후보는 여러개 있었지만 컴퓨터 과학이 적성에 잘 맞아서 다른건 접고 프로그래머가 되기로 결심했습니다. 대학교에서 컴퓨터 과학 수업을 3개 정도 듣고, 휴학을 하고 국비지원학원을 다녔습니다. 국비지원학원에서 배운 내용은 오래된 기술들이고 깊이도 없어 도움이 되지 않는다는 분이 많지만, 저는 국비지원학원을 들으며 제가 학문으로서의 컴퓨터 과학이 아닌 프로그래머라는 직업도 적성에 맞다고 알게 돼서 좋았습니다. 그 후 국비지원학원을 수료하고 1년간의 독학을 한 뒤 최종적으로 정말 꿈꾸던 회사인 토스에 합격하게 됐습니다. 토스는 제가 지원한 많은 회사 중 1곳이 아닌 꼭 가고 .. 2023. 9. 23.
Redux 아키텍처, 사용할 수 있을 정도로만 알아보기 Redux 아키텍처, 사용할 수 있을 정도로만 알아보기 서버 개발자로써 프론트엔드를 자세히 깊게 배울 생각은 없었지만, 프론트엔드 작업을 하면서 자연스럽게 불편함과 필요함을 느껴 하나하나 배우다 보니 Redux까지 쓰게 됐습니다. 처음에는 굳이 Redux까지 도입해야 할까 싶었지만, 여러 Component에 걸쳐 Props를 전달하고, 상태를 관리하다 버그를 만나서 디버깅을 하다 보니, 자연스럽게 상태관리 Library를 쓰지 않으면 코딩이 너무 고통스러워서 Redux를 배우게 됐습니다. Redux, 뭐고 왜 필요할까? 웹 애플리케이션에서는 다양한 상태가 필요합니다. 점점 애플리케이션이 복잡해 지면서 자연스럽게 관리해야 할 상태가 늘어나고, Component들을 분리하면서 상태들을 Props를 통해 전달해야 하는 경우도 많아집니다. 이럴때 상태 관리 Libr.. 2023. 8. 13.
🍎 취미 iOS 앱 개발 후기 🍎 취미 iOS 앱 개발 후기 최근 너무 웹 개발만 한거 같아 Refresh 겸, 또 평소 iOS 앱을 만들고 싶었기에 취미로 iOS 앱을 만들어 보기로 했습니다. 간단히 공부해 보니 iOS는 Objective-C + UIKit 에서 Swift + SwiftUI로 넘어가고 있는 상태였습니다. 취업을 위해서라면 다 공부해야 하겠지만, 취미로 하는거니 당연히 Swift + SwiftUI 조합을 사용했고, iOS 버전도 가장 최신인 iOS 15를 기준으로 하고, 나머지 솔루션도 애플에서 기본 제공하거나 가장 편한 걸 사용했습니다. (Persistence에 CoreData + CloudKit, CI/CD에 XCode Cloud 등) Apple 제품을 쓰면서 느꼈던 장단점이 개발에서도 나타난다 개발이 아니라 Apple 제품의 장단점이 뭘까요?.. 2023. 8. 3.
트랜잭션 격리수준 (Transaction Isolation)에 따른 데이터 불일치 현상 트랜잭션 격리수준 (Transaction Isolation)에 따른 데이터 불일치 현상 Trasnaction 격리수준을 왜 다르게 해야 할까? 성능 때문에 Transaction은 여러개의 작업을 하나의 작업으로 묶는 역할을 합니다. 흔히 ACID라고 줄여 부르는 특징을 가지고 있습니다. 애플리케이션이 복잡해 지면 Transaction이 길어지고, 자연스럽게 같은 데이터를 여러 Transaction이 써야 할 일이 생기게 됩니다. 직관적으로는 Transaction이 데이터를 사용중이면 다른 Transaction은 사용할 수 없도록 Lock을 걸면 되지만 그렇게 하면 데이터가 필요한 다른 모든 Transaction이 그 시간동안 대기해야 합니다. 그래서 한 Transaction이 데이터를 사용중일때, 다른 Transaction이 어떻게 처리할지에 관한 전략을 격리수준 (Isolation Lev.. 2023. 7. 18.
Git 파일의 Life Cycle 이해하기 Git 파일의 Life Cycle 이해하기 Git을 사용한지는 오래됐지만, Git을 엄밀히 공부하고 사용한 것은 아니였습니다. 그러던 와중 Git에 대한 이해 부족으로 협업 과정에서 문제를 몇 번 겪게 된 뒤로 Git을 이해하고 사용해야 겠다고 결심해 첫 단계로 Git으로 관리되는 파일들의 Life Cycle를 공부했습니다. Untracked -> Tracked Git으로 한 번도 관리되지 않은 상태의 파일은 Untracked 상태에 놓여 있습니다. 1번이라도 add, commit을 하면 Tracked 상태가 됩니다. git add를 하면 생기는 일 .git 내부에는 2가지의 영역이 있습니다. Staging Area와 Repository 입니다. git add를 하면 파일이 Staging Area로 이동됩니다. 여러개의 파일 혹은 파일의 일부분을.. 2023. 6. 29.
Spring에서 같은 type의 Bean 구분하는 방법 Spring에서 같은 type의 Bean 구분하는 방법 Spring의 가장 핵심적인 기능은 객체의 수명주기를 개발자가 관리하지 않고 Spring에서 관리해 주는 겁니다. 보통 이를 제어의 역전 (IoC)이라고 부르는데요. 객체의 수명주기를 개발자가 제어하던게 역전되서, Spring에서 관리해 준다는 의미입니다. Spring에서 관리되는 객체를 Bean이라고 부릅니다. 일반적으로 객체를 쓸 때와 같이, Spring의 Bean도 같은 타입의 Bean이 여러개 있을 수 있습니다. 스프링에서 이 Bean들을 어떻게 구분하고, 적절한 Bean을 어떻게 가져다 쓸 수 있는지 정리했습니다. @Qualifier @Configuration public class ObjectMapperConfig { @Bean public ObjectMapper mapper1() { retu.. 2023. 6. 6.
👜 Apple Wallet Pass, Spring Boot에서 개발하기 👜 Apple Wallet Pass, Spring Boot에서 개발하기 기본적인 구조 모르는 분야의 개발을 시작할 때 가장 먼저 해야 할 일은 공식 문서를 보는 것이라고 생각합니다. 그래서 저도 애플의 공식 문서를 참고해 우선 Apple Wallet의 기본적인 구조를 이해해 보려고 했습니다. 우선, .pkpass라는 파일을 아이폰, 맥북, 아이패드 등의 애플 기기에서 열면 Apple Wallet에 Pass가 추가됩니다. .pkpass는 폴더를 압축한 파일이라고 생각하면 되고, 그 폴더의 구조는 아래와 같습니다. 보시면, 핵심적인건 3가지 입니다. 리소스 파일 (icon, thumbnail, logo 등 이미지) 설정 파일 (pass.json) 리소스 파일, 설정 파일의 번역본 (영어, 한국어 등) 즉, Apple Wallet Pass를 개발하는 방법은 위 3가지를 준비하고,.. 2023. 6. 2.
반응형