전체 글

Studying archive https://github.com/ChoMinGi
개요Part 1 에서는 쿠폰 발급 로직을 전략 패턴을 통해 분리하고 서비스 레이어를 명확히 나누어 유지보수성과 확장성을 향상시킨 내용을 다루었다.  이번 포스팅에서는 쿠폰 발급의 빈도(IssuanceFrequency)와 제한 조건을 전략 패턴을 이용해 보다 유연하고 효율적으로 관리하는 방법을 소개하려고한다. 쿠폰 시스템의 특성을 자세히 생각해본다면 "얼마나, 누구한테, 언제, 쿠폰을 발급할 것인가?" 이다.따라서 발급 빈도와 제한 조건을 명확히 정의해야지, 이벤트 쿠폰이나 회원가입 축하 쿠폰 등 다양한 조건과 상황에 유연하게 대응이 가능해진다.   예를 들어, 최근 클라이언트가 요청한 특정 기간에만 발급되는 신규 가입 이벤트 쿠폰의 경우를 살펴보자.클라이언트 요청은 특정 기간(예: 3월 23일~3월 31..
개요사실 블로깅할 소재가 쌓여있다.. 인턴하면서 국제화 리팩터링 한 건도 그렇고 알림/메일링 서버도,,,  사업보안인증을 위해서 메인서버 취약점을 고쳤던 소재도 남아있는데,, 클라이언트께서 신학기 맞이 이벤트를 준비하시면서 첫회원가입시에 발급하는 쿠폰 옵션 변경 요청이 들어왔는데 나름 유연하게 리팩터링 해놨던 터라 무려 10분도 안되어서 대응을 완료했기 때문에 겸사겸사 작성을 해본다.  실제 운영을 하면서 개발자로서 가장 고민되는 부분은, 클라이언트의 갑작스러운 요청사항에 얼마나 빠르고 효율적으로 대응할 수 있는가이다. 최근 클라이언트로부터 '신학기 맞이 이벤트'를 위한 쿠폰 옵션 변경 요청을 받았다. 다행히도 이전에 쿠폰 발급 전략을 기간별, 이벤트별, 회원별로 유연하게 관리할 수 있도록 설계해둔 덕분..
· Java
비트마스킹 기본 연산1.1 특정 비트 확인 (Check)boolean isSet = (mask & (1 `1 `&` 연산을 통해 i번째 비트가 1인지 0인지 확인 가능.1.2 특정 비트 세팅 (Set)mask |= (1 i번째 비트를 1로 설정한다.1.3 특정 비트 해제 (Clear)mask &= ~(1 i번째 비트를 0으로 만든다.1.4 특정 비트 뒤집기 (Toggle)mask ^= (1 i번째 비트를 1이면 0, 0이면 1로 바꾼다.  /2 대신 >> 1, *2 대신 `/2` 연산은 `>> 1`로 대체 가능`*2` 연산은 `컴파일러가 대부분 최적화하므로 큰 체감은 없을 수 있으나, 간단한 비트 연산을 직접 사용하면 의도를 더 명확히 드러낼 수 있음.  방문 배열(visited) 대체 개념기존에는 bo..
· Spring
서론: 왜 직접 HTTP 서버를 만들어보는가?웹 개발을 할 때 우리는 대부분 Spring Boot 같은 프레임워크를 사용하여 서버를 구축한다.Spring Boot는 내부적으로 Tomcat, Jetty 같은 내장 서버를 사용하기 때문에, HTTP 요청이 어떻게 처리되는지 직접 고민할 일이 거의 없다. 그러나 만약 내장 서버가 없다면? 어떻게 동작하는지 예상이 가는가?? 라는 질문에 내가 대답하지 못했어서 시작하게 되었다. HTTP 서버의 동작 원리를 직접 구현해 본다면Socket 프로그래밍: 클라이언트와 서버 간의 데이터 전송 원리멀티스레딩 기초: 여러 클라이언트 요청을 동시에 처리하는 방법HTTP 프로토콜 구조: HTTP 요청(Request)과 응답(Response)의 동작원리 및 기본적인 웹 서버의 구..
· Java
개요일반적으로, 우리는 자바 HashMap이 평균적으로 O(1)의 시간 복잡도를 가진다고 배웁니다. 하지만 “해시 충돌(Hash Collision)”이 심해지면 성능이 급격히 떨어질 수 있다는 사실은 자칫 놓치기 쉽습니다. 또한, CPU 캐시 구조와 “참조 지역성(Reference Locality)”을 이해하면, 왜 이 문제가 현실에서 더 크게 체감되는지 알 수 있습니다. 이 주제는 백준 7453 번 문제를 풀다가 경험하게 되었는데https://www.acmicpc.net/problem/7453 C++,C 에서는 기존의 방법처럼 2개씩 쌍으로 묶어서 계산한다음에 한쪽 값을 해시 맵에 넣어두고 0을 만들기 위한 보수가 존재하는지 hash key 탐색으로 풀렸지만 자바의 경우에는 그렇지 않았다. 탐색 길이인..
· Java
개요자바 8에서 람다 표현식은 기존의 익명 클래스 방식과 다르게1. 익명 클래스를 생성하지 않고2. 바이트코드 수준에서 최적화된다.그럼에도 불구하고 람다를 배우면 항상 그냥 순회하는게 성능이 더 좋아~ 오버헤드가 발생해~ 로만 대강 알고있던 성능저하가 존재한다고 알고있었다. 그럼에도 불구하고 개발자들이 람다라는 표현식의 성능 최적화를 위해 어떻게 이를 구현했는지 바이트코드 분석을 통해 알아보자. 요약디슈거링(Desugaring)이 수행되며, 람다 표현식은 일반적인 정적 메서드로 변환된다.이후, 실행 시점에서 `invokedynamic` 바이트코드를 활용하여 동적으로 `MethodHandle`을 참조하게 된다.  디슈거링(Desugaring) 개념자바 8에서 람다 표현식은 내부적으로 익명 클래스를 생성하지..