본문 바로가기

전체 글

(35)
NewSQL의 정의와 특징, 그리고 한계 NewSQL이란?NewSQL은 NoSQL의 장점인 수평적 확장과 성능 + RDBMS의 ACID 특징을 합친 새로운 데이터 관리 도구이다. 현대 앱 서비스들이 높은 트랜잭션 처리량과 실시간 분석을 요구하기 때문에 이에 맞게 설계되었다. 특히 클라우드 환경과 분산 아키텍처에 적합한걸로 알려져있다.NewSQL의 특징ACID: 트랜잭션의 안정성과 데이터 무결성을 보장한다.확장성: 수평 확장을 고려해서 설계되어 부하 처리에 유연하다.SQL 호환성: 쿼리 언어로 SQL을 지원하기 때문에 추가 학습이 필요 없다.높은 성능: 인메모리 처리, 고급 인덱싱 등을 활용해 빠른 쿼리 응답을 제공한다.분산 아키텍처: 여러 노드간의 데이터 복제와 장애를 허용하여 가용성과 신뢰성을 제공한다.그럼 NewSQL이 무조건 좋은가?New..
Java/Spring에서의 함수형 프로그래밍 활용 함수형 프로그래밍이란? 간단 정리함수로 이루어진 프로그래밍 방법으로, 선언형 패러다임의 일종이다.순수 함수를 중심으로 상태변경과 side effect를 최소화 하는 프로그래밍.순수 함수 : 외부 상태를 변경하거나 참조하지 않는 함수.파이썬, 자바에서 lambda, map, filter 등을 지원하여 함수형 프로그래밍이 사용될 수 있다.lambda는 익명함수, map()은 고차함수익명함수 : 이름이 없는 함수고차함수 : 함수를 매개변수로 사용Java Lambda와 Functional Interface우리가 사용하는 sort 예시먼저, 람다 표현식으로 사용하고 싶은 메서드의 인터페이스를 생성한다.@FunctionalInterfacepublic interface Comparator { int compar..
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 7장 분산 시스템을 위한 유일 ID 생성기 설계 기존 auto_increment의 한계일반적으로 개인 프로젝트를 진행하면 DB에 저장하는 ID는 ‘auto_increment’를 사용하곤 한다. 그러나 서비스가 커져서 분산 환경이 된다면 auto_increment는 좋은 설계 방법이 되지 못한다. DB 서버 한 대로는 요구를 감당할 수 없고, DB 서버를 여러 대 사용한다면 순차적인 카운터를 공유해야 하기 때문에 응답 시간이 개선되진 않는다.마스터 DB를 복제해서 서버의 수 만큼 id의 증가 범위를 설정하는 방법도 존재하지만 기존의 서버에서 더 추가하거나 삭제할 때 상당히 복잡해진다.auto_increment의 대안으로 UUID, 티켓 서버 사용, 트위터 스노플레이크 방식이 있다.UUIDUUID는 컴퓨터 시스템에 저장되는 정보를 유일하게 식별하기 위한 ..
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 6장 키-값 저장소 설계 키-값 저장소란먼저, 키-값 저장소(key-value store)는 일반적으로 비관계형 DB인 Redis, DynamoDB를 말한다. key는 모든 서버에서 유일해야하며 key를 통해 value에 접근할 수 있어야 한다.단일 서버 키-값 저장소일부 in-memory 기반 key-value 저장소는 단일 서버에서 데이터를 메모리의 해시 테이블로 관리한다. 그러나 모든 데이터를 메모리에 올리는 한계가 있다. 일단 메모리는 수직적 확장 한계가 금방 오고, 자원 자체가 넉넉하지 않다.이런 문제를 해결하기 위해서 데이터를 압축하거나, 자주 쓰이는 데이터만 메모리에 올리고 나머지는 디스크에 저장할 수 있다. 그러나 이런 해결 방법은 한계가 있기 때문에 키-값 저장소 서버를 분산할 필요가 있다.분산 서버 키-값 저장..
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 5장 안정 해시 설계 안정 해시의 탄생 배경기존에는 수평적 규모 확장에 따라 데이터를 균등하게 나누기 위해 hash(key) % N (N은 서버의 수)을 사용했다. 그러나 이 방법은 서버가 추가되거나 삭제될 때, 모든 key가 재배치되고, key가 균등하게 분포되지 않는 문제가 발생할 수 있다.안정 해시의 원리해시 공간의 시작과 끝을 이어서 해시 링을 만든다.서버들을 해시 링 위(해시공간)에 서버와 key를 배치하고, 인접한 두 서버 사이의 해시 공간을 하나의 파티션으로 간주한다.key는 시계방향으로 갔을 때 가장 가까운 서버에 저장된다.그러나 이 방법을 사용하면 key가 특정 서버들 사이에 몰려서 불균등하게 분포되거나, 서버 하나에 장애가 발생하면 그 서버가 담당하던 해시 공간은 이웃한 서버 중 하나에게 전부 넘어간다. 그..
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 4장 처리율 제한 장치의 설계 Rate Limiter는 클라이언트가 보내는 트래픽의 처리를 제어하는 장치다. 예를 들면, 일정 시간 동안 최대 HTTP 요청 가능 횟수 제한을 IP별, 사용자별, 디바이스별로 제한할 수 있다. DoS(Denial of Service)같은 공격을 막을 수 있고, 외부 서버에 요청하는 api가 요금제일 때 과금을 막아주기도 한다. 트위터에서는 3시간동안 최대 300개의 트윗을 올릴 수 있다. 구글 독스는 사용자 당 분당 300회의 read만 허용한다. rate limiter의 위치는 클라이언트, 서버, 미들웨어 중 하나를 선택할 수 있다. 클라이언트측은 쉽게 위변조가 가능해서 비선호한다. 미들웨어를 둔다면 요청이 서버까지 가지 않고, 미들웨어에서 429 에러를 반환한다. 서버에 두거나, 외부 서비스가 ..
[가상 면접 사례로 배우는 대규모 시스템 설계 기초] 1장 사용자 수에 따른 규모 확장성 DB 서버 분리애플리케이션 서버와 DB 서버를 분리하여 각각의 서버가 독립적으로 확장 가능DB는 크게 관계형 데이터베이스(RDB)와 비 관계형 데이터베이스(NoSQL)로 구분이 가능RDB는 데이터를 테이블과 열, 컬럼으로 표현한다. 여러 테이블간의 관계를 형성NoSQL은 key-value 저장소, 그래프 저장소, 컬럼 저장소, 문서 저장소로 나뉜다.낮은 latency, 데이터가 비정형, 아주 많은 양의 데이터를 저장할 때 NoSQL을 사용한다.여러 대의 애플리케이션 서버 + 로드밸런서여러 대의 서버를 사용하여 클라이언트의 요청을 분산시킨다.하나의 서버에 장애가 발생하면 다른 서버로 요청을 보내서 서비스의 중단을 방지할 수 있다.로드밸런서를 사용하면 서버 수가 증가해도 유연하게 트래픽 분산이 가능하다.ma..
Spring HTTP Client의 개념과 진화 Http Client란Spring 애플리케이션에서 다른 서버(API)에 HTTP 요청을 보내기 위해 사용하는 클라이언트 도구들을 의미한다. Spring에서 제공하는 Http Client를 사용하지 않고도 Java 표준 라이브러리인 HttpURLConnection을 사용하여 통신이 가능하긴 하나, 코드가 길고, 예외 처리나 JSON 파싱을 직접 해야고, 커넥션 관리, 헤더 설정 등을 직접 해야해서 실제로 쓰기에는 불편한 요소가 많다. 그 외 Spring에서 제공하는 라이브러리 말고 외부 라이브러리로 Apache HttpClient, OkHttp 가 있다.HttpURLConnection 을 이용한 코드URL url = new URL("https://api.example.com/data");HttpURLCon..