도메인 주도 설계(DDD)를 학습하면서 정리한 내용입니다.개념 위주 요약보다는, 실무에서 느낀 점과 함께 정리했습니다.Chapter 1. 도메인 모델 시작하기💬 간단 정리도메인은 소프트웨어로 해결하고자 하는 문제 영역이다.문제를 해결하기 위한 요구사항들을 개념적으로 표현하면 도메인 모델을 도출할 수 있다.ex) 주문, 주문 상태, 배송, 상품 등등도메인 모델은 엔티티와 밸류로 구분된다.엔티티와 밸류의 가장 큰 차이점은 식별자의 유무이다.(엔티티는 식별자가 존재함)코드 상에서 사용하는 용어와 회사 내의 소통할 때 사용하는 용어를 공통으로 사용하는 것이 유비쿼터스 언어이다.💡 관련 생각DDD가 아니더라도 요구사항을 통한 객체 추출은 이전부터 해오고 있었는데 이전에도 이러한 개념은 존재했던 것 같다.실제 ..
프로젝트 의도최근에 AI 연관한 서비스에 관심이 생겨 이를 연동한 서비스를 만들어보고 싶었습니다. 그리고 AI를 연동할 때 비동기를 통해 이를 최적화하는 것을 공부해보고 싶습니다. 그리고 시간이 남는다면, 주식창을 실시간으로 보여주는 소켓 프로그래밍도 공부해보고 싶습니다.그래서 이 프로젝트를 하면서 다음 기술에 대해 공부해볼 예정입니다.비동기 처리소켓 프로그래밍이 기술들 이외에도 프로젝트를 만들어보면서 느낀 점을 간단하게 기록해보고자 합니다.
개요회사에서 Spring Data r2dbc를 이용해서 레거시 프로젝트를 마이그레이션 하고 있습니다.DB도 레거시 스타일로 되어 있었는데 PK가 복합키로 되어 있는 상황입니다. create table Example( column1 long comment '다른 테이블 PK', column2 varchar(10) comment '구분 타입', created_at datetime, updated_at datetime, primary key (column1, column2)); 예시와 같이 PK가 다른 테이블의 PK와 그것을 구분하는 타입으로 되어 있는 구조여서 PK를 직접 설정해서 insert를 해야했습니다. 하지만, PK를 직접 입력하고 reposi..
서브쿼리가 일으키는 폐해 [서브쿼리의 문제점] 서브쿼리의 성능적 문제점의 원인은 서브쿼리가 실체적인 데이터를 저장하지 않는 점입니다. 문제점은 다음과 같습니다. 연산 비용 추가 서브쿼리에 접근할 때마다 SELECT 구문을 실행해야 한다. 데이터 I/O 비용 발생 서브쿼리의 연산 결과가 클 경우 저장소에 저장해야 한다. 최적화를 받을 수 없음 서브쿼리에는 메타 정보가 존재하지 않아 옵티마이저에 의한 최적화가 힘들다. [서브쿼리 의존증] 예시를 통해 서브쿼리를 사용하면 좋지 않은 경우를 살펴보겠습니다. CREATE TABLE Receipts ( cust_id CHAR(1) NOT NULL, seq INTEGER NOT NULL, price INTEGER NOT NULL, PRIMARY KEY (cust_id..
6장 결합 기능적 관점으로 구분하는 결합의 종류 SQL에는 결합 연산이 다음과 같이 존재합니다. 결과의 형태에 따른 구분 크로스 결합 내부 결합 외부 결합 등호 사용 여부에 따른 구분 등가 결합 비등가 결합 기타 자연 결합 자기 결합(필자에 의하면 굳이 결합 카테고리로 구분할 필요가 없다고 합니다.) 자연 결합은 굳이 사용하지 않아도 된다. 필자에 의하면, 자연 결합은 여러 단점이 있어 내부 결합을 사용할 것을 추천하고 있습니다. 필자가 밝힌 단점은 다음과 같습니다. 등가 결합은 짧게 쓸 수 있지만 내부 결합에 비해 엄청 짧지 않다.필드 이름이 다르거나 자료형이 다르면 적용할 수 없어 확장성이 떨어진다.결합 조건을 한번에 알기 어려워 가독성이 떨어진다. 자연 결합과 내부 결합의 중간 형태인 USING 구..
집약 표준 SQL에는 다음과 같은 집약 함수가 존재합니다. COUNT SUM AVG MAX MIN 해당 함수들에 '집약'이라는 접두사가 붙은 이유는 여러 개의 레코드를 하나의 레코드로 집약하는 기능을 가지기 때문입니다. [여러 개의 레코드를 한 개의 레코드로 집약] 실제 예시를 통해 집약을 하면 어떻게 되는지 살펴보겠습니다. 다음과 같은 테이블이 존재합니다. NonAggTbl id data_type data_1 data_2 data_3 data_4 data_5 data_6 Jim A 100 10 34 346 54 Jim B 45 2 167 77 90 157 Jim C 3 687 1355 324 457 Ken A 78 5 724 457 1 Ken B 123 12 178 346 85 235 Ken C 45 ..
8강 UNION을 사용한 쓸데없이 긴 표현 조건 분기를 구현할 때 왜 UNION을 사용할까? 일반적으로 조건 분기는 복수의 조건에 일치하는 하나의 결과 집합을 얻고 싶을 때 사용합니다. 여러 개의 SELECT 문으로 쪼개어 각 조건을 표현할 수 있기 때문에 생각하기가 쉽습니다. 즉, UNION을 이용하는 방법은 조건 분기를 SQL 문으로 나타낼 때 가장 처음 나타내기 쉬운 방법입니다. UNION을 사용하면 어떤 점이 문제일까? UNION을 사용하면 SQL 문을 짜기 쉬운데 왜 사용이 지양될까요? 바로 성능적인 측면에서 문제가 있기 때문입니다. UNION을 이용하면 내부적으로 여러 개의 SELECT 구문을 실행하도록 해석됩니다. 이는 곧 I/O 횟수의 증가로, 성능적으로 손실이 발생합니다. 그렇다면 실제 ..
개요 이번 장에서는 SQL과 관련된 기초적인 설명을 합니다. 6강 SELECT 구문 SELECT 구문은 검색을 위해 사용합니다. 예시) 모든 사람 조회 SELECT * FROM People; SELECT 구와 FROM 구 SELECT 구는 검색할 테이블의 필드들을 지정할 수 있습니다. FROM 구는 검색할 대상이 되는 테이블을 지정할 수 있습니다. 특정 조건을 검색할 때는 어떻게 할까? 항상 모든 데이터가 필요한 것은 아닙니다. 특정 조건의 데이터를 검색할 때는 WHERE 구를 이용할 수 있습니다. 예시) 주소가 인천시인 사람 검색 SELECT * FROM People WHERE address = '인천시'; WHERE 구는 '=' 이외에도 다양한 연산자를 통해 조건 지정을 할 수 있습니다. (, ..
01 강 DBMS 아키텍처 개요 쿼리 평가 엔진 SQL 구문 분석 및 데이터 접근 순서 결정 데이터에 어떻게 접근할지 세우는 계획을 실행 계획(또는 실행 플랜)이라고 함 실행 계획에 따라 성능과 연관이 있음 버퍼 매니저 버퍼 메모리 영역을 관리 디스크 용량 매니저와 함께 연동하며 작동 -> 마찬가지로 성능과 연관이 있음 디스크 용량 매니저 데이터의 저장 위치 관리 및 데이터의 읽기, 쓰기 제어 트랜잭션 매니저와 락 매니저 트랜잭션의 정합성 유지 및 실행, 락 관리 리커버리 매니저 데이터 백업 및 복구 02 강 DBMS와 버퍼 버퍼는 성능에 중요한 영향을 미친다! 공짜 밥은 존재할까? 하드디스크는 큰 용량을 저장할 수 있지만 느리고, 메모리는 빠르지만 비싸다! DBMS와 기억장치 DBMS가 데이터를 왜 메..
개요 해당 포스팅은 오디고(ODEEGO) 프로젝트에 관한 글입니다. 해당 프로젝트에서 저는 사용자의 출발역들을 통해 중간역을 찾는 API를 맡았습니다. 이번 포스팅에서는 해당 API의 부하 테스트를 진행하던 도중 발생한 에러와 이에 대한 생각 및 해결 과정을 정리할 예정입니다. 부하테스트 저는 제가 담당한 API의 호출 빈도를 초당 700명 정도로 가정했습니다. JMeter를 통해 요청을 보내 부하테스트를 해보겠습니다. Thread Group 초당 700명으로 가정하여 다음과 같이 구성했습니다. 요청 데이터 결과 에러율은 1.00%, 평균 약 45000ms로 확인되었습니다. 원인 분석 에러 로그 에러 로그를 살펴보면, Connection 이 부족하여 해당 문제가 발생했다는 것을 알 수 있습니다. 더보기 ..