분류 전체보기

    [4주차] PKOS 쿠버네티스 실무 실습 스터디 (23.02.04)

    [4주차] PKOS 쿠버네티스 실무 실습 스터디 (23.02.04)

    들어가며 이번 글에서는 지난주 kOps기반 gitOps 기술에 대한 스터디에서 배운 내용을 정리하도록 한다. GitOps는 평소에도 관심 가지고 부서에 도입하고자 했던 기술이었고, 이 내용을 스터디에서 다루게 되어 좋았다. 사용한 OSS(Open Source Software)인 Harbor, Gitlab, ArgoCD는 목적에 따라 개별적으로 프로젝트에 적용해 본 경험이 있었다. 스터디에서 한번에 연계해서 사용해보고 나니 생각보다 난이도가 높지 않고 적용해 볼 만하다 싶었다. 스터디 진행전 간단하게 각 OSS의 소개 및 용도에 대해 간략히히 정리하고 넘어가도록 한다. Harbor 오픈소스 기반 이미지 레지스트리로써, 다른 SaaS형 이미지 레지스트리와 다르게 Onpremeis와 같은 격리된 환경에서 직접..

    [3주차] PKOS 쿠버네티스 실무 실습 스터디 (23.01.29)

    [3주차] PKOS 쿠버네티스 실무 실습 스터디 (23.01.29)

    들어가며 이번 글에서는 Kubernetes Ingress 및 Kubernetes Storage에 대해 스터디에서 배운 내용을 정리하도록 한다. Ingress (네트워크 스터디 과정의 연속) Ingress는 kubernetes cluster 내부의 서비스들을 외부로 노출하는 데 사용한다. 스터디 환경에서는 AWS Load Balacer Controller를 Ingress에 연결하여 사용했다. NLB의 경우 TCP, UDP 등 많은 프로토콜을 지원하지만, Ingress ALB의 경우 HTTP/HTTPS 프로토콜만 지원한다. IAM Policy에 AllowExtenerDNSUpdates policy와 AllowExternalDNSUpdates를 각 Leader/Follow Node에 할당한다. 참고: AWSL..

    [2주차] PKOS 쿠버네티스 실무 실습 스터디 (23.01.15)

    [2주차] PKOS 쿠버네티스 실무 실습 스터디 (23.01.15)

    들어가며 이번 글에서는 Kubernetes Network에 대해 스터디에서 배운 내용을 정리하도록 한다. Kubernetes는 클러스터 내부 통신을 위해 Network Plugin을 사용한다. 플러그인은 CNI(Container Network Interface)를 사용한 다양한 오픈소스를 이용하는데, 그중 Calico를 많이 사용하는 것 같다. 사내에 구축한 Kubernetes Cluster 역시 Calico 기반이다. Kubernetes Pod는 Container들로 구성되는데 Pod의 Pause 컨테이너를 통해 하나의 IP를 할당할 수 있다. (Container 개별적으로 접근하려면 Port를 이용해야 한다.) Pod 들은 Node(Host)의 이더넷 카드를 이용하여 외부로 통신한다. 여기서 외부는 ..

    [1주차] PKOS 쿠버네티스 실무 실습 스터디 (23.01.08)

    [1주차] PKOS 쿠버네티스 실무 실습 스터디 (23.01.08)

    들어가며 사내 실험용 서버팜을 EKS 기반으로 구축하기 위해 노력 중이었다. 그러던 중 AWS 환경에서 쿠버네티스 실무 실습 스터디 모집을 한다는 소식을 우연히 접하게 되어 바로 신청했고, 운이 좋게 40여 명의 스터디 인원중 한 명으로 참여할 수 있게 되었다. AWS가 아직은 익숙하지 않았기에, ‘이번 기회에 열공 해서 제대로 감을 잡아 보자!’ 하는 마음으로 보내주신 스터디 사전 지식들을 학습하기 시작했다. 지난 일요일(23.01.08) 본격적으로 1주차 실습에 임하게 되었다. 스터디는 정말 군더더기 없이 유용한 정보들과 함께 빠르게 진행되었다. 스터디 리더이신 가시다님께서 커리큘럼과 진행에 대해 많은 고민을 하신 것이 온몸으로 느껴졌다. 아직 스터디를 접하지 못한 Cloud 또는 DevOps 엔지니..

    [Istio] Istio Service mesh 튜토리얼 후기

    [Istio] Istio Service mesh 튜토리얼 후기

    들어가며 Istio Service Mesh 는다양한 장점을 가지고 있지만, 그중 필자가 도입하고자 하는 이유는 두 가지다. 첫 번째, 서비스간 상호작용 추적 운영 중인 서비스간 상호 관계를 파악하기 위한 방법은 전술적 설계 과정의 개발 산출물을 토대로 서비스의 연관성을 확인한 후, Datadog의 이벤트 로그들을 확인하며 검증하는 방법뿐이다. Istio Service Mesh의 Sidecar를 기반으로 한 운영 가시화가 매력적이었다. 또한 Sidecar를 이용하여 상호 작용이 불가능한 서비스 결함을 사전 탐지할 수 있는 점도 좋았다. 두 번째, Circuit breaker 도입 운영 중인 서비스에 Circuit breaker를 도입하기 위함이다. 플랫폼이 Polyglot 한 마이크로 서비스 구조로 변경되..

    [Kubernetes] DEVOCEAN - 김정기 전문가(SK Telecom)님의 멘토링

    [Kubernetes] DEVOCEAN - 김정기 전문가(SK Telecom)님의 멘토링

    들어가며 9월, 적잖은 노력 끝에 2개의 MSA 프로젝트를 성공적으로 Kubernetes 환경에 배포하게 되었다. 이제 우리 회사도 탄력적인 클라우드 인프라를 사용할 수 있는 환경이 조성되었다는 뿌듯함과 함께 2가지 미해결 사항이 마음을 무겁게 하고 있다. 첫 번째, CI/CD 환경 구축 프로젝트가 아직 연구단계이기 때문에 도메인 요구사항이 계속 발굴되고, 자잘한 버그들이 많은 상황이다. 그래서 하루 평균 10~20번 정도 빌드와 배포를 반복하고 있다. 프론트엔드의 경우 단일 프로젝트라 한 번의 빌드로 끝나지만, Micro serice들 상호 간에 패치를 진행하면 빌드 횟수는 n배로 늘어나는 상황이다. 사업이 어느 정도 일단락되는 시점에 CI/CD에 대한 탈출구를 찾아야한다. 두 번째, Distribut..

    [Kubernetes]Nginx 이미지를 이용한 간단한 쿠버네티스 프로젝트

    [Kubernetes]Nginx 이미지를 이용한 간단한 쿠버네티스 프로젝트

    들어가며 MSA에 입문한 뒤로 블로그에 글을 올라는 횟수가 대폭 줄었다.. 회사에 제안한 MSA 기반 프로젝트를 진행하면서 학습량이 많이 증가했기 때문이다. (서비스 나누는 법을 알기 위해 이벤트 스토밍을 공부하고.. 서비스를 잘 만들기 위해 DDD와 객체 지향도 들여다보고.. Spring framework와도 이제 아주 조금은 친해진것 같기도 합니다.) 3번째로 진행하는 MSA 기반 프로젝트는 시스템 규모가 좀 있다 보니 마이크로 서비스가 18개 정도 도출되었다. 1, 2번째 진행한 MSA 기반 프로젝트들은 서비스 개수가 6~8개 정도였기 때문에 Kong 기반 API gateway + Docker compose 환경에서 처리가 가능했다. 하지만 진행 중인 프로젝트는 서비스의 개수도 많고, 상황에 따른 ..

    [MSA] 헥사고날 아키텍처(Hexagonal Architecture)

    [MSA] 헥사고날 아키텍처(Hexagonal Architecture)

    들어가며 이번 글에서는 이벤트 스토밍 결과물을 실제로 구현할 수 있도록 표현하는 헥사고날 아키텍처에 대해 알아보도록 한다. 이벤트 스토밍이 생소하다면 다음의 글을 먼저 참고하기 바란다. 2022.02.15 - [MSA 설계 & 도메인 주도 설계] - [MSA] 이벤트 스토밍(Event storming) [MSA] 이벤트 스토밍(Event storming) 들어가며 필자가 이벤트 스토밍을 진행할 때 헷갈리는 부분은 2가지였다. 첫 번째는 다양한 포스트잇 색상의 의미였고, 두 번째는 활동의 진행 순서였다. 이번 글에서는 이 두 가지에 대한 요 devlos.tistory.com 헥사고날 아키텍처란? 헥사고날 아키텍처는 소프트웨어 설계에 사용되는 아키텍처 패턴 중 하나다. 포트와 어댑터를 통해 여러 소프트웨어 ..

    [MSA] 이벤트 스토밍(Event storming)

    [MSA] 이벤트 스토밍(Event storming)

    들어가며 필자가 이벤트 스토밍을 진행할 때 헷갈리는 부분은 2가지였다. 첫 번째는 다양한 포스트잇 색상의 의미였고, 두 번째는 활동의 진행 순서였다. 이번 글에서는 이 두 가지에 대한 요약을 먼저 하고, 필자가 이벤트 스토밍을 진행하며 참고한 자료 및 예시들을 공유하려 한다. 필자는 처음 진행할 때 많이 헷갈렸지만 아래 두 내용을 참고하여 4~5개의 주제로 진행해보니 익숙해졌다. 만약 애그리거트가 무엇인지 생소하다면 아래의 글을 먼저 읽는 것이 도움이 될 것이다. 2022.02.06 - [MSA 설계 & 도메인주도 설계] - [DDD] 애그리거트란? [DDD] 애그리거트란? 들어가며 도메인 주도 설계 전문가분들과 대화하거나, MSA 관련 강의를 수강할 때 반드시 언급되는 "애그리거트"에 대해서 명확히 이..

    [DDD] 도메인 계층의 Structure

    [DDD] 도메인 계층의 Structure

    들어가며 이번 글에서 설명하는 내용은 이희창님의 프로젝트 구조를 기반으로 도메인 계층의 structure를 구성할 때 최소한으로 필요하다고 생각되는 부분만 간추려낸 것이다. 도메인 계층의 structure은 크게 Entity 부, Service 부, DTO 부로 나뉜다. (Entity 부, Service 부, DTO 부는 이해를 돕고자 필자가 부여한 용어이므로 큰 의미를 두지 않았으면 한다.) 도메인 계층 structure에서 각 부분이 하는 역할은 다음과 같다. 1. Entity 부 Entity 부에서는 도메인 객체의 속성과 매서드를 정의한다. 속성과 메서드의 예는 아래와 같다. 속성 name age state 매서드 enableState() disableState() Getter Setter Enti..

    [DDD] 인터페이스 계층과 응용 계층의 구현

    들어가며 DDD를 적용하여 프로젝트를 구성하고 개발하게 되면 대부분의 업무상 중요한 코드들을 도메인 계층에 작성하게 된다. 인터페이스와 계층과 응용 계층은 만들어 놓은 도메인 계층을 기반으로 구현된다. 인터페이스 계층이야 클라이언트와 통신을 하기 위해 필요하다고 이해할 수 있는데, 응용 계층은 반드시 필요한 것인가?라는 생각이 들었다. 이번 글에서는 DDD START! 책에서 나오는 인터페이스 계층과 응용 계층의 역할을 좀 더 알아보도록 한다. 만약 도메인 주도 설계의 계층에 대해서 생소하다면 이전 글을 참고하기 바란다. [DDD] 도메인 주도 설계의 계층 분리에 관하여 들어가며 MSA와 함께 사용되는 도메인 주도 설계 방식에 대해서 정리하려고 한다. 도메인 주도 설계에 대해 이희창 님의 강의에서 처음 ..

    [DDD] 애그리거트란?

    [DDD] 애그리거트란?

    들어가며 도메인 주도 설계 전문가분들과 대화하거나, MSA 관련 강의를 수강할 때 반드시 언급되는 "애그리거트"에 대해서 명확히 이해하려고 여러 가지 자료들을 찾아보았다. 그러다 최범균 님께서 집필하신 "DDD Start!" 라는 책에 애그리거트 개념이 잘 설명되어 있어서 관련 내용을 공유하고자 한다. (절판된 책이라 구하느라 엄청 힘들었다..) 애그리거트(Aggregate) 애그리거트의 뜻 데이터 변경의 단위로 다루는 연관 객체의 묶음 - 에릭 에반스 | 도메인 주도 설계 연관된 엔티티와 값 객체들의 묶음 - SK C&C | 도메인 주도 설계로 시작하는 마이크로 서비스 개발 애그리거트는 모델이나 비즈니스 도메인을 이해하기 위한 거시적인 방법으로 사용된다. 아래의 다이어그램은 DDD Start! 2장에 ..

    [DDD] 도메인 주도 설계의 계층 분리에 관하여

    [DDD] 도메인 주도 설계의 계층 분리에 관하여

    들어가며 MSA와 함께 사용되는 도메인 주도 설계 방식에 대해서 정리하려고 한다. 도메인 주도 설계에 대해 이희창 님의 강의에서 처음 접하게 되었다. MSA의 서비스 분리 콘셉트와, 도메인 주도 설계에서 모델을 중심으로 분리하는 콘셉트가 유지보수나 추후 기능 개선 등 궁합이 잘 맞아떨어지는 것 같다는 정도로 생각하고 있었다. 하지만 시간이 지남에 따라 이 설계기법은 MSA와는 독립적으로 질 좋은 코드를 개발하기 위한 노하우의 결정체라는 것을 느낄 수 있었다. 이번 글에서는 에릭 에반스의 도메인주도 설계(72p)의 업무용 소프트웨어 계층에 대해서 살펴보도록 한다. 도메인 주도 설계의 계층 분리 복잡한 프로그램을 여러 개의 계층으로 나눠라. 응집력 있고 오직 아래에 위치한 계층에만 의존하는 각 계층에서 설계..

    [MSA] MSA 기반 프로젝트 입문 후기 (Devlos feat. @Todo)

    도메인 주도 설계(Domain-driven Design): 설계 단계에서 비즈니스 도메인을 분석하여 도출된 도메인 모델의 디자인에 중점을 두어 소프트웨어를 개발하는 방식이다. 설계 산출물과 최종 개발 산출물(소스코드)의 차이를 없앰으로써 유지보수가 용이하고 향후 확장성을 얻어내는 설계 방법이다. MSA(Micro Service Architecture): 하나의 거대한 시스템(Monolithic)을 작은 단위의 서비스로 잘게 나누어 설계하는 방식 (잘게 나누었을 때의 이점과 고통은 다른 글에서 더 설명하도록 한다.) 들어가며 나는 부끄럽게도 ‘내가 개발한 소프트웨어가 잘 동작할까?’에 대한 고민을 몇 년째 하고 있었다. 나의 주 업무는 개발자들의 생산성을 향상하는 모듈 개발이나, 인터페이스 규격화 작업등이..

    [MSA] 레이어드 아키텍처 vs 헥사고날 아키텍처 vs 클린 아키텍처 요약

    데이터베이스 중심 아키텍처의 문제점 관심사의 분리 원칙이나, 비즈니스 로직을 표현하는 객체 모델보다 데이터 질의 구문인 SQL문에 들어있는 경우가 대부분 비즈니스 로직을 처리하는 자바 코드는 10줄 미만인데, 100~1000줄이 넘는 SQL문 또는 프로시저로 가득 차 있음 시간이 지날수록 코드의 가독성보다 쿼리 성능을 위한 SQL 문의 최적화에 우선순위를 두어서 작성한 사람 이외에는 소스코드를 이해할 수 없는 수준이 됨 애플리케이션의 유지보수성 애플리케이션의 유지보수성이 높다는 의미는 특정 개인에 의존하기 보다 어느 누구라도 손쉽게 애플리케이션을 이해하고 유지보수할 수 있음을 의미 레이어드 아키텍처 vs 헥사고날 아키텍처 vs 클린 아키텍처 레이어드 아키텍처 (Layered Architecture) 시스..

    객체지향 프로그래밍 정리  #1

    객체지향 프로그래밍 정리 #1

    이 글은 조영호 님의 저서 "객체지향의 사실과 오해"를 읽고 정리한 내용이다. 객체 지향에 대해 엄청 이해하기 쉽게 풀어주셨다고 생각한다. 글의 맨 아래 참고 서적에 대한 링크를 공유한다. 객체 식별 가능한 개체 또는 사물을 의미한다. 객체로 표현하는 것은 구체적인 사물(자동차) 일 수도 있고, 추상적인 개념(시간) 일 수도 있다. 하나의 개별적인 실체로 식별 가능한 물리적, 개념적인 사물은 어떤 것이라도 객체가 될 수 있다. 인간의 인지 능력 안에서 개수를 셀 수 있거나, 다른 사물과 구별할 수 있으며, 생성 지점을 알 수 있고, 독립적인 하나의 단위로 인식할 수 있는 모든 사물을 의미한다. 객체는 상태(State), 행동(Behavior), 식별자(Identity)를 가진다. 객체의 상태를 조회하는 ..

    Springboot 프로젝트 생성하기

    Springboot 프로젝트 생성하기

    이번 포스팅에서는 Springboot framework를 이용하여 새로운 프로젝트를 생성하는 방법에 대해 설명한다. 하드웨어 구성 mackbook pro (Retina, 15-inch, Mid 2014, macOS Big Sur v11.4) IDE IntelliJ IDEA 2021.2 (Community Edition) IntelliJ Ultimate에서는 Spring 프로젝트 생성 기능이 기본으로 제공되지만 Community Edition에서는 지원되지 않기 때문에 Graddle Java를 이용하여 생성한다. 1. 프로젝트 생성 2. Project 이름 및 GroupId를 설정 3. build.gradle 설정 plugins { id 'org.springframework.boot' version '2...

    MOM (Message Oriented Middleware) 란?

    MOM (Message Oriented Middleware) 란?

    MOM 이란? 독립된 애플리케이션 간에 데이터를 주고 받을 수 있도록 하는 시스템 아키텍처다. 함수 호출이나 공유 메모리를 이용하여 애플리케이션 간 통신하는 것이 아니라, 메시지 교환을 이용하는 중간 계층에 대한 인프라 아키텍처 개념이다. 사용하게 될 경우 분산 컴퓨팅이 가능하며 서비스 간의 결합성이 낮아진다. 송신자와 수신자는 서로를 알지 못하며 통신 채널만 알 수 있다. 발신자와 수신자는 토픽이나 큐를 통해 서로를 찾는다. 여러 수신자가 동일한 통신 채널에 등록한 경우 수신자 중 한명이 메시지를 처리할 수 있다. 부하분산이 가능하기 때문에 로드 밸런스를 위한 특정 인프라가 필요하지 않다. MOM의 특징 비동기 방식으로 메시지를 전달한다. Queue, Broadcast, Multicast 등의 방식으로..

    IntelliJ 단축키

    IntelliJ 단축키

    이번 포스팅에서는 IntelliJ의 단축키를 정리한다. 1. IDE의 기능 관련 단축키 기능 Mac Windows Project 창 포커싱 (최소, 최대화) command + 1 ctrl + 1 에디터로 포커싱 esc esc Project 창에서 프로젝트 코드 미리보기 space space 에디터 창 키우기 shift + command + fn + F12 ctrl + shift + F12 에디터 창 이동 control + tab ctrl + tab 에디터에서 새 파일 생성 control + option + N ctrl + alt + insert 프로젝트 창에서 새 파일 생성 command + N alt + insert 단어별 커서 이동 alt left or right ctrl left or right 라..

    Lombok

    Lombok

    Spring boot를 사용할 때 gradle dependencies에 lombok이라는 라이브러리를 추가했다. 예제를 따라 코드를 작성하다 보니 lombok 라이브러리 역할이 무엇인지 궁금해서 확인해보았다. 다음은 프로젝트의 build.gradle 코드다. plugins { id 'org.springframework.boot' version '2.4.2' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { implementation 'org.springframewo..