배경회사에서 개발 중인 솔루션에서는 서로 다른 도메인(사용자, 업무 코드)에 속한 특정 필드 간에 중복이 허용되지 않는 제약 조건이 필요했다. 문제는 이 제약이 단일 테이블이나 단일 도메인 수준에서 해결될 수 있는 성격이 아니라는 점이었다.해당 솔루션은 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는 도메인 규칙 준..
minikube 에서 local 에 있는 docker image 로 deploy 하기 위해 다음과 같은 명령어가 필요했다. eval $(minikube docker-env) 그 이후로도 minikube 에서 jenkins 구축을 위해 helm 설치를 했는데 그 이후로 문제가 발생했다. 문제 kubectl 명령어가 과도하게 느려지거나, TLS 오류 또는 timeout 이 발생했다. 그래서 minikube status 를 해보니 아래와 같았다. apiserver만 Stopped 상태다. minikube stop, start 를 반복해도 문제는 여전했다. minikube type: Control Plane host: Running kubelet: Running apiserver: Stopped kubeconf..
사내 서버 k8s 로 이것저것 하다 되는 게 없어, 로컬에서 minikube 사용 겸 정리 minikube 설치 https://minikube.sigs.k8s.io/docs/start/ minikube start minikube is local Kubernetes minikube.sigs.k8s.io 해당 작업이 다 되어 있다고 가정한 상태로 진행 deployment 배포 kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 다음과 같이 테스트용 deployment 를 배포한다. 배포한 뒤에 kubectl get deployments 로 확인할 수 있다. 외부로 보이도록 설정 kub..
글 시작전에 쿠버네티스를 공부하다 거의 절망했는데 (도커 친구 같은 너.. 도커도 힘든데 너는 그냥 모르겠다...) 날 구제해준 영상 강의가 있어, 한 번 보고, 다시 한 번 보면서 그림그리면서 정리한 것을 다시 블로그에 정리해서 올리면서 복기하려고 한다. (그 강의는 아래 참고자료에 있다. 진짜 추천👍👍👍) 쿠버네티스에서 강조하는 상태체크 (Observe) 현재 상태와 원하는 상태가 맞는지 (현재 상태 == 원하는 상태) 확인하는 것 즉, 컨테이너 하나만 떠 있어야 하는데, 실제로도 하나만 떠 있는지 확인하는 것이다. 차이점 발견 (Diff) 컨테이너 하나가 떠 있어야 하는데, 떠 있지 않으면 차이점을 발견한 것이다. 조치 (act) 컨테이너 하나가 있어야 하지만, 그렇지 않기 때문에 컨테이너 하나를 ..
클라우드 이용 모델이란 클라우드 이용 모델은 크게 퍼블릭 클라우드, 프라이빗 클라우드, 커뮤니티 클라우드, 하이브리드 클라우드, 멀티 클라우드로 나누어볼 수 있다. 클라우드 벤더사에 따라 몇 가지 종류가 더 있을 수 있다. 퍼블릭 클라우드 (Public Cloud) 서비스 제공업체가 컴퓨팅 및 스토리지, 개발 및 배포 환경, 애플리케이션을 포함한 컴퓨팅 서비스를 주문형으로 공개 인터넷을 통해 조직과 개인에게 제공하는 모델이다. 운영 비용 절감 물리적 서버에 대한 유지보수 비용이 들지 않기 때문에 비용을 절감할 수 있다. 서비스를 운영하고 관리하는 데 드는 운영 비용, 인력이 없다. 대규모 확장성 비즈니스가 성장함에 따라 자유롭게 확장이 가능하다. 온디맨드 리소스 온디맨드는 '주문형'으로, 메뉴를 주문하듯..
회사 교육이 드디어 끝나면서 (내일까지) 공부하고 발표한 내용을 다시 한 번 정리해보며, 기록한다. 먼저 클라우드 서비스 모델은 총 3개로, IaaS, PaaS, SaaS가 있다. 그리고 클라우드 서비스 이전에 "온프레미스"에 대해 한 번 짚고 넘어가보자. 온-프레미스 (On-premise) 기업의 서버를 클라우드와 같이 '가상의 공간'이 아니라, 자체적으로 보유하고 있는 서버에 직접 설치하고 운영하는 방식 다음 이미지에서 'On-site'가 '온-프레미스' 방식으로 보면 되고, IaaS, PaaS, SaaS 는 '오프-프레미스' 방식이다. IaaS(Infra as a Service) 클라우드를 통해 기업 및 개인에게 컴퓨팅, 스토리지, 네트워킹, 가상화 같은 주문형 인프라 리소스를 제공하는 것 비유로 ..
- Total
- Today
- Yesterday
- 톰캣
- 자바스크립트
- springboot
- 클라우드
- 파이썬
- 로그
- 마리아디비
- AWS
- oracle
- Minikube
- nodejs
- Spring
- 쿠버네티스
- docker
- 스프링부트
- MySQL
- 알고리즘
- BeautifulSoup
- 스프링
- 크롤링
- k8s
- MongoDB
- mariadb
- kubernetes
- 쿼리
- server
- 오라클
- 도커
- JavaScript
- java
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |