배경회사에서 개발 중인 솔루션에서는 서로 다른 도메인(사용자, 업무 코드)에 속한 특정 필드 간에 중복이 허용되지 않는 제약 조건이 필요했다. 문제는 이 제약이 단일 테이블이나 단일 도메인 수준에서 해결될 수 있는 성격이 아니라는 점이었다.해당 솔루션은 GitLab을 미들웨어로 연계하고 있으며, GitLab은 URL 기반 네임스페이스 구조를 사용한다.https://gitlab.com/{namespace}/{project}이 구조로 인해 GitLab 사용자 아이디와 GitLab 그룹명은 서로 중복될 수 없다. 네임스페이스 충돌은 곧 GitLab 리소스 접근 오류로 이어지기 때문이다.솔루션에서는 이를 다음과 같은 정책으로 매핑하고 있었다.GitLab 사용자(User)는 솔루션의 "사용자 아이디"를 기준으로 ..
❓ 이 글을 쓰게 된 이유주로 MyBatis를 사용해 개발하다 보니 Hibernate라는 기술은 익숙한 이름이었지만, 정작 “Hibernate가 무엇이냐”는 질문에는 늘 추상적인 설명밖에 하지 못했다. ORM과 JPA에 대한 기본적인 개념은 알고 있었고, 가볍게 JPA를 사용해 본 경험도 있었지만, Hibernate가 어떤 역할을 하고 어떤 책임을 지는지 명확하게 설명하기는 쉽지 않았다.이번 글은 그동안 어렴풋하게 알고 있던 개념들을 정리하고, Hibernate를 보다 정확하게 이해하기 위해 작성한 기록이다. 이를 위해 Hibernate 자체부터 설명하기보다는, 먼저 ORM과 JPA라는 기본 개념부터 다시 짚어본다.1. ORM(Object-Relational Mapping)ORM(Object-Relati..
1. 트랜잭션이란?트랜잭션은 "모든 작업이 성공하거나, 모든 작업이 실패하거나" 하는 원칙으로 ACID 특성을 갖는다.Atomicity (원자성): 모두 성공하거나 또는 모두 실패Consistency (일관성): 트랜잭션 전후 데이터 무결성 유지Isolation (격리성): 동시 실행되는 트랜잭션들이 서로 간섭 안 줌Durability (지속성): 성공한 트랜잭션은 영구적으로 저장2. Spring 트랜잭션 구조Controller ↓Service (프록시 객체) ↓TransactionInterceptor ↓PlatformTransactionManager ↓TransactionSynchronizationManager ↓DataSource / JDBC Connection각 요소별로 역할을 살..
이 글을 쓰게 된 계기CQRS(https://benfatto.tistory.com/68)에 대해 찾아보면서 CQRS를 도입하지 않을 경우 안티 패턴 중 무거운 엔티티도 있었다. 흥미로워 더 찾아보다가 점점 작성할 내용들이 방대해져 CQRS와 분리하게 되었다.여기서는 성능의 관점을 조금 더 집중해보았다.👀 무거운 엔티티란?먼저 단순한 엔티티는 아래와 같이 깔끔하다.class Issue { Long id; String title; String status;} 하지만 엔티티가 다양한 요구사항(Read, Create)을 모두 만족하기 위해 노력하는 순간 “무거운” 엔티티가 되기 십상이다. 아래와 같이 두 요구사항을 모두 만족하고, 필드 과잉, 로직 과잉, 연관 관계 과잉이 되어 버린다.예시이슈..
CQRS는 명령(Command)와 조회(Query) 책임을 명확히 분리하는 아키텍처 패턴이다.데이터를 변경하는 작업과 조회하는 작업을 서로 다른 모델, 더 나아가 다른 저장소로 분리하는 방식이다.분리하는 모델의 타입은 두 가지로 우선 간략하게 요약하면 아래와 같다.Command Model (Write Model)상태 변경 목적트랜잭션 중심복잡한 비즈니스 규칙과 도메인 로직 포함Event Sourcing과 결합되기도 함Query Model (Read Model)조회 목적고성능, 고속 응답단순화된 읽기 전용 View / DTODB를 별도로 두거나 Read Replica로 구성해 조회 부하 분산Command와 Query를 왜 나눌까?쓰기와 읽기의 서로 다른 성격 (서로 다른 관심사)Write는 도메인 규칙 준..
Java Bean 이란? 자바 빈은 속성(데이터), 변경 이벤트, 객체 직렬화를 위한 표준으로, 특정 규약을 지킨 클래스를 자바 빈이라고 부른다. 규약은 다음과 같다. 클래스는 인자(Argument)가 없는 기본 생성자(Default constructor)를 갖는다. 클래스의 멤버 변수는 프로퍼티(Properties) 라고 하며, private 접근 제한자를 가져야 한다. 클래스의 프로퍼티들은 Getter / Setter를 통해 접근 가능해야 한다. Getter의 이름은 get{프로퍼티 이름}이고, Setter의 이름은 set{프로퍼티 이름}이어야 한다. Getter / Setter의 접근 제한자는 public이어야 한다. (접근 하기 위하여) 프로퍼티의 자료형이 Boolean일 경우 is로 시작할 수 ..
- Total
- Today
- Yesterday
- server
- Spring
- 크롤링
- kubernetes
- 도커
- JavaScript
- MongoDB
- Minikube
- mariadb
- 알고리즘
- nodejs
- BeautifulSoup
- java
- 파이썬
- docker
- 스프링부트
- 쿠버네티스
- 쿼리
- 톰캣
- MySQL
- 클라우드
- 스프링
- 로그
- 마리아디비
- 자바스크립트
- k8s
- oracle
- AWS
- springboot
- 오라클
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |