Elasticsearch 란?Elasticsearch는 분산형 검색 및 분석 엔진으로 JSON 문서를 저장하고 검색 및 분석할 수 있게 해주는 오픈소스형 NoSQL 데이터베이스입니다. 아파치 루씬을 기반으로 구축되었으며 대용량 데이터에서 초고속 검색을 할 수 있도록 설계 되어 있습니다.RestAPI를 지원하며 HTTP을 통해 CRUD(Create, Read, Update, Delete) 작업이 가능합니다. 인덱스(Index) 란?Elasticsearch에서 데이터를 저장하는 기본 단위 입니다. RDB에서 테이블과 유사한 개념이지만 내부적으로 역색인 구조를 사용합니다.하나의 인덱스는 여러 개의 샤드로 분할되어 저장됩니다. 예를들어서 책(Books) 이라는 인덱스를 만든다면 이렇게 만들 수 있습니다.cu..
개요GCP Compute Engine은 AWS EC2 인스턴스와 비슷하게 컴퓨팅 자원을 빌려주는 것을 말한다. 생성하는 방법이 AWS와 차이가 조금 있으니 천천히 따라가보자. VM 생성GCP 검색창에 인스턴스라고 검색하면 VM 인스턴스라는 메뉴를 확인할 수 있고 누르게 되면 인스턴스를 생성하는 화면으로 넘어가게 된다.만약에 프로젝트가 없다면 [프로젝트 만들기]를 크릭하고, Open API 사용을 클릭한다. 인스턴스 만들기를 클릭하고 다음과 같이 설정해준다.1. 머신 구성을 클릭한다.2. 머신의 이름을 정해준다.3. 리전을 골라준다. (당연히 서울)4. 가용영역을 선택해준다. VPC를 따로 설정했다면 다중 가용영역을 사용할 수 있다.5. 가장 저렴한 2core 4gb 인스턴스를 골라준다. 그리고 OS 및..
ECK란?ECK는 Elastic Cloud on Kubernetes 약자로 ELK 스택을 쿠버네티스 환경에서 쉽게 배포하고, 관리할 수 있도록 해주는 솔루션입니다. Elasticsearch에서 공식적으로 제공하는 쿠버네티스 오퍼레이터이며, 기본적으로 엘라스틱서치 클러스터 배포, 관리, 스케줄링 등을 자동화할 수 있게 해줍니다. CRD 정의 및 등록kubectl create -f https://download.elastic.co/downloads/eck/2.16.1/crds.yaml CRD는 쿠버네티스에서 자신만의 리소스를 정의할 수 있도록 해주는 기능입니다. 공식적으로 엘라스틱서치는 ECK 배포를 위해 CRD를 배포했습니다. 기본적으로 쿠버네티스는 Pod, Service, Deployment 와 같은 ..
개요소프트웨어 개발에서 가장 중요한 것은 유지보수성과 확장성이 중요합니다. 잘못된 설계는 시간이 지날수록 코드의 복잡도를 증가시키고, 개발 속도를 저하 시킵니다. 이를 해결하기 위해 등장한 설계 패턴이 클린 아키텍처 (Clean Architecture) 와 헥사곤 아키텍처(Hexagonal Architecture)입니다.또한, 도메인 주도 설계(Domain Driven Design)도 비즈니스 로직을 보호하는 핵심적인 접근 방식입니다. 이번 포스팅에서는 클린 아키텍처와 헥사곤 아키텍처의 개념을 살펴보고 이것이 어떻게 DDD에 연결되는지 자세히 분석해 보겠습니다. 클린 아키텍처란? 클린 아키텍처는 로버트 C.마틴 (Uncle Bob) 이 제안한 소프트웨어 설계 개념입니다. 이 아키텍처는 유지보수성과 확장..
[이전 편]- 1편 : [Spring Boot] Spring 대용량 데이터 페이징 처리하기 1탄(Spring Data JPA + PostgreSQL)이전편을 보고 오시면 N+1 문제 이외에 Page 객체를 사용함으로 발생한 테이블 풀스캔 문제와 인덱스 생성, 쿼리실행 계획 등 성능최적화 부분에서 알 수 있는 부분들이 있으니 안 보신분들은 보고 오시면 2편을 이해하시는데 도움이됩니다. 저는 PostgreSQL DB에 데이터 5천만건을 삽입하고 이를 최적화하는 작업을 했으며 1탄과 이어집니다. N+1 문제 해결하기 해당 코드는 postId를 가져와서 postId를 기반으로 Hashtag 엔티티, Image 엔티티를 불러오는 로직이 존재합니다. 이 문제의 원인은 postHashtagRepository.fin..
대규모 Insert 방식 선택 및 구현먼저 Spring Data JPA + PostgreSQL을 사용하여 데이터 5천만건 페이징을 구현하기 위해서는 더미 데이터를 Insert 해야했습니다. 각종 자료를 리서치해보니 JPA로 데이터를 밀어 넣는 것보다 JDBC를 사용하는 것이 훨씬 성능이 좋다는 것을 알게 됐습니다. 순수 JDBC Insert 시 장단점장점:최적화 시 삽입속도가 가장 빠름단점:SQL을 직접 관리해야한다.직렬화/재시도 로직 직접구현Spring Batch(JPA)장점:추상화된 API를 제공Chuck 처리, Skip 로직 내장스케줄링 가능단점:ORM 오버헤드 때문에 삽입 속도가 느림 저는 성능최적화가 가장 큰 목적이라 JDBC를 선택했습니다. reWriteBatchedInserts=true을 적..
Gradle 의존성 implementation과 runtimeOnly 의 차이점Implementation은 코드에서 실제로 해당 라이브러리를 참조하고 싶을 때 사용한다. 예를들면 Redis 라이브러리인 Redisson 라이브러리를 사용한다고 했을 때 아래처럼 사용한다.redissonClient.getLock() 직접 의존성을 부여해서 getLock()이라는 메서드를 사용하기 때문에 이것은 Implementation로 종속해주어야 한다.jar파일로 묶일 때 당연히 같이 따라오고, 다른 모듈에서는 사용이 불가능하다. 다른 모듈에서 사용 불가능하다는 이야기는 내가 LikeService 내부에서 RedissonClinet를 사용하고 있는데 PostService에서 LikeService를 참조하여 redisson..
네트워크에서 빠질 수 없는 개념인 OSI 7계층을 알아봅시다. 이 개념을 이해하면 네트워크가 어떻게 동작하는지 더 쉽게 파악할 수 있어요. OSI 7계층은 네트워크 통신 과정을 7단계로 나눈 국제 표준화 기구(ISO)에서 정의한 네트워크 표준 모델입니다.OSI 7계층 은 네트워크 통신을 각 기능별로 구분해서 체계적으로 이해할 수 있도록 도와줘요. 각 계층은 독립적이며 하위 계층의 기능을 이용해 상위 계층에 서비스를 제공하는 구조를 가지고 있습니다.OSI 7계층의 역할1. 물리 계층 (Physical Layer)이 계층은 데이터를 0과 1의 전기적 신호로 변환하여 물리적으로 전송하는 역할을 해요. 우리가 인터넷을 사용할 때 쓰는 LAN 케이블, 광케이블, Wi-Fi 신호 같은 물리적인 요소들이 포함됩니다...