안녕하세요.
|
개발자 최민석입니다.

thumbnail
Devops
Docker
April 25, 2025
🐳 DinD vs DooD / Docker 기반 Jenkins/Argo CI/CD 전략 분석

🐳 DinD vs DooD: Docker 기반 Jenkins/Argo CI/CD 전략 분석 Docker 기반의 CI/CD 파이프라인을 구성할 때, Jenkins나 Argo 같은 자동화 도구에서 Docker를 어떻게 실행할지에 따라 DinD(Docker-in-Docker) 와 DooD(Docker-outside-of-Docker) 두 가지 방식 중 선택하게 된다. DinD (Docker-in-Docker) 컨테이너 내부에서 자체적으로 Docker 데몬을 실행하여, 완전한 격리 환경을 제공한다. 예를 들어, Jenkins Job이 실행되는 컨테이너 안에서 독립적인 Docker 데몬을 구동하여, 그 안에서 다시 컨테이너를 실행하는 구조이다. 이러한 방식은 테스트 환경을 완전히 분리하고자 할 때 유용하다. 그러나 —privileged 권한이 필요하며, 보안상 위험이 존재하고 리소스 사용량이 많을 수 있다. DooD (Docker-outside-of-Docker) 컨테이너에서 호스트의 …

Spring
MSA
DDD
April 25, 2025
DDD Aggregate 패턴과 OneToMany 메모리 비효율성 문제에 대한 고찰

DDD 애그리거트에서의 fetch join 처음 나는 도메인 주도 설계(DDD)의 원칙에 따라 와 을 하나의 애그리거트로 묶었다. 그리고 자연스럽게 모든 의 변경은 루트를 통해서만 일어나도록 설계했다. 이 구조 자체는 문제가 없었다. 문제는 그 이후, 성능 최적화에 대한 오해에서 비롯되었다. 💡 애그리거트 패턴이란? 애그리거트(Aggregate) 패턴은 도메인 모델에서 관련된 객체들을 하나의 일관된 단위로 묶어 관리하는 개념이다. 이 묶음의 중심에는 루트 엔티티(Aggregate Root)가 있으며, 외부에서는 반드시 루트를 통해서만 내부 구성 요소에 접근하거나 변경할 수 있다. 이렇게 함으로써 도메인의 불변 조건이나 비즈니스 규칙을 루트가 통제할 수 있게 된다. 구성 객체들은 루트 없이는 독립적으로 저장되거나 로딩될 수 없다. 애그리거트는 하나의 트랜잭션 단위를 구성하며, 변경은 항상 이 경계 내에서 일어난다. 여러 애그리거트가 서로 참조할 경우에는 실제 객체 참조 대신 식별자…

Backend
Spring
April 24, 2025
Java 제네릭과 수퍼타입 토큰

자바의 레퍼런스 타입은 런타임에 지워짐 예상결과 실제결과 왜 다 지워져버리는걸까? 이는 T의 타입 정보가 런타임까지 전달되지 않고, 컴파일 시점에 Object로 타입 소거되었기 때문이다. Sup이나 Sup 모두 동일한 바이트코드를 가지며, 리플렉션을 통해 타입 정보를 확인하려 해도 Object로 나오는 것이 정상이다. 여기에는 역사적인 이유가 있는데, 자바 1.4 이전 버전과의 호환성을 맞추기 위해 컴파일 타임에 타입을 소거시키는 것이다. 그래서 확장성있으면서도 안전한 형 보존을 위해서는 추가적인 작업이 필요하다. 예시: ObjectMapper 유틸리티 기존 프로젝트에서 ObjectMapper를 사용해서 json을 파싱할때면, 항상 와 같은식으로, ObjectMapper 빈은 스프링이 자동으로 빈 컨텍스트에 넣어주는데도 불구하고, 새로운 ObjectMapper를 만들어서 사용했고, 코드의 재사용성이 현저히 떨어졌다. 이를 개선하기 위해 JsonUtil 클래스를 만들었다. level…

Devops
K8S
April 23, 2025
Workflow 관리(쿠버네티스 스터디 8주차)

Chap 17. Workflow 관리 Argo workflow 쿠버네티스 core API에는 일회성 배치 작업을 수행하는 Job 리소스가 존재한다. 간단한 retry정책이나 parallel 실행이 가능하지만 작업간 종속성 부여, 조건부 실행, 에러 핸들링 등 고급 워크플로우 관리 기능은 부재한다. 이를 해결하고자 Argo Project에서 Argo workflow를 개발했다. Argo workflow는 쿠버네티스 워크플로우 엔진으로 CNCF의 incubating 프로젝트로 등록되어 있다. 사용자가 원하는 Workflow를 직접 구성할 수 있으며 작업간 종속성을 만들어 순차적으로 실행할 수 있다. 또한 병렬실행이나 에러 핸들링 등과 같은 고급 워크플로우 관리 기능과 사용자를 위한 웹 UI도 제공한다. 사용자는 쿠버네티스 내장 리소스처럼 워크플로우를 생성, 삭제 및 관리할 수 있다. 동작 방법 Argo workflow도 다른 Operator와 마찬가지로 사용자 정의 리소스에 따라 사…