Skip to Content
Step2A-3. 도메인 로직 위치 — utils? reducer? 어디에?

A-3. 도메인 로직이 엉뚱한 곳에 — utils? reducer? 어디에 있어야 할까?

이렇게 읽어보세요: 선배 크루의 고민 → 토론 질문을 먼저 읽고 → AS-IS 코드를 직접 분석 → 리뷰어의 피드백으로 관점 확인 → 탐색 미션에서 PR 깊이 파기

선배 크루의 고민

“도메인과 관련된 로직을 util로 빼는 실수를 한 것 같아요. 처음 구현 당시 webOutputView에 있는 게 맞나에 대한 의문에서 dom 디렉토리로 분리했던 것 같습니다!” — 마루, PR #300 

“validator가 utils에 있어도 되는 건지 고민이 됩니다. 검증 로직이 도메인에 속하는 건지, 범용 유틸리티인 건지 구분이 잘 안 됩니다.” — 신세한탄, PR #56 

“Lotto와 LottoMachine의 역할 구분이 혼란스럽습니다. 어디까지가 Lotto의 책임이고 어디서부터 LottoMachine이 해야 하는지 경계가 모호합니다.” — 앵버, PR #355 

이 코드를 보면서 이야기해봅시다

  • utils/dom이라는 파일명만 보고, createLottoResultTable 같은 함수가 여기 있을 거라고 예측할 수 있나요?”
  • “범용 헬퍼($, create)와 도메인 로직(PRIZE를 아는 함수)이 한 객체에 섞여 있으면, 내 코드에서 도메인 로직을 찾으려 할 때 어떤 문제가 생기나요?”

AS-IS 코드

출처: PR #300 — 마루 (2024, 2단계)  · 해당 파일 

// utils/dom/index.js — 범용 DOM 유틸 객체 안에 로또 도메인 로직이 섞여 있는 패턴 import PRIZE from '../../constants/prize'; const dom = { $(selector) { /* 범용 DOM 헬퍼 */ }, create(tag, id, className, text) { /* 범용 DOM 헬퍼 */ }, // 아래 함수들은 로또 당첨 등수(PRIZE)를 직접 사용하는 도메인 로직 createLottoResultTitle() { const lottoResultRowTitle = document.createElement('div'); PRIZE.TABLE_TITLE_LIST.forEach(text => { const lottoTableTitle = this.create('div', null, 'lotto-result-cell', text); lottoResultRowTitle.appendChild(lottoTableTitle); }); return lottoResultRowTitle; }, createLottoResultTable(ranks) { const resultTableFragment = document.createDocumentFragment(); [PRIZE.FIFTH, PRIZE.FORTH, PRIZE.THIRD, PRIZE.SECOND, PRIZE.FIRST].forEach(rank => { const lottoResultRow = this.create('div', null, 'lotto-result-row'); const lottoMatchedCount = this.create('div', null, 'lotto-result-cell', `${PRIZE.COUNT_OUTPUTS[rank]}`); const lottoResultPrize = this.create('div', null, 'lotto-result-cell', `${PRIZE.AMOUNT[rank].toLocaleString()}`); const lottoRankCount = this.create('div', null, 'lotto-result-cell', `${ranks[rank]}개`); lottoResultRow.append(lottoMatchedCount, lottoResultPrize, lottoRankCount); resultTableFragment.appendChild(lottoResultRow); }); return resultTableFragment; }, };

리뷰어의 피드백

“보편적인 디렉토리에 보편적인 네이밍으로 위치하고 있어서 이런 로직이 포함될 것이라고 예측하기 힘든 것 같아요. 분리하거나, 위치를 변경하면 좋을 것 같은데 어떻게 생각하시나요?” — PR #300 (링크 )

“파일/객체의 이름이 그냥 modal이어서 보편적으로 모달을 열고 닫는 함수일 것이라고 추측했는데, 내부에서는 lotto 관련된 네이밍이 많은 것 같아요! 아예 유틸적인 modal처럼 만들거나, 위치와 네이밍을 재고해보는 것도 좋을 것 같습니다!” — PR #300 (링크 )

“중요한 부분은 드러내고 중요하지 않은 부분은 감추라. 입력·출력·데이터 생성·데이터 변경을 각각 개별적으로 추상화해야 합니다.” — PR #355 (링크 )


Last updated on