단순하게 Service (Application Layer)에서 Presentation Layer의 DTO를 받는것도 상위레이어를 참조하는 것이라 생각하여 이와같이 코드를 구현
DTO 를 왜 쓰는가에 대한 원론적인 물음으로 들어가면 -> 도메인을 보호하기 위함
다시 코드를 보면 Controller -> Service 로 Request -> DTO 로 변환해서 보내주는것이 위의 목적에 부합하는가와 과연 장점이 있는가를 물어보면 대답은 NO
다만 Service 가 비지니스 로직을 가지는 구조이고 Service 가 Service 를 참조하는 설계라면? -> DTO 를 만들어주는 것이 알맞음
물론 위의 상황이 객체지향적인 상황은 아님 (내가 예전에 Spring 을 배우며 구현했던 만능의 Service가 떠오름)
그렇다면 Response는?
Service는 비지니스 로직의 순서와 트랙잭션 관리 라는 흐름제어 역할 -> 과연 서비스의 메서드 반환값이 재사용될 일이 있는가?! -> Response를 반환해도 재사용 하는곳이 있는가? 라는 관점에서 생각하면 답이 나온다.
재연링은 친절하다 👍
[Null] Collection.emptyList() - 1
학습 내용
컬렉션 필드에 null로 초기화 하는것은 올바르지 못함
해당 필드 또는 객체를 사용하는 코드에 null인지 체크하는 코드를 항상 추가해야함
(그렇지 않으면 NullPointerException이 발생할 가능성이 있으므로)
빈 컬렉션(emptyList)로 초기화해주면 사용하는 쪽에서 null에 대한 두려움을 줄여줄 수 있다!
Collections.EMPTY_LIST vs Collections.emptyList()
Collections.emptyList() 가 타입 세이프하게 사용할 수 있습니다.
Collections 의 EMPTY_LIST를 사용하게 되면 Raw Type(원시 타입 즉, Object) 를 사용하게 됩니다.
@SuppressWarnings("rawtypes")
public static final List EMPTY_LIST = new EmptyList<>();
하지만 Collections.emptyList() 메서드를 사용하면 내부 로직에서 EMPTY_LIST를 형변환하여 반환해줍니다.
@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
[Repository] Repository vs DAO - 2
학습 내용
나는 Repository라고 쓰던것이 사실 DAO 였다 ㅎㅎ..
DAO 가 DB와 1:1 관계로 존재하고 Repository에서 집합처리를 한다고 생각하면 어떤 설계가 나와야 할지 보임
Line 안에서 Sections 라는 객체가 항상 필요해서 LineRepository 와 SectionRepository를 함께 LineService에서 사용했음
현재는 LineRepository에서 LineDao와 SectionDao 를 주입받아서 사용하도록 수정
Repository는 객체의 컬렉션으로 Repository의 interface는 도메인 계층에 존재합니다. 그리고 Repository interface의 구현체는 Persistance 계층에 존재합니다. 즉, Repository는 추상화를 통해 Persistance 계층에 있는것을 숨기고 이로 인해 Repository에 도메인 로직을 사용할 수 있습니다.
주의할 점은 만약 우리가 만든 도메인이 빈약한 도메인이라면 Repository는 그저 DAO의 메서드를 호출하는 정도로 끝날것입니다.
[OOP] Validator - 1
학습 내용
Sections 의 코드가 150줄이 넘어가서 추가 삭제등을 검증하는 로직을 Validator 라는 이름의 클래스로 분리
댓글