일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 도메인주도설계
- 엘라스틱서치
- Spring XD
- Spring
- Linux
- Hbase
- 제주
- Spring Boot
- scala
- hadoop
- elastic search
- 인텔리J
- hdfs
- Clean Code
- 스프링 배치
- Gradle
- Spring Batch
- Angular2
- Java
- apache storm
- spark
- design pattern
- SBT
- hibernate
- nginx
- DDD
- intellij
- Storm
- elasticsearch
- docker
- Today
- Total
목록Methdology (61)
욱'S 노트
우리 모두는 자신이 짠 쓰레기 코드를 쳐다보며 나중에 손보겠다는 생각을 한 경험이 있다. 그러나 르블랑의 법칙은 나중은 결코 오지 않는다는 것이다. 태도 좋은 코드를 사수하는 일은 바로 우리 프로그래머들의 책임이다. 나쁜 코드의 위험을 이해하지 못하는 관리자의 말을 그대로 따르는 행동은 전문가답지 못하다. 깨끗한 코드란? 비야네 스트롭스트룹(C++ 창시자) - 나는 우아하고 효율적인 코드를 좋아한다. 논리가 간단해야 버그가 숨어들지 못한다. 의존성을 최대한 줄여야 유지보수가 쉬워진다. 오류는 명백한 전략에 의해 철저히 처리한다. 성능을 최적으로 유지해야 원칙 없는 최적화로 코드를 망치려는 유혹에 빠지지 않는다. 깨끗한 코드는 한 가지를 제대로 한다. 그래디 부치(Object oriented analysi..
문제점 매직넘버를 사용합니다. 매직넘버란 무엇인가 살펴보자면 아래와 같은 코드를 사용하고 있습니다. if (100 < input.length()) 이렇게 되었을 경우 문제점은 1. 의미를 이해하기 어렵습니다.2. 복수의 장소에서 사용된다면 변경하기 힘듭니다. 해결책 상수를 사용하면 됩니다. public static final int MAX_INPUT_LENGTH = 100; 연습문제 문제public class Robot { private final String name; public Robot(String name) { this.name = name; } public void order(int command) { if (command == 0) { System.out.println(name + " wal..
기능에 대한 욕심 (Feature Envy)객체의 가장 중요한 요점은 데이터와 데이터를 사용하는 프로세스를 하나로 묶는 기술이다. 한가지 고전적인 냄새가 있는데 그것은 메소드가 자신이 속한 클래스보다 다른 클래스에 관심을 가지고 있는 경우이다가장 흔한 욕심이 데이터에 대한 욕심이다. Move Method를 사용한다.메소드의 특정 부분만 이런 욕심으로 고통 받는데 이럴 때는 욕심이 많은 부분에 대해서 Extract Method 사용한 다음 Move Method를 사용한다.물론 이런 규칙이 깨지는 몇몇 복잡한 패턴도 있다. 디자인 패턴에서 Strategy와 Visitor 가 당장 떠오른다. Kent Beck의 Self Delegation도 그 중하나다.확산적 변경과 싸우기 위해 이런 것들을 이용해야 한다. ..
이전에 우리는 비즈니스 도메인 중심의 소프트웨어 개발 방법에 대한 중요성에 대해서 살펴보았다. 모델을 생성하기 위해서 가장 중요한 점은 도메인에 중심을 두어야 하며 도메인의 핵심적인 요소를 반영해야 한다는 것이다. 모델링 단계의 주목적은 좋은 모델을 만드는 것이다. 그리고 다음 단계가 코드로 모델을 구현하는 것이다. 소프트웨어 개발 프로세스에서 이 단계들은 똑같이 중요하다. 소프트웨어 분석가와 비즈니스 도메인 전문가가 도메인의 기초적인 요소와 그들간의 관계를 강조하고, 정확한 모델을 생성하기 위해 몇달동안 협업을 하면 정밀한 도메인 캡쳐를 가지게 된다. 그러면 모델은 개발자에게 전달된다. 개발자는 모델을 살펴보았을 때, 몇몇의 관계와 컨셉이 코드로 표현하기에 적정하지 않다는 것을 발견하게 된다. 그러면 ..
도메인 전문가와 이야기를 하다보니 커뮤니케이션에 장벽을 느낄 수 있다. 개발자는 모든 생각이 클래스, 메소드, 알고리즘, 패턴등 프로그래밍 요소들에 가 있을 것이다. 혹은 항상 관계, 상속, 다형성, 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..