Open shbada opened 2 years ago
분석하느라 고생하셨어요 👍컬럼 부분은 이번 피드백에서는 최대한 Comment 안할게요 !
전체적으로 구성은 좋은 것 같아요. 다음 Step 에서는 피드백 참고해서 조금 더 디테일하게 진행 해보시면 좋을 것 같습니다 ㅎㅎ
room_id INT(11) NOT NULL COMMENT '객실 일련번호'
현재 시스템 컬럼을 아래와 같이 사용 중이신데, Spring Data 에서 제공해주는 네이밍을 따라가는 건 어떨까요?
MOD_DTS DATETIME(6) NOT NULL COMMENT '등록일자',
MOD_USER_IDX INTEGER NOT NULL COMMENT '수정자',
REG_DTS DATETIME(6) NOT NULL COMMENT '등록일자',
REG_USER_IDX INTEGER NOT NULL COMMENT '등록자',
COMMENT 오타 수정 부탁드립니다 ㅎㅎ
CREATED_AT ~ 등록일자
CREATED_BY ~ 등록자
LAST_MODIFIED_AT ~ 수정일자
LAST_MODIFIED_BY ~ 수정자
MYSQL 에서 charset 은 데이터베이스마다 설정을 어떻게 했는지에 따라 다르긴 한데, 예시로 아래와 같은 것들이 있습니다.
DEFAULT character set utf8mb4 collate utf8mb4_unicode_ci;
DEFAULT character set utf8 collate utf8_general_ci;
데이터베이스 기본 설정을 따라가도 상관은 없을 것 같아요 ㅎㅎ
FK 설정 부탁드립니다 :)
PK 부분도 IDX BIGINT NOT NULL,
이렇게 되어있는 부분 MYSQL 로 작성 부탁드려요 ㅎㅎ
해당 부분은 조금 더 진행되시고나서 피드백 드리겠습니다
개인적인 생각으로는 객실에는 객실마다 기본 요금이 있을 것 같고, 추가 옵션 처럼 관리되는 요금이 있을 것 같습니다 :)
전체적으로 테이블 잘 짜주신 것 같아요 👍 👍 질문은 [Q] 로 표시해두겠습니다.
PK
IDX BIGINT
PK 생성 부분 BIGINT 까지는 필요 없을 것 같습니다. 보통 INT(11) 정도에 unsigned 면 되지 않을까 생각합니다 :)
FK
RESPE_USER_IDX 부분은 나중에 PARTNER_CENTRAL_ID 로 바뀔 것 같습니다 :) 일단은 지금은 그대로 두셔도 될 것 같아요 ㅎㅎ
System Column
createdBy 와 lastModifiedBy 에 DEFAULT 'SYSTEM'
을 주는것은 어떨까요? 예외의 상황에는 DEFAULT 값이 들어가게끔 해주는것도 좋을 것 같습니다.
테이블이 아닌 공통코드로 가져가도 될지?
ACCOMMODATION_TYPE 을 보면 FK 가 아무것도 안걸려있습니다. 숙박업체를 등록할때 타입을 먼저 선택하는데, ACCOMMODATION 쪽에 타입이 존재해야하지 않을까 생각합니다.
변경 가능성이 거의 없거나, 추가 되더라도 빈도가 엄청 낮은 경우에는 테이블로 관리하는 것도 괜찮고, 코드에서 Enum 으로 관리해도 충분하지 않을까 생각합니다.
개인적으로는 Enum 이 낫지 않을까 생각합니다. Table 로 빼는 순간 조회가 한 번 더 늘어나기도 하고 혹은 서로 테이블간 객체간 관계를 맺어줘야하기 때문에..
어차피 등록할때 타입을 선택하고, 타입은 ACCOMMODATION 에 들어가야할 것 습니다😄
진행 상태 코드 : 승인(APPROVAL) 과 반려(DENY), 대기(PENDING)
ROLE 에 탈퇴와 관련된 코드
를 하나 추가하면 어떨까요? SOFT DELETE
처럼 사용할 수 있을 것 같습니다. 그리고 정석적으로 한다면 ROLE 에 대한 HISTORY TABLE 이 하나 존재해야하긴 하지만 일단, 노가다성 작업이라고 생각돼서 빼고 진행하는거로 할게요 ㅎㅎ
진행 상태 코드를 권한쪽에다 관리하면, 일단 권한을 세세하게 가져갈 필요는 없겠네요. 단순히 내 숙박 업체가 어떤 상태인지만 체크하면 될 것 같네요 :) 👍
우선순위 관련 컬럼은 PRIORITY
로 제안해 봅니다 😄 다른 테이블에서도 테이블명_ORDER
로 쓸 필요 없고 모든 우선순위 컬럼은 PRIORITY 로 통일하면 좋지 않을까 생각합니다.
GROUP_COMMON_CODE, COMMON_CODE 부분
코드값이 UNIQUE 하더라도 PK 는 인조키로 잡는게 좋습니다. 어떤일이 발생할지 모르기때문에 ㅎㅎ 저는 PK 를 인조키로 생성하고, 코드값에 UNIQUE INDEX 를 걸어줄 것 같습니다 😄
GROUP_COMMON_CODE, COMMON_CODE, ROOM_INFO 되게 잘 풀어주신것 같아요 👍
CODE_VALUE(Y/N)
공통 코드 제공 관련 여부는 활성화 여부
랑 같은 역할인 것 같은데 ACTIVE
로 통일하는게 어떨까 제안합니다. Y/N 값을 갖는 컬럼을 CODE_VALUE 로 한다면, 코드에서는 String 타입으로 받아야 하고 아래와 같이 코딩이 되겠죠?
String codeValue;
그러면 다른 사람이 봤을때 codeValue 가 뭔지 짐작하지 못할 것 같습니다. 물론 @Column 을 사용하여 필드명을 다른 것으로 바꿔줄 수 있겠지만, boolean 값을 받는 ACTIVE 컬럼으로 통일하면 좋지 않을까 생각합니다.
boolean active
이러한 이유 때문에 개인적으로 YN 컬럼을 별로 좋아하지 않습니다 😅
여기도 Y/N 컬럼에 대해서는 ACTIVE 라는 명칭을 사용하면 어떨까 생각합니다.
몇개 LAST_MODIFIED_AT DATETIME(6) NOT NULL COMMENT '등록일자', 이런식으로 컬럼과 COMMENT 가 매칭이 안되는 부분이 있습니다 :)
CREATED_BY INTEGER NOT NULL COMMENT '등록자', 이런식으로 INTEGER 로 되어있는 오타도 있습니다.
시스템 컬럼 위주로 한번 훑어봐주시면 좋을 것 같아요
[Q] https://github.com/cIonecoder/expedia/issues/2#issuecomment-1101482129 서해님 생각도 궁금하네요 ㅎㅎ. IDX 랑 ID 어떤 네이밍이 더 좋을지, 서해님 생각이 궁금합니다.
- 저도 이건 단순히 명칭 차이로, 어떻게 관리하느냐인거 같아요! 그래서 IDX, ID 중 어느 것으로 갈지 통일하면 될것같습니다 ㅎㅎ
IDX BIGINT PK 생성 부분 BIGINT 까지는 필요 없을 것 같습니다. 보통 INT(11) 정도에 unsigned 면 되지 않을까 생각합니다 :)
- 넵! 조언 감사합니다~
createdBy 와 lastModifiedBy 에 DEFAULT 'SYSTEM' 을 주는것은 어떨까요?
[질문]
- 제가 생각한 createdBy, lastModifiedBy 에는 USER_ACCOUNT 테이블의 id 로 생각했거든요! 'SYSTEM' 이라 하시면, USER_ACCOUNT, USER_INFO 테이블의 어떤 컬럼값을 말씀하시는 건가요?!
- https://github.com/cIonecoder/expedia/issues/2
ACCOMMODATION_TYPE 을 보면 FK 가 아무것도 안걸려있습니다. 숙박업체를 등록할때 타입을 먼저 선택하는데, ACCOMMODATION 쪽에 타입이 존재해야하지 않을까 생각합니다. 권한 테이블을 보면 타입을 FK 로 잡고있는데, 어떤 이유에서 위 처럼 설계한 것인지 궁금합니다
- 우선 이 테이블은 enum, code table 중에 어떤걸로 갈지는 좀더 고민해보겠습니다 ㅎㅎ
- FK가 없던 이유는, ACCOMMODATION_ROLE 에서 관리되기 때문이였습니다~ ACCOMMODATION_TYPE 의 코드를 select box 로 보여줄테고, 이 중에 선택된 데이터와 진행상태가 ACCOMMODATION_ROLE에 들어가는 방향으로 생각했고, 하나의 숙박업체의 유형이 여러개일 수 있다고 생각했는데 야놀자/Expedia 등을 보니, 여러 타입을 가지고있진 않은것으로 확인되서 이부분은 수정했습니다!
저도 이건 단순히 명칭 차이로, 어떻게 관리하느냐인거 같아요! 그래서 IDX, ID 중 어느 것으로 갈지 통일하면 될것같습니다 ㅎㅎ
그러면 ID 로 통일하는 거로 하겠습니다 :)
제가 생각한 createdBy, lastModifiedBy 에는 USER_ACCOUNT 테이블의 id 로 생각했거든요! 'SYSTEM' 이라 하시면, USER_ACCOUNT, USER_INFO 테이블의 어떤 컬럼값을 말씀하시는 건가요?!
id 값이 맞는데 만약에 id 값이 안들어가지거나(버그 등으로 인해) 혹은 개발자(시스템 관리자라고 할게요)
가 수정하는 경우나? 그런 경우에 DEFAULT 값이 있어야 하지 않을까 해서 말씀드렸습니다 ㅎㅎ
CREATED_BY INT(11) NOT NULL DEFAULT 'SYSTEM' COMMENT '등록자',
STOPPED_DTS DATETIME(6) COMMENT '중지일자',
STOPPED_RSN LONGTEXT COMMENT '중지사유',
이 두 컬럼은 뭔가 히스토리 테이블에 있어야 어울릴 것 같은데, 빼도 되지 않을까요? History table 을 안쓰니까, 추가하신거면 상관은 없을 것 같습니다 :)
그러면 ID 로 통일하는 거로 하겠습니다 :)
넵! 이건 수정했습니다~
id 값이 맞는데 만약에 id 값이 안들어가지거나(버그 등으로 인해) 혹은 개발자(시스템 관리자라고 할게요) 가 수정하는 경우나? 그런 경우에 DEFAULT 값이 있어야 하지 않을까 해서 말씀드렸습니다 ㅎㅎ
아하 근데 만약 id 값이 들어갈 수가 없거나, 빈 값이라면 에러 발생이 맞지 않을까여? DEFAULT 지정하면 에러 없이 'SYSTEM'으로 데이터가 삽입될거 같아서 이 점은 운영으로 가져갈시에는 설정하지 않는게 낫지 않을까 라는 생각이 들어요! 시스템 관리자가 직접 수기/수정할 때에도 개인의 사번 등으로 직접 문자열을 넣지않을까요?!
이 두 컬럼은 뭔가 히스토리 테이블에 있어야 어울릴 것 같은데, 빼도 되지 않을까요? History table 을 안쓰니까, 추가하신거면 상관은 없을 것 같습니다 :)
숙박업체가 중지 상태로 변경됬을때 데이터를 넣어두려고 추가했습니다! 히스토리 테이블을 안써서 추가한거 맞아요!ㅎㅎ
Aggregate 확정 과정
[1] accommodation aggregate1.png [Aggregate : ACCOMMODATION]
Aggregate Root : ACCOMMODATION 1) ACCOMMODATION_ROLE 2) ACCOMMODATION_ROOM 2-1) ACCOMMODATION_ROOM_INFO 2-2) ACCOMMODATION_ROOM_FEE 3) ACCOMMODATION_GROUP_COMMON_CODE 3-1) ACCOMMODATION_COMMON_CODE
[2] accommodation aggregate2.png [Aggregate : ACCOMMODATION]
Aggregate Root : ACCOMMODATION ACCOMMODATION_ROLE ACCOMMODATION_ROOM 2-1) ACCOMMODATION_ROOM_INFO 2-2) ACCOMMODATION_ROOM_FEE
[Aggregate : ACCOMMODATION_GROUP_COMMON_CODE]
Aggregate Root : ACCOMMODATION_GROUP_COMMON_CODE 1) ACCOMMODATION_COMMON_CODE
[3] accommodation aggregate3.png [Aggregate : ACCOMMODATION]
[Aggregate : ACCOMMODATION_GROUP_COMMON_CODE]
[Aggregate : ACCOMMODATION_COMMON_CODE]
1) 같은 Aggregate에 속한 구성요소는 대부분 함께 생성되고 함께 제거된다. -> 숙박업체 공통코드 테이블이지만 숙박업체의 데이터에 따라 변경되는 데이터는 아닌거같다고 생각했어요! 2) 'A가 B를 갖는다' 로 설계할 수 있는 요구사항이 있더라도 이것이 반드시 A와 B가 한 Aggregate에 속한다는 것을 의미 하는 것은 아니다. -> 숙박업체가 숙박업체 공통코드 데이터를 갖고있지만, 함께 생성되고 삭제된느 데이터가 아니므로 반드시 한 Aggregate에 포함되지 않을 수 있다. 3) ACCOMMODATION_GROUP_COMMON_CODE 테이블이랑 ACCOMMODATION_COMMON_CODE 테이블 분리 -> ACCOMMODATION_GROUP_COMMON_CODE 테이블이랑 ACCOMMODATION_COMMON_CODE 테이블이 숙박업체 그룹 공통코드 (ACCOMMODATION_GROUP_COMMON_CODE) : 숙박업체 공통코드 (ACCOMMODATION_COMMON_CODE) = 1 : N
연관관계는 가지고있지만 같은 라이프사이클을 가졌다기에는 애매하고, 별도로 관리되는 테이블 데이터라고 생각해서 각각의 Aggregate로 분리
고생하셨습니다 ~ 👏👏👏
ATDD 하러 가시죠 ~
ACCOMMODATION (숙박업체)
ACCOMMODATION_TYPE (숙박업체 타입)
Enum
ACCOMMODATION_ROLE (숙박업체 권한)
ACCOMMODATION_ROOM (객실)
ACCOMMODATION_GROUP_COMMON_CODE (숙박업체 그룹 공통코드)
ACCOMMODATION_COMMON_CODE (숙박업체 공통코드)
비즈니스 시설 (A001) 1) 비즈니스 센터 A001-01 2) 회의 시설 A001-02 3) 팩스/복사 A001-03
상점 1) 구매 상점 B001-01 2) 미용실 B001-02
기타 1) 엘리베이터 C001-01 2) VIP용 시설 C001-02
ACCOMMODATION_ROOM_INFO (객실 부가정보)
1) 침실 위치 침실 / 거실 / 기타공간 2) 숙소에서 이용할 수 있는 부가기능 (bar, 사우나, 무료 WIFI, 에어컨 등) 3) 숙소 정책 (흡연 가능 여부, 반려동물 동반 가능 여부 등)
ACCOMMODATION_ROOM_FEE (객실 요금)
테이블 관계
History
Aggregate
[3] accommodation aggregate3.png [Aggregate : ACCOMMODATION]
2-1) ACCOMMODATION_ROOM_INFO 2-2) ACCOMMODATION_ROOM_FEE
[Aggregate : ACCOMMODATION_GROUP_COMMON_CODE]
[Aggregate : ACCOMMODATION_COMMON_CODE]