❐ Description과거 실무에서 프로젝트를 할 때 slow query를 개선해 본 경험이 있다.그 당시에는 구글링과 책들을 참고해서 했었는데, 이번에 한 번 블로그에 정리해볼까 한다.
6-3. Repository
·
Architecture/DDD
❐ Description도메인 주도 설계의 목표는 기술보다는 도메인에 대한 모델에 집중해 더 나은 소프트웨어를 만드는 것"에릭 에반스 - 도메인 주도 설계" 6장의 Repository 내용 정리.여기서 만든 예제는 스스로 이해를 돕기 위해 만든 간단한 예제.저장된 객체를 가져오는 것은 실제로는 생성의 한 부분집합Entity의 생명주기 가운데 중간 단계에 불과 ❐ 필요한 데이터를 직접 획득해서 조작하면 안된다.우선 여기서 가장 중요하게 설명하는 것은 아래와 같다. 클라이언트 코드에서 직접적으로 데이터베이스를 사용해서 Aggregate나 캡슐화와 같은특징을 활용하는 것을 우회하려고 하고, 그 대신 필요한 데이터를 직접 획득해서 조작하면 안된다. 아래와 같이 하지말라는 것이다.// 클라이언트 코드pub..
6-2. Factory
·
Architecture/DDD
❐ Description"에릭 에반스 - 도메인 주도 설계" 6장의 Factory 내용 정리.여기서 만든 예제는 스스로 이해를 돕기 위해 만든 간단한 예제. ❐ Factory와 Factory의 위치 선정1. Aggregate 내부 Factory MethodAggregate의 루트 엔티티에 팩토리 메서드를 배치하면, Aggregate의 무결성을 보장하는 책임을 루트가담당하게 된다.public class PurchaseOrder { private final String orderId; private final List items; // 생성자 생략 // ... // FACTORY METHOD: PurchaseItem을 생성하고 Aggregate에 추가 p..
ReadMe.md
·
Architecture/DDD
❐ DescriptionWewoot 프로젝트를 하면서 DDD를 접했었다. 그 당시에는 빠른 실무 적용을 위해 "도메인 주도 개발 시작하기" 책을 통해서 스터디를 했고, 프로젝트에 점진적으로 적용해 나아갔다.아무래도 JPA 기반으로 설명이 되어 있다보니 적용이 수훨했다. 요즘 내 눈에는 MSA라는 단어가 많이 보인다. 아무래도 경력직 공고를 보다보니 그런 것 같다.그러다보니 DDD라는 설계에 꽂히게 됐다. 그리고 개인적으로 도메인들을 잘 쪼개놓고 그것이기대하는대로 동작하는 것을 보면 왠지 모르게 기분이 좋다. 그래서 이번에는 좀 더 깊에 DDD를 공부해보고자 "에릭 에반스 - 도메인 주도 설계"를 읽으면서DDD에 대한 지식의 깊이를 더 해보려고 한다. 후기를 보니 난이도도 높은데 번역이 쫌 자연스럽지 않..
[LeetCode#131] Palindrome Partitioning
·
Algorithm/문제풀이
❐ Description이번 문제도 [LeetCode#93] Restore IP Addresses와 마찬가지로 문자열을 동적으로 분할하는 로직이 추가적으로 필요하다. ❐ 풀이 전략☑️ 주어진 문자열의 분할 시작점을 cursor 변수에 저장한다.☑️ cursor를 시작으로 하는 for문 input의 길이만큼 순회한다. (int i = cursor;)☑️ 부분 문자열의 Palindrome 여부를 확인한다.☑️ 시작 : cursor, 종료 : i + 1 ❐ Solutionpublic class Solution { private final List> subsets = new ArrayList(); public List> partition(String s) { backTra..
[LeetCode#93] Restore IP Addresses
·
Algorithm/문제풀이
❐ Description이번 문제는 기존의 순열이나 조합을 다루는 백트래킹 문제와는 달리, 입력이 문자열로 주어지고 이를조각으로 나누어가며 탐색하는 백트래킹 유형이다. 문자열의 앞뒤를 탐색하며 유효성을 검증해야 하기때문에, 문자열을 동적으로 분할하는 로직이 추가적으로 필요하다. ❐ 풀이 전략☑️ 문자열 분할의 시작 지점을 cursor 변수에 저장한다.☑️ IP의 8비트 최대 길이인 3만큼 for문을 순환한다.☑️ 문자열 분할의 종료 지점을 cursor + length로 나타낸다.☑️ 생성된 부분 문자열이 0으로 시작하지 않는 10의 자리 숫자 이상인지 확인한다.☑️ 생성된 부분 문자열이 255 이하를 충족하는지 확인한다.☑️ dot(점)의 수가 4개가 넘어간다면 해당 IP는 무시한다.☑️ 현재 c..
Partitioning
·
CS/Database
❐ Partitioning데이터베이스 파티셔닝(partitioning)은 대량의 데이터를 효율적으로 관리하고 쿼리 성능을 향상시키기위해 데이터를 여러 개의 물리적 파티션으로 나누는 기법이다. ❐ Partitioning1. Horizontal Partitioning☑️ Horizontal Partitioning이란?하나의 테이블의 각 행을 다른 테이블에 분산시키는 것이다. (컬럼의 갯수는 똑같고, 데이터만 분산)위와 같이 지역별로 사용자 데이터를 분산할 때 사용할 수 있다. ☑️ Horizontal Partitioning 선택 시점은?1. 데이터 크기가 너무 커서 분산 저장 필요할 때2. 지역 분리3. 로드 벨런싱4. 아카이빙 ☑️ Horizontal Partitioning을 적용할 때 생각해볼 ..
Sharding
·
CS/Database
❐ Sharding1. 샤딩이란?샤딩은 동일한 스키마를 가지고 있는 여러대의 데이터베이스에 데이터를 작은 단위로 나누어 분산저장하는 기법이다. 데이터 자체를 분산 저장해서 수평 분할(Horizontal Partitioning)이라고도 한다.데이터를 분배할 때는 샤딩 키(Sharding Key)를 사용한다. 또한 샤딩은 수평 분할(Horizontal Partitioning)이라고 할 수 있다. 샤드(Shard)는 샤딩(Sharding)에서 사용되는 개념으로, 하나의 데이터베이스를 여러 개의 독립적인단위로 나눈 데이터 조각을 의미한다. 각 샤드는 자체적으로 완전한 데이터베이스로 기능하며,전체 데이터베이스 시스템의 일부 데이터를 저장합니다. 2. 샤딩의 목적☑️ 확장성데이터의 양이 많아지고 쓰기/읽기 요청..