본문 바로가기

분류 전체보기333

DDIA - 그래프형 데이터 모델 - 이 글은 마틴 클레프만의 데이터 중심 애플리케이션 설계를 기반으로 작성되었습니다. - 개요 다대다 관계가 데이터 모델을 구별하는 중요한 기능임을 살펴봤다. 앞서 애플리케이션이 1:N 관계이거나 관계가 없다면 문서 모델이 적합하다고 하였다. 반면 관계형 모델은 M:N 을 다루기 수월하지만 데이터간 연결이 복잡해지면 그래프형 데이터 모델을 사용하는편이 자연스럽다. 그래프의 구성요소에는 정점(노드, 엔티티)과 간선(엣지, 관계, 호)이 있다. 예를 들어 소셜그래프에서 정점은 사람이며 간선은 사람간의 관계라고 할 수 있다. 웹 그래프에서는 정점은 웹이며 간선은 다른 페이지의 HTML 링크라고 할 수 있다. 위의 예제에서는 정점이 모두 같은 유형(type)을 예로 들었지만 그래프는 같은 유형의 데이터만 정점으.. 2021. 11. 21.
이펙티브 자바 - 계승대신 구성 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 개요 계승(extends)은 코드 재사용을 돕는 강력한 도구이지만 잘못 사용하면 S/W 가 깨지기 쉽다. 계승을 사용하기전에는 아래와 같은 사항들을 고려해보는것이 좋다. 단일 패키지내에서 상위 클래스와 하위 클래스 구현자가 같은 경우 계승을 고려해 설계되었으며 문서를 갖춘 클래스인 경우 만약 객체 생성 가능 클래스라면 해당 클래스가 속한 패키지밖에서 계승을 시도하는것은 위험하다. - 계승의 문제점 메소드 호출과 달리 계승은 캡슐화 원칙을 위반한다. 상위 클래스 A 와 이를 extends 한 하위 클래스 B가 있다고 가정해보자. 하위 클래스 B를 변경하지 않아도 release 가 거듭되면서 상위 클래스 A 의 동작이 변경되면 하위 클래.. 2021. 11. 6.
DDIA - 데이터를 위한 질의(query) 언어 - 이 글은 마틴 클레프만의 데이터 중심 애플리케이션 설계를 기반으로 작성되었습니다. - 데이터를 위한 질의 언어 관계형 모델이 등장했을 때 데이터를 질의하는 새로운 방법이 등장하였다. SQL 은 선언형 질의언어인 반면 IMS와 코다실은 명령형 코드를 사용해 DB 에 질의한다. 동물의 종 목록중에서 상어만 반환하는 코드를 작성한다고 가정해보자. 이를 명령형 코드로 작성하면 아래와 같이 작성할 수 있다. public List getSharks(List animals) { List sharks = new ArrayList(); for(Animal animal : animals) { if("Sharks".equals(animal.getFamily())) { sharks.add(animal); } } retur.. 2021. 10. 31.
이펙티브 자바 - 변경가능성 최소화 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 변경 불가능(immutable) 클래스 변경 불가능 클래스란 수정할 수 없는 클래스를 말하며, 객체가 생성될 때의 정보가 살아있는 동안 그대로 보존된다. 우리가 자주 사용하는 String, 기본 자료형(primitive type), Big Integer, Big Decimal 등이 모두 변경 불가능 클래스에 해당한다. 변경 불가능 클래스는 설계와 구현이 쉬우며 Client 가 사용하기도 쉽다. 그리고 오류 발생가능성이 적어 훨씬 안전하다. 변경 불가능 클래스가 지켜야 할 5 가지 규칙은 아래와 같다. 상태 변경 메소드(ex - setter, mutator) 를 제공하지 않는다. 계승(extends) 를 막아야 한다. 보통은 final.. 2021. 10. 30.
DDIA - 관계형 모델과 문서 모델 - 이 글은 마틴 클레프만의 데이터 중심 애플리케이션 설계를 기반으로 작성되었습니다. - 개요 데이터 모델은 S/W 가 어떻게 작성되었는지와 문제를 어떻게 생각해야하는지에 대해서도 영향을 미친다. 대부분의 애플리케이션에서는 각 계층마다 데이터 모델에 대한 관점이 다르다. App. 개발자는 현실을 보고 객체, 데이터 구조, API를 모델링 한다. 데이터 구조를 저장할 때는 JSON, XML, RDB 테이블, 그래프와 같은 모델로 표현한다. DB S/W 엔지니어는 데이터를 메모리나 디스크에 표현하는 방법을 결정한다. 그리고 이 표현은 질의, 탐색, 조작, 처리할 수 있게 한다. 각 계층에서 명확한 데이터 모델을 제공하면 하위 계층에 대한 복잡성을 숨길 수 있다. - 관계형 모델 관계형 모델이라는 단어가 어색.. 2021. 10. 30.
이펙티브 자바 - Public 클래스의 Public 필드 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 개요 public 클래스에서 멤버 변수를 public 으로 대외에 공개하지 말라는 규칙을 본적이 있을것이다. 이렇게 멤버 변수를 대외에 공개하면 많은 문제점들이 일어날 수 있다. 캡슐화의 이점을 누릴수가 없다. 내부표현을 변경하기 위해서 API 를 변경해야 한다. 불변식을 강제할 수 없다. 필드 사용시 그에 따른 동작을 수행할 수 없다. 해결법은 그리 어렵지 않은데 public 멤버 변수를 private 변수와 public 접근자 메서드로 변경하는것이다. - 공개해도 괜찮은 경우 private 변수와 public 접근자 메서드는 정설처럼 여겨져서 많은 사람들이 지키는 규칙이다. 그래서 코딩할 때 해당 변수는 외부에 공개되어도 되는 변.. 2021. 10. 26.
DDIA - 신뢰성,확장성,유지보수성 - 유지보수성 - 이 글은 마틴 클레프만의 데이터 중심 애플리케이션 설계를 기반으로 작성되었습니다. - 개요 S/W 는 대부분 개발보다 유지보수를 할 때 많은 비용이 들어간다. 이런 유지보수에는 일반적으로 다음과 같은 항목들이 있다. 버그 수정 시스템 운영 유지보수 신규플랫폼 적용 기술채무 상환 신규 기능 추가 유지보수의 고충을 최소화하기 위해서는 지켜야하는 설계 원칙이 있다. 운용성: 운영팀이 시스템을 운영하기 쉽게 해야 한다. 단순성: 복잡도를 최대한 제거하여 새로운 엔지니어가 최대한 이해하기 쉬워야 한다. 발전성: 이후에 시스템을 쉽게 변경할 수 있어야 한다. 신뢰성과 확장성을 달성하는것은 그리 간단하지 않다. 그래서 위의 3 가지 항목을 염두해두면서 기본적으로 유지보수성을 달성하기위해 노력해야 한다. - 운영성.. 2021. 10. 25.
DDIA - 신뢰성,확장성,유지보수성 - 확장성 - 이 글은 마틴 클레프만의 데이터 중심 애플리케이션 설계를 기반으로 작성되었습니다. - 개요 어떤 시스템이 현재 안정적이라고 해서 미래에도 안정적이라는 보장은 없다. 이런 경우 보통 성능이 달라져서 문제가 되는데 성능이 달라지는 주요 Issue 는 부하가 증가되는것이다. 확장성이라는 것은 증가되는 부하에 대처하는 시스템의 능력이라고 할 수 있다. 프로젝트를 진행하다보면 설계자나 PM 들은 흔히 'A 시스템(모듈)은 확장 가능하다.', 'B 시스템(모듈)은 확장성이 없다.' 와 같은 말을 많이 한다. 하지만 이런 말들은 확장성을 논하는데에 아무런 도움이 되지 않는다. 확장성을 논할때에는 '시스템이 특정 방향으로 커지면 이에 대처하기 위한 선택은 무엇인가?' 와 같은 사고방식으로 접근해야 한다. - 부하기.. 2021. 10. 19.
이펙티브 자바 - 클래스와 멤버 접근 권한 - 이 글은 Effective Java 를 기반으로 작성되었습니다. - 개요 어떤 클래스가 잘 설계되었는지 판단할 수 있는 요소에는 여러 가지가 있지만, 그 중 하나는 구현 세부사항을 얼마나 잘 감추었는가이다. 이 규칙을 잘 지키면 각 모듈들끼리는 API 를 통해서만 의사소통하며 구현 세부사항은 각 모듈내부로 제한된다. 이것이 우리가 흔히 말하는 '정보은닉'과 '캡슐화'이다. - 정보은닉 정보은닉은 모듈과 모듈사이의 의존성을 줄여주기때문에 중요하다. 모듈 사이의 의존성이 줄어들면 각각 개발, Test, 최적화, 변경을 손쉽게 할 수 있으며 대규모 시스템을 개발할때 위험(Risk)을 낮춰준다. Java 에서 정보은닉을 구현하려면 클래스, 인터페이스 멤버들에 접근제어자를 사용해야 한다. 정보은닉을 위한 몇 .. 2021. 10. 19.
DDIA - 신뢰성,확장성,유지보수성 - 신뢰성 - 이 글은 마틴 클레프만의 데이터 중심 애플리케이션 설계를 기반으로 작성되었습니다. - 개요 과거에는 CPU, RAM 같은 하드웨어 성능이 애플리케이션을 제한했지만, 애플리케이션들이 계산 중심이 아닌 데이터 중심으로 변화하면서 데이터의 양, 복잡도, 변화속도로 관점이 변경되고 있다. 일반적으로 데이터 중심 애플리케이션이 공통으로 필요로 하는 표준 구성요소는 아래와 같다. DB: 구동 App. 및 다른 App. 에서 데이터를 다시 찾을 수 있게 데이터를 저장 Cache: Read 성능 향상을 위한 값 비싼 수행 결과를 기억 Index: 키워드로 데이터를 검색하거나 필터링 제공 Stream 처리: 비동기 처리를 위한 다른 프로세스로 메시지 전송 Batch: 일정 주기로 대량의 누적된 데이터 분석 위의 요소.. 2021. 10. 17.