운영 중인 PostgreSQL에 인덱스를 추가하며 배운 것들 상황 DB 에서 데이터를 특정 조건으로 검색하거나 조회할 때 인덱싱이 중요하다는 건 익히 알고 있었다.최초의 요구사항이나 기획단에서 염두해서 신중하게 중복값과 의미가 있는지 여부를 고민하여 유저(학생) 이름에 Index를 넣어두었다. 문제예상과 달리 새로운 요구사항 (사용자 통합 검색 기능)의 들어와 개발 작업에 착수했다. 이름뿐 아니라 학년, 연락처, 아이디 등 다양한 조건으로 쿼리를 사용해야 했다. 이로 인해 기존에는 없던 인덱스를 새로 추가하는 것이 불가피했다.문제는 이미 서비스가 릴리즈되어 운영 중인 상태였다는 점이다. 대응처음에 그냥 무작정 migration 을 짜면서 자연스레 CREATE INDEX를 작성했다.그런데, 다른 동료가 독..
TL;DR MongoDB는 최초로 설치할 때 single node 로 생성되니, 트랜잭션을 사용하기 위해서는 Replica 설정이 반드시 필요하다. Too Long MongoDB 를 사용 중에 트랜잭션으로 데이터 일관성을 유지해야 하는 상황이 생겼다. Mongoose를 ODM으로 쓰고 있기 때문에 찾아본 결과, session을 활용하면 되었다. const session: ClientSession = await mongoose.startSession(); session.startTransaction(); try { // Add to do statement // Commit the changes await session.commitTransaction(); } catch (error) { // Rollbac..
가장 많이 사용하지만, 매번 잊어버리고 다시 검색하게 되는 주요 psql 명령어 정리 postgresql 클라이언트 실행 $ psql -U -d # 예. $ psql -U postgres -d postgres # 예. 기본 데이터베이스로 실행 $ psql postgres psql 명령어 데이터베이스 조회 # 데이터베이스 전체 조회 postgres=# \l # OR # SQL 문 활용 SELECT datname FROM pg_database; 기타 DB 정보 조회 -- schma (table) list # \t -- user list # \du -- function(extension) list # \df 권한 및 유저 관리 # 로그인 상태 유지하머 슈퍼유저로 생성 CREATE USER WITH LOGIN ..
문제 그룹 : 클라이언트 = N: M 관계이기 때문에 아래 사진처럼 클라이언트_그룹 관계테이블을 만들어 인덱스만 저장하는 형태로 설계하였다. 삽입과 수정이 용이하고, 조회할 때도 인덱스 탐색하기 때문에 보다 빠른 것으로 알고 있다. 그룹 전체 조회를 할 때, 그룹에 관계된 클라이언트 개수도 가져오려고 했다. group.repository.js // group.repository.js //그룹 전체 조회 getAllGroup = async () => { logger.info(`GroupRepository.getAllGroup Request`); const allGroupData = await Groups.findAll({ attributes: [ 'groupId', 'groupName', 'createdA..
only_full_group_by 모드 - MySQL 트러블슈팅 기본 환경: docker image mysql:latest 상황 Clients : Groups = N : M 관계로, 각 클라이언트와 그룹은 여러 개에 속할 수 있음 클라이언트 ID를 기준으로 그룹 정보와 클라이언트 정보를 조인으로 조회하고자 함 문제 아래와 같은 쿼리문 실행 SELECT cs.clientId, cs.clientName, cg.groupId, g.groupName FROM Clients AS cs LEFT OUTER JOIN ClientGroups cg ON cs.clientId = cg.clientId LEFT OUTER JOIN `Groups` g ON g.groupId = cg.groupId GROUP BY cs.cli..
데이터 모델링 (Data Modeling) 데이터 모델링은 현실 세계의 개념을 데이터로 저장하기 위해 논리적인 데이터베이스 모델로 만드는 작업을 말한다. 데이터로 정의하고 구조화하는데 여러 기법이 활용될 수 있지만, 그 중 개체-관계 모델 (Entity-Relationship Modelling) 이 많이 적용된다. ERD (Entity-Relationship Diagram) ERD는 개체-관계모델을 다이어그램으로 나타낸 것이다. 그렇다면 개체-관계 모델이란 무엇인가. 예를 들어서 설명해보겠다. 개체는 말 그대로 행동의 물체가 되는 사물, 사람 등의 '명사'를 나타낸다. 사람, 책, 컴퓨터 하나하나가 바로 하나의 개체를 뜻한다. 관계는 두 개 이상의 개체끼리 연관성을 나타내는데, 주로 '동사'형의 의미를 ..
DML (Data Manipulation Language) 데이터베이스/테이블에 있는 데이터 (레코드 또는 행)를 조작(생성, 수정, 삭제)하는 언어 CREATE (추가) 데이터베이스/테이블에 데이터를 추가(생성)하는 쿼리문 INSERT문으로 새로운 데이터 추가(생성)하기 INSERT INTO 테이블명 (컬럼명1, 컬럼명2, ...) VALUES(데이터1, 데이터2, ...) -- 컬럼명 순서에 맞게 데이터를 순서대로 입력해야 함 READ (조회) 데이터베이스/테이블의 데이터를 조회(검색)하는 쿼리문 SELECT문으로 데이터 조회(검색)하기 -- * : 전체 컬럼 SELECT * FROM 테이블명 WHERE 컬럼명=속성값; SELECT 컬럼1, 컬럼2 FROM 테이블명 WHERE 컬럼명=속성값; UPDA..