본문 바로가기

전체 글35

공통 코드를 분리하면 모두 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.
구독 시스템 - 구독 상태 및 Entity 설계 카카오 페이 결제 시스템 구축으로 인해 결제가 가능한 서비스를 개발하게 되었다. 단순 결제를 통해 배운 트랜잭션과 격리 수준에 대해 새롭게 배우고, 결제 시스템 꼭 필요한 멱등성 관리에 대해 학습할 수 있게 되었다.  결제 시스템을 학습하다보니 단순 결제가 아니라 정기 결제도 많이 사용되고 있는데 이건 어떻게 구현할 수 있을까 생각해보다가 구현해보게 되었다.   먼저 구독은 상태 설계가 중요해보였다. 왜냐하면 상태 관리에 따라 결제가 이루어지기 때문에 현재 어떤 상태인지를 체크하고, 상태를 변경하며 관리할 수 있을까에 대해서 고민해보았다.   1. 구독 상태를 관리할 수 있는 enum을 만들어 가능한 모든 구독 상태의 경우의 수를 고려해서 설계했다.  public enum SubscriptionStatu.. 2024. 11. 20.
배치 처리 1. 프로젝트 내 배치 처리 구현1.1 구독 갱신 배치 처리@Component@RequiredArgsConstructorpublic class SubscriptionScheduler { @Scheduled(cron = "0 0 0 * * *") // 매일 자정 @Transactional public void processSubscriptionRenewals() { log.info("Starting daily subscription renewal processing"); LocalDateTime now = LocalDateTime.now(); List dueSubscriptions = subscriptionRepository .fi.. 2024. 11. 19.
반응형