Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
e06b320
Docs: 요구사항 분석
dev-wooyeon Jan 7, 2026
3f237e3
Docs: 기능 목록표
dev-wooyeon Jan 7, 2026
6b087f3
Feat: Word 도메인 정의
cwangg897 Jan 7, 2026
92b2e81
Feat: Word 도메인 입력 검증
dev-wooyeon Jan 7, 2026
912b4f8
Test: Word 길이 검증 테스트
cwangg897 Jan 9, 2026
5f4388e
Feat: 문장 판정 결과 enum 추가
dev-wooyeon Jan 9, 2026
d755be2
Feat: 결과, 입력, 답안지 도메인 생성
cwangg897 Jan 9, 2026
3bf898a
Feat: 단어 판정 기능 구현
dev-wooyeon Jan 9, 2026
8b5cfef
Test: 기본 판정 로직 테스트
cwangg897 Jan 11, 2026
bb7cf80
Feat: Game 도메인 정의 및 구현
dev-wooyeon Jan 11, 2026
162debb
Test: Game 종료 조건 테스트
cwangg897 Jan 11, 2026
1fcfc59
Feat: UI 및 Client 구현
dev-wooyeon Jan 11, 2026
3fe1bd5
Feat: main에서 Game과 UI를 연결한다
cwangg897 Jan 11, 2026
bae4ede
Refactor: 규칙 정확도 중복문자 처리
dev-wooyeon Jan 12, 2026
e76f0c3
Refactor: 입력 검증 강화
cwangg897 Jan 12, 2026
a96ad49
Refactor: 정답 선정 고도화 (날짜기반 Index 적용)
dev-wooyeon Jan 12, 2026
27c3407
Refactor: 디렉토리 구조화
dev-wooyeon Jan 12, 2026
397270c
Refactor: 메시지 처리 리팩토링
dev-wooyeon Jan 13, 2026
8e925fe
Refactor: 도메인 구조 개선 및 코드 일관성 확보
dev-wooyeon Jan 29, 2026
654aa1e
refactor: 아키텍처를 DDD 구조로 재구성하고 직관적인 메소드명으로 변경
dev-wooyeon Feb 5, 2026
d593fd9
chore: DDD 구조 및 메인 클래스 설정을 위한 build.gradle 업데이트
dev-wooyeon Feb 5, 2026
0cfc828
docs: DDD 리팩토링 개요 및 마이그레이션 가이드 추가
dev-wooyeon Feb 5, 2026
c73d72a
refactor: Answer 및 GameInput을 Java 21 Record로 변환
dev-wooyeon Feb 5, 2026
011d879
refactor: Java 21 기능 적용 및 코드 네이밍 통일
dev-wooyeon Feb 5, 2026
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
5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
plugins {
id 'java'
id 'application'
}

group = 'camp.nextstep.edu'
version = '1.0-SNAPSHOT'

application {
mainClass = 'wordle.infrastructure.App'
}

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
Expand Down
95 changes: 95 additions & 0 deletions docs/DDD_REFACTORING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# DDD 구조 리팩토링 완료

## 변경 사항

기존 Hexagonal Architecture에서 DDD(Domain-Driven Design) 구조로 리팩토링을 완료했습니다.

## 새로운 디렉토리 구조

```
src/main/java/wordle/
├── domain/ # 도메인 계층 - 핵심 비즈니스 로직
│ ├── word/ # Word 도메인
│ │ ├── Word.java # Aggregate Root
│ │ ├── Answer.java # Value Object
│ │ ├── AnswerSelector.java # Domain Service
│ │ ├── WordRepository.java # Repository Interface
│ │ └── WordCondition.java # Domain Constants
│ ├── game/ # Game 도메인
│ │ ├── Game.java # Aggregate Root
│ │ ├── GameResult.java # Value Object (Result → GameResult)
│ │ ├── GameInput.java # Value Object (Input → GameInput)
│ │ └── validation/ # 검증 관련
│ │ ├── InputValidator.java
│ │ └── ValidationStatus.java
│ └── matching/ # Matching 도메인 (정답 비교)
│ ├── AnswerComparator.java # Domain Service
│ └── MatchResult.java # Value Object (ResultValues → MatchResult)
├── application/ # 애플리케이션 계층 - Use Case
│ ├── GameService.java # Application Service (Client → GameService)
│ └── OutputPort.java # Output Port Interface
└── infrastructure/ # 인프라 계층 - 기술적 구현
├── App.java # Entry Point
├── persistence/ # 영속성
│ └── FileWordRepository.java
└── ui/ # 사용자 인터페이스
└── ConsoleUI.java # (ConsoleOutputAdapter → ConsoleUI)
```

## 주요 변경 내용

### 1. 패키지 구조 변경
- **기존**: `application`, `domain`, `infrastructure` (기술 중심)
- **새로운**: `wordle.domain.{word, game, matching}` (도메인 중심)

### 2. 클래스 이름 변경
더 명확한 의미를 가진 이름으로 변경:
- `Input` → `GameInput`
- `Result` → `GameResult`
- `ResultValues` → `MatchResult`
- `Client` → `GameService`
- `ConsoleOutputAdapter` → `ConsoleUI`

### 3. 도메인별 그룹화
비즈니스 개념에 따라 클래스를 그룹화:
- **word**: 단어 관련 (Answer, Word, WordRepository, AnswerSelector)
- **game**: 게임 로직 (Game, GameInput, GameResult, validation)
- **matching**: 정답 비교 (AnswerComparator, MatchResult)

## DDD 구조의 장점

1. **직관성**: 패키지 이름만 봐도 무엇을 하는지 명확
2. **도메인 중심**: 비즈니스 로직이 기술적 세부사항과 분리
3. **확장성**: 새로운 도메인 추가 시 독립적으로 확장 가능
4. **응집도**: 관련된 클래스들이 같은 패키지에 모여 있음
5. **유지보수성**: 변경 시 영향 범위를 쉽게 파악 가능

## 빌드 및 테스트

모든 테스트가 정상적으로 통과했습니다:

```bash
./gradlew clean build
# BUILD SUCCESSFUL

./gradlew test
# All tests passed
```

## Migration Guide

기존 코드를 새 구조에서 사용하려면 다음과 같이 import를 변경:

```java
// 기존
import domain.model.Word;
import domain.model.Input;
import domain.model.Result;
import application.service.Client;

// 새로운 구조
import wordle.domain.word.Word;
import wordle.domain.game.GameInput;
import wordle.domain.game.GameResult;
import wordle.application.GameService;
```
70 changes: 70 additions & 0 deletions docs/기능_목록표.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# 기능목록표

## MVP
- [x] **[domain] 오늘의 정답 단어를 하드코딩한다**
- 예: `"APPLE"`
- 게임 로직에 집중하기 위한 임시 처리

- [x] **[domain] Word 객체 구현 (길이만 검증)**
- 문자열 래핑
- 5글자가 아니면 예외
- 알파벳 검증

- [x] **[test] Word 길이 검증 테스트**
- 정상 케이스
- 예외 케이스

- [x] **[domain] 문자 판정 결과 enum 추가**
- GREEN
- YELLOW/GRAY

- [x] **[domain] 입력 단어와 정답 비교 로직 구현**
- 같은 위치 + 같은 문자 → GREEN
- 그 외 → YELLOW/GRAY

- [x] **[test] 기본 판정 로직 테스트**
- 완전 일치
- 완전 불일치

- [x] **[domain] Game 클래스 구현**
- 정답 보관
- 시도 횟수 관리
- 종료 여부 상태

- [x] **[domain] 게임은 최대 6번 입력받고 종료된다**
- 정답을 맞히면 즉시 종료
- 6번 시도 후 종료

- [x] **[test] Game 종료 조건 테스트**
- 6턴 초과 불가
- 정답 성공 시 종료

- [x] **[ui] 콘솔 입력으로 단어를 입력받는다**
- [x] **[ui] 판정 결과를 콘솔에 출력한다**
- GREEN / NOT_GREEN 문자열 출력

- [x] **[app] main에서 Game과 UI를 연결한다**
- while 루프 기반
- `System.exit()` 사용 ❌
- 자연 종료

## 리팩토링
규칙 정확도
- [x] YELLOW / GRAY 분리
- [x] 중복 문자 처리

입력 검증 강화
- [x] 알파벳 소문자 검증
- [x] words.txt 기반 사전 검증
- [x] 예외처리 콘솔로그 출력
- [x] 테스트코드 작성

정답 선정 고도화
- [x] AnswerSelector 도입
- [x] 날짜 기반 index
- [x] 관련 테스트 추가

구조 리팩토링
- [ ] Domain / Application / UI 분리
- [ ] Port / Adapter 도입
- [ ] 책임 재배치 및 네이밍 정리
Comment on lines +68 to +70

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 이부분은 실제로 진행해보면 좋을것같네요

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이미 하셨군요

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

체크 표기가 누락되었네요,, 채크 표기 수정해두겠습니다.
확인 감사합니다!

166 changes: 166 additions & 0 deletions docs/요구사항_분석.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
# Wordle 요구사항 분석

## 1. 개요

본 문서는 콘솔 기반 Wordle 게임의 기능 요구사항을 정의한다.
플레이어는 5글자 영어 단어를 입력하여 정답을 맞히며, 최대 6번의 시도가 허용된다.

---

## 2. 규칙

### 2.1 게임 기본 규칙

- 정답은 **5글자 영어 단어**이다.
- 플레이어는 **최대 6회**까지 단어를 입력할 수 있다.
- 각 입력은 즉시 정답과 비교되어 결과가 출력된다.
- 정답을 맞히면 즉시 게임이 종료된다.
- 6회를 모두 사용하면 게임은 실패로 종료된다.

### 2.2 개발 기본 규칙
- 프로그램 종료시 System.exit()을 호출하지 않는다.
- 삼항 연산자를 사용하지 않는다.
- 함수가 한가지일만 하도록 최대한 작게 만든다.
- 기능은 테스트로 확인한다.
- 메소드 길이는 15라인을 넘어가지 않게 구현한다.
- else를 사용하지 않는다.
- 도메인 클래스에 단위테스트가 작성되어야한다.
- Java 21 이상
- 외부 라이브러리 사용 금지
- 콘솔 기반 입출력
- 테스트 코드 작성 필수
- 객체지향 설계 원칙 준수
- 클린 코드 지향
---

### 2.2 판정 규칙 (타일 상태)

각 입력 단어의 문자들은 정답과 비교되어 아래 3가지 상태 중 하나로 판정된다.

| 상태 | 의미 |
|----|----|
| 초록색 | 해당 문자가 정답에 존재하며 위치도 동일 |
| 노란색 | 해당 문자가 정답에 존재하지만 위치는 다름 |
| 회색 | 해당 문자가 정답에 존재하지 않음 |

#### 중복 문자 처리 규칙

- 동일한 문자를 여러 번 입력한 경우, **정답에 존재하는 개수만큼만 초록/노란색으로 표시**된다.
- 초과된 동일 문자는 회색으로 판정된다.
- 예시.
- 정답 : hello
- 입력 : lllll
- 출력 : ⬜⬜🟩🟩⬜

---

## 3. 단어 유효성 규칙

### 3.1 단어 길이

- 입력 단어는 반드시 **5글자**여야 한다.

### 3.2 단어 사전
- 정답과 사용자 입력 단어는 모두 `words.txt` 파일에 포함된 단어여야 한다.
- 사전에 없는 단어는 유효하지 않은 입력으로 처리한다.
- ex.
- 사전에 있는 단어이자 정답 mercy
- 사전에 없는 사용자 입력 nurse
- 출력
1. ⬜⬜🟩⬜🟨 보여주지 않고 횟수를 차감하지 않는다.
2. 유효하지 않은 입력 (채택)
---

## 4. 오늘의 정답 선정 규칙

정답 단어는 날짜 기반으로 결정된다.

- 기준 날짜: `2021-06-19`
- 단어 목록: `words.txt`



### 계산 식
```
배열의 크기 = x * y
index = ((현재 날짜 - 2021-06-19) % 배열의 크기)
오늘의 정답 = words[index]
0 ~ 29까지 출제된다
```
- 동일한 날짜에는 항상 동일한 정답이 선택된다.

---

## 5. 사용자 흐름

1. 게임 시작 메시지를 출력한다.
시작 메시지는 다음과 같다.
```
WORDLE을 6번 만에 맞춰 보세요.
시도의 결과는 타일의 색 변화로 나타납니다.
```

2. 사용자에게 단어 입력을 요청한다.
입력단어 길이를 제한하지 않는다

3. 사용자가 5글자 단어를 입력한다.
4. 입력 단어의 유효성을 검증한다.
- 길이 검사
- 사전 포함 여부 검사
- words.txt파일에 있는 단어만인데 배열크기-1 만큼 조회하면 더 빠르게 조회가 가능하다
5. 정답과 입력 단어를 비교하여 타일 결과를 생성한다
- ⬜ : 위치도 안맞고 스펠링도 안맞는 경우
- 🟨 : 스펠링은 맞지만 위치가 틀린 경우
- 🟩 : 스펠링도 맞고 위치도 맞는 경우
6. 결과를 누적 보드 형태로 출력한다.
- 계속 쌓아간걸로 표현되어야 한다
7. 정답을 맞히면 성공으로 게임을 종료한다.
- System.exit(0); // 강제 종료 - 이렇게 하지 말라는 것
- 종료처리에 대한 상태를 추가한다
8. 6회 시도를 모두 소진하면 실패로 게임을 종료한다.
- 종료처리에 대한 상태를 추가한다
---

## 6. 출력 명세

### 6.1 시작 메시지

- `WORDLE을 6번 만에 맞춰 보세요.`
- `시도의 결과는 타일의 색 변화로 나타납니다.`

### 6.2 입력 안내

- `정답을 입력해 주세요.`

### 6.3 결과 출력

- 각 시도 후, 이전 결과를 포함한 전체 보드를 출력한다.
- 성공 시 다음 형식의 결과 요약을 출력한다.

```
성공시도수 / 6
예: 4/6
```


---

## 7. 종료 조건
- 성공여부에 대한 상태를 추가한다
- 성공여부는 긍정형으로 작성한다

### 7.1 성공 종료
- 입력한 단어가 정답과 완전히 일치한 경우

### 7.2 실패 종료
- 6번의 시도 동안 정답을 맞히지 못한 경우

---

## 8. 용어 정의

| 용어 | 설명 |
|----|------------------------|
| 시도 | 사용자가 단어를 한 번 입력하는 행위 |
| 타일 | 문자 하나에 대한 판정 결과 |
| 보드 | 전체 시도 결과를 누적한 출력 영역(행) |
Comment on lines +164 to +166

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋습니다!

Empty file removed src/main/java/.gitkeep
Empty file.
Loading