System Design/Layered Arch
[Spring] MVC Layered Architecture : DTO 전달/변환/파라미터 설계
[Spring] MVC Layered Architecture : DTO 전달/변환/파라미터 설계
2022.03.17Controller -> Service 호출 시, Service의 메서드 파라미터 설계 ```java @PostMapping("/some-path") public ResponseEntity foo(@RequestBody @Valid FooControllerRequest request) { varService.doSomething(request.getGroupId(), request.getUserId()); ... } /* foo API에 변경이 발생했다 */ @DeleteMapping("/some-path/groups/{groupId}/users/{userId}") public ResponseEntity foo(@PathVariable String groupId, @PathVariable String u..
[Spring] MVC Layered Architecture : DTO와 Domain Model을 분리해야 하는 이유
[Spring] MVC Layered Architecture : DTO와 Domain Model을 분리해야 하는 이유
2022.03.14God Class에 대한 용어 정리 god class는, 꼭 크기가 커야만(가지고 있는 필드가 많아야만) god class인 것은 아닙니다. 여러 layer에 걸쳐 사용되고 있다면, 또는 2개 이상의 책임을 가지고 있다면, 그 클래스를 사용(의존)하고 있는 클래스가 그 만큼 많다는 의미이고, 이는 곧 god class (또는 god class 유망주)입니다. god class는 크게 2가지 유형으로 나누어 볼 수 있습니다. (왼쪽) domain 책임은 제대로 나눴으나 여러 layer에 걸쳐 사용되는 경우 = 유형 1 (오른쪽) domain 책임을 제대로 나누지 못해 1개 이상의 책임을 가지는 경우 = 유형 2 유형 1 + 유형 2 = 유형3 이 글에서 주요하게 다루고자 하는 내용은 유형 1 God Cla..
[마틴파울러] Layering 관련 글 모음
[마틴파울러] Layering 관련 글 모음
2022.03.13https://martinfowler.com/bliki/PresentationDomainDataLayering.html layer를 나누는 것의 장점 1. 관심 분리 (를 통해 작업 대상 layer에 집중 가능) 마틴 파울러는 layer를 나누는 것의 최고 장점은, 작업 대상이 되는 layer에만 집중할 수 있도록 해준다는 점이라고 얘기하고 있다. It's biggest advantage (for me) is that it allows me to reduce the scope of my attention by allowing me to think about the three topics relatively independently. When I'm working on domain logic code I ..
Domain Model에 대해서
Domain Model에 대해서
2022.03.11Domain Model이란 해당 도메인에서 비즈니스적인 의미를 가지는 object 다. An object model of the domain that incorporates both behavior and data. - P of EAA Domain Model은 id 여부에 따라 두 가지로 구분할 수 있다. Entity id가 있어 각각의 개체를 고유하게 식별 할 수 있는 경우 엄밀히 불변은 아니고 시간이 지나면서 상태가 변경될 수 있는 대상임. (그러나 이와 별개로 앱단에서는 불변 객체로 처리하는 것이 좋다. 함수형.) e.g., Member VO ( value object ) id가 없음 To avoid aliasing bugs I follow a simple but important rule: val..
Repository와 DataMapper의 책임 (w/o ORM)
Repository와 DataMapper의 책임 (w/o ORM)
2022.03.09traditional Java EE 패턴에서의 정의 Spring에서 제공하는 @Repository 는 DAO 의미를 지닌다. (javadoc 참조) MyBatis에서 제공하는 @Mapper 는 sql mapper 의미를 지닌다. 따라서 layer는 아래와 같이 표현되어야 한다. ```kt @Service ---> @Repository ---> @Mapper ----> mapper.xml || annotation-string DAO sql mapping ``` 관습적으로 @Repository와 @Mapper를 동일한 layer로 간주하는 경우가 많은데, 서로 다른 layer로 간주해야 한다. "dao와 mapper의 차이" 로 검색해보면, 마치 두 개념이 같은 추상화 수준이며 서로 양립 불가한 것 처럼 보..
[Spring] MVC Layered Architecture : Controller와 Service의 책임 나누기
[Spring] MVC Layered Architecture : Controller와 Service의 책임 나누기
2020.07.06그림으로 정리한 Spring MVC Application Architecture 왜 layer가 필요한가? layer를 왜 분리할까? layer를 분리한다는 것에는 어떤 의미가 있는가? layer를 나누게 되면, 다른 layer를 추상화 할 수 있다. 추상화를 잘 했다면, 관심 분리 를 통해 현재 작업하고 있는 layer에 집중할 수 있다. 다른 layer의 모듈을 부품을 갈아끼우듯 변경할 수 있다. 각 layer가 자신의 세부사항을 몰라도 상관 없도록, 잘 추상화해서 제공하고 있었다면 가능하다. 컴포넌트 간의 의존 계층 관계를 깔끔하게 유지할 수 있다. 각 layer를 넘나들면서 스파게티처럼 꼬여 있는 관계가 아니라, 위에서 아래로 떨어지는 간단한 구조 혹은 복잡한 참조는 같은 계층 내에서 끝내는 등 ..
[Spring] MVC Layered Architecture : Map 보다 Data Class 사용해야 하는 이유
[Spring] MVC Layered Architecture : Map 보다 Data Class 사용해야 하는 이유
2020.06.25Map과 data class는 애초에 용도와 목적이 다르다. Map은 data class 처럼 쓸 수는 있지만, 그렇게 쓰는게 Map의 올바른 사용법이라고 할 수는 없다. Data Class 대용으로 Map을 사용할 때의 단점 타입 정보가 유실되어 type safe 하지 않다는 점. 이게 가장 큰 단점이자 본질적인 단점이다. 꺼낼 때 형변환 필요해서 번거롭다. key 지정을 String으로 하다 보니 잘못된 참조에 대한 컴파일 타임 체크가 불가능하다. fragile. 어떤 필드가 어디서 사용되고 있는건지 IDE의 추적 기능 도움을 받을 수 없어 일일히 따라가보아야 한다. 리팩터링이 굉장히 어렵다.=유지보수가 어렵다. (e.g., 이 필드 삭제 해도 되는걸까?) Map을 Domain Model로 쓴다면? ..
[Spring] MVC
[Spring] MVC
2017.11.11더보기 JSP 모델 1 구조 웹 브라우저의 요청을 JSP가 받아 직접 처리(로직, 출력) 따라서 비즈니스 로직을 처리하기 위한 코드와 웹 브라우저에 결과를 출력하는 코드가 혼재한다. JSP 모델 2 구조 웹 브라우저의 요청을 단일 서블릿이 받아 로직 클래스에서 로직을 처리하고, 결과를 보여줄 JSP 페이지로 포워딩. JSP는 출력만 처리. 웹 브라우저의 요청을 단일 진입점, 하나의 서블릿에서 처리한다는 점이 특징이다. 그래서 서블릿에서 웹 브라우저의 요청을 구분해서 출력을 생성할 JSP를 선택하게 된다. 모델 2 구조가 곧 MVC 패턴을 웹에 적용한 것이라고 생각하면 된다. JSP 모델 2 구조 기반 MVC Model : 명확한 규칙은 없으나 보통 로직 처리 클래스, 자바빈, 서비스 View : JSP,..