본문 바로가기

CS19

도메인 주도 설계 정리 - ENTITY, VALUE OBJECT 도메인 주도 설계: 엔티티와 값 객체의 본질복잡한 도메인을 위한 소프트웨어를 설계할 때, 모델을 구성하는 각 요소의 본질을 깊이 이해해야 한다. 도메인 주도 설계(DDD)는 이 과정을 돕는 두 가지 강력한 빌딩 블록, 엔티티(Entity)와 값 객체(Value Object)를 제시한다.1. 엔티티 (Entity): 식별성으로 정의되는 연속적인 삶엔티티의 근본적인 개념은 객체의 생명주기 내내 이어지는 추상적인 연속성이며, 그러한 추상적인 연속성은 여러 형태를 거쳐 전달된다는 것이다.어떤 객체를 그 속성이 아닌, 고유한 식별성(Identity)으로 일차적으로 정의한다면, 우리는 그것을 엔티티라고 부른다. 엔티티의 핵심은 시간이 흘러도 변치 않는 정체성이다.예를 들어 '고객'이라는 엔티티를 생각해보자. 한 고.. 2025. 6. 26.
RealMySQL - 인덱스 스캔 방향 1. 인덱스 스캔 방향은 무조건 오름차순으로 이루어지는가?- No, 인덱스는 항상 오름차순으로 정렬돼 있지만 인덱스를 최솟값부터 읽으면 오름차순으로 값을 가져올 수 있다. 최댓값부터 거꾸로 읽으면 내림차순으로 값을 가져올 수 있다는 것을 MySQL 옵티마이저는 이미 알고있다. 2. 인덱스 스캔- 내림차순 인덱스 : 큰 값의 인덱스 키가 B-Tree의 왼쪽으로 정렬된 인덱스- 인덱스 역순 스캔 : 인덱스 키의 크고 작음에 관계없이 인덱스 리프 노드의 오른쪽 페이지부터 왼쪽으로 스캔 - 오름차순 인덱스 : 작은 값의 인덱스 키가 B-Tree의 왼쪽으로 정렬된 인덱스- 인덱스 정순 스캔 : 인덱스 키의 크고 작음에 관계없이 인덱스 리프 노드의 왼쪽 페이지부터 오른쪽으로 스캔 3. 인덱스 역순 스캔이 인덱스 .. 2025. 6. 22.
RealMySQL - REAPEATABLE READ REPEATABLE READ란? - REAPEATABLE READ는 MySQL의 InnoDB 스토리지 엔진에서 기본으로 사용되는 격리 수준- MVCC를 위해 언두 영역에 백업된 이전 데이터를 이용해 동일 트랜잭션 내에서는 동일한 결과를 보여줄 수 있게 보장함1. 주요 특징특징설명 동일 쿼리 반복 시 결과 일관성 유지트랜잭션이 시작된 순간의 스냅샷을 기준으로 데이터를 조회한다.Phantom Read 방지MySQL(InnoDB)은 Next-Key Locking을 통해 팬텀 리드를 막는다.Serializable보다 성능이 좋음완벽한 직렬화(Serializable) 수준보다 성능이 높고 동시성도 괜찮은 편이다.Read Committed보다 보수적다른 트랜잭션에서 커밋한 내용도, 트랜잭션 내에서는 보이지 않음. .. 2025. 6. 22.
Spring 테스트에서 @Transactional과 비관적 락 사용 시 주의점 오늘은 Spring 테스트 코드를 통해서 방 입장 동시성 문제를 해결한 비관적 락 코드를 테스트하면서 발생한 문제에 대해서 다뤄보겠습니다.문제 상황Spring에서 데이터베이스 테스트를 작성할 때, 우리는 종종 @Transactional 어노테이션을 사용합니다. 이 어노테이션은 각 테스트 메서드를 하나의 트랜잭션으로 감싸고, 테스트가 끝나면 자동으로 롤백 하여 데이터베이스를 초기 상태로 되돌립니다.이번 테스트에서는 비관적 락을 통해 5명 제한인 방에 10명이 동시에 입장을 시도하면 5명이 방에 참여를 하고 5명은 참여하지 못하는 것을 테스트 시나리오로 수립하였습니다. 그러나 생각했던 시나리오와는 달리 계속해서 lock timeout이 발생하였습니다. 원인을 파악하기전에 작성한 코드를 먼저 살펴보겠습니다... 2024. 10. 14.
스프링부트 JPA 모범 사례 - @ManyToMany 연관관계를 효과적으로 구성하는 방법 오늘은 양방향 @ManyToMany 연관관계를 효과적으로 구성하는 방법에 대해 알아보았다.먼저 양방향 @ManyToMany 연관관계는 양쪽으로부터 탐색할 수 있으므로 양쪽 모두 부모가 된다. 둘 다 부모이기 때문에 둘 중 누구도 외래 키를 보유하지 않고 연결 또는 조인 테이블로 알려진 별도의 테이블에 저장되는 2개의 외래 키를 갖는다. 이 연결 테이블은 숨겨져 있으며 자식 측 역할을 한다. 그럼 @ManyToMany 연관관계를 어떻게 하면 효과적으로 사용할 수 있을까? 1. 항상 List가 아닌 Set을 사용@ManyToMany의 대부분의 상황에서 List보다 Set의 성능이 뛰어나다. 특히 삭제 처리와 관련해 Set을 사용하고 List는 피하는 것이 좋다고 한다. 2. 연관관계의 양측 동기화 상태.. 2024. 8. 23.
[JAVA] String.valueOf()와 toString()의 차이에 대해서 알아보자 feat. Effective Java 들어가면서.. AWS에 배포 중인 요양기관 차량 배치 프로젝트에서 에러가 난다는 이야기를 듣게 되었고 리팩토링을 진행하려고 테스트 코드를 작성하다가 원시 타입 배열에서는 toString()이 작동하지 않고 String.valueOf()만 가능한 이유와 둘의 차이에 대한 궁금증이 생겨 글을 작성하게 되었다. 1. 왜 employeeCapacityLeft[i] (원시 타입 배열)은 toString()이 작동하지 않고 String.valueOf로 감싸주어야 할까? toString()은 java.lang.Object 클래스에 정의된 인스턴스 메소드이고 객체 타입에만 동작한다. 따라서 employeeCapacityLeft는 원시 타입으로(int) 변수가 선언되었기 때문에 java.lang.Object 클래스의 .. 2024. 6. 7.