일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- Angular2
- hibernate
- Hbase
- scala
- design pattern
- Spring Boot
- 스프링 배치
- intellij
- Linux
- Domain Driven Design
- Spring Batch
- elasticsearch
- 제주
- docker
- Gradle
- Spring XD
- spark
- Storm
- Clean Code
- hdfs
- Spring
- 엘라스틱서치
- 도메인주도설계
- elastic search
- hadoop
- SBT
- DDD
- apache storm
- nginx
- Java
- Today
- Total
목록Methdology (48)
욱'S 노트
이전에 우리는 비즈니스 도메인 중심의 소프트웨어 개발 방법에 대한 중요성에 대해서 살펴보았다. 모델을 생성하기 위해서 가장 중요한 점은 도메인에 중심을 두어야 하며 도메인의 핵심적인 요소를 반영해야 한다는 것이다. 모델링 단계의 주목적은 좋은 모델을 만드는 것이다. 그리고 다음 단계가 코드로 모델을 구현하는 것이다. 소프트웨어 개발 프로세스에서 이 단계들은 똑같이 중요하다. 소프트웨어 분석가와 비즈니스 도메인 전문가가 도메인의 기초적인 요소와 그들간의 관계를 강조하고, 정확한 모델을 생성하기 위해 몇달동안 협업을 하면 정밀한 도메인 캡쳐를 가지게 된다. 그러면 모델은 개발자에게 전달된다. 개발자는 모델을 살펴보았을 때, 몇몇의 관계와 컨셉이 코드로 표현하기에 적정하지 않다는 것을 발견하게 된다. 그러면 ..
도메인 전문가와 이야기를 하다보니 커뮤니케이션에 장벽을 느낄 수 있다. 개발자는 모든 생각이 클래스, 메소드, 알고리즘, 패턴등 프로그래밍 요소들에 가 있을 것이다. 혹은 항상 관계, 상속, 다형성, OOP 등을 생각할 수 도 있다. 하지만 도메인 전문가들은 라이브러리, 프레임워크, 데이터베이스 등에 아무런 관심이 없다. 이러한 상황을 극복하기 위해 모델을 정의할 때. 모델에 대한 반드시 생각이 교환해야 한다. 만약 한 사람이 말한 것을 다른 사람이 이해하지 못한다면 그 프로젝트는 성공할 수 없을 것이다. Domain-Driven Design의 핵심 원칙은 모델을 기초로한 언어를 사용하는 것이다. 모델은 공통영역이므로 소프트웨어와 도메인이 만날 수 있다. 공통언어는 하룻밤 사이에 나타나지 않을 것이다. ..
비행기 운항 제어 시스템을 고려해보자. 이 시스템의 목적은 비행기가 운항중인 경로를 추적하고, 잘 진행되고 있는지 모니터링하는 것이다. 어디서부터 시작해야 되나? 도메인을 이해하는 것부터 시작하자. 항공운항관리사가 도메인을 가장 잘 아는 스페셜리스트이다. 하지만 그는 시스템 설계자도 아니고, 소프트웨어 스페셜리스트도 아니다. 항공운항관리사는 도메인에 대한 넓은 지식을 가지고 있다. 하지만 모델을 구축하기 위해 우리는 핵심 정보를 추출하고 일반화 할 필요가 있다. 전문가와 대화를 하다보면 착륙, 충돌 위등 엄청난 양의 정보가 있다는 것을 알 수 있다. 그러나 어디선가 모델링을 시작해야 한다. 항공운항관리사와 당신은 각 비행기는 출발지와 도착지를 가지고 있다는 것에 동의했다. 간단하게 다음과 같이 그릴 수 ..
소프트웨어에서 도메인이란 소프트웨어에서 실제 해결해야될 문제점을 의미한다. 도메인에 대한 이해없이 복잡한 소프트웨어를 개발하는 것은 불가능하다. 그렇다면 누가 가장 많은 도메인 지식을 가지고 있나? 그것은 소프트웨어 아키텍트도 아니고 비즈니스 컨설턴트도 아니다. 개발자는 더더욱 아니고. 정답은 현업 혹은 사용자이다. 그들은 비즈니스를 가장 잘 이해하고 있는 사람들이다. 소프트웨어 프로젝트를 첨 시작할 때 도메인에 초첨을 맞춰야 한다. 가장 좋은 방법은 도메인을 반영한 소프트웨어를 설계하는 것이다. 소프트웨어는 코어 컨셉과 도메인 요소를 포함해야 하며 둘의 관계를 반영해야 한다. 해당 소프트웨어에 대한 지식이 없는 사람도 도메인 모델의 코드를 읽으면 해당 도메인에 대해 알 수 있어야 한다. 도메인을 추상화..
When Using It 언어로 문제를 해결하기 Class Diagram Sample Code public interface AbstractExpression { public void interprete(Context context); } public class TerminalExpression implements AbstractExpression { @Override public void interprete(Context context) { String token = context.currentToken(); if (!"go".equals(token) ) { new NonTerminalExpression().interprete(context); } else { System.out.println("g..
When Using It 명령을 클래스로 표현하고 싶을때 Class Diagram Sample Code public interface Command { public void execute(); } public class ConcreteCommand implements Command { private Receiver receiver = new Receiver(); @Override public void execute() { receiver.action(); } } public class Receiver { public void action() { System.out.println("Action Performed!!!"); } } public class Invoker { private List comma..
When Using It 조건에 따른 상태 자체를 클래스로 표현하고 싶을때 Class Diagram Sample Code public interface State { public void handle(Context context, boolean condition); } public class ConcreteState implements State { @Override public void handle(Context context, boolean condition) { if (condition) { System.out.println("ConcreteState Handled."); } else { context.setState(new ConcreteState2()); } } } public class Con..
When Using It 자신의 상태의 저장본을 만들기 Class Diagram Sample Code public class Memento { private String state; public String getState() { return state; } public void setState(String state) { this.state = state; } } public class Organitor { private String state; public Memento createMemento() { Memento memento = new Memento(); memento.setState(state); return memento; } public void setMemento(Memento memen..
When Using It 자신의 상태에 변화가 일어났을 경우 Observer들에게 통보하기 Class Diagram Sample Code public interface Observer { public void update(Subject subject); } public class ConcreteObserver implements Observer { @Override public void update(Subject subject) { System.out.println(subject.getState()); } } public abstract class Subject { private List observers = new ArrayList(); public void attach(Observer observ..
When Using It 다수의 객체에 통합적인 지시를 내리기 위한 패턴. 클래스의 기능들을 분할하여 세분화된 클래스로 내렸을때, 세분화된 클래스간의 통신이 필요할때 유용하다. Class Diagram Sample Code public interface Mediator { } public class ConcreteMediator implements Mediator { private Colleague colleague; private Colleague colleague2; public void initializeColleague() { colleague = new Colleague(); colleague2 = new Colleague(); colleague.setMediator(this); colleagu..