JAVA
-
private 생성자로 noninstantiability를 강제할 것JAVA/Effective java 2020. 12. 30. 15:08
단순히 static 메서드와 static 필드를 모아두는 유틸리티 클래스들을 만들고 싶을 때가 있다. OOP적 사고와는 다소 거리가 있지만 나름의 쓰임새는 있다. Arrays에 배열 관련 메서드, Collections에 정적 메서드 와 팩토리 등이 그 예이다. 또한 final 클래스와 관련된 메서드들을 모아놓을 때도 사용하게 된다. final 클래스를 상속해서 하위 클래스에 메서드를 넣는 것은 불가능하기 때문이다. 따라서 이같은 유틸리티 클래스는 인스턴스를 만들어 쓰려고 설계한 게 아니다. 하지만 생성자를 명시하지 않으면 생성되는 기본 생성자는 public한 생성자이다. 클라이언트는 이 생성자가 자동 생성된 것인지 구분할 수 없다. 실제로 공개된 API들도 의도치 않게 인스턴스화할 수 있게 된 클래스가 ..
-
Aggregate와 Repository 3부JAVA/DDD 2020. 12. 30. 14:18
유창하게(Fluently) 구현하기 AGGREGATE와 ENTRY POINT, REPOSITORY를 사용하여 대략적인 도메인 모델을 만들었다. 이제 테스트 주도 방식을 적용하여 도메인 로직을 개발해보자. 테스트 주도 개발 방식에서는 애플리케이션 코드를 작성하기 전에 실패하는 테스트부터 작성한다. 테스트를 작성할 때는 테스트 대상 객체의 인터페이스가 어떻게 사용될 지를 상상해 보는 것이 중요하다. 테스트 중인 시나리오를 실행하기 위해 객체의 어떤 오퍼레이션을 어떤 순서로 호출하는 것이 효율적인지를 결정한다. 따라서 테스트를 작성함과 동시에 자연스럽게 사용하기 편리한 인터페이스를 설계하게 되는 부수적인 효과도 얻을 수 있다. 객체의 인터페이스 설계와 관련해서 FLUENT INTERFACE라는 방식이 있다. ..
-
private 생성자 또는 enum 타입을 사용해서 싱글톤으로 만들 것JAVA/Effective java 2020. 12. 29. 19:35
싱글톤은 흔히 쓰는 용어이다. 하나의 패턴의 이름이고 App을 통틀어서 해당 클래스의 인스턴스가 하나만 사용하는 패턴을싱글톤이라고 한다. 간단하게 싱글톤 패턴을 요약해보면 자기 타입에 대한 인스턴스를 private static으로 만들어 놓는다. private 한 생성자를 만든다. 이제 이 타입의 인스턴스는 new를 통해 만들 수 없다. static 한 get메서드를 통해서 이 하나의 인스턴스를 가져다가 쓸 수 있다. ( multi-thread 등의 환경을 고려한다면 좀 더 복잡한 형태가 될 것 ) 이처럼 오직 한 인스턴스만 만드는 클래스를 싱글톤이라 부른다. 보통 함수 같은 Stateless 객체 또는 본질적으로 유일한 시스템 컴포넌트를 그렇게 만든다. 싱글톤의 단점으로는 사용하는 클라이언트 코드를 테..
-
AGGREGATE와 REPOSITORY 2부JAVA/DDD 2020. 12. 29. 18:21
AGGREGATE AGGREGATE는 데이터 변경 시 하나의 단위로 취급할 수 있는 연관된 객체들의 클러스터이다. 각 AGGREATE는 루트(root)와 경계(boundary)를 가진다. 경계는 AGRREGATE 내부에 무엇이 포함되어야 하는지를 정의한다. 루트는 AGGREGATE 내에 포함된 하나의 REFERENCE OBJECT이다. 루트는 외부에서 참조 가능한 유일한 AGGREGATE의 내부 객체이다. 외부에서는 루트 객체만이 참조 가능하지만 AGGREGATE 내부의 객체는 외부 객체를 자유롭게 참조할 수 있다. 루트를 제외한 나머지 REFERENCE OBJECT들은 외부로부터 접근이 불가능하기 때문에 지역 식별자(local identity)를 가진다. 지역 식별자는 AGGREGATE 내부에서 REF..
-
생성자 매개변수가 많다면 빌더 사용을 고려해보자JAVA/Effective java 2020. 12. 28. 15:51
static 팩토리 메서드, public 생성자 모두 매개변수가 많이 필요한 경우 불편해진다. 그 예가 NutritionFacts인데 해당 클래스를 한번 봐보자. 몇몇 필드등은 반드시 세팅되어야 되는 필드고 나머지 필드는 Optional 한 필드들도 있다. 기본 타입은 기본값으로 세팅이 될 것이고 참조 타입은 null로 기본 세팅이 될 것이다. 하지만 문제는 굉장히 코드가 길어지고 특히 자바에서는 이것이 뭘 뜻하는지 알 수가 없게 된다. 따라서 이런 생성자를 쓰게 되면 필요 없는 매개변수도 넘겨야 하는 경우가 발생하는데 보통 0 같은 기본값을 넘기게 된다. 동작하기는 하지만 읽기가 어렵고 작성하기도 역시 번거롭다. 그렇다면 매개변수를 받지 않는 생성자를 만드는 건 어떨까? 비어있는 생성자와 세터를 사용해..
-
AGGREGATE와 REPOSITORY 1부JAVA/DDD 2020. 12. 28. 15:39
고객(Customer)은 시스템을 사용해서 상품을 주문(Order)한다. 한 번 주문 시 다수의 상품(OrderLineItem)을 구매할 수 있으며 상품에 대한 이름(name), 가격(price)과 같은 기본 정보는 별도의 상품(Product) 클래스에 정의되어 있다. 고객은 고객 등급에 따라 일 회 주문 시 구매 가능한 금액에 제한(limitPrice 프로퍼티)을 받는다. 앞의 도메인 모델에서 Customer 클래스와 Money 클래스를 표기한 방법에 주목하자. 일반적으로 REFERENCE OBJECT는 독립적인 클래스로 표기하는 반면, VALUE OBJECT는 클래스의 속성으로 표기한다. 좋은 모델이란 충분한 정보를 다루면서도 세부 사항에 집착하지 않고 핵심 주제를 효과적으로 전달하는 모델이다. 주문..
-
자바 데이터 타입, 변수, 배열JAVA/Java 2020. 12. 26. 20:50
목표 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익히기 프리미티브 타입 종류와 값의 범위 그리고 기본 값 Primitive Type? 기본자료형 혹은 원시자료형이라고 불리는 프리미티브 타입은 값을 할당할 때 변수의 주소 값에 값이 그 자체로 저장되는 데이터 타입이다. 해당 데이터 타입은 값이 할당되면 앞서 살표 보았던 JVM Runtime Data Area 영역 중 Stack 영역에 값이 저장된다. 종류 Java에서 프리미티브 타입의 종류는 총 8 가지이다. byte, short, int, long, float, double, char, boolean 타입이 그것이다. 타입의 종류와 값의 범위 기본값을 다음과 같은 표로 정리해 보았다. 2. 프리미티브 타입과 레퍼런스 타입 Referen..
-
DDD - Value Object와 Reference Object 4부JAVA/DDD 2020. 12. 24. 20:49
앞 선 예제에서는 Customer 클래스 자체에 ENTRY POINT의 컬렉션을 관리하는 인터페이스를 추가함으로써 시스템 내에 ENTRY POINT의 인스턴스가 하나만 유지되도록 만들었다. 또 다른 방법으로는 Customer 클래스와는 분리된 별도의 클래스에 Customer 클래스의 컬렉션 관리 인터페이스를 할당하는 방법이 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public void setUp() { Registrar.init(); } public void testCustomerIdentical() { CustomerRepository customerRepository = new CustomerRepository(); Custom..