대규모 트래픽을 다루는 메시징 시스템을 설계할 때, 가장 골치 아픈 문제 중 하나는 ‘수십만 건의 발송 요청에 대한 요금(포인트) 차감을 어느 시점에 할 것인가?’ 입니다.사용자의 포인트는 회사의 핵심 자산과 직결되므로 완벽한 정합성을 요구합니다. 이번 글에서는 대용량 발송 시스템에서 포인트를 차감하는 최적의 위치와, 동시성 이슈(이중 지불)를 방어하는 아키텍처 설계에 대해 정리해 보았습니다.1. 차감 로직, 어디에 두어야 할까? (Web vs Targeter)발송 요청을 받는 맨 앞단(API Gateway/Web)과 실제 발송 대상을 필터링하는 뒷단(Targeter/Worker) 중 어디서 요금을 차감하는 것이 맞을까요? 결론부터 말하자면 Targeter에서 차감하는 방식이 압도적으로 유리합니다.❌ W..
Redis특징인메모리 저장소더보기1. 일반적인 DB (Disk-based)저장 위치: 하드디스크(HDD)나 SSD특징데이터가 영구적으로 저장되지만, 물리적인 디스크를 읽고 써야 하므로 속도가 상대적으로 느림. 우리가 컴퓨터에서 파일을 저장하고 불러올 때 느끼는 그 속도와 비슷함2. 인메모리 DB (Memory-based)저장 위치: RAM (메모리)특징: 전기적 신호로 데이터를 주고받기 때문에 디스크 방식보다 수십, 수백 배 빠름.한계RAM은 휘발성이라 전원이 꺼지면 데이터가 날아간다는 단점.그래서 보통 중요한 '원본 데이터'를 저장하기보다는, 속도가 중요한 '임시 데이터(캐시)'를 저장하는 용도로 많이 씀.Key-Value 구조더보기일반 DB (Table 구조) : "회원 테이블의 ID가 123인 행에..
재귀(Recursion)- 재귀: 자신을 정의할 때, 자기 자신을 참조하는 것- 재귀 함수: 함수 내부에서 자기 자신을 호출하는 함수 재귀 함수를 사용하는 이유변수의 사용을 줄여, 프로그램을 더 간결하고 이해하기 쉽게 만들 수 있음재귀 함수는 복잡한 문제를 간단한 기본 단계 (base case)로 나누고, 이러한 기본 단계에서 해결하는 방식을 통해 문제를 해결할 수 있게 함재귀 함수를 작성할 때 주의할 점무한 루프에 빠지지 않도록 종료 조건을 잘 설정 (종료 조건을 기저 사례 (base case) 라고도 함)함수의 파라미터 및 인자 설정에 유의* 재귀는 이후 DFS / BFS 등에 자주 사용되는 개념이기 때문에 꼭 이해하고 넘어가야함 정렬정렬이 필요한 이유?오름차순 및 내림차순으로 정렬되어 있다면 특정 ..
FileUploadMultipartService.java/** * MultipartFile을 이용한 파일 업로드 구현 */@Service@Slf4jpublic class FileUploadMultipartService { @Autowired @Qualifier("fileUploadExecutor") private ExecutorService executorService; @Value("${file.upload-dir}") private String uploadDir; /** * (방법2) 비동기 파일 업로드 */ @Async public void uploadFileAsync(MultipartFile file) throws IOException { ..
fileupload.ymlspring: servlet: multipart: enabled: true max-file-size: 10MB max-request-size: 10MBfile: upload-dir: "경로" application.yml10번 라인 추가spring: application: name: project-api profiles: active: local config: import: - config/database.yml - config/security.yml - config/fileupload.yml cache: type: simple FileUploadMultipartServcie.java/** ..
Spingboot는 다양한 설정을 통해 애플리케이션의 동작을 제어할 수 있습니다.주요 설정 클래스@SpringBootApplication@SpringBootApplication은 Spring Boot 애플리케이션의 진입점으로, 여러 애너테이션을 조합한 것입니다.주요 기능- @SpringBootConfiguration: Spring 설정 클래스를 나타냅니다.- @EnableAutoConfiguration: Spring Boot의 자동 구성 기능을 활성화합니다.- @ComponentScan: @Component 애너테이션이 붙은 클래스를 스캔하여 Spring 컨텍스트에 등록합니다.WebMvcConfigurerWebMvcConfigurer는 Spring MVC 설정을 사용자 정의하기 위해 사용됩니다.주요 기능..
Spring Boot는 서버와 클라이언트 간의 효율적인 데이터 전송을 위해 여러 가지 응답 처리 방식을 제공합니다. 이러한 다양한 응답 처리 방식은 애플리케이션의 요구사항에 따라 유연하게 선택할 수 있으며, 성능 최적화와 사용자 경험 향상에 기여합니다. 이번 글에서는 각 응답 처리 방식의 특징과 사용 사례를 자세히 살펴보겠습니다. 1. @ResponseBody / @RestController간단한 문자열, 객체, JSON 등을 반환할 때 주로 사용상태 코드와 헤더 설정은 자동으로 처리되며, 기본적으로 200 OK 상태 코드가 사용됨json 응답형식{ "key": "Hello", "value": "World"}2. ResponseEntity간단하고 유연한 응답 처리주로 API 응답에 상태 코드와 헤더를..
자바 LTS 버전자바는 3년 정도의 텀으로 LTS 릴리스가 제공됩니다.보통 8년 이상의 장기 지원을 제공하는데 현재 LTS 지원 버전은 Java8, Java11, Java17, Java21입니다.Java8은 여전히 많은 기업에서 사용 중이며, 레거시 시스템에서 널리 사용되고 있습니다.spring3.x, springboot6.x 이상부터는 최소 Java17 버전을 요구하고 있습니다. 왜 LTS 버전을 사용해야 할까?장기적인 지원Long-Term Support의 이름과 같이 장기적으로 보안 업데이트와 버그 수정을 지원해줍니다.안정성광범위하게 테스트되고 안정화된 후 릴리스되므로 높은 신뢰성을 갖고 있습니다.기업 환경에 적합많은 기업에서는 규제 요구 사항을 충족하기 위해 장기적으로 지원되는 소프트웨어를 사용해..
OAuth2Spring Security의 OAuth2 모듈은 OAuth 2.0 프로토콜을 사용하여 사용자 인증 및 권한 부여를 처리하는 기능을 제공합니다. 이를 통해 애플리케이션은 Facebook, Google, GitHub 등과 같은 외부 OAuth 2.0 제공자를 사용하여 사용자를 인증할 수 있습니다.Spring Security OAuth2 기능OAuth2 로그인: 외부 OAuth 2.0 제공자를 통해 사용자를 인증합니다.Resource Server: 액세스 토큰을 검증하고 보호된 리소스에 대한 접근을 제어합니다.Authorization Server: 인증과 권한 부여를 처리하고 액세스 토큰을 발급합니다. 클라이언트 정보얻기구글: https://console.cloud.google.com/home/d..
코드기반- Mermaid장점: 적은 공수로 비교적 예쁜 다이어그램을 만들 수 있다.https://mermaid.js.org/ Mermaid | Diagramming and charting toolMermaid Diagramming and charting tool JavaScript based diagramming and charting tool that renders Markdown-inspired text definitions to create and modify diagrams dynamically.mermaid.js.org - SequenceDiagram장점: 깔끔하다https://sequencediagram.org/ SequenceDiagram.org - UML Sequence Diagram On..