[Redis] Redis 깊게 파보기 (2) - 고가용성 설계, 동시성 예방 Redis 분산 아키텍처 설계 Redis도 장애가 발생할 수 있다. 우리가 흔히 Redis를 StandAlone 방식으로 HA 없이 두는데, 이렇게 되면 장애가 전파될 수 있다. 예를 들어, 캐싱을 Redis로부터 하면, Redis가 장애났을 때, Cache에서 null이 읽혀오는게 아니라 그냥 Exception이 발생한다. 그리고, Exception나더라도 무시하게 Handler를 설정했더라도, RDB에 조회가 폭발적으로 늘기 때문에 SPOF가 된다. 그래서, Redis의 HA를 보장하기 위한 아키텍처를 알아본다. Replication일종의 Master-Slave 구조다. 단순히, Master Node 밑에 1대 이상의 Slave를 두고, 이를 비동기적으로 복제만 한다. 다만, 자동 FailOver가 .. 2025.09.18 [Redis] Redis 깊게 파보기 (1) - Key 만료 방식, 영속성 캐싱을 위한 기반 마련캐싱을 제대로 활용하려면 먼저 어떤 캐시를 선택할 것인가부터 고민해야 한다. 단순히 “빠른 게 좋으니Redis”가 아니라, 서비스 성격과 요구사항에 맞는 도구를 택하는 것이 중요하다. 보통 백엔드에서는 세 가지 축을 놓고 선택을 시작한다. 로컬 캐시, Memcached, 그리고 Redis다. 로컬 캐시는 애플리케이션 인스턴스 안에 데이터를 담아두는 방식이다. 네트워크 왕복이 없으니 가장 빠르며, 구현도 간단하다. 자주 조회되지만 일관성이 크게 문제 되지 않는 값(예: 짧은 TTL의 설정 값이나 인기글 목록)을 저장할 때 유용하다. 하지만 대규모 분산 환경에서는 인스턴스마다 다른 값이 캐시에 저장되있어 불일치가 발생할 수 있다는 단점이 있다. 그래서 보통은 2단계 구조로, 로컬 캐시를.. 2025.09.17 [대규모 시스템 설계] GRPC를 통한 서비스간 통신 서비스간 통신 어떻게 진행할까?일반적으로 우리가 MSA 구조에서, 서비스와 서비스간 통신한다라고 한다면 직관적으로 떠오르는 것은 Endpoint를 생성해서 REST를 이용해서 통신하는 것이다. 하지만, REST의 큰 단점이 존재한다. REST는 HTTP/1.1 프로토콜을 사용하기 때문에, 단일 request에 대해서 단일 response만 제공해준다. 즉, 여러번의 request를 보내서 서버에 처리를 요청해야 된다. 그러면, 불필요한 네트워크 비용이 발생하며, 성능도 저하가 된다. 요즘같이 MSA가 업계 표준이 되가는 상황에서, 서비스간 통신이 진행될 일이 굉장히 많을텐데, 이 점은 굉장히 치명적일 것이다. 그래서 해결하기 위해 등장한 기술이 Socket, RPC와 같은 기술이다. 여기서, 구글이 기존.. 2025.07.09 [Spring] Jar Layer 분리로 효율적으로 Spring 서버 배포하기 일반적인 Docker로 Spring 서버 배포하기제일 직관직이고 간단한 방법부터 시작해보고자 한다. 우선 프로젝트 최상단에 Dockerfile을 하나 생성하고 아래처럼 작성해보자.FROM openjdk:17-alpineARG JAR_FILE=./build/libs/*.jarCOPY ${JAR_FILE} app.jarENTRYPOINT ["java","-jar","/app.jar"] 이제 ./gradlew 또는 gradle clean build를 통해서 빌드를 진행하여 .jar 파일을 생성한다.docker build -t [name]:[tag] . image의 name과 tag를 지정한 뒤, 위 명령어를 통해 docker image를 생성한 후, docker run -d [name]:[tag] 그런데 D.. 2025.06.30 [Spring] OpenSearch를 이용한 검색어 자동완성 기능 제작 검색어 자동완성을 구현하는 가장 쉬운 방법은 RDB에서 매번 특정 칼럼에 Like문을 때리는 것이다. 그런데 이렇게 하면 문제가 있다. 첫번째, 검색어 자동완성 자체가 이벤트가 일어날 때 마다 지속적으로 api 요청을 보내는데, 거기에 Full Scan으로 검색하는 RDB Like 문으로 검색하면 DB 부하가 장난 아닐 것이다. 두번째, 모든 데이터가 영어로 보장되있다면 그나마 괜찮은데 (인덱스를 활용하면 되기 때문), 한글 데이터가 들어가는 순간, Like 문 검색은 반드시 피해야된다. 왜냐하면, 한글 특성상 DB 인덱스를 사용하기 매우 어렵기 때문이다. 한글은 자모음 분리가 가능하고, 초성 검색 등의 특수한 경우를 고려해야 하기에, 기본적인 Like 문으로는 성능이 급격히 떨어진다. 따라서, Ela.. 2025.06.22 [백엔드 기술 면접] #9 DB심화 #9 DB심화 Q. 데이터베이스 파티셔닝의 필요성과 파티셔닝 방식에는 어떤 것들이 있나요?A. 데이터베이스 파티셔닝은 대용량 데이터베이스의 관리를 용이하게 하고 성능을 향상시키기 위해 사용됩니다. 주요 파티셔닝 방식으로는 수평 파티셔닝(Horizontal Partitioning)과 수직 파티셔닝(Vertical Partitioning)이 있습니다. 수평 파티셔닝은 데이터 행을 여러 테이블로 나누고, 수직 파티셔닝은 열을 기준으로 데이터를 분할합니다. 각 방식은 특정 쿼리 유형에 최적화되어 성능을 개선할 수 있습니다. Q. MySQL에서 파티션 테이블에 외래키 제약조건을 설정할 수 있나요? 없다 실제 사용 시 어떻게 대응하는 것이 좋을까요?A. MySQL에서 파티션 테이블은 외래키 제약조건을 지원하지 않습.. 2024.11.24 [백엔드 기술 면접] #8 JAVA #8 JAVA Q. JVM의 작동 원리에 대해 설명해보아라A. JVM은 자바 애플리케이션을 실행하기 위한 가상 머신이다. JVM은 클래스 로더를 통해 클래스 파일을 메모리에 로드하고, 바이트코드를 실행 엔진이 해석하며, JIT 컴파일러가 성능을 최적화한다. Q. Garbage Collection이 무엇이며, Java에서 주요 알고리즘에 대해 설명하라.A. 프로그래밍에서 객체나 변수를 생성하면, 이들은 메모리를 점유하게 됩니다. 하지만 더 이상 사용되지 않거나 참조되지 않는 객체가 남아 있다면, 그들이 차지하는 메모리는 비효율적으로 낭비됩니다. 이러한 메모리 누수를 방지하기 위해 Garbage Collection이 필요합니다. 주요 알고리즘으로는 Mark and Sweep, Minor/Major GC, G.. 2024.11.23 [백엔드 기술 면접] #7 Server (3) #7 Server (3) Q. Java 17 버전을 사용한 이유는 무엇인가?A. Java 17은 LTS(Long-Term Support) 버전으로, 안정성과 장기적인 지원을 제공합니다. 또한, 성능 향상과 새로운 기능들, 특히 텍스트 블록을 통한 코드 가독성을 향상시킬 수 있었으며, record 객체를 이용하여 보일러플레이트 코드를 크게 줄일 수 있습니다. Q. GraphQL과 REST의 차이는 무엇인가?A. GraphQL은 클라이언트가 필요한 데이터만 요청할 수 있게 해주어 오버페칭과 언더페칭을 줄일 수 있으며, REST는 정형화된 HTTP 메서드를 사용해 리소스를 처리합니다. GraphQL은 하나의 엔드포인트로 다양한 쿼리를 처리할 수 있지만, REST는 리소스마다 별도의 엔드포인트를 가집니다. Q... 2024.11.22 [DB] ElasticSearch의 Suggest API Suggest API SuggestAPI에서 사용되는 Suggester는 색인이 된 대상을 FST(유한상태 변화기)라는 데이터 구조를 만들어 In-Memory에 올려 일반 검색 API보다 훨씬 응답이 빠르다. 이때, 인메모리에 올라가니 변경이 적은 것이 좋다. FST Type을 사용하고 싶으면 mapping에서 completion type으로 지정하면 된다. Completion field type | Elasticsearch Guide [8.16] | ElasticCompletion field type edit To use the completion suggester, map the field from which you want to generate suggestions as type completion.. 2024.11.21 [백엔드 기술 면접] #6 시스템 설계 Q. SNS에서 친구 관계에 대해 기록을 하고 싶다. 어떤 종류의 DB를 사용하는 것이 적절할까? 그 이유는?A. 그래프 데이터베이스(예: Neo4j)가 적절합니다. 이유는 친구 관계를 노드(사용자)와 엣지(친구 관계)로 모델링할 수 있으며, 관계를 빠르게 탐색하고 쿼리하는 데 최적화되어 있기 때문입니다. Q. 사용자의 위치 정보를 기반으로 근처의 상점을 추천하는 기능을 구현하려고 한다. 어떤 데이터베이스를 사용할 것이며, 어떻게 구현할 것인가?A. 사용자의 위치 정보를 기반으로 근처의 상점을 추천하는 기능을 구현하기 위해 PostgreSQL 데이터베이스를 사용하는 것이 적합합니다. 그 이유는 PostgreSQL의 PostGIS 확장이 지리적 데이터를 효율적으로 처리하고 쿼리하는 데 최적화되어 있기 때문.. 2024.11.20 more