반응형

Developer's_til 79

[ELK] 클러스터 성능, 모니터링과 최적화

클러스터의 자원 상황, 요청 빈도, 처리 상태 등의 지표를 수집하고 모니터링하는 것은 ElasticSearch를 운영하는데 필수 업무 중 하나이다. 이번 포스팅에서는 지표를 수집하고 해석하는 방법을 다룰 것이다. 📗 ElasticSearch 상태 확인하기cat API를 통한 클러스터, 노드, 샤드의 상태 등 다양한 정보를 확인할 수 있다. [ 클러스터의 상태와 정보 ]_cat/health API[ { "epoch": "1735564800", "timestamp": "12:00:00", "cluster": "es-prod-cluster", "status": "green", "node.total": "3", "node.data": "3", "shards": "12..

[ELK] ElasticSearch 정의와 기본 개념

📗 ElasticSearch란?ElasticSearch는 루씬(Lucene) 기반의 오픈 소스 검색 엔진입니다.JSON기반의 문서를 저장, 검색할 수 있으며 문서들의 데이터를 기반으로 분석 작업까지 가능합니다. [ 기본적인 특징 ]항목특징준실시간성 검색 엔진실시간이라고 생각할만큼 색인된 데이터가 매우 빠르게 검색됨클러스터 구성한 대 이상의 노드를 클러스터로 구성하여 높은 수준의 안정성을 이루고 부하를 분산할 수 있음스키마리스(Schemaless)입력될 데이터에 대해 미리 정의하지 않아도 동적으로 스키마를 생성할 수 있음Rest APIRest API 기반의 쉬운 인터페이스를 제공하여 비교적 진입 장벽이 낮음 ❓ 준실시간성 실시간에 준하는 수준의 검색을 제공한다는 의미로 문서를 입력하자마자 검색하는 것은..

[리액트] 렌더링되는 과정과 예시

✅ 리액트의 렌더링이란? 리액트는 UI를 컴포넌트 단위로 구성하고, 컴포넌트는 상태(state)나 props가 바뀔 때마다 다시 렌더링된다.이 렌더링 과정은 브라우저의 DOM 조작을 최소화하고 최적화된 방식으로 수행된다. ✅ 초기 렌더링 과정function MyComponent() { const [count, setCount] = useState(0); return ( Count: {count} setCount(count + 1)}>Increment );}[ 과정 요약 ]1. 컴포넌트 함수가 호출됨 → `MyComponent()` 실행2. useState 훅이 초기값을 등록하고 상태 관리 시작3. JSX 반환 → 리액트가 가상 DOM(Virtual DOM) 생성4...

[Spring] Server to Server 연동을 위한 여정

🙋‍♂️ 개요Spring 환경에서 서버 간의 연동을 위해 구글링하다보면, 아래와 같이 3가지의 기술들이 나열된다.ㅇ RestTemplateㅇ WebClientㅇ FeignClient  ✅ RestTemplate이란?Http 요청을 보내기 위해 Spring에서 제공하는 동기식 클라이언트 라이브러리. - Http 프로토콜에 맞게 다양한 메서드 제공- RESTful 형식을 갖춘 템플릿- HttpClient를 추상화해서 응답 형식으로 JSON, XML 등 다양한 형식을 지원- 동기식, Blocking I/O- 동시성이 높은 시나리오에는 부적합- Connection Pool(소켓 풀) 기능 제공 [ 동기식(Synchronous)이란? ]요청한 작업에 대해 완료 여부를 신경쓰면서 작업을 순차적으로 수행하는 방식말..

[Spring] API 속도 개선을 위한 여정

[ 📢 세줄 요약 ] 특정 테이블의 데이터를 대량으로 삭제할 수 있는 API 개발 API 속도 개선을 위해 비즈니스 로직을 단계적으로 접근 각 단계별로 속도 개선을 위한 코드 리팩토링 ✅ 배경과 상황 사업팀으로부터 하나의 요청사항을 받았다. 관리자 포탈에서 발신번호를 대량으로 삭제할 수 있는 기능을 만들어주세요. 기존에는 발신번호의 상세 조회 페이지에서 한 건씩 삭제할 수 있는 기능이 있었기에, 대량으로 삭제하는 건 크게 어렵지 않을 거라고 생각했다. 단순히 DB에서 삭제하는게 아니라 타 시스템의 발신번호 삭제 API를 호출하는 방식이였고, 삭제 대상들을 엑셀 파일로 업로드받아서 삭제 프로세스를 진행했을 때, 약 20초안에 200건까지 삭제가 가능했다. 관리자 포탈에서 WAS의 응답값을 기다리는 시간이 ..

[Spring] Static 변수와 스프링 빈

✅ Static / 스프링 빈 [ 🔑 간단요약 ] 특정 클래스에서 멤버 변수를 선언 및 초기화를 동시에 할 때, static 클래스의 메서드를 호출해서 초기화 하는 상황에서 NPE가 발생 스프링이 빌드되면서 객체들이 메모리에 저장되는 시점과 스프링 컨테이너가 로드되는 시점 등에 따른 차이 이해하기 ✅ 빈 주입이 안되는... WAS 프로젝트에는 공통적으로 보안 시스템에 로그를 적재하는 로직이 존재한다. 해당 로직들을 리팩토링하는 과정에서 빌드 자체가 실패하는 문제가 있었다. public class YamlUtil { @Autowired private Environment env; public String getProperty(String key) { return env.getProperty(key); } ..

조회 성능을 책임지는 인덱스

✅ 인덱스(Index) [ 🛠 간단 요약 ] 조회 기능의 성능을 높이고 싶은 경우, DB에서 SELECT 시간이 오래 걸리는 경우, 데이터베이스의 검색 속도를 향상시키는 인덱스를 먼저 고려해보자 ✅ 답답한 조회 시간 입사 초, 담당하고 있는 웹 사이트에서 조회 시간이 너무 오래걸린다는 문의가 들어왔다. 관리자 포탈에서는 이력 / 통계성 조회 기능이 많다보니, 기간을 길게 설정해서 데이터를 조회하면 DBConnectionTimeOut 에러가 발생하는 경우가 있었다. 하지만, 이번에는 조회 결과가 수만건도 안되는데 조회가 되지 않는 상황이었다. 보통 이런 경우, 시스템에 문제가 없다면, 3가지의 케이스가 있다. 첫번째는 클라이언트(프론트)에서 조회 결과를 한번에 렌더링하는 경우, 두번째는 WAS(백엔드)에서..

[Spring] Mybatis의 동적쿼리와 변수

✅ Mybatis Spring 웹 어플리케이션에서 쿼리 기반으로 데이터베이스에 접근하는 SQL Mapper 프레임워크 [ 🔑 간단 요약 ] Mybatis의 쿼리가 작성되는 XML 문서에서 요청 파라미터와 동적 쿼리 기반으로 변수를 작성하는 2가지 케이스 쿼리가 작동하지않는 이슈를 접하고, 각 케이스를 비교 ✅ 배경과 상황 새로운 API를 개발하고 있던 팀원에게 질문을 받았다. 똑같은 쿼리인데 WAS에서는 조회 결과가 안나오고, DB 툴에서는 결과가 나옵니다. 실제로 WAS에서는 조회 결과가 0이 나오고, DBeaver에서는 정확한 조회결과가 나왔다. 이런 경우는 처음 접해서 원인을 어떻게 찾아야할지 고민이었다. WAS와 DB간의 연동, 회사내 방화벽, 반환 타입 등 다각도로 보던 중 동적쿼리가 눈에 들어..

[Spring] XSS필터와 Surrogate pair

✅ 세줄 요약 🛠 특정 조건에서만 조회 기능이 동작하지 않는 이슈 확인. 🛠 기능 동작 과정을 거슬러 올라간 결과, Emoji 데이터가 포함된 경우와 클라이언트로 반환하기 직전에 지나가는 XSS 필터에서 문제 원인을 발견. 🛠 UTF-16의 특별한 인코딩 방식인 Surrogate pair를 기반으로 문제 해결. ✅ 배경과 상황 [ 에러 상황 ] 담당하고 있는 고객 포탈 사이트에서 특정 조건에만 조회 기능이 동작하지 않는 이슈가 있었다. 가장 먼저, 서버 로그를 살펴보니 아래와 유사한 내용이 남겨져 있었다. 2023-11-10 20:08:17.435 WARN 16980 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [or..

[Spring] 완전한 AOP 솔루션을 제공하는 AspectJ

✅ 배경 실무에서는 로깅, 파일 처리 등 비즈니스 로직 외에 다양한 코드를 접할 수 있다. 현업에서 API에 녹아있는 코드를 보면 회사 정책에서 요구하는 로그를 객체에 담아 파일로 보관하는 로직을 접했는데 메서드마다 비슷한 코드가 반복됐다. 이러한 상황을 AspectJ 기반으로 리팩토링하여 유지보수성을 높이기로 계획했다. ✅ AspectJ AspectJ는 스프링 AOP와는 다르게 모든 도메인 객체에 적용할 수 있다는 장점이 있다. 다만, 둘은 다른 목표와 특징을 갖고 있다. [ 기능 및 목표 ] Simply put, Spring AOP and AspectJ have different goals. Spring AOP는 프로그래머가 직면하는 가장 흔한 문제를 해결하기 위해 Spring IoC 전반에 걸쳐 간..

반응형