본문 바로가기

전체273

왜 DDD 에서 팩토리 패턴을 사용하는 걸까? Photo by Christopher Burns on Unsplash 팩토리 패턴은 애그리게잇을 생성하는 책임을 가지는 메소드나 객체를 말한다. 도메인 주도 설계에서 팩토리 패턴을 사용되는 곳은 1. 도메인 모델 내의 팩토리 2. 애그리게잇 루트상의 팩토리 메소드 3. 서비스의 팩토리 그리고 에릭 에반스가 말하는 팩토리 패턴을 사용하는 주된 동기는 아래와 같다. 복잡한 객체와 애그리게잇 인스턴스를 생성하는 책임을 별도의 객체로 이동시키자. 여기서의 책임은 도메인 모델과 관련이 있진 않지만, 여전히 도메인 설계를 구성하는 한 요소다. 모든 복잡한 조립 과정을 캡슐화하고, 클라이언트가 인스턴스화된 객체의 구체적 클래스를 참조할 필요가 없도록 인터페이스를 제공하자. 전체 애그리게잇을 하나의 조각으로 생성하고,.. 2020. 8. 22.
회사에서 그렇게 쓰는 VPN 이해해보자. 최근 코로나의 영향으로 VPN ? 특히 회사에서는 FortiClient 라는 VPN Client를 사용합니다. 그런데, VPN이라고 하면 뭔가, 우회해서 무엇을 한다. 라고 생각만 들 뿐, 실제로 어떻게 동작되는지 모르겠다. 한번 이해하기 위한 시도를 해보자. VPN의 약자부터 생각해보자. VPN(Virtual private Network -가상 사설망) VPN 이전에는 PN(Private Network) 라는 용어를 사용했었다. 그럼 PN이란 무슨말일까? 즉, 전용으로 사용하는 망(전용망)이라 할 수 있다. 가상사설망? 이란 가상 전용망(선)을 의미합니다. 집 - 회사 로 이어지는 전용망이 있다고 생각하면 됩니다.(Private Network) 망이라는 어떤 Mash가 있다면, 그 중앙에는 선이 있어야.. 2020. 8. 22.
[동영상 정리]의존성을 이용해 설계 진화시키기 - 조영호 님 의존성을 어떻게 관리하는가? 그것이 핵심☢️ 의존성의 정의란 무엇일까? A가 B에 의존할수록 위 그림과 같이 점선으로 그린다. 이 그림의 의미는 B가 변경될 때 A도 같이 변경 될 수 있다. 라는 것을 의미한다. 그러므로, B가 뭐가 됐던 A가 같이 변경 될 수 있음을 의미합니다. B클래스의 변경에 따라서 A에 영향을 줄수 또는 안줄 수도 있다. 클래스 의존성의 종류 패키지 의존성 패키지에 포함된 클래스 사이의 의존성 import에 다른 패키지의 이름이 있다면 디팬던시가 있다고 생각하면 된다. 설계 할 때 좋은 규칙이 몇가지 있다. 양방향일 경우, 싱크를 맞추는데- 비용이 많이 든다. 패키지 세계에 사이클이 돈다라는 것은 하나의 패키지라고 봐야 한다. 의존성을 가장 쉽게 이해할 수 있는 방법은 역시 코드.. 2020. 8. 21.
[동영상 정리]애플리케이션 아키텍처와 객체지향 - 조영호님 영화관에서 영화를 상영하는 도메인을 예제로 OOP를 설명합니다. 아키텍처 프로젝트에 참여하는 개발자들이 설계에 대해 공유하는 이해를 반영하는 주관적인 개념 : 주관적이다... 중요한것? 변경하기 어려운 것? 일찍 변경 하기 어려운 것? 관심사의 분리 서로 다르고 관련이 없는 책임들을 분리 좀 더 세분화할수 있다.그러나 우리는 위 3가지로만 나눠서 시작하겠습니다. 여기서 가장 중요한 레이어는 도메인 레이어입니다. 대부분 2가지 종류의 도메인 레이어를 설계합니다. Transaction Script와 Domain Model의 차이점은 무엇일까? 도메인 레이어가 주도하기 때문에 도메인 레이어는 중요합니다. 아래는 도메인 컨셉입니다. 할인을 2가지 정책을 가질 수 있다. 퍼센트 또는 고정 할인가로 할 수 있다... 2020. 8. 21.
반버논이 말하는 Value Object 란? 반버논의 도메인 주도 개발 서적에서 발췌 값 객체(Value Object) DDD의 필수적인 구성 요소. 왜? 값의 이점에 대해 이해하라. 측정하고 수량화하거나 설명해주는 값 타입은 생성,테스트, 사용, 최적화, 유지 관리가 더 쉽다. 가능한 위치에선 엔티티 대신 값 객체를 사용해 모델링하도록 노력해야 한다는 사실을 알게 되면 놀랄지도 모른다. 심지어 도메인 개념이 엔터티로 모델링돼야할 때도 엔티티의 설계는 자식 엔티티의 컨테이너보다는 값의 컨테이너로 동작하는 쪽으로 기울어야 한다. 배울 내용 값으로 모델링하기 위해 도메인 개념의 특징을 이해하는 방법을 배우자 통합의 복잡성을 최소화하기 위해 값 객체를 활용하는 방법을 살펴보자 값으로 표현된 도메인 표준 타입의 사용을 확인하자. 사스오베이션은 어떻게 값의.. 2020. 8. 12.
코드 리뷰를 왜 해야될까? 백명석님 유튜브 강의을 듣고 정리한 내용입니다. www.youtube.com/watch?v=FJNV_qoRRks 코드리뷰에 대해 왜? 코드리뷰를 해야되나??? 시장과 비즈니스의 요구사항 개발 리소스 증가 추이 동일 기간별 개발 생산성 릴리즈가 증가함에 따른 개발 비용 Release별 생산성 Architecture란? SW의 속성 Software Craftmanship 릴리즈에 따라서 스탭들이 커진다. 릴리즈가 증가함에 따른 개발 비용 첫번째 릴리즈의 40배 Release별 생산성 2개의 중복까지는 괜찮다? - 켄트백 Big Ball of Mud 뚜렷한 아키텍처없이 구현된 시스템 미는건지, 끄는건지? 프로덕션 코드와 테스트 코드 중 어느것이 망가지는 것이 좋은가? 테스트 코드가 살아남는게 좋다. 같은 설계.. 2020. 8. 11.
Notification 구현 in IDDD_Samples - 메시지에 기반한 알림 발행 NotificationService는 메시징 인프라를 통해 DomainEvent 인스턴스를 발행하는 한 가지 방법을 제공. - 책에서 말하는 Notification 구현 - 실제 프로젝트에서 Notification 구현 public class NotificationService { public void publishNotifications(){ PublishedMessageTracker publishedNotificationTracker = this.publishedMessageTracker(); List notifications = this.listUnpublishedNotifications( publishedNotificationTracker.mostRecentPublishedNotificationI.. 2020. 8. 8.
Notification 구현 in IDDD_Samples - 리소스풀 방식 - 책에서 말하는 Notification 구현(리소스풀 방식) - 실제 프로젝트에서 Notification 구현 - 그림으로 이해해보기 앞서 설명했던 메세지 전달 방법중 리소스풀을 활용한 전달 방법 책에서 말하는 Notifiaction 구현 책에서 시작은 NotificationService에 대한 언급으로 시작한다. 이벤트가 모델로부터 발생한 알림으로써 발행될 때, 도메인의 관심사가 아닌 애플리케이션의 관심사라는 것을 강조. public class NotificationService { @Autowired private EventStore eventStore; @Autowired private NotificationPublisher notificationPublisher; public Notificati.. 2020. 8. 8.
도메인 주도 설계에서 Notification 이란 무엇인가? 목차 - 들어가며 - Notification이란? - 왜 EventStore를 활용한 Notification이 필요해진걸까? - 그림으로 이해해보는 Notification - 조금 더 생각해보기 들어가며... 토이 프로젝트에 참여하며 EventSouring에 대한 이야기를 이야기를 햇님과 이야기를 나눴습니다. 그러나, 이야기 중간중간에 "이벤트소싱과 Notification은 다른것이다." 라는 것을 끊임없이 말씀하셨고, 저는 이 둘을 비교할 수 있는 대상이라고 생각했습니다. 그러나, 몇차례의 티키타가로 이 둘의 관계를 좀 더 면밀히 살펴보는 시간을 가졌습니다. Notification이란? 반 버논 책의 8장 도메인 이벤트 부분에 Notification에 대한 이야기가 있습니다. repository에서 애.. 2020. 8. 8.
코딩은 어떻게 해야하는가? - 1 항상 피플웨어라는 책을 교보문고에서 찾아본다면, 그 책은 개발서적 가운데에 꽂혀있다. 왜일까? 왜 '피플웨어' 책은 개발서적 사이에서 '나를 읽어주십시오~' 하는걸까? 실제 그책은 경영/관리 주제로 분리되어 있음에도 불구하고? 그 답은 내마음대로 정의내려보고싶다. 심지어 '피플웨어' 책은 10년전에 우리나라가 개발은 3D라 외치던 시절에 출간되었다. 왜일까? 그 당시 프로젝트 하나라도 더 빨리 출시하기 위해 사람을 갈아?서 마셨다는 시절에 미국에서는, 이미 피플웨어라는 책이 출시되 많은 인기가 있었다. 어쩌면, 사람이 우선순위라는 사실에 대해서 인지하고 있었을 수도 있다. "인간 관계는 복잡할 뿐만 아니라 그 파급 효과가 절대로 깔끔하고 명확하지 않지만 업무의 어느 측면보다 더 중요하다." - 피플웨어 .. 2020. 7. 25.
왜 Enum을 아래와같이 작성했을까? /** * Created by joenggyu0@gmail.com on 4/7/20 * Github : http://github.com/lenkim */ package net.slipp.moim.domain.model.recruit; public enum Status { BEGIN { public boolean isBegun() { return true; } }, WORKING { public boolean isWorking() { return true; } }, FINISH { public boolean isFinished() { return true; } }; public boolean isBegun() { return false; } public boolean isWorking() { return .. 2020. 7. 15.
10- 메모리 메모리 메인 메모리란 명령어 집합에 의해 정의된 메모리로서 실행될 프로그램과 데이터가 머무는 장소를 의미한다. 메모리는 프로그래머에게 보이는 시스템의 속성 중 하나로 조작할 수 있는 명령어가 존재한다. 예를 들어, 대부분의 아키텍처는 메모리에 접근할 수 있도록 적재 명령어와 저장 명령어를 프로그래머에게 제공한다. 1. CPU와 메모리 CPU와 메모리는 물리적으로 메인보드의 노스브리지를 통해 서로 연결. CPU와 노스브리지 사이를 연결하는 통로는 전면버스(FSB front-side bus)라 하고, 노스브리지와 메모리 슬롯 사이를 연결하는 통로는 메모리버스(memory bus)라고 한다. 전면버스와 메모리버스는 일반적으로 동일한 클럭으로 동작하며, 메모리 슬롯에 장착되는 메모리의 클록 속도는 이 속도에 의.. 2019. 9. 8.
09-파이프라이닝 파이프라이닝? 오늘날의 컴퓨터에서 프로세서의 성능을 개선하는데 사용하는 가장 보편적인 구현 기술. 명령어를 읽어 순차적으로 실행하는 프로세서에 적용되는 기술로, 한 번에 하나의 명령어만 실행하는 것이 아니라 하나의 명령어가 실행되는 도중에 다른 명령어 실행을 시작하는 식으로 동시에 여러 개의 명령어를 실행하는 기법이다. 프로세서의 성능에 영향을 미치는 요소로 프로그램에 포함된 명령어의 수, 하나의 명령어 실행에 필요한 평균 사이클의 수인 CPI, 클록 사이클 시간 명령어의 수 : 좋은 알고리즘 또는 컴파일러를 통한 최적화 클록 사이클 시간 : 최신 하드웨어 기술 평균 CPI : 병렬 처리, 파이프라이닝, 슈퍼스칼라 파이프라이닝, 슈퍼파이프라이닝, VLIW(very long instruction word).. 2019. 9. 5.
01-연산장치부터 제어장치까지 [문제만들어 풀어보기] 문제 만들기 연산장치의 구성 요소 그리고 레지스터의 역할 ​ Booth 알고리즘 ​ 0011 x 0110 ㅡㅡㅡㅡ. 복원 알고리즘과 비복원 알고리즘 ​ 0011 을 1로 나눈 것을 복원 알고리즘과 비복원 알고리즘으로 구해보기. ​ 가드 디지트란? ​ 단일 사이클 방식과 다중 사이클 방식의 차이(결론) 데이터 경로의 구성 요소 다중 사이클 방식의 데이터 경로에 대한 설명이 아닌 것은? 다음 사이클을 위하여 현재 내용을 임시 저장소에 저장해야 한다. 메모리를 2번 접근하기 위하여 데이터 메모리와 명령어 메모리로 분할해야 한다. 단일 사이클 방식에 비하여 일반적으로 클럭 사이클 시간이 짫다. 단일 사이클 방식에 비하여 파이프라인 기법에 더 적합하다. 고정결선식 제어와 마이크로프로그래밍 제어 ​ 다음 중 마이크.. 2019. 9. 5.
01-연산장치부터 제어장치까지 연산 장치 Chapter 06 연산장치 ? 197 1 연산장치의 개요 ? 199 1 연산장치와 레지스터 파일 ? 199 2 산술장치와 논리장치의 통합 ? 201 3 플래그 레지스터 ? 202 2 정수의 덧셈 ? 204 1 덧셈 연산 ? 204 2 덧셈?뺄셈장치 ? 206 3 정수의 곱셈 ? 208 1 곱셈 연산 ? 208 2 시프트-덧셈 방식의 곱셈 연산 ? 209 3 Booth 알고리즘 ? 213 4 정수의 나눗셈 ? 217 1 나눗셈 연산 ? 217 2 복원 알고리즘 ? 218 3 비복원 알고리즘 ? 221 5 부동 소수점의 연산 ? 224 1 부동 소수점의 덧셈 ? 224 2 부동 소수점의 곱셈과 나눗셈 ? 225 3 가드 디지트 ? 227 요약 ? 229 연습문제 ? 230 연산장치의 개요 산술 .. 2019. 9. 5.
00-컴퓨터 구조 컴퓨터 부팅과정 컴퓨터에 전원을 인가하면 ROM에 저장된 BIOS가 실행된다. BIOS는 CPU, 메인 메모리, 하드 디스크와 같은 각종 하드웨어의 상태를 검사한 후 이상이 있으면 오류를 통지하고 동작을 멈춘다. BIOS는 부팅 메체인 하드디스크에 저장된 부트스트랩 로더를 메인메모리로 옮긴다. 2개 이상의 부팅 매체를 지정하여 BIOS로 하여금 운영체제를 선택하도록 할 수도 있는데, 이를 멀티 부팅이라고 한다. 부팅로더는 BIOS를 종료하고 하드디스크에 저장된 운영체제를 메인 메모리에 적재한 후 운영체제에 제어권을 넘긴다. 운영체제는 응용 소프트웨어의 실행 환경을 조성한다. 부트로더가 하드디스크에 있는 운영체제 커널을 찾아 RAM에 적제한다. 부트로더는 제어권을 운영체제에게 전달한다. 컴파일러와 인터프리.. 2019. 9. 5.
자바8 inAction - [12] 새로운날짜와시간API 새로운 날짜와 시간 API 자바8에서 새로운 날짜와 시간 라이브러리를 제공하는 이유 사람이나 기계가 이해할 수 있는 날짜와 시간 표현 방법 시간의 양 정의하기 날짜 조작, 포매팅, 파싱 시간대와 캘린더 다루기 자바 1.0 에서는 java.util.Data 클래스 하나로 날짜와 시간 관련 기능을 제공 Date date = new Date(114, 2, 18); > Tue Mar 18 00:00:00 CET 2014 Date 는 JVM 기본시간대인 CET, 즉 중앙 유럽시간대를 사용, 그렇다고 Data클래스가 자체적으로 시간대 정보를 알고 있는 것도 아니다. Data 대신 Calendar 클래스가 등장 했지만, 역시 쉽게 에러를 일으키는 설계 문제를 갖고 있었다. 예를 들어 Calendar에서는 1900년도.. 2019. 8. 31.
자바8 inAction - [10] Null 대신 Optioanl null 대신 Optioanl null 래퍼런스의 문제점과 null을 멀리해야 하는 이유 null 대신 Optioanl: null로부터 안전한 도메인 모델 재구현하기. Optioanl 활용: null 확인 코드 제거하기. Optional에 저장된 값을 확인하는 방법 값이 없을 수 있는 상황을 고려하는 프로그래밍 null은 구현하기 쉬웠기 때문에 존재했던 것이지, 의도했던 것은 아니다. 00. 값이 없는 상황을 어떻게 처리할까? public String getCarInsuranceName(Person person){ if(persion != null) { Car car = person.getCar(); if(car != null) { Insurance insurance = car.getInsurance().. 2019. 8. 31.
자바8 inAction - [9] Default method 이해하기 디폴트 메서드 디폴트 메서드란 무엇인가? 진화하는 API가 호환성을 유지하는 방법 디폴트 메서드의 활용 패턴 해결 규칙 자바8에서는 기본 구현을 포함하는 인터페이스를 정의하는 두 가지 방법을 제공한다. 첫 번째는 인터페이스 내부에 정적 메서드(static mathod)를 사용하는 것 두 번째는 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드 라는 기능을 사용하는 것 즉, 자바8 에서는 메서드 구현을 포함하는 인터페이스를 정의할 수 있다. 결과적으로 기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메소드의 디폴트 메서드를 상속받게 된다. 이렇게 하면 기존의 코드 구현을 바꾸도록 강요하지 않으면서도 인터페이스를 바꿀 수 있다. 결국 인터페이스가 아니라 추상 클래스 아닌가? 인.. 2019. 8. 31.
자바8 inAction - [8] 리펙토링/테스팅/디버깅 - 자바8 더 잘 사용하기 리팩토링 / 테스팅 / 디버깅 람다 표현식으로 코드 리펙토링하기 람다 표현식으로 객체지향 설계 패턴에 미치는 영향 람다 표현식 테스팅 람다 표현식과 스트림 API 사용 코드 디버깅 람다표현식으로 전략 / 템플릿 메서드 / 옵저버 / 의무 체인 / 팩토리 등의 객체 지향 디자인 패턴을 어떻게 간소화할 수 있는지 살펴보기. 코드 가독성이 좋다는 것은 추상적인 표현이므로 이를 정확하게 정의하기 어렵다. 일반적으로 코드 가독성이 좋다는 것은 '어떤 코드를 다른 사람도 쉽게 이해할 수 있음'을 의미, 즉 코드 가독성을 개선한다는 것은 우리가 구현한 코드를 다른 사람이 쉽게 이해하고 유지보수 할 수 있게 만드는 것. 1. 익명 클래스를 람다 표현식으로 리팩토링 하기 Runnable r1 = new R.. 2019. 8. 31.