### 목차
- [(서문) 개발공정](https://ohhoonim.blogspot.com/2024/02/blog-post_62.html) <- 현재문서
- [1. 이벤트스토밍](https://ohhoonim.blogspot.com/2024/02/blog-post_47.html)
- [2. 유스케이스 구현](https://ohhoonim.blogspot.com/2024/02/blog-post_92.html)
- [3. 인프라 테스트](https://ohhoonim.blogspot.com/2024/02/blog-post_39.html)
- [4. UI 구현](https://ohhoonim.blogspot.com/2024/02/ui_21.html)
## 기본 구성
이벤트 스토밍, 유스케이스 구현, 인프라 테스트, 사용자 화면 구현의 총 4가지 공정으로 구성되어있다. 각 공정은 명시한 순서대로 진행하되 다음 공정에 자신의 공정 결과물을 소리쳐야 한다. (그림 참고) 예외 적으로 사용자 화면 구현 공정은 이벤트 스토밍 후 UX 설계를 거쳐 다소 독립적으로 공정을 진행할 수 있다.

## 반복 공정
모든 개발 공정이 예측가능한 것은 아니다. 초기 시스템 분석 단계인 이벤트 스토밍 공정에서는 다수의 프로젝트관련자들이 요구사항을 분류, 정제하는 과정을 거쳐야 하므로 언제나 변경 가능한 상태이므로, 공정 수행자는 이러한 사실을 인지하고 맞춰나가야한다. 이를 적응 계획[^예측계획과적응계획]이라 한다.
이벤트 스토밍이 유스케이스별로 구분되기 시작하면 일정수립이 가능해진다. 이를 예측 계획이라고 하며, 일정에 따라 다음의 공정 묶음으로 반복 수행이 가능해진다.
[^예측계획과적응계획]: [[UML Distilled(third edition)#^49626e|Martin Fowler, "UML Distilled(third edition)", (Pearson, 2004)]], p.28
1. 유스케이스 구현과 인프라 테스트
2. 이벤트 스토밍과 UI구현
엄밀히 말하면 이벤트 스토밍 자체는 예측 계획이 불가능한 공정이다. 하지만 UI 구현 공정의 계획일정과 긴밀하게 공정을 수행하면 반복적으로 계획을 진행할 수 있다.
## 공정별 세부사항
### 이벤트 스토밍
[이벤트스토밍](https://ohhoonim.blogspot.com/2024/02/blog-post_47.html) 페이지로 이동하기
### 유스케이스 구현
[유스케이스 구현](https://ohhoonim.blogspot.com/2024/02/blog-post_92.html) 페이지로 이동하기
### 인프라 테스트
[인프라 테스트](https://ohhoonim.blogspot.com/2024/02/blog-post_39.html) 페이지로 이동하기
### UI 구현
[UI 구현](https://ohhoonim.blogspot.com/2024/02/ui_21.html)
## 적용사례
[[클린아키텍처]]
Session 대신 JWT를 사용하는 이유 실 서버는 하나의 인스턴트로만 동작하지 않는다. 서버의 고가용성(high availabliity, HA)을 확보하기 위해 두 개 이상의 병렬서버로 운영하게 된다. 서버가 병렬로 운영되는 상황에서 세션을 사용하면 각 서버간의 세션을 동기화하는 문제가 발생한다. 이를 해결하기 위해 공유 데이터베이스를 이용한 세션공유 기법들을 사용하기도 한다. 서버가 많아지면 세션동기는 더 어렵다. JWT를 사용하면 세션사용으로 인한 서버 자체에 부담도 줄이면서 공유 세션에 대한 관리가 한층 수월하다. 스프링 시큐리티 - SecurityConfig.java session을 사용하지 않도록 설정 jwtAuthFilter 추가 httpBasic 제거 - JwtAuthenticationFilter.java config.filter 패키지에 파일 추가 jwt dependency 추가 (3개). gradle refresh하는 거 까먹지 말기 config.service 패키지에 [JwtService.java](http://JwtService.java) 추가 jwtService와 UserDetailService final field 추가. @RequiredArgsConstructor 까먹지 말기 - config.service.JwtService 소스 참조해서 파일 작성 - controller, service 수정 User 를 리턴하면 pwd가 그대로 노출되므로 AuthResponse와 AuthRequest로 교체 Github https://github.com/ohhoonim/factory.git 유튜브 영상 스프링부트 - 보안 JWT JWT - refresh 토큰과 logout
Inlay Hint > Parameter names java.inlayHints.parameterNames.enabled: literals java.inlayHints.parameterTypes.enabled java.inlayHints.variableTypes.enabled editor.inlayHints.enabled: offUnlessPressed Code lens editor.codeLens: true editor.codeLensFontSize java.referencesCodeLens.enabled java.implementationCodeLens: all ligature 폰트 설정 editor.fontFamily: 'D2Coding ligature’ "editor.fontLigatures": true, 편집기 확대 축소 단축키 설정 zoom 으로 검색 Google Style Formatter 설정 java.format.settings.url https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml JDK 설정 java.configuration.detectJdksAtStart Language Server JAVA_HOME 설정 java.jdt.ls.java.home Gradle JAVA_HOME 설정 java.import.gradle.java.home Installed JDK 설정 java.configuration.runtimes Static 클래스, 메서드 import java.completion.favoriteStaticMembers "org.springframework.test.web.client.match.MockRestRequestMatchers. ", "...
# 5-Step Architecture Spec 이 문서는 헥사고날 아키텍처를 실무적으로 변형하고, DDD의 전략적 설계를 극대화한 5-Step Architecture의 표준 공정을 정의한다. 샘플 리파지토리 : https://github.com/ohhoonim/smart-factory/tree/main/back/factory-api-module ### Core Philosophy > "Service는 배달부(Messenger)일 뿐, 뇌(Brain)는 **Model**에, 법(Law)은 **Policy**에 둔다." > --- ## The 5-Step Standard Process ### Step 1: 도메인 자아 확립 (Domain Model Discovery) 비즈니스의 핵심 상태와 행위를 관리하는 Aggregate Root(AR)를 정의한다. - **원칙**: 데이터 필드가 아닌 '상태 변화의 규칙'과 '생애주기'에 집중한다. - **핵심**: AR 내부에서만 상태 변경이 가능하도록 캡슐화하며, 외부로부터의 직접적인 필드 수정을 금지한다. ### Step 2: 법전 정의 (Policy Abstraction) 비즈니스 제약 조건 중 변하기 쉬운 규칙(보안, 한도, 계산 로직)을 인터페이스로 추상화한다. - **원칙**: 도메인 모델이 프레임워크(Spring)나 환경 설정에 오염되지 않도록 보호한다. - **효과**: 정책의 변경이 모델이나 서비스의 코드 수정을 유발하지 않도록 결합도를 낮춘다. ### Step 3: 도구 제작 (Activity Implementation) 도메인이 외부 세계와 소통하기 위한 구체적인 기술(DB, Storage, 외부 API)을 구현한다. - **원칙**: 헥사고날의 **Output Adapter** 역할을 수행하며, 기술적 복잡성을 이 계층에 가둔다. - **명칭**: `QueryActivity`(조회), `CommandActivity`(...
댓글
댓글 쓰기