Skip to content
Open
Show file tree
Hide file tree
Changes from 57 commits
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
04e3e81
Initial commit
dbdb1114 Jan 8, 2025
849720c
불필요 파일 제거
dbdb1114 Jan 8, 2025
18697b8
[ feat ] RDS 기본 의존성 추가
dbdb1114 Jan 9, 2025
5c301e8
[ feat ] entity 설계 작성
dbdb1114 Jan 9, 2025
0eca294
[ feat ] repository 작성
dbdb1114 Jan 9, 2025
e0f47ec
[ fix ] 불필요 코드 제거
dbdb1114 Jan 9, 2025
739e260
[ refactor ] BaseEntity생성 및 상속, PK starategy 설정 추가
dbdb1114 Jan 9, 2025
26fa2df
[ fix ] screen - seats 연관관계 단방향으로 변경
dbdb1114 Jan 9, 2025
566283f
[ fix ] Movie plot 필드 타입 변경
dbdb1114 Jan 9, 2025
432c7a0
[ refactor ] 칼럼명 스네이크케이스 -> 카멜케이스 수정
dbdb1114 Jan 9, 2025
bd452f2
[ feat ] test위한 util 클래스 정의
dbdb1114 Jan 10, 2025
fdf2c20
[ refactor ] 불필요 Import 제거
dbdb1114 Jan 10, 2025
9c0c3f3
[ test ] 상영정보 레파지토리 테스트 class 생성
dbdb1114 Jan 10, 2025
c36d8f1
[ feat ] 상영정보 조회 메소드 작성 및 테스트
dbdb1114 Jan 10, 2025
e000d67
[ test ] GenreRepository 테스트 클래스 생성
dbdb1114 Jan 10, 2025
342f2b2
[ test ] GenreRepository 장르 조회 테스트
dbdb1114 Jan 10, 2025
1fe75a9
[ refactor ] FetchType LAZY로 변경
dbdb1114 Jan 10, 2025
30901ce
[ test ] ShowingRepository 영화 장르 조회 테스트
dbdb1114 Jan 10, 2025
505c695
[ test ] ShowingRepository rating 조회 테스트 추가
dbdb1114 Jan 10, 2025
3d041f6
Merge pull request #1 from dbdb1114/feature/rds-repo
dbdb1114 Jan 10, 2025
9b1b594
[ conf ] ignore 항목 추가
dbdb1114 Jan 10, 2025
1824dc6
Merge branch 'dev' of https://github.com/dbdb1114/HangHaeHo into dev
dbdb1114 Jan 10, 2025
5583274
[ refactor ] ShowingRepository 상영정보 조회 메소드 수정
dbdb1114 Jan 10, 2025
d02f450
[ fix ] rds 패키지 변경
dbdb1114 Jan 10, 2025
6806485
[ feat ] module-core DTO 클래스 작성
dbdb1114 Jan 10, 2025
a9f9b59
[ feat ] module-service build.gradle 작성
dbdb1114 Jan 10, 2025
90d5661
[ feat ] model mapper config 작성
dbdb1114 Jan 10, 2025
bff52d3
[ feat ] showingService 금일 상영정보 조회 기능 구현
dbdb1114 Jan 10, 2025
86de798
[ test ] 상영정보 조회 메소드 테스트 코드 작성
dbdb1114 Jan 10, 2025
f8a53ac
[ refactor ] Autowired -> RequiredArgsConstructor 의존 주입 방식 변경
dbdb1114 Jan 10, 2025
90e6c71
[ refactor ] service layer 상영정보 조회 메소드 반환 타입 수정
dbdb1114 Jan 10, 2025
219b441
[ refactor ] 패키지 변경 및 @Data 어노테이션 제거
dbdb1114 Jan 10, 2025
664ed23
[ test ] ShowingService getTotalShowing() 수정에 따른 테스트 코드 수정
dbdb1114 Jan 10, 2025
1385883
[ feat ] ShowingService getTodayShowing() 메소드 기능 수정
dbdb1114 Jan 10, 2025
f3e7566
[ refactor ] 불필요 의존성 제거
dbdb1114 Jan 10, 2025
fe1a21d
[ feat ] 상영정보 응답 dto 작성
dbdb1114 Jan 10, 2025
7bbcc20
[ refactor ] 메인 함수 패키지 변경
dbdb1114 Jan 10, 2025
81a70e1
[ feat ] module-app ShowingController 상영정보 조회 기능 구현
dbdb1114 Jan 10, 2025
c8c9832
[ refactor ] module-app build.gradle 불필요 의존성 제거
dbdb1114 Jan 10, 2025
673e7a2
[ fix ] DTO 객체 @getter 추가
dbdb1114 Jan 10, 2025
99b5ef2
[ fix ] MovieDTO equals,hashCode 함수 추가
dbdb1114 Jan 10, 2025
137e9c7
[ feat ] 메인 페이지 구현
dbdb1114 Jan 10, 2025
6213054
[ feat ] 빌드 불필요 하위 모듈 bootJar fase 처리
dbdb1114 Jan 11, 2025
aae0fcf
[ fix ] ShowingService 메소드 수정에 따른 테스트 코드 수정
dbdb1114 Jan 11, 2025
ed3b1f2
[ feat ] ShowingService getTodayShowing() 메소드 수정
dbdb1114 Jan 11, 2025
04e71e9
[ fix ] 프론트엔드 비동기 요청 호스트 주소 기준으로 변경
dbdb1114 Jan 11, 2025
b86438b
[ feat ] module-rds-repo yml 파일 작성
dbdb1114 Jan 11, 2025
862b960
[ feat ] docker sring profiles 수정
dbdb1114 Jan 11, 2025
a132007
[ feat ] docker-compose 작성
dbdb1114 Jan 11, 2025
e63f3ae
[ feat ] root project build.gradle 파일 수정
dbdb1114 Jan 11, 2025
cb2aede
[ fix ] docker-compose spring-profiles 수정 ( prod -> dev )
dbdb1114 Jan 11, 2025
55e296d
[ feat ] ReadMe 작성
dbdb1114 Jan 11, 2025
1f7c86f
[ fix ] init sql 제거
dbdb1114 Jan 11, 2025
ad7f80b
[ faet ] DDL 및 INSERT 쿼리 작성
dbdb1114 Jan 11, 2025
e14ea35
[ fix ] readme 수정
dbdb1114 Jan 11, 2025
00e0f91
Merge branch 'hanghae-skillup:main' into dev
dbdb1114 Jan 11, 2025
6f13ff4
[ feat ] readme 작성
dbdb1114 Jan 11, 2025
2b63091
[ feat [ postgresql->mysql 로 변경
dbdb1114 Jan 12, 2025
e6943d0
[ feat ] mysql 기준으로 야믈파일과 초기화 ddl파일 변경
dbdb1114 Jan 12, 2025
957c068
[ fix ] 칼럼명 변경 row,number -> seatRow,seatNumber
dbdb1114 Jan 12, 2025
9a02883
[ fix ] dev yaml프로퍼티 변경
dbdb1114 Jan 12, 2025
6684ba6
feat: 상영중인 영화 조회 수정
dbdb1114 Jan 13, 2025
8e1954c
fix: 불필요 메소드 삭제
dbdb1114 Jan 14, 2025
45a1d4c
[ refactor ] 러닝 타임 칼럼명 변경
dbdb1114 Jan 14, 2025
9173ae1
[ refactor ] 정렬 코드 제거
dbdb1114 Jan 14, 2025
86c346c
[ refactor ] api URI 변경
dbdb1114 Jan 14, 2025
203d3cb
fix: postgresql -> mysql
dbdb1114 Jan 14, 2025
fb8a65b
[ refactor ] api 스펙 변경 반영
dbdb1114 Jan 14, 2025
6f334a7
[ feat ] 장르 조회 api 추가
dbdb1114 Jan 15, 2025
280e5f3
[ feat ] ControllerAdvice 적용
dbdb1114 Jan 15, 2025
859645e
[ refactor ] 패키지 구조 변경
dbdb1114 Jan 19, 2025
f9cb622
[ refactor ] 패키지 구조 변경
dbdb1114 Jan 19, 2025
77c0b60
[ feat ] rsd 모듈 필터링 검색 기능 추가 - entity 칼럼명 변경 및 불필요 파일 제거
dbdb1114 Jan 19, 2025
35153dd
[ feat ] core module - response 객체 생성
dbdb1114 Jan 19, 2025
51fffbf
[ feat ] rds-repo module - 필터링 검색 기능 추가
dbdb1114 Jan 19, 2025
e66bfe0
[ test ] rds-repo module - build.gradle 의존성 추가
dbdb1114 Jan 19, 2025
19d0f5a
[ feat ] rds-repo module - 필터링 기능 테스트 코드 작성
dbdb1114 Jan 19, 2025
6ea4b84
[ feat ] rsd-repo module - Genre test 코드 수정
dbdb1114 Jan 19, 2025
67f1957
[ feat ] service module - 패키지 변경 및 필터링 검색 기능 구현
dbdb1114 Jan 19, 2025
a6a57af
[ feat ] service module - test코드 수정
dbdb1114 Jan 19, 2025
5127daa
[ feat ] app module - 필터링 검색 기능 구현
dbdb1114 Jan 19, 2025
eb1a04b
[ feat ] service module - 캐싱 기능 구현 ( 의존성 및 설정 클래스 생성 )
dbdb1114 Jan 19, 2025
b959365
[ feat ] service module - getTodayShowing 메소드 캐싱 적용
dbdb1114 Jan 19, 2025
8a3f548
[ feat ] redis-repo module - redis기본설정 생성
dbdb1114 Jan 19, 2025
de0bc16
[ feat ] service module - redis캐싱 기능 구현
dbdb1114 Jan 19, 2025
95a8e2a
Merge branch 'hanghae-skillup:main' into feature/cache
dbdb1114 Jan 19, 2025
7570bf0
[ refactor ] 불필요 interface 제거
dbdb1114 Jan 23, 2025
91bb9f7
[ refactor ] 불필요 넘버링 제거
dbdb1114 Jan 23, 2025
ee57d70
[ refactor ] 400 매직넘버 제거
dbdb1114 Jan 23, 2025
bce708c
Merge pull request #3 from dbdb1114/feature/caching
dbdb1114 Jan 23, 2025
32ecc2f
[ refactor ] 프로젝트 프로퍼티 통합
dbdb1114 Jan 23, 2025
9be6370
[ test ] test 프로퍼티 Import 설정 추가
dbdb1114 Jan 23, 2025
1b6cf7c
[ test ] 캐싱 evict 메소드 기능 테스트
dbdb1114 Jan 23, 2025
f5f5571
Merge pull request #4 from dbdb1114/feature/caching
dbdb1114 Jan 23, 2025
c3163a8
[ refactor ] showingCache 관련 로직 제거
dbdb1114 Jan 23, 2025
698bba6
Revert "[ refactor ] showingCache 관련 로직 제거"
dbdb1114 Jan 23, 2025
bc33f87
[ refactor ] ShowingCacheService 생성 및 테스트 코드 수정
dbdb1114 Jan 23, 2025
523dfbd
[ refactor ] core moduel ShowingResponse stTime,edTime 칼럼명 수정
dbdb1114 Jan 24, 2025
8b126ff
[ refactor ] stTime, edTime => showStTime,showEdTime 칼럼명 변경
dbdb1114 Jan 25, 2025
a1a4441
[ fix ] redis LocalDateTime 직렬화,역직렬화 설정 수정
dbdb1114 Jan 25, 2025
8482053
[ fix ] 전반적인 실행환경 수정
dbdb1114 Jan 25, 2025
1240b3a
[ fix ] 로컬에서 사용하는 클래스 ignore 설정 추가
dbdb1114 Jan 25, 2025
72094d4
Merge pull request #45 from dbdb1114/feature/cache
phyeran Jan 26, 2025
510ab7e
[ feat ] rds-repo module - 사용자 엔티티 및 레파지토리 작성
dbdb1114 Jan 26, 2025
84667c7
[ feat ] rds-repo module 티켓 레파지토리 및 엔티티 수정
dbdb1114 Jan 26, 2025
e6d8ef8
[ feat ] rds-repo module - 좌석 엔티티 및 티켓 좌석 조회 레파지토리 작성
dbdb1114 Jan 26, 2025
06a3570
[ feat ] rds-repo module - 판매 엔티티 및 사용자별 티켓 판매 내역 정보 조회 레파지토리 작성
dbdb1114 Jan 26, 2025
32ed9fd
[ feat ] rds-repo module - rating age column 추가
dbdb1114 Jan 26, 2025
dc85e29
[ fix ] rds-repo module - Movie 엔티티 getter 추가
dbdb1114 Jan 26, 2025
029dcca
[ test ] rds-repo module 사용자별 티켓 구매 이력 조회 테스트 작성
dbdb1114 Jan 26, 2025
0a13318
[ feat ] module-external 모듈 추가
dbdb1114 Jan 26, 2025
b76e4c7
[ feat ] external module - fcm 앱 푸시 서비스 작성
dbdb1114 Jan 26, 2025
cf3586a
[ feat ] module-core - 티켓 예매 서비스에 대한 커스텀 예외 정의
dbdb1114 Jan 26, 2025
b99c4f9
[ feat ] service module - 티켓 조회 및 예매 기능 구현 및 테스트 코드 작성
dbdb1114 Jan 26, 2025
1e116b3
[ feat ] core module - ticket및 seates 관련 DTO 작성
dbdb1114 Jan 26, 2025
b535eae
[ fix ] core module - spring validation 의존성 추가
dbdb1114 Jan 26, 2025
2468321
[ feat ] app module 예외처리 어드바이스 작성
dbdb1114 Jan 26, 2025
c27d11a
[ feat ] app module 티켓 예매 컨트롤러 및 테스트 코드 작성
dbdb1114 Jan 26, 2025
8caa762
[ feat ] .http 작성
dbdb1114 Jan 26, 2025
db2379e
[ fix ] app module - 유저별 티켓 조회 수정 및 예매 시스템 기능 구현 완료
dbdb1114 Jan 27, 2025
6351b56
[ feat ] pessimisticLock 설정 및 테스트
dbdb1114 Jan 27, 2025
2f032ac
[ feat ] OptimisticLock 설정 및 테스트
dbdb1114 Jan 27, 2025
7db5e3c
Merge remote-tracking branch 'forked-origin/dev' into dev
dbdb1114 Jan 27, 2025
138359a
Merge branch 'dbdb1114' into dev
dbdb1114 Jan 29, 2025
b8875b8
[ Feat ] 설정 정보 변경
dbdb1114 Feb 1, 2025
e963c98
[ feat ] redisson 기반 분산락 aop 구현
dbdb1114 Feb 1, 2025
19c3228
[ feat ] service module aop 기반 분산락 적용
dbdb1114 Feb 1, 2025
4860358
[ feat ] rds-repo module 낙관적락 설정 해제
dbdb1114 Feb 1, 2025
fe569d7
[ feat ] rds-repo module @Version 제거
dbdb1114 Feb 2, 2025
19b2851
[ feat ] 락 점유 실패 exception 정의
dbdb1114 Feb 2, 2025
3330668
[ feat ] service module AOP 기반 분산락 작성
dbdb1114 Feb 2, 2025
1a3aaa6
[ feat ] service module 함수형 분산락 정의
dbdb1114 Feb 2, 2025
a1d22ba
[ feat ] service module ticketService 분산락별 메소드 분리
dbdb1114 Feb 2, 2025
d6b82c5
[ feat ] service module waitTime및 leaseTime 설정
dbdb1114 Feb 2, 2025
28871da
[ feat ] readme 분산락 관련 내용 정리
dbdb1114 Feb 2, 2025
2b5c4b2
Merge remote-tracking branch 'forked-origin/dev' into dev
dbdb1114 Feb 2, 2025
90d5c3b
[ refactor ] service module lock 과정 메소드 분리
dbdb1114 Feb 6, 2025
1a5bddd
[refactor] service module 함수형 분산락 락 점유 및 해제 로직 메소드 분리
dbdb1114 Feb 6, 2025
b2ddd8a
[ refactor ] module service reservation validate 메소드 분리
dbdb1114 Feb 6, 2025
19f200f
[ fix ] rds module ForTransaction 클래스 private 생성자 제거
dbdb1114 Feb 7, 2025
9253439
[ feat ] app module RateLimit Exception 정의 및 advice 등록
dbdb1114 Feb 7, 2025
3dd75a9
[ feat ] app module RateLimt 어노테이션,AOP 정의 및 적용
dbdb1114 Feb 7, 2025
7a65bb6
[ feat ] app module Rate Limit RateLimiter 인터페이스 정의 및 구현체 작성
dbdb1114 Feb 7, 2025
1deea31
[ test ] app module Rate Limit 테스트 작성
dbdb1114 Feb 7, 2025
90d80a6
[ feat ] app module redis Rate Limiter 구현
dbdb1114 Feb 9, 2025
c1aa723
[ feat ] core module CustomException 클래스 재정의
dbdb1114 Feb 15, 2025
5be162b
[ feat ] app,service module CustomException 재정의에 따른 기존 엑셉션 사용 변경
dbdb1114 Feb 15, 2025
97ef489
[ feat ] core, app module build.gradle 최신화
dbdb1114 Feb 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/hanghaeho-postgresql

.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/

### IntelliJ IDEA ###
.idea/
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store
30 changes: 30 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# 1. Build Stage: JDK 21 기반 빌드
FROM eclipse-temurin:21-jdk AS build

WORKDIR /app

# Gradle 설정 및 소스 복사
COPY gradlew .
COPY gradle ./gradle
COPY settings.gradle .
COPY build.gradle .
COPY module-app ./module-app
COPY module-rds-repo ./module-rds-repo
COPY module-service ./module-service
COPY module-core ./module-core

# Gradle 의존성 다운로드 및 빌드
RUN ./gradlew --no-daemon clean build -x test

# 2. Runtime Stage: 빌드된 JAR 실행
FROM eclipse-temurin:21-jre

WORKDIR /app

# 빌드된 JAR 파일 복사
COPY --from=build /app/module-app/build/libs/*.jar app.jar

# Spring Profile 설정 (prod로 고정)
ENV SPRING_PROFILES_ACTIVE=dev

ENTRYPOINT ["java", "-jar", "app.jar"]
175 changes: 172 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,172 @@
## [본 과정] 이커머스 핵심 프로세스 구현
[단기 스킬업 Redis 교육 과정](https://hh-skillup.oopy.io/) 을 통해 상품 조회 및 주문 과정을 구현하며 현업에서 발생하는 문제를 Redis의 핵심 기술을 통해 해결합니다.
> Indexing, Caching을 통한 성능 개선 / 단계별 락 구현을 통한 동시성 이슈 해결 (낙관적/비관적 락, 분산락 등)
## GettingStart
### Docker-Compose 구성
```yaml
version: "3.7"
services:
db:
image: postgres
restart: always
ports:
- "5499:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql # DDL 및 insert
app:
build:
context: . # Dockerfile이 있는 디렉토리
dockerfile: Dockerfile # 사용할 Dockerfile 지정 (옵션)
ports:
- "8999:8080"
environment:
SPRING_PROFILES_ACTIVE: dev
```
### Docker-compose 실행
```shell
mkdir test-dbdb-hanghaeho
cd test-dbdb-hanghaeho
git init
git pull https://github.com/dbdb1114/HangHaeHo
docker-compose -p dbdb1114_hanghaeho up
```
**접속 확인** <br>
http://localhost:8999



## 데이터베이스 설계
### DB ERD
![스크린샷 2025-01-11 오전 11 09 51](https://github.com/user-attachments/assets/efcb6f9b-2f6d-4604-8172-73ed172cf113)
DB설계에서는 구매나 관리자와 같은 것들은 크게 고려하지 않은 상태로 만들었습니다.
기초적인 영화관의 기본 설계를 생각하면 만들었고 테이블별 설계에 대한 이야기는 아래에 드리겠습니다.
### 테이블 및 내부 설계 사항
**공통**<Br>
CreateAt, creatBy, modifyAt, modifyBy 등의 칼럼을 두고, 생성일 및 생성자, 수정일 및 수정자 칼럼을 두었습니다.

**Movie**<br>
영화정보 테이블입니다. 고유 번호를 가지고, 제목(현재는 title로 변경했습니다.), 개봉일(open_day), 러닝타임(running_time), 썸네일 사진(thumbnail_src),
장르id(genre_id), 상영등급(rating_id)를 두었습니다. movie 테이블을 설계하면서 장르와 상영등급을 따로 관리하는 것이 맞는지 고민했는데, 실제로
영화 관련 사이트를 보면, 장르에 대한 설명, 상영등급에 관한 설명, 각각에 대한 이미지 등이 따로 관리될 때도 있습니다. 즉, 단순히 장르와 상영등급이 영화와
1대1 매핑 관계처럼 보이지만 이 외의 쓰임도 있을 수 있는 것을 보아 따로 관리하기로 했습니다.

**rating, genre**<br>
상영등급과 장르 테이블입니다. movie테이블 설명드린 것 처럼 별도의 테이블로 준비했습니다. 현재 항해호 서비스에서는 장르명과 등급명 이외에 따로 관리되는 것은
없기 때문에 각각의 id와 name만 부여했습니다.


**showing**<br>
movie 테이블 다음으로 가장 신경을 많이 쓴 테이블 입니다. 상영 정보는 참조할 내용이 많습니다. 상영관(screen_id), 영화(movie_id), 시작시간(st_time), 종료시간(ed_time) 하나하나 중요한 정보들입니다.
그래서 더더욱 정규화를 지키고자 했습니다. 아직까지 신경이 쓰이는 것은 시간 st_time과 ed_time을 별도 테이블로 관리를 했어야 하는 약간의 아쉬움이 남지만,
그 부분 까지는 좀 과하다는 생각이 들어 진행하진 않았습니다.

**screen**<br>
상영관 테이블 입니다. 지금은 상영관명(name)만을 가지고 있지만 실제로는 아마 대피공간 지도 라던가 대피공간 이미지 등 영화관에 갔을 때 나오는 상영관별로 사용하는
고유 데이터들이 있습니다.

**seats**<br>
좌석 정보 테이블 입니다. 해당 좌석의 상영관과 좌석의 행(row, A-B-C-D-E),열(number)를 주요 데이터로 가지고 있습니다.

**ticket**<br>
ticket은 상영 정보(showing_id), 좌석 정보(seat_id), 판매 상태(status) 칼럼을 가지고 있습니다. 차후 추가적인 요구사항을 개발해 나가면서 좀 더
수정 보완할 부분들이 가장 많이 생기지 않을까 생각이 드는 부분입니다.



## 아키텍처 및 모듈 구성

### Layered Architecture

LayeredArchitecture는 시스템 설계에 있어 가장 클리셰와 같은 아키텍처 입니다. 이번 프로젝트의 아키텍처를 정하면서 여러가지 아키텍처를 둘러보게 됐습니다. 헥사고날 아키텍처의 포트와 어댑트 개념도 있었고, 클린 아키텍처 개념도 있었습니다. 이 중에서 layered architecutre를 선정하게 된 이유는 가장 분리를 위한 철학이 강하다고 느껴졌습니다. 그럼에도 아키텍처 중에서 고민했던 헥사고날을 왜 하지 않게 됐는지도 함께 설명을 드리겠습니다.

**헥사고날은 변화에 강하다**<br>
이번 프로젝트에서 헥사고날 아키텍처와 레이어드 아키텍처를 가장 고민했습니다. 헥사고날을 둘러봤을 때 제가 느낀점은 **변화에 강한 설계** 라고 느꼈습니다. 물론 모든 설계가 변경과 유지보수를 생각하며 고안되었지만, 각 설계마다 특징과 장점은 다양합니다. 그리고 제가 느낀 헥사고날은 변화에 강하다는 느낌이었습니다.

**항해호 프로젝트는 어떤 변화에 대응해야할까?**<br>
큰 변화가 있을 거라고 예상되지 않습니다. 만약 있다면 데이터를 서빙하는 방식에 있어서는 변화될 수 있겠다고 생각했습다. 그렇다면 그 데이터 서빙의 변경을 어느정도 커버를 해야할까 즉, 그러한 변경 지점이 헥사고날 아키텍처를 사용해야할 정도로 다양하고 변화무쌍한가? 제 생각은 아니었습니다. 그 정도의 확장성과 유지보수성은 헥사고날의 학습곡선과 복잡도를 가져가야할 만큼 의미있지 않았습니다.

**왜 레이어드 아키텍처인가**<br>
다른 아키텍처들도 그렇겠지만 레이어드 아키텍처는 코드를 작성하고, 개발하는 것에 있어 어느정도 강제적인 철학을 가집니다. 예를 들어 의존 관계는 단방향 이라던지 계층별로 독립적으로 존재하며, 인터페이스를 통해서만 통신해야 되는 것 등 어떤 명확한 rule을 제시합니다. 그런 좀 더 명확한 룰은 개발 생산성에 도움이 됩니다. 그래서 종합적으로 봤을 때 이번 항해호 프로젝트에서는 레이어드 아키텍처가 적절하다고 판단했습니다.

### 5개의 멀티모듈

![스크린샷 2025-01-08 오전 9.12.35.png](https://github.com/user-attachments/assets/5b6fd9ab-56f4-4dc3-b3d4-de14888bf064)

항해호 프로젝트는 총 5개의 멀티모듈을 가지기로 결정했습니다. LayerdArchitecture를 기반으로 한 모습이지만 거기서 책임과 역할을 조금 더 세분화하여 총 5개의 모듈로 구분했습니다. 레이어드 아키텍처의 철학을 지키면서 각 **모듈별로 의존 관계를 최소화하고 역할과 책임을 독립적으로 가질 수 있도록** 하였습니다. LayeredArchitecture는 모듈별로 **단방향의 의존 관계**를 가집니다. 이를 확실히 지키고자 의존관계를 아래와 같이 제한하기로 했습니다.

1. app 모듈은 service, core모듈에만 의존합니다.
2. service 모듈은 repo-rds, repo-redis, core모듈에만 의존합니다.
3. repo-rds 모듈은 core모듈에만 의존합니다.
4. repo-reids 모듈은 core모듈에만 의존합니다.

| 의존여부 | app | service | repo-rds | repo-redis | core |
| --- | --- | --- | --- | --- | --- |
| app | O | O | X | X | O |
| service | X | O | O | O | O |
| repo-rds | X | X | O | X | O |
| repo-redis | X | X | X | O | O |
| core | X | X | X | X | O |

### core 모듈

![스크린샷 2025-01-08 오전 10.09.57.png](https://github.com/user-attachments/assets/5c920915-5388-4b2b-a042-eed22edb8e15)

| 의존여부 | app | service | repo-rds | repo-redis | core |
| --- | --- | --- | --- | --- | --- |
| core | X | X | X | X | O |

**core 모듈의 철학은 모든 모듈에서 의존하지만, 이 모듈은 오로지 자바에만 의존합니다.** 해당 모듈은 **exception, dto, enum, util** 과 같은 공통적으로 사용되지만 외부 의존성을 필요로 하지 않는 모듈입니다. 시스템 전반적으로 모든 모듈에서 사용해야 하는 것들을 가지고 있습니다. 흔히 다른 멀티 모듈 프로 젝트에서 종종 보이는 common과 같다고 볼 수 있습니다. 다만, 반드시 필요한 것들을 오로지 자바 코드로만 만들어 낸다는 부분에서 철학이 조금 다릅니다. 그 만큼 단순하면서도 공통적으로 쓰이는 것들을 분리하기 위해 설계된 모듈입니다.

저는 core모듈을 통해 서로 다른 모듈간의 통신을 하게하고, 동일하게 사용되는 타입들을 이곳에 정의하여 사용하여 어떻게 보면 시스템의 전반적임 흐름에 대한 책임을 지게 할 예정입니다.

### repo-rds, repo-redis 모듈

![스크린샷 2025-01-08 오전 10.10.31.png](https://github.com/user-attachments/assets/145d1414-a91a-43d0-9a30-6391c1d86bfe)

| 의존여부 | app | service | repo-rds | repo-redis | core |
| --- | --- | --- | --- | --- | --- |
| repo-rds | X | X | O | X | O |
| repo-redis | X | X | X | O | O |

두 부분은 LayerdArchitecture 의 infrastructure에 해당하는 부분들 입니다. 극장 애플리케이션의 전시 시스템은 데이터가 대개 정형적입니다. 실시간으로 바뀐다기 보다는 하루종일 같은 데이터만 사용할 가능성이 높습니다. 이런 시스템의 경우 redis와 같은 inmemory DB를 사용하는 것이 자연스러운 일이고 매번 RDBMS에서 조회하는 것도 다분히 소모적이라고 생각하여 별도의 모듈로 두 가지를 선택했습니다.

처음에는 rds와 redis 두 Infrastructure를 사용한다는 부분에서 repo-rds, repo-redis, service 이 세 모듈을 하나의 domain이라는 모듈로 가져가는게 낫지 않을까라는 고민도 했습니다. 하지만 그렇게 되면 해당 모듈의 책임이 과중해 집니다. **현재 멀티모듈 프로젝트의 목적은 모듈별 역할과 책임의 분리인데, 그런 목적에서 멀어지게 됩니다.**

그렇다고 repo-rds와 repo-redis를 repo라는 하나의 모듈로 가져가는 것 또한 그다지 좋은 선택은 아닌 것 같았습니다. 이때 발생할 수 있는 문제는 앞서 이야기했던 모듈별 역할과 책임의 분리에도 어긋나기도 하고, repo-rds 모듈은 관리자 페이지를 만들게 될 때 재사용을 할 수 있을 것 같은 느낌이 들었습니다. 모듈별 역할과 책임의 분리의 목적 자체가 **교체 혹은 재사용**인데 repo-rds와 repo-redis를 함께 사용했을 때 보다 별도로 나누는 것이 결국 우리가 원하는 목적지에 조금 더 가까워지는 것이라고 생각했습니다.

### service 모듈

![스크린샷 2025-01-08 오전 10.10.48.png](https://github.com/user-attachments/assets/fc69dbb5-01a8-486f-a795-63c656f05885)

| 의존여부 | app | service | repo-rds | repo-redis | core |
| --- | --- | --- | --- | --- | --- |
| service | X | O | O | O | O |

service 모듈은 전시 시스템의 비즈니스 로직만을 책임집니다. 경우에 따라서 repo-rds 혹은 repo-redis를 나눠서 사용하게 됩니다. 실제 service 코드도 service레이어만 가지게 될 예정입니다.

### app 모듈

![스크린샷 2025-01-08 오전 10.14.03.png](https://github.com/user-attachments/assets/1f71f094-993d-4ece-8dc6-e3feeb6ad877)

| 의존여부 | app | service | repo-rds | repo-redis | core |
| --- | --- | --- | --- | --- | --- |
| app | O | O | X | X | O |

app은 전반적으로 클라이언트와 요청을 주고받는 모듈입니다. 애플리케이션의 수문장 같은 녀석이라고 할 수 있습니다. 여기서 filter, interceptor, controller, security 등 요청 처리, 전처리, 후처리 모든 것이 들어갈 곳 입니다.

### 외부 통신을 해야한다면?

여기서 의문이 있었습니다. 만약 pub/sub 구조의 통신을 또 지원해야한다면 어떻게 해야할까? Redis, rabitmq, kafka 등..

![스크린샷 2025-01-08 오전 11.23.22.png](https://github.com/user-attachments/assets/ab5b660b-1e8c-4986-8d44-fe085c4bbc4a)

명확하진 않지만 아마 이런 구조가 되지 않을까 싶습니다. event를 처리하는 모듈을 하나 만들어서 거기서 관리를 하게 할 것이고 어떤 도메인 관련된 job이 생긴다면 service레이어에게 위임을 하는 그런 방향으로 처리를 할 것 같습니다.

### core가 과중해진다면?

현재는 exception, dto, util 등의 패키지들을 둘 목적이지만, 만약 해당 객체가 너무 많아지거나 어쩔 수 없이 core의 역할을 하면서도 외부 의존성을 필요로 한다면 이렇게도 될 수 있을 것 같습니다.

![스크린샷 2025-01-08 오전 11.26.11.png](https://github.com/user-attachments/assets/036e8c14-4300-4f0b-adc3-603580e30928)

네이밍은 조금 더 신경 쓰겠지만 아무튼 이렇게 두 개로 나눠질 수 있지 않을까 싶습니다. 그땐 조금 더 세부적인 책임과 역할이 생긴 상태겠지요
Loading
Loading