728x90

DataBase 12

Redis Pub/Sub 기능 사용하기 (feat. NestJS)

Publish-Subscribe 패턴Redis의 pub/sub을 살펴보기 전에 pub/sub이 어떤 기능인지부터 살펴보자. publish-subscribe (pub/sub)은메시지 발행자(publisher)는 특정 채널에 메시지를 보내고,해당 채널을 구독한 모든 구독자(subscriber)들은 그 메시지를 수신하는 방식이다.이는, 발행자가 구독자에게 직접 메시지를 보내는 일반적인 메시징 패턴과 구분된다.구독자가 없다면 메시지는 사라지고 복구되지 않는다. 이러한 구조는 발행자와 구독자가 서로를 알 필요 없이 독립적으로 동작할 수 있게 하여(decoupling),시스템의 확장성과 유연성을 높인다. Redis Pub/Sub"channel11" 과 "ch:00" 채널을 구독하려는 클라이언트는 아래와 같이 입력한..

DataBase/Redis 2025.03.02

DB 참조 무결성 제약 (feat. ON DELETE, ON UPDATE)

참조 무결성 제약이란참조 무결성 제약(Referential Integrity Constraint)이란데이터베이스에서 외래 키(Foreign Key)가 정의된 경우,참조되는 테이블(부모 테이블)과 참조하는 테이블(자식 테이블) 간의 관계를 유지하도록 보장하는 제약 조건이다.이를 통해 데이터의 일관성과 정확성을 유지할 수 있다. 참조 무결성 제약의 역할 1. 자식 테이블의 외래 키 값은 반드시 부모 테이블의 기본 키(Primary Key) 값 중 하나이도록 제한한다. 2. 부모 테이블에서 데이터를 삭제하거나 수정할 때 자식 테이블의 외래 키 값이 어떻게 처리될지를 결정한다. 참조 무결성 제약의 4가지 옵션외래 키를 정의할 때부모 테이블의 데이터 변경(삭제 또는 수정)이 자식 테이블에 미치는 영향을 제어하기 ..

DataBase 2025.01.19

[MySQL] 인덱스의 기본, B-Tree 인덱스 사용법

DBMS에서 쿼리를 효율적으로 사용하기 위해인덱스는 매우 중요하다. 그 중 가장 대표적인 B-Tree 인덱스에 대해 알아보자.인덱스란우선 인덱스가 무엇인지부터 살펴보자.인덱스는 컬럼의 값과 해당 레코드가 저장된 주소를키와 값의 쌍으로 만들어두는 것이다. 그리고 컬럼의 값을 주어진 순서로 미리 정렬하여 보관한다. 인덱스는 Sorted List의 구조를 가지고 있는데,Sorted List 자료 구조는 데이터가 변경/추가될 때마다 항상 값을 다시 정렬해야 하므로 저장하는 과정이 느리고 복잡하지만이미 정렬 되어 있기 때문에 원하는 값을 매우 빠르게 찾을 수 있다는 특징을 갖는다. 즉, 인덱스는 데이터의 저장(INSERT, UPDATE, DELETE) 성능을 희생하고읽기 성능을 높이는 기능이다. 그렇기에 마냥 인..

DataBase/MySQL 2024.11.24

pg_trgm, Postgresql trgm으로 한글 LIKE 검색 시 Index 사용하기

postgresql로 만들어진 테이블에서음식의 이름을 검색하는 기능을 구현해야 했다. 유저가 특정 키워드를 입력하면 그 키워드가 포함된 음식을 반환하는 방식이다. SQL의 LIKE 문법과 와일드 카드(%)를  사용하면 문자열을 포함한 결과를 조회할 수 있지만, SELECT *FROM foodsWHERE name LIKE '%키워드%';키워드 앞에 와일드 카드(%)를 붙이면name 필드의 인덱스를 사용할 수 없다. 검색에서 인덱스를 타지 않으면 full table scan을 하게되고,테이블의 크기가 클 수록 조회 쿼리의 부하가 커진다. LIKE 검색 시 인덱스를 사용하기 위해 찾은 방법은pg_trgm 트라이그램(trigram)이라는 postgresql 확장 기능을 사용하는 것이다. Postgresql 공식..

DataBase/PostgreSQL 2024.10.13

[Redis] Redis란? 설치 방법과 활용법

회사에 입사하고 새롭게 접하게 된 Redis. 이전에 사용해 본 적이 없어서 생소하기도 하고,사용해야 하는 이유와, 사용되는 로직이 잘 이해되지 않았다. 스스로 정리하지 않으니, 한 번 들어도 까먹게 되더라.다음에 봤을 때 또 초면처럼 느끼지 않도록 정리해보자. Redis란우선 redis는 데이터 접근/저장/관리와 관련된 서비스다. 일반적으로 데이터는 데이터베이스에 저장하여, 필요할 때마다 쿼리를 실행해 불러오거나 저장하거나 한다. 그러나 개발을 하다보면 데이터 베이스에 접근하는 것은 시간이 많이 걸린다는 것을 느끼게 된다.속도를 빠르게 하기 위해 데이터 베이스에도 캐싱이 적용되는데,Redis가 자주 접근하는 데이터를 캐시에 두고 속도를 향상시키는 데이터 캐시 서버 역할을 한다. Redis는 key-va..

DataBase/Redis 2023.09.12

[MySql] 조건 입력 순서

1. SELECT2. FROM3. WHERE4. GROUP BY5. HAVING6. ORDER BY7. LIMIT 참고한 블로그: https://dwbutter.com/entry/MySQL-SELECT-%EB%AC%B8-%EA%B0%81-%EC%A0%88%EB%93%A4%EC%9D%98-%EC%82%AC%EC%9A%A9-%EC%88%9C%EC%84%9C-%EC%8B%A4%EC%A0%9C-%EC%8B%A4%ED%96%89-%EB%90%98%EB%8A%94-%EC%88%9C%EC%84%9C [MySQL] SELECT 문 각 절들의 사용 순서, 실제 실행 되는 순서SELECT 문의 각 절들은 먼저 써야 하는 순서들이 정해져있다. 이 순서는 반드시 지켜야 함 더 앞에 나와야 하는 순서대로 보면 1. SELECT..

DataBase/MySQL 2023.04.27

[MySql] 이미 존재하는 row의 속성을 새로 입력하고 싶다면?

예를 들어 name, email, phone_number 칼럼이 있는 users 테이블에서 당신이 이미 name, email을 넣어 한 명의 user를 아래와 같이 입력했다고 해보자.id (PK)nameemailphone_number1왈왈이walwalwal@tistory.comNULL...   phone_number는 입력하지 않았으므로, NULL값일 것이다. 이 상태에서 phone_number를 입력하고자 할 때INSERT INTO 구문을 사용하여 데이터를 넣어야겠다고 생각할 수 있다. 하 지 만데이터 관점에서 INSERT INTO는 새로운 행(새로운 user)를 추가하는 행위이므로이미 존재하는 행(user)의 속성(column)을 새로이 입력하고자 할 때는 UPDATE ~ SET ~구문을 사용해줘야 ..

DataBase/MySQL 2023.04.06

[MySql] GROUP BY, max()를 활용한 문제 풀이

문제: 페이지 하단 참고자료의 SQL 키워드들과 MySQL의DQL(Data Query Language)를 사용하여, 아래 결과가 출력될 수 있는 쿼리문을 작성해주세요. 특정 배급사(Nolan Unlimited)의 영화 중 가장 높은 평점을 받은 영화의 모든 정보와 출연 배우 목록을 다음과 같은 형태로 출력해주세요.(문제 출처: 위코드 (wecode)) 내가 작성한 쿼리문 SELECT m.title, m.rate, m.open_date, d.business_name, JSON_ARRAYAGG( JSON_OBJECT( "name", a.name , "actorId", a.id)) actor_listFROM movies mJO..

DataBase/MySQL 2023.03.25

[MySql] mysql을 실행하려고 했을 때 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 에러 문구가 나온다면

mysql은 컴퓨터를 종료시키면 데이터베이스 서버가 꺼진다.따라서 컴퓨터를 재시작할 때마다 서버를 다시 실행시켜 줘야 한다. 서버 실행 명령어 없이 바로  mysql -u root -p 를 입력해서 데이터베이스로 들어가려 한다면아래와 같은 에러 메시지를 보았을 것이다.ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)이럴 때는 mysql 서버를 시작하는 명령어를 아래와 같이 입력해주자 mysql.server start그 후 다시 mysql -u root -p 명령어를 입력해주면 mysql이 잘 실행된다.mysql -u root -p

DataBase/MySQL 2023.03.25

[MySql] 명령어 정리 - DDL (Data Definition Language) 쿼리문

관계형 데이터베이스에서 테이블의 데이터를 다루기 전에테이블 그 자체, 테이블의 구조와 각 칼럼의 속성 등을 다루는DDL (Data Definition Language) 쿼리문에 대해 알아보자.DDL (Data Definition Language) 쿼리문명령어설명활용법CREATE새로운 테이블을 각 칼럼(열)의 [칼럼명, 자료형, 제약 조건]을 입력하여 생성CREATE TABLE [테이블명] ([칼럼 이름] [자료형] [제약 조건]...(칼럼만큼 반복));ALTER테이블의 열을 추가/수정/삭제할 수 있는 명령어변경하고자 하는 테이블의 [테이블명] [행위] [열이름] [자료형] [제약 조건] 순서로 지정(수정 시 변경하지 않을 요소도 모두 기입해줘야 함)추가: ALTER TABLE [테이블명] ADD [열 이..

DataBase/MySQL 2023.03.24
728x90