본문 바로가기

분류 전체보기

(32)
[Elasticsearch] 인덱스(Index) 생성 및 도큐먼트(Document) CURD 인덱스(Index) 생성 / 조회 / 삭제Elasticsearch에서 인덱스(Index)를 생성하는 건 MySQL에서 테이블(Table)을 생성하는 것과 같습니다. 인덱스 생성 및 조회# 인덱스 생성# PUT /{인덱스명}PUT /users# 인덱스 생성됐는 지 확인하기# GET /{인덱스명}GET /users 인덱스 삭제# 인덱스 삭제# DELETE /{인덱스명}DELETE /users 매핑(Mapping) 정의Elasticsearch에서 매핑(Mapping)을 정의하는 건 MySQL에서 테이블의 스키마(Schema)를 정의하는 것과 같다.# 매핑 정의하기# PUT /{인덱스명}/_mappingsPUT /users/_mappings{ "properties": { "name": { "type": "key..
[Elasticsearch] 기본 개념 및 조작하기 Elasticsearch란?공식 홈페이지에 의하면Elasticsearch는 오픈 소스 분산, RESTful 검색 및 분석 엔진, 확장 가능한 데이터 저장소 및 벡터 데이터베이스이다.라고 정의 되어 있지만 간단히 정리하면, Elasticsearch는 검색, 수집, 데이터 분석에 최적화된 데이터 베이스이다. Elasticsearch 주요 사례1. 데이터 수집 및 분석Elasticsearch는 대규모 데이터(ex. 로그 등)를 수집 및 분석하는 데 최적화되어 있다. 예를들어 Logback을 통하여 서버 로그를 수집하여 트러블 슈팅에 사용한다던지, 서비스에서 사용자 행동에 대한 로그 등 로그 데이터를 수집하여 활용 할 수 있다.Elasticsearch(데이터 저장), Logstash(데이터 수집 및 가공), K..
[Redis] Cache-Aside(Lazy Loading) 패턴 적용(With SpringBoot) 이번 포스트는 Redis의 Cache-Aside(Lazy Loading) 패턴을 적용했던 사례에 대하여 게시판을 예제로 정리해 봤습니다.글을 들어가기 전에 DB에 100만 건짜리 게시판 데이터를 넣어두고, 매번 리스트를 조회하면 어떤 일이 벌어질까요? 간단히 생각해보면 1. 페이지네이션 + 정렬까지 들어가면 DB 부하가 꽤 세게 온다2. 동시에 여러 사용자가 몰리면, 같은 쿼리를 반복해서 날리게 된다 간단히 정리하면 2가지 정도 될꺼 같습니다. 아마 이렇게되면 부하가 많이 발생하고, 서비스 품질(속도)가 저하 될 것 입니다.운이 나쁘면 DB 락이 걸리거나 서버가 다운되는 등 서비스에 치명적인 문제가 발생할 수 있습니다. 사실 대부분의 사용자는 “최신 1~2페이지”만 반복해서 보는 경우가 보통입니다. 물론..
[Elasticsearch] Elasticsearch Highlight 검색 적용(With SpringBoot) 최근에 Elasticsearch + SpringBoot 조합으로 검색 서비스를 구현 및 유지보수를 했습니다.검색 서비스를 구현하고 유지보수를 경험을 어떤 과정부터 정리 해볼까 고민을 하다가 먼저 검색어를 하이라이트 적용하는 방법을정리 하기로 했습니다.검색어 하이라이트 기능이란? 아래 이미지와 같이, 쿠팡이나 네이버에서 검색을 했을 경우 검색어에 매칭되는 부분을 Bold나 특정 색상으로 처리 하여 사용자로 하여금 검색 결과에 대해서 쉽게 인지 할 수 있도록 하는 기능입니다. 왜 하이라이트인가? 검색 결과에서 사용자가 입력한 검색어가 본문/제목 어디에 등장했는지 즉시 보여주면 클릭률과 탐색 속도가 올라갑니다. ES의 하이라이트 기능은 쿼리와 동일한 분석 체계를 이용해 일치 구간만 스니펫으로 추출하고, ..
[Spring] Enum-Strategy Pattern 적용기 Strategy Pattern란?서로 바꿔 끼울 수 있는 알고리즘(행동)을 캡슐화하고, 런타임에 교체 가능하게 해 클라이언트(컨텍스트)와 알고리즘의 결합도를 낮추는 패턴.즉, 전략 패턴은 “알고리즘(행동)을 갈아끼울 수 있게” 만드는 설계 패턴이에요.같은 일을 하되, 상황에 따라 계산 방법을 바꾸고 싶을 때 if-else 덩어리 대신 교체 가능한 객체로 분리합니다. Strategy Pattern 적용하게 된 이유서비스를 만들다 보면 조건 분기가 끝없이 늘어납니다.처음엔 if - else 가 편하지만, 조건이 추가되면서 계속해서 추가되다보면 소스 가독성은 떨어지고 수정 범위는 넓어지고 버그 리스크도 커져 불편함을 느꼈습니다.그래서 저는 "분기를 매핑으로 바꾼다"는 관점에서 enum + strategy 패..
[Redis] Redis 계정 생성 및 systemd 등록 Redis를 도입후 운영의 편의성과 안정성을 위하여 계정생성 및 systemd을 추가로 진행 하였습니다. 1. 계정생성 및 패스워드 세팅Redis 전용 계정을 생성하는 이유는 시스템 보안과 안정성을 확보하고, 운영 편의성을 높이기 위함입니다. 루트 권한 실행은 지양하고, 전용 사용자로 격리하여 Redis가 시스템에 미치는 영향을 최소화하는 것이 보안 상 권장되는 방식입니다.[root@localhost /]# adduser redis[root@localhost /]# passwd redis[root@localhost ~]# lslogins UID USER PROC PWD-LOCK PWD-DENY LAST-LOGIN GECOS 0 root 13..
[Redis] Redis 도입을 위한 설치 및 세팅 local 환경에서는 docker를 사용하여 redis환경을 구축 하고, 실제 운영 및 테스트 서버에서는 rocky linux 환경에서 redis 환경을 구축 했습니다.1. Docker를 이용한 Redis설치1) docker run 명령어로 설치 및 실행docker run -d --name redis-server -p 6379:6379 redis 2) Reids CLI로 접속docker exec -it redis-server redis-cli 2. Rocky Linux에서 Reids를 설치(소스 설치)Oracle VirtualBox을 이용하여 Rocky Linux를 설치하고, Linux 환경에서 Redis 소스 설치1) redis 설치 전 기본 패키지 설치redis 설치를 위한 기본 패키지 설치[roo..
[Spring] SiteMesh란? 1. SiteMesh란? SiteMesh는 Java 기반 웹 애플리케이션에서 공통 레이아웃을 적용하기 위한 필터 기반 데코레이터프레임워크.2. 데코레이터 패턴이란?기존 객체의 기능을 변경하지 않고, 동적으로 기능을 추가하거나 확장할 수 있게 하는 패턴 3. SiteMesh의 주요 개념 개념설명Decorator페이지에 입힐 공통 레이아웃 (보통 layout.jsp)Content실제 사용자 컨텐츠 (board.jsp, main.jsp 등)Filter웹 요청 시 페이지를 가로채서 레이아웃을 적용Tag 등으로 컨텐츠 위치 지정4. SiteMesh의 동작 방식- 동작방식 요청: /board/list.jsp사용자는 /board/list.jsp를 요청함SiteMesh Filter가 요청을 가로채서 내부적으로 렌더..
[Oracle] EXISTS VS COUNT 성능 차이 쿼리 성능 개선 작업을 진행하면서 행의 값의 존재 유무를 표기하는데, EXISTS와 COUNT로 혼용하여 쿼리 가 되어 있는 부분이 있어 정리하면서 글로 남겨보았습니다.결론부터 이야기 하면 행의 값의 존재 유무를 표기하는데 COUNT보다는 EXISTS가 성능이 더 좋습니다.왜 그런지 비교와 예시를 들어 이유를 정리해 보겠습니다. 1. EXISTS vs COUNT 성능 비교 항목EXISTSCOUNT목적레코드 존재 여부 확인데이터의 건수 확인동작 방식첫 번째 행 발견 시 즉시 중단모든 조건 만족 행을 전부 탐색성능빠름 (항상 일정하게 빠름)느림 (데이터 많을수록 느려짐)용도데이터 존재여부 판단정확한 레코드 수가 필요할 때만 이론상 성능 비교만 봐도 존재 여부만을 생각할때 COUNT보다는 EXISTS가 빠르..
[Node.js] cookie-parser란? cookie-parser는 Node.js의 Express 애플리케이션에서 쿠키를 쉽게 다룰 수 있도록 도와주는 미들웨어이다.cookie-parser란?HTTP 요청에서 쿠키를 파싱하여 req.cookies 또는 req.signedCookies 객체로 변환해준다.서명된 쿠키(signed cookie)도 지원하여, 쿠키의 무결성을 검증할 수 있다.Express에서 쿠키 값을 쉽게 읽고 조작할 수 있도록 도와준다.설치 방법npm install cookie-parser 사용법1. 기본 사용 (일반 쿠키)const express = require('express');const cookieParser = require('cookie-parser');const app = express();app.use(cookieP..
[Docker] Oracle 설치 및 접속(Windows 환경) 윈도우 환경에서 Docker를 이용해 Oracle Database를 설치하기전에 먼저 Windows에서 WSL2(Windows Subsystem for Linux 2) 와 Docker Desktop 설치가 먼저 필요합니다. 1. Oracle Docker 이미지 다운로드 및 실행1) Oracle Database Docker 이미지 받기Docker Hub에는 공식 Oracle 이미지가 없지만, Oracle의 컨테이너 레지스트리에서 직접 받을 수 있습니다. // docker search 명령어로 image 검색 docker search [image명]docker search oracle2) Oracle Container Registry에 로그인Oracle Container Registry(https://co..
[Algorithm] 투 포인터(Two Pointers) 알고리즘 1. 투 포인터(Two Pointers) 알고리즘이란?투 포인터는 두 개의 포인터를 이용하여 배열이나 리스트를 탐색하는 알고리즘 기법이다.주로 정렬된 배열에서 특정 조건을 만족하는 쌍을 찾거나, 연속된 부분 배열을 탐색하는 문제에서 사용된다.이 방법을 사용하면 O(N^2) 복잡도의 문제를 O(N)으로 최적화할 수 있습니다.2. 투 포인터 동작 원리시작점과 끝점에서 이동오름차순 정렬된 배열에서 특정 합(target)을 찾을 때 사용좌측 포인터(left)는 작은 값부터, 우측 포인터(right)는 큰 값부터 이동두 포인터를 조절하면서 특정 조건을 만족하는 값을 찾는다.아래 예제를 통해 원리에 대한 설명 하겠습니다. 특정 합을 가지는 두 숫자 찾기 (Two Sum)문제: 정렬된 배열에서 합이 9 되는 두 숫자..
[HTTP] Chunked Transfer Encoding 1. Chunked Transfer Encoding이란? Chunked Transfer Encoding은 HTTP/1.1에서 도입된 데이터 전송 방식으로, 데이터를 고정된 크기가 아닌, 여러 개의 작은 청크(Chunk)로 나누어 전송하는 방식이다. 이 방식은 서버가 모든 데이터를 한 번에 생성하지 않아도, 데이터가 준비되는 대로 클라이언트에게 스트리밍 방식으로 전송할 수 있도록 해주고, Content-Length를 명시하지 않고도 데이터를 스트리밍 방식으로 전송할 수 있도록 해줍니다. 즉, 응답 본문의 크기를 미리 알 수 없을 때 유용하게 사용됩니다.2. Chunked Transfer Encoding의 장점과 단점장점Chunked Transfer Encoding(청크 전송 인코딩)은 HTTP/1.1에서 ..
[HTTP] HyperText Transfer Protocol 1. HTTP란?HTTP (HyperText Transfer Protocol)HTTP는 웹에서 클라이언트(브라우저)와 서버 간 데이터를 주고받는 프로토콜입니다. 웹 페이지, API 요청, 파일 다운로드 등의 모든 웹 통신에서 사용됩니다. HTTP 특징비연결성 (Stateless) : 한 번의 요청-응답 후 연결이 종료됨.무상태성 (Stateless) : 각각의 요청은 독립적이며, 이전 요청 정보를 기억하지 않음.TCP/IP 기반 : HTTP는 기본적으로 TCP(전송 제어 프로토콜)를 사용하여 데이터 전송.주요 버전 :- HTTP/1.1: 기본적인 웹 통신 방식.- HTTP/2: 멀티플렉싱 지원(여러 요청 동시 처리), 헤더 압축.- HTTP/3: QUIC 기반으로 더 빠른 데이터 전송.2. HTTP 요..
[JAVA] 정규식 사용 정리 Java에서 정규식(Regex)은 java.util.regex 패키지의 Pattern 및 Matcher 클래스를 사용하여 처리됩니다.Pattern : 정규식 패턴을 정의하는 클래스Matcher : 패턴과 문자열을 매칭하는 클래스PatternSyntaxException : 정규식 구문 오류 예외1. 정규식 기본 문법패턴설명예제 . 임의의 문자 (줄바꿈 제외) "a.c" → "abc", "a3c" 매칭 ^ 문자열의 시작 "^Hello" → "Hello world" 매칭 $ 문자열의 끝 "world$" → "Hello world" 매칭 * 0개 이상 반복 "a*" → "", "a", "aaa" + 1개 이상 반복 "a+" → "a", "aaa" (빈 문자열 X) ? 0개 또는 1개 "a?" → "", "a"..
[JAVA] Stream API Collect 메소드 Java Stream API에서 collect() 메서드는 스트림의 요소들을 컬렉션으로 집계하거나, 다양한 방식으로 결과를 처리할 때 사용됩니다. 주로 Collectors 유틸리티 클래스와 함께 사용되며, 리스트 변환, 그룹화, 조인, 맵핑 등의 기능을 제공합니다. 가장 많이 사용되는 컬렉는 Collectors.toList(), Collectors.toSet(), Collectors.toMap() 등이 있습니다.주요 Collectors 메소드1. 리스트(List)나 집합(Set)으로 변환 - toList(), toSet(), toMap() 스트림 결과를 List, Set, Map 등으로 변환 할 수 있습니다.import java.util.*;import java.util.stream.Collectors;..
[vue.js] Composition API vs Options API Vue.js에서는 컴포넌트를 정의할 때 Composition API와 Options API 두 가지 방법을 사용할 수 있습니다.1. Composition API와 Options API 비교비교 항목Composition APIOptions API코드 구조setup() 함수 내부에서 로직을 구성data, methods, computed 등의 옵션을 사용하여 명확한 역할 분리(직관적이고 구조화된 코드)재사용성Composition Functions를 활용하여 로직 재사용이 용이Mixins을 사용하지만, 충돌 문제 발생 가능타입스크립트 지원매우 우수 (함수 기반 구조로 타입 적용 용이)제한적 (Vue 내부에서 자동 추론)가독성상태, 로직, 라이프사이클이 한 곳에서 관리되어 일관성 있음. (로직이 하나의 함수 내에..
[JAVA] Stream API 생성과 사용법 정리 1. Java Stream API 이란?Java Stream API는 Java 8에서 도입된 기능으로, 컬렉션(List, Set, Map 등)의 데이터를 함수형 스타일로 처리할 수 있도록 지원하는 기능입니다. Stream은 데이터 소스(컬렉션, 배열 등)를 처리하는 데 사용됩니다.2. Stream API의 주요 특징데이터 처리 중심: 컬렉션 요소를 반복하지 않고 함수형 프로그래밍 방식으로 데이터를 처리연산 체이닝(Chaining): 여러 연산을 조합하여 선언적으로 처리 가능내부 반복(Internal Iteration): 루프 없이 병렬 처리 최적화Immutable(불변성): 원본 데이터를 변경하지 않고 새로운 데이터를 생성3. Stream 생성스트림은 컬렉션, 배열, 또는 직접 값을 통해 생성할 수 있습..
[JAVA] Checked Exception과 Unchecked Exception 차이점 자바에서 예외(Exception)는 크게 Checked Exception과 Unchecked Exception으로 나뉩니다.1. Checked Exception개념- 컴파일 시점에 반드시 예외 처리를 해야 하는 예외 - try-catch 문으로 처리하거나 throws 키워드를 사용하여 호출자에게 예외 처리를 위임해야 함 - 예외 처리를 하지 않으면 컴파일 오류 발생 대표적인 Checked Exception- IOException → 파일 입출력 시 발생- SQLException → 데이터베이스 관련 예외- ClassNotFoundException → 클래스 로드 실패- InterruptedException → 스레드 인터럽트 발생 예제import java.io.File;import java.io.File..
[MariaDB/MySQL] general_log 설정 및 확인하기 general log 기능은 DB사용자의 쿼리 실행(사용) 내역을 파일(file)이나 테이블(Table) 기록하여 확인 할 수 있도록 합니다. ISMS-P 심사에서도 쿼리 실행 log를 관리하고 있는지 확인 하는데요. ISMS-P를 준비하시는 분들에게 도움이 되었으면 합니다 ㅎㅎ general log 기능을 사용하기 위해서는 먼저 root 계정으로 로그인이 필요합니다. (DB는 mysql로 설정합니다) # mysql -uroot -p mysqlEnter password: root 계정으로 로그인 후에 general log 기능이 켜져 있는지 확인 합니다.MariaDB [mysql]> SHOW VARIABLES LIKE '%general%'; 쿼리 실행 결과 아래와 같이 조회가 되는데요. 현재는 gener..