전체 글37 Java record로 API DTO 설계하기 엑셀 파일마다 열의 위치와 이름은 달라질 수 있다.어떤 파일에서는 회원 이름이 첫 번째 열에 있지만, 다른 파일에서는 세 번째 열에 있을 수 있다. 이름, 성명, 회원명처럼 같은 의미를 다른 표현으로 작성하기도 한다.이처럼 데이터의 위치는 계속 달라지지만 서버가 주고받는 요청과 응답의 기본 구조까지 매번 달라져서는 안 된다.이 문제를 해결하기 위해 다음 두 가지를 함께 사용한다.고정된 요청과 응답 구조는 Java record로 표현한다.파일마다 달라지는 필드와 열 번호는 List와 Map으로 표현한다.이번 글에서는 단순히 record 문법을 살펴보는 데서 그치지 않고 다음 내용을 학습한다.일반 DTO와 record의 차이정적 API 구조와 동적 데이터의 결합record의 얕은 불변성방어적 복사와 깊은 불.. 2026. 8. 28. 고정 엑셀 템플릿이 실패한 이유 엑셀 업로드 기능은 왜 고정 템플릿만으로 해결되지 않았을까처음에는 문제를 단순하게 생각했다. 우리 서비스에서 사용할 엑셀 템플릿을 하나 만들고, 사용자가 그 형식에 맞춰 명단을 작성한 뒤 업로드하면 된다고 보았다. 개발하는 입장에서는 가장 예측하기 쉬운 방식이다. 열의 위치와 이름이 고정되어 있으니 파싱 로직도 간단해진다.하지만 회사마다 이미 사용하는 규격이 다 달랐다. 어떤 파일은 ‘이름’을, 어떤 파일은 ‘성명’을 사용했다. 부서와 팀이 하나의 시트에 있는 곳도 있었고, 부서마다 시트를 나눈 곳도 있었다. 한 사람의 정보가 한 행에 모두 들어 있지 않고 출근 기록이 여러 행에 걸친 파일도 있었다. 병합 셀과 빈칸은 보기에는 자연스러웠지만 프로그램에는 별도의 의미 규칙이 필요했다.사용자에게 새 템플릿으.. 2026. 8. 27. 공통 코드를 분리하면 모두 AOP인가? 아니다.여러 기능에서 사용하는 코드를 공통 함수나 별도 파일로 분리하는 것은 일반적으로 다음 개념에 해당한다.공통 로직 추출모듈화관심사 분리추상화캡슐화중복 제거예:import { createChallenge } from './pkce'export async function startOAuth(provider) { const challenge = await createChallenge()}OAuth 코드가 PKCE 함수를 직접 호출하고 있으므로 일반적인 모듈화와 관심사 분리다.2. 관심사 분리란?**관심사 분리(Separation of Concerns)**는 서로 다른 책임을 각각의 함수·파일·모듈로 나누는 설계 원칙이다.예를 들어 OAuth 로그인 기능에는 여러 관심사가 있다.환경 판단OAuth URL.. 2026. 8. 26. PKCE란? 1. PKCE란?**PKCE(Proof Key for Code Exchange)**는 OAuth 2.0 Authorization Code 방식에서, Authorization Code를 탈취한 공격자가 토큰을 발급받지 못하도록 막는 보안 장치다.발음은 보통 **“픽시”**라고 한다.핵심 원리는 다음과 같다.OAuth 로그인을 시작한 클라이언트만 알고 있는 일회용 비밀값을 만들고, 토큰 발급 시 그 비밀값을 증명한다.특히 모바일 네이티브 앱이나 SPA처럼 client_secret을 안전하게 숨기기 어려운 공개 클라이언트에서 중요하다.2. 네이티브 앱에서 PKCE가 필요한 이유일반적인 웹 백엔드는 client_secret을 서버에 안전하게 보관할 수 있다.client_idclient_secret그러나 iOS·.. 2026. 8. 25. 비관적 락(Pessimistic Lock) 구독 시스템을 관리하며 비관적 락을 사용하게 되었다. @Repositorypublic interface SubscriptionRepository { @Lock(LockModeType.PESSIMISTIC_WRITE) @Query("SELECT s FROM Subscription s WHERE s.subscriptionId = :subscriptionId") Optional findBySubscriptionIdWithLock(@Param("subscriptionId") String subscriptionId);} 이 코드가 실행될 때 실제로 SQL은 이렇게 동작한다. SELECT * FROM subscriptions s WHERE s.subscription_id = ? FOR UPDA.. 2024. 11. 22. 구독 시스템 - 결제 주기와 구독 서비스 로직 구독 시스템 구현을 위해 구독 상태를 enum으로 관리하고 필요한 Entity들을 설계했다. https://dorightting.tistory.com/36 구독 시스템 - 구독 상태 및 Entity 설계카카오 페이 결제 시스템 구축으로 인해 결제가 가능한 서비스를 개발하게 되었다. 단순 결제를 통해 배운 트랜잭션과 격리 수준에 대해 새롭게 배우고, 결제 시스템 꼭 필요한 멱등성 관리에dorightting.tistory.com Entity 설계 이후에 다시 생각해보니, 단순히 월간 결제 주기만 생각할 게 아니라 연간 결제도 있으면 좋겠다고 생각했다. 그래서 연간에는 할인을 할 수 있는 코드를 구현하고 구독 결제 주기가 월간인지 연간인지도 구분할 수 있도록 해야 했다. 그래서 결제 주기에 대한 enum부.. 2024. 11. 22. 이전 1 2 3 4 ··· 7 다음 반응형