본문 바로가기

전체 글

(6)
SOLID 디미페이 또 뻔한 SOLID 글이 아닙니다!최근 객체 지향과 소프트웨어의 품질을 높일 수 있는 방법들을 깊이 있게 공부하고 있어요. 지금은 OO 프로그래밍 세계에서 가장 대표적이고 잘 알려진 SOLID 법칙에 대해 자세히 배우고 있어요. SOLID가 워낙 유명하지만, 전 실제로 사용해 보고 결과를 눈으로 확인해보기 전까진 잘 믿지 않는 성격이에요. 그래서 SOLID를 사용하면 정말 확장과 유지가 용이한 소프트웨어가 만들어지는지 직접 살펴볼 거예요. 이런 이유뿐만 아니라 모든 디자인 패턴들은 많은 경험을 통해 만들어진 정제된 법칙들이니 실생활 예제를 최대한 많이 접해봐야 더 잘 공감할 수 있다고 생각해요. 제가 발견한 디미페이에서 SOLID 법칙을 이용해 코드를 개선할 수 있는 두 가지 사례 공유해 볼게요.이 글은..
Local Token 0.4 Release Note 로컬 생성 결제 토큰이 처음이라면, 이전 글을 먼저 읽어주세요! 최근 앱과 백엔드에서 로컬 생성 결제 토큰 구현을 시작했는데, 구현 중에서 치명적인 논리적 오류 찾아 사양 일부를 수정해야 했어요.하지만 이번 업데이트는 단순히 이 오류만 고치는 것이 아니라, 암호화 알고리즘 교체, TLV 포맷 도입, 키 유도 함수 등 보안적으로도 큰 변경이 이루어졌어요.TL;DR사양 논리 오류 수정HKDF로 암호 키 유도오프라인 무차별 대입 공격(Offline brute-force attack) 대응AES-GCM 사용 중지 및 XChaCha20-Poly1305 도입16 바이트를 줄여 QR 버전 5 사용 가능 (이전: 버전 6)TLV 포맷 도입Nonce 값으로 UUIDv7 사용Additional Data 필드 추가Time-..
QR 코드에 최대한 많이 때려넣기 결제용 QR 코드는 단순히 일회용 토큰으로만 구성될 수 있지만, 로컬 생성 결제 토큰처럼 사용자 ID나 결제 수단 정보 등 추가적인 데이터가 충분히 담길 수 있어요. 네이버 페이에서 사용되고 있는 EMV-QR 표준은 이미 탬플릿 지시자나 결제 수단 정보(Track 2 Equivalent Data)와 인증 코드 같은 부가 정보를 담고 있어요. 하지만 QR 코드로 전달할 수 있는 데이터의 양은 훨씬 제한적이에요. 이론상 가장 큰 QR 코드는 약 2,900자 까지 담을 수 있지만, 이 경우 QR 코드의 크기가 너무 거대해져서 특히 모바일 앱에서 사용하기엔 적절하지 않아요. 바코드도 하나의 디자인 요소로 볼 수 있기 때문에 QR 코드의 크기에 대한 제한도 필요해요. 특히 로컬 생성 결제 토큰은 사용자 기기에서 ..
🤫오프라인이지만 온라인이어야 해요 - 로컬 생성 결제 토큰 디미페이는 네이버페이와 카카오페이처럼 사용자 휴대폰에서 제시되는 QR 코드로 오프라인 결제를 제공해요. 그런데 디미페이를 포함한 이런 대중적인 오프라인 결제 서비스를 사용하기 위해 공통적으로 필요한 게 있어요. 바로 "인터넷"이에요. 오프라인 결제를 하는데, 온라인이어야 한다니, 뭔가 모순적이지 않나요? 사실 요즘 밖에서 인터넷을 사용하지 못하는 사람은 많이 없다고 생각해요. 그래서 크게 중요하게 생각하지 않을 수도 있는데, 저희가 인터넷 환경에 신경쓰는 이유는 디미페이가 학생들을 위한 결제 서비스이기 때문이에요. 학생들은 상대적으로 모바일 데이터가 부족한 경우가 많아요. 인터넷이 안돼서 친구가 대신 결제해 주고 나중에 송금해 준다는 걸 저희 팀원에게 들었을 때 꾀 충격적이었어요. 모든 학생이 차별 없이..
🔩Nest.js로 견고한 백엔드 만들기 이번 글에서는 디미페이 2.0 백엔드 개발 과정에 집중해서 v2 백엔드가 어떻게 구성되고, QR 코드 결제 과정을 따라가 보며 DDD 빌딩 블록으로 비즈니스 로직을 추상화한 사례를 이야기해볼게요.기술 스택디미페이 v2 백엔드는 Bun 런타임과 타입스크립트, Nestjs(express), Mikro ORM으로 개발되었어요. 제가 선택한 도구들은 이전 글에서 자세한 소개와 그 이유를 읽어보실 수 있어요. 폴더 구조백엔드는 헥사고날 이케틱처와 클린 아키텍처를 기반으로 해요. 그래서 크게 도메인 계층, 애플리케이션 계층, 인터페이스 계층, 인프라 계층의 네 레이어로 구성돼요. 저는 폴더 구조가 아키텍처 못지않게 중요하다고 생각해요. 잘 조직된 구조는 아키텍처가 잘 성장할 수 있는 뿌리가 되고, 신중하게 구성되지..