1주차 과제#27
Hidden character warning
Conversation
|
제가 급하게 올린터라 커밋을 나누지 못했습니다. 루트와 각 모듈의 README.md 파일을 확인부탁드립니다! |
- CinemaCommandAdapter 에 TODO 남김(exception 처리를 위한 공통 모듈 필요성) - 각 모듈 별로 독립적인 cinema 생성 코드 작성
ann-mj
left a comment
There was a problem hiding this comment.
안녕하세요~ 1주차 과제를 진행하시느라 고생많으셨습니다.
[전체적인 피드백]
- 외부에서 domain 에 대한 의존도를 최대한 제거하시려고 설계하신 모습이 느껴졌고, 좋았습니다.
- 특히, 모듈 간 순환참조가 없게 잘 설계해주신 것 같습니다!
[질문에 대한 답변]
- Application 모듈까지 Transaction 관리를 적용하는 게 맞는 방향일까요?
- 생각하시는 장점이 어떤게 있을지 의견주시면 좋을 것 같아요!
- 하나의 application 안에서 여러개의 infrastructure가 있을 때에만 필요할 것 같다고 생각합니다.
- 일반적으로는 infrastructure 레벨에서만 관리하는 것으로 알고 있습니다.
- 현업에서는 Port-Adapter 패턴을 많이 사용하는지,
- 제 회사에선, port-adapter 까지 세부적으로 나누진 않았습니다. 그냥 팀 내에서 코드리뷰를 주기적으로 하면서 계층간 서로 의존도가 없도록 관리하는 편입니다. 하지만, 계층 내에서도 하나의 port 를 통해 여러 adapter가 존재해야 하는 케이스가 있을 때는 유사하게 interface 로 설계해서 구현할 때도 있었습니다.
- 멀티 모듈을 잘 이해하고 여러 에러들이 있었을텐데 잘해주신 것 같습니다!! 👍
| updated_at datetime(6) null, | ||
| created_by binary(16) null, | ||
| updated_by binary(16) null, | ||
| constraint fk_seat_cinema foreign key (cinema_id) references cinema (cinema_id) |
There was a problem hiding this comment.
실무에서는 FK 참조 무결성으로 인한 성능, 데이터 이관, 클렌징 작업 등의 편의성 때문에 FK를 걸지 않은 경우가 많은데,
이번 프로젝트의 경우에서도 데이터의 무결성이 중요하지는 않고, FK 가 반드시 필요하지는 않은듯 하여.. 제거해주셔도 좋을 것 같습니다.
There was a problem hiding this comment.
Mysql 를 쓰는 이유가 innoDB의 장점을 가지고 가기 위해서 사용하는 것으로 알고 있는데요,
데이터 이관, 클랜징 작업은 FK로 얽혀 있는 경우 불편하다는 것은 이해했습니다.
다만 FK 참조 무결성이 성능에 저하를 일으키는 이유는 알겠지만, 꼭 필요한 경우와 필요하지 않은 케이스를 구분하는 게 조금 난해한것 같습니다.
지금 위의 sql에서 contraint만 빼서 관계만 제거하는 개념으로 거의 모든 RDB를 사용하나요?
There was a problem hiding this comment.
애플리케이션 내부에서 관리를 하는 경우, 단순한 참조라면은 굳이 fk를 설정할 필요가 없다고 생각하구요.
혹 부모,자식관계에 있는 케이스 (댓글-게시글 처럼) 의 경우에는 fk 를 꼭 강제하기도 합니다.
요것도 정책적인 부분이긴 하지만 저희는 이번 프로젝트 내부적으로는 강한 제약이 없다고 봐주시면 될 것 같아요!
| #### **의존관계** | ||
| - `presentation` → `application` → `infrastructure` | ||
| - `application` → `domain` | ||
| - `infrastructure` → `domain` |
| @Value | ||
| @AllArgsConstructor(access = AccessLevel.PRIVATE) | ||
| public class Cinema { | ||
| UUID cinemaId; |
There was a problem hiding this comment.
id들은 모두 unsigned int 형으로 될 수 있도록 long 또는 int를 사용해주세요~
| --- | ||
|
|
||
| #### **`ScreeningsQueryParam`** | ||
| - 비즈니스 로직 수행에 필요한 파라미터를 캡슐화한 클래스. |
There was a problem hiding this comment.
바로 request 에서 get해서 사용하는게 직관적이지 않을까 생각이 들었는데요~
request 를 통해 param 을 캡슐화하면 어떤 장점이 있나요?
There was a problem hiding this comment.
캡슐화라는 말은 조금 과한 것 같네요..ㅎ
그보다, presentation 모듈에서 client로부터 받는 요청이 변경되었을 때, application에서의 영향이 적다는 것을 이야기하고 싶었습니다.
사실 presentation에서 application으로 전달되는 파라미터는 어찌보면 동일하게 넘어갈 수 있겠지만,
협업하는 입장에선 하나의 요청이 각 모듈에서 전달되는 인자가 강하게 얽혀있으면
한 사람이 모두 수정을 해야하기 때문에 나누는게 좋다고 생각했습니다.
반대로 말해서 얽혀있지 않다면, 여러사람이 각 모듈을 수정 가능하다는 것을 어필하고 싶었습니다!
There was a problem hiding this comment.
일하다보니 api spec이 너무 자주 변할때도 있어서 결합도를 낮추는 코드가 의미가 없어질 때도 있더군요.🥲
결합도를 낮추는 의도에서 좋은 접근이신 것 같습니다.
다음 주차부터 계속되는 endpoint들도 잘 설계해주신다면 파라미터가 무분별하게 추가되는 일도 막을 수 있겠네요! 변화에 항상 열려있는 코드를 짜는게 힘든데, 의도가 명확하셔서 좋네요 ㅎㅎ
There was a problem hiding this comment.
항상 생각만 하다 실제로 구현해보니 초반에 조금 힘들긴했습니다...ㅎ
리뷰 감사합니다!
추가로,
Application 모듈까지 Transaction 관리를 적용하는 게 맞는 방향일까요? 에대한 답변
생각하시는 장점이 어떤게 있을지 의견주시면 좋을 것 같아요!
하나의 application 안에서 여러개의 infrastructure가 있을 때에만 필요할 것 같다고 생각합니다.
일반적으로는 infrastructure 레벨에서만 관리하는 것으로 알고 있습니다.
이 부분은 경험이 부족하다보니 잘 몰랐는데, '일반적으로는 infrastructure 레벨에서만 관리하는 것으로 알고 있습니다.'인지가 궁금했습니다. 실제로 지금 프로잭트에서 많은 관계를 물고 있는 상영시간표 CUD를 하다보니 말씀해주신게 맞다는 판단이 조금씩들고 있습니다.
감사합니다!!
|
|
||
| 1. **외부 통신 및 기술 로직 담당** | ||
| - 데이터베이스, 외부 API, 메시지 큐 등 외부 시스템과의 통신을 처리. | ||
| - JPA, Flyway 등 구체적인 기술을 활용하여 데이터를 저장하고 조회. |
There was a problem hiding this comment.
Flyway 가 형상 관리를 하는 도구라고 알고 있는데요. 혹 해당 프로젝트에서 선택하신 이유가 있었을까요?
There was a problem hiding this comment.
저는 모듈을 분리하고, 의존도를 낮추는 방향으로 개발을 하는 게
결과적으로 협업을 위한 것으로 판단했습니다. 이번 과제도 앞서 말한 것을 염두한게 아닐까 생각했구요.
플라이웨이는 제가 기존에도 많이 애용하게 되던 툴인데,
말씀하신 것처럼 형상관리 도구이면서도,
- 데이터베이스 구조나 코드 변경 이력을 추적하여 언제, 누가, 무엇을 변경했는지를 명확히 파악
- validation, none 상태에서 팀원들이 동시에 작업하더라도 에러를 명시적으로 확인가능하여 수정하기 용이
- 데이터 베이스 변경 사항 관리 가능(테이블로도 확인 가능)
이라는 측면에서 사용해봤습니다.
docker의 볼륨으로 하는 것보다 익숙한 이유도... 한 목 했습니다..ㅋㅋ
There was a problem hiding this comment.
복잡한 설정없이 편하게 사용할 수 있나보군요?
저희는 DBA가 따로 있어서 그분들에게 요청했었는데 JPA랑 같이 쓰면 편할 것 같은데, mybatis 로 쓰는 사람들도 잘 쓸수있을까요?
There was a problem hiding this comment.
mybatis는 잘 모르겠습니다..ㅎ
설정은 그냥
- 의존성추가
- yaml 파일에 "사용겠다", "해당 경로를 통해 쓰겠다" 정도라 편합니다.
- 파일을 만드는 규칙만 알면 쉬운것 같습니다(1년차인 저도 회사에서 그냥 설명듣고 바로 썼습니다)
개인적으로는 checksum으로 파일을 함부로 변경불가능하게 만들어서, 버전관리를 엄격하게 다루고 있다는게 좋은 것 같습니다.
에플리케이션 실행단계에서 flyway가 먼저 동작해서 hibernate가 validate하기 이전에 동작하는 걸로 알고 있는데,, 이 구조대로라면, mybatis는 버전관리 스크립트를 보고 설계하는 정도일 것이라고 생각되긴합니다!
늦은 시간인데도 리뷰를 해주셔서 정말 감사합니다!!ㅠㅜ
- 간단하게 application 테스트 코드 추가
- 각 모듈 별 테스트 환경 구축
- 최소한의 도메인 생성 시, 검증 로직 추가
- 이번 프로잭트의 취지에 맞도록 foreign key 참조는 전부 제거
- flyway 로 foreign key 제거 후 이력 관리
- application 레벨에서 키를 관리
- application 레벨에서 키를 관리함을 명시적으로 설정
- foreignKey = @foreignkey(value = ConstraintMode.NO_CONSTRAINT)
- 곁다리로 임시 데이터 생성 스크립트 주석 처리(지우긴 아쉬워)
제목(title)
멀티모듈 구성 및 API 구현
작업 내용
멀티모듈 구성
테이블 설계
발생했던 문제와 해결 과정을 남겨 주세요.
문제 1 - 멀티 모듈 구성의 복잡성
Gradle(전역) 설정과 Gradlew 설정 충돌 문제로 인해 빌드 실패. 전역 Gradle을 삭제하고 Gradlew를 기준으로 통일하여 해결.
문제 2 - Port-Adapter 패턴 적용 시 각 모듈 간 인터페이스 설계의 어려움
상위 모듈(application)이 하위 모듈(infrastructure)을 알지 못하도록 인터페이스를 정의.
하위 모듈(infrastructure)에서 인터페이스를 구현하여 분리.
문제 3 - Application 모듈에서 외부 기술의 의존도를 제거하는 방법 고민
Application과 Infrastructure 모듈 모두 Domain을 참조하도록 설계.
이를 통해 Infrastructure의 외부 기술(entity, JPA)을 Application이 알지 못하도록 분리.
이번 주차에서 고민되었던 지점이나, 어려웠던 점을 알려 주세요.
리뷰 포인트
만약 맞다면, 현재 구조나 코드에서 어떤 변경이 필요한지 조언 부탁드립니다.
기타 질문
하지만 모듈 간 의존도가 감소하고, 각 모듈이 독립적으로 작업 가능해졌다는 점에서 효율적이라 느꼈습니다.
현업에서는 Port-Adapter 패턴을 많이 사용하는지, 그리고 제가 작성한 코드가 적절하게 구현된 것인지 궁금합니다.