JAVA
-
DDD - Dependency Injection과 AOP 4부 5부JAVA/DDD 2021. 1. 22. 22:17
우선 ProductRepository를 리팩토링하자. 구체적인 클래스에서 인터페이스를 추출하는 EXTRACT INTERFACE를 적용하자. 인터페이스 명은 ProductRepository로 하고 구현 클래스 명은 CollectionProductRepository로 하자. 1 2 3 4 5 6 7 8 9 10 ProductRepository.java public interface ProductRepository { public void save(Product product); public Product find(String productName); } Colored by Color Scripter cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CollectionProduc..
-
DDD - Dependency Injection과 AOP 3부JAVA/DDD 2021. 1. 22. 22:03
영속성(Persistence)과 REPOSITORY REPOSITORY는 도메인 객체 생성 이후의 생명주기를 책임진다. 도메인 객체가 생성되고 상태가 초기화된 후에는 REPOSITORY에게 넘겨진다. REPOSITORY는 객체를 넘겨받아 내부 저장소에 보관하고 요청이 있을 경우 객체를 조회하여 반환하거나 삭제한다. 클라이언트 입장에서 REPOSITORY는 커다란 메모리에 도메인 객체들을 담고 있는 객체 풀(object pool)과 같다. 클라이언트는 생성된 객체를 REPOSITORY에게 전달하고 객체가 필요한 경우 REPOSITORY에게 객체 풀 안의 어딘가에 잠자고 있는 도메인 객체를 찾아 달라고 요청한다. REPOSITORY의 기능을 메모리 컬렉션에 대한 오퍼레이션으로 바라보는 것은 도메인 모델을 단..
-
DDD - Dependency Injection과 AOP 2부JAVA/DDD 2021. 1. 22. 21:41
객체 그리고 영속성(Persistence) 모든 객체는 생성자가 호출되는 시점에 생성된다. VALUE OBJECT의 수명은 짧다. 생성된 후 잠시 다른 REFERENCE OBJECT 또는 VALUE OBJECT에 의해 사용되다가 다른 VALUE OBJECT로 대체된다. 갈 길을 잃은 VALUE OBJECT는 가비지 컬렉터에게 넘겨진 후 조용히 생을 마감한다. VALUE OBJECT에 비해 REFERENCE OBJECT의 수명은 상대적으로 길다. REFERENCE OBJECT는 다양한 이벤트에 반응함에 따라 상태가 변한다. 일단 고객 객체가 생성되면 시스템은 고객이 탈퇴할 때까지 고객 객체를 참조하고 추적할 수 있어야 한다. 이를 위해 도메인 모델에 추가되는 PURE FABRICATION이 REPOSITO..
-
Comparable을 구현할지 고려하라JAVA/Effective java 2021. 1. 21. 17:54
Comparable 인터페이스의 유일무이한 메서드인 compareTo를 알아보자. compareTo는 Object의 메서드가 아니다. compareTo는 Object의 equals와 비슷하지만 두 가지가 다르다. 단순 동치성 비교에 더해 순서까지 비교할 수 있으며 제네릭하다. Arrays.sort(a); Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서가 있음을 뜻하고 따라서 Comparable을 구현한 객체들의 배열은 다음처럼 손쉽게 정렬할 수 있는 것이다. 검색, 극단값 계산, 자동 정렬 컬렉션 관리 역시 쉽게 할 수 있다. 다음 프로그램은 명령줄 인수들을 알파벳순으로 출력한다. String이 Comparable을 구현한 덕이다. 사실상 자바 플랫폼 라이브러리의 모든 값 ..
-
clone 재정의는 주의해서 진행하라JAVA/Effective java 2021. 1. 20. 18:09
Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스지만, 아쉽게도 의도한 목적을 제대로 이루지 못했다. 가장 큰 문제는 clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이고 그마저도 protected라는 데 있다. 따라서 Cloneable을 구현하는 것만으로는 외부 객체에서 clone 메서드를 호출할 수 없다. 그렇다면 메서드 하나 없는 Cloneable 인터페이스는 무슨 일을 할까? 이 인터페이스는 Object의 protected 메서드인 clone의 동작 방식을 결정한다. Cloneable을 구현한 클래스의 인스턴스에서 clone을 호출하면 그 객체의 필드들을 하나하나 복사한 객체를 반환하며, 그렇지 않은 클래스의 인스턴스에서 호출하면 CloneNotSu..
-
toString을 항상 재정의하라JAVA/Effective java 2021. 1. 19. 12:30
Object의 기본 toString 메서드가 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다. 이 메서드는 단순히 클래스_이름@16진수로_표시한_해시코드 를 반환할 뿐이다. toString의 일반 규약에 따르면 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보'를 반환해야 한다. 이 같은 toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 그 클래스를 사용한 시스템은 디버깅하기 쉽다. toString메서드는 객체를 println, printf, 문자열 연결, assert 구문에 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 불리고 이는 직접 호출되지 않더라도 다른 어딘가에서 쓰일 거란 이야기이다. 또 작성한 객체를 참조하는 컴포넌트가 오류 메시지를 로깅할 때 자동으로 호..
-
equals를 재정의하려거든 hashCode도 재정의하라JAVA/Effective java 2021. 1. 14. 11:44
equals를 재정의한 클래스 모두에서 hashCOde도 재정의해야 한다. 그렇지 않는다면 hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킬 것이다. equals(Object0가 두 객체를 같다고 판단했다면 두 객체의 hashCode는 똑같은 값을 반환해야 하며 equals(Object) 가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시 테이블의 성능이 좋아진다. 이 코드의 답은 null을 반환한다. PhoneNumber 클래스는 hashCode를 재정의하지 않았기 때문에 논리적 동치인 두 객체가 서로 다른..
-
DDD - Dependency Injection과 AOP 1부JAVA/DDD 2021. 1. 11. 19:29
애플리케이션의 모든 기억들은 종료되는 순간 깨끗하게 증발돼 버리고 만다. 애플리케이션은 상태를 끊임없이 기록하고, 기억을 재생하고, 현실을 재구성해야 한다. 유효 시간이 지나고 단기 기억 상실증으로 인해 모든 기억이 소멸되더라도 기록을 통해 어플리케이션의 기억을 되돌릴 수 있어야 한다. 애플리케이션이 기억을 재생할 수 있다고 해서 모든 기억을 동시에 복구하는 것은 소모적인 일이다. 살아오면서겪은 모든 일들을 일일이 다 기억하고 있을 수는 없다. 애플리케이션 역시 마찬가지다. 지금 처리하기 위해 필요한 최소한의 정보만 기억하고 있으면 된다. 시스템의 메모리는 한정된 자원이다. 지금 당장 필요하지도 않은 정보들을 유지하기 위해 값비싼 자원을 낭비할 필요는 없다. 잠시 잊어 버렸다가 필요할 때 기록을 들춰 보..