1. 데이터 중심의 세상과 객체 지향 프로그래밍(Data-Oriented and Object-Oriented Programming)[ 데이터 중심의 세상 ]21세기는 두말 할 필요 없이 데이터가 중심인 세상이다. 많은 데이터들이 기록되고 수치화되며, 데이터를 분석하여 얻은 결과는 수 많은 의사결정의 근거가 된다. 이렇듯 데이터 중심의 세상이 되면서, 프로그래밍 세계에도 변화가 도래했다. 마이크로서비스 아키텍처가 등장하고 데이터가 중심이 되어 서비스들 간에 데이터를 교환하는 것이 상당히 중요해졌다. 이를 위해 자바는 대표적으로 Ember라는 프로젝트를 통해 언어를 고도화하여 생산성을 높이고자 하였고, 그 과정으로 데이터를 손쉽게 모델링할 수 있도록 도와주는 record 클래스 등이 등장하게 되었다. 심..
1. 객체에게 역할과 책임을 부여하는 객체 지향 프로그래밍 (Object-Oriented Programming)[ 객체에게 역할과 책임을 부여하는 객체 지향 프로그래밍 ]우리는 대부분 자바 또는 코틀린과 같은 객체 지향 언어(Object-Oriented Programming)를 사용하여 개발을 하고 있다. 객체 지향 언어는 캡슐화(Encapsulation), 상속 (Inheritance), 다형성 (Polymorphism), 추상화 (Abstraction) 등과 같은 특성을 통해 프로그래밍을 용이하게 할 수 있도록 도와준다. 이러한 특성을 바탕으로 시스템을 구현하면 변경에 유연하게 대응할 수 있다.객체 지향적인 부분이 가장 많이 적용되는 부분은 인터페이스를 통해 추상화를 하는 부분일 것이다. 예를 들어 ..
1. 진짜 중복과 가짜 중복의 구분(중복 여부를 판단하는 기준)[ 진짜 중복과 가짜 중복 ]개발을 하다 보면 특정 기능에 대한 변경이 다른 기능에도 영향을 주게 되고, 이러한 사이드이펙트로 인해 시스템에 문제가 발생하는 경우가 자주 있다. 당연하게도 문제가 생긴 기능을 빠르게 복구하는 것이 가장 중요하겠지만, 이러한 문제가 생긴 근본적인 원인을 찾는 것 또한 중요하다. 대게 어떠한 기능에 대한 변경이 의도하지 않은 사이드이펙트를 유발하는 것은 단일 책임 원칙(SRP, Single Responsibility Principle)을 위반하기 때문일 것이다.예를 들어 다음과 같이 배송 주소를 저장하는 ShippingAddress 라는 클래스가 존재하며, ShippingAddress 객체는 집 주소와 회사 주소를..
1. 비즈니스 정책과 입력 데이터, 서로 다른 데이터 검증 및 유효성 검사(Validation)[ 입력 데이터의 검증 및 유효성 검사 ]우리의 애플리케이션은 클라이언트로부터 받은 입력 데이터를 바탕으로 비즈니스 로직을 수행해야 한다. 이때 입력 데이터가 잘못되면 시스템에 문제를 일으킬 수 있으므로 클라이언트로부터 올바른 데이터가 전달되었는지 검증이 필요하다. 예를 들어 주식 주문을 위한 API가 존재하고, 다음과 같은 입력 데이터를 받고 있다고 하자.@Getter@NoArgsConstructor@AllArgsConstructorpublic class OrderStockRequest { private TradeType tradeType; // 거래 타입(매도, 매입) private String..
1. Redis와 LuaScript(레디스와 루아스크립트)를 활용한 슬라이딩 윈도우 구현하기분산 환경에서 5분 동안 특정 요청의 성공률이 50% 미만으로 떨어진 경우, fallback 로직을 수행해야 하는 요구사항이 있다고 하자. 이를 위한 다양한 구현 방식이 존재하는데, 레디스 기반으로 슬라이딩 윈도우를 구현해 해결할 수 있다. [ 요구사항 구현하기 ]먼저 현재 시간을 기준으로, 5분 동안의 성공률을 갱신해야 한다. 이를 위해 슬라이딩 윈도우 알고리즘을 사용할 수 있다. 슬라이딩 윈도우 알고리즘을 구현하는 다양한 방법이 있는데, 레디스의 Sorted Set을 사용하면 손쉽게 구현할 수 있다. 이는 다음과 같은 내용들을 바탕으로 구현하면 된다.성공과 실패를 저장하는 Sorted Set을 관리함Sor..