Skip to content

[6기] 3주차 Wordle 과제 제출 - 우연#42

Open
dev-wooyeon wants to merge 24 commits intowoowahan-pjs:mainfrom
dev-wooyeon:main
Open

[6기] 3주차 Wordle 과제 제출 - 우연#42
dev-wooyeon wants to merge 24 commits intowoowahan-pjs:mainfrom
dev-wooyeon:main

Conversation

@dev-wooyeon
Copy link
Copy Markdown

페어 : 초이
방식 : 작업 명세서 기반 커밋 단위로 교체, 50분마다 10분 휴식
진행 : 총 10시간 진행

  • 1/5(월) 21:00 ~ 23:00 (2시간) - 온라인
  • 1/7(수) 21:00 ~ 24:00 (3시간) - 온라인
  • 1/11(일) 20:00 ~ 23:00 (3시간) - 온라인
  • 1/12(월) 21:00 ~ 23:00 (2시간) - 온라인

배운점과 잘한점

페어프로그래밍의 본질을 배웠습니다. 잘하고 싶고 욕심도 많이나서 관련된 자료도 많이 찾아보며 초이님과 공유시간도 가졌었습니다. 상호간에 Sync가 잘맞추는데 시간이 좀 걸리도 했었습니다. 하지만 서로 같은 목표를 바라보고 적극적으로 의견들 내며 커밋이 늘어갈 때마다 초이님과 함께 한다면 더 어려운 미션도 도전해볼 수 있겠다는 생각이 들정도로 좋은 페어였다고 생각합니다.
왜 둘이 할 때 더 시너지가 생기는지 알게된 계기가 되었습니다.

2회차 시작할 때 서로 이 페어프로그래밍을 통해 뭘 가져가고 싶은지 이야기를 나누기도 했었습니다.

우연 : 페어프로그래밍의 본질자체를 체득하고 싶었다.
초이 : 주어진 미션은 물론 코드 레벨에서 구조를 잡아가는 것을 배우고 싶다.

적극적으로 임한 결과로 둘다 원하는 목표를 달성할 수 있었습니다 ㅎㅎ.

초이님 짱짱 최고 👍🏻

아쉬운점

페어프로그래밍의 숙련도가 낮아서 초반에 시간을 많이 소요한 것 같습니다.

저희팀은 먼저 구현을 하고 리팩토링하는 방향으로 작업을 진행했는데요. 일단 서로의 머릿속에만 있는 것들을 끄집어내놓고 정리하고 설계하는 시간을 더 가졌더라면….

주어진 시간에 더 좋은 아웃풋을 낼 수 있을 것 같다는 생각이 들어서 아쉽습니다 🥲

많은 시간을 투자한 부분

요구사항 분석에 가장 많은 시간을 소요한 것 같습니다. 용어 파악하고 맥락을 이해하고 서로 같은 목표를 바라보기 위해 먼저 이해한 사람이 상세하게 설명해줄 때 시간을 많이 쓴 것 같습니다.

특히 같은 알파벳 2개를 처리해야할때, 같은단어 중 한 알파벳이 초록 타일 이라면 이건 어떻게 처리해야할까요? 하며 논의했던 사례도 생각납니다.

페어에게 하고 싶은 말

저랑 함께 같은 목표를 바라봐주시고 적극적으로 임해주셔서 감사하다는 먼저 드리고 싶습니다.

특히 테스트코드 작성할 때는 그동안 쌓아오신 경험들이 묻어나는 코드들이 자연스럽게 나오는거 보니 눈에 보이지 않는 그 훈련들의 시간들을 엿볼 수 있었어서 눈도 즐거웠고 배우는 재미가 있었습니다.

이번 페어프로그래밍을 통해 초이님을 더욱 잘 알아갈 수 있는 기회였고, 다음에 또 한번 하고 싶다는 생각이 들 정도로 좋은 페어였습니다.

지금까지 해오신 경험들을 비춰본 결과, 초이님이 원하시는 목표에 도달하실 수 있을 것 같다는 생각도 강하게 듭니다. 늘 자신있게 파이팅!

dev-wooyeon and others added 18 commits January 7, 2026 22:05
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Comment on lines +68 to +70
- [ ] Domain / Application / UI 분리
- [ ] Port / Adapter 도입
- [ ] 책임 재배치 및 네이밍 정리
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.

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

Comment on lines +164 to +166
| 시도 | 사용자가 단어를 한 번 입력하는 행위 |
| 타일 | 문자 하나에 대한 판정 결과 |
| 보드 | 전체 시도 결과를 누적한 출력 영역(행) | No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

좋습니다!

import domain.service.AnswerSelector;
import domain.service.Game;
import infrastructure.adapter.in.ConsoleOutputAdapter;
import infrastructure.adapter.out.FileWordRepository;
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.

헉.. 확인하고 즉시 수정하겠습니다.

Comment on lines +33 to +40
System.out.println(outputPort.getInputInfoMessage());
String userInput = scanner.next();
Word word = new Word(new Input(userInput, result), answer, wordRepository, outputPort);

Client client = new Client(word, game, result, outputPort);
String gameResult = client.run();

System.out.println(gameResult);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

매 라운드마다, client 랑 word 가 여러번 생성되는것같네요

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.

그렇네요,, client, word는 1번만 생성하고 입력만 여러번 생성되도록 리팩토링하는 방향으로 해보겠습니다.

Comment on lines +27 to +29
if (!validWord(input.getValue())) return false;

if (!validNull(input.getValue())) return false;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

null 부터 검증 필요해보여요


String getNotAlphabetMessage();

String getTryCountExceededMessage();
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.

혹시 어떤 의도로 말씀해주신건지 구체적으로 말씀해주실 수 있을까요?
작성해주신 내용만 봐서는 어떤 점을 말씀해주신건지 제가 잘 이해를 못했습니다 🥲

Comment on lines +6 to +10

// 기본 생성자는 apple로 생성한다.
public Answer(){
this.value = "apple";
}
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.

초기 개발시에 답안지 생성을 빠르게 하기 위해서 작성해두었습니다!
기본 생성자만 사용하는 경우에는 항상 apple을 반환하도록 했고
답안지를 설정하려고 하면 String value으로 설정될 수 있도록 오버로딩을 적용해둔 상태입니다!

Comment on lines +12 to +13
public Answer(String value){
this.value = value;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

null 체크가 없습니다.

검증 요소도 없네요!

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.

FileWordRepository::loadWords 에서 답안지 생성할 때 사용되는 데이터 자체를 필터했습니다!
null, blank 케이스에 대해서 항상 검증된 데이터가 들어옵니다.

try (BufferedReader reader = new BufferedReader(
       new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {

       String line;
       while ((line = reader.readLine()) != null) {
            String word = line.trim().toLowerCase();
            if (!word.isEmpty()) {
                wordSet.add(word);
                wordList.add(word);
            }
        }
}

Comment on lines +21 to +22
return String.valueOf(ResultValues.그린.getValue())
.repeat(Math.max(0, WordCondition.입력_제한_길이.getValue()));
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

WordCondition.입력_제한_길이.getValue()) 이값은 항상 5인것같은데요?

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.

그렇네요. 비효율적인 코드 피드백 감사합니다!
수정해서 효율적으로 관리해보겠습니다 ㅎㅎ.

Comment on lines +25 to +28
public static String inCorrect() {
return String.valueOf(ResultValues.그레이.getValue())
.repeat(Math.max(0, WordCondition.입력_제한_길이.getValue()));
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

여기도 동일해요

public void 종료_조건_정답_실패_시_종료안됨() {
// given
Result result = new Result();
StringBuilder board = new StringBuilder(ResultValues.inCorrect());
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

inCorrect -> incorrect() 가 맞을겁니다.

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.

단어하나까지 세심하게 확인해주셔서 감사합니다 사이몬님!

Comment on lines +44 to +53
public void 종료_조건_테스트_6턴_초과_불가() {
// given
Result result = new Result();
result.setCurrentBoardsIndex(6);
Game game = new Game(result, outputPort);
// when
boolean resultChecked = game.checkedTryCount();
// then
Assertions.assertFalse(resultChecked);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

허헛.. 제가 궁금한 점은 message 들은 검증이 안되있는것같아요
굳이 안고치셔도 됩니다!

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.

출력 메세지 검증하는 것도 추가해보겠습니다!
주어진 요구조건 만족하는데 급급했던터라 시야가 좁았던것 같네요,,

Copy link
Copy Markdown
Author

@dev-wooyeon dev-wooyeon left a comment

Choose a reason for hiding this comment

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

코드 꼼꼼히 살펴봐주시고 피드백 주셔서 감사합니다. 사이몬님!
피드백 주신 내용 반영해보도록 하겠습니다.

Comment on lines +33 to +40
System.out.println(outputPort.getInputInfoMessage());
String userInput = scanner.next();
Word word = new Word(new Input(userInput, result), answer, wordRepository, outputPort);

Client client = new Client(word, game, result, outputPort);
String gameResult = client.run();

System.out.println(gameResult);
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.

그렇네요,, client, word는 1번만 생성하고 입력만 여러번 생성되도록 리팩토링하는 방향으로 해보겠습니다.

Comment on lines +44 to +53
public void 종료_조건_테스트_6턴_초과_불가() {
// given
Result result = new Result();
result.setCurrentBoardsIndex(6);
Game game = new Game(result, outputPort);
// when
boolean resultChecked = game.checkedTryCount();
// then
Assertions.assertFalse(resultChecked);
}
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.

출력 메세지 검증하는 것도 추가해보겠습니다!
주어진 요구조건 만족하는데 급급했던터라 시야가 좁았던것 같네요,,

public void 종료_조건_정답_실패_시_종료안됨() {
// given
Result result = new Result();
StringBuilder board = new StringBuilder(ResultValues.inCorrect());
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.

단어하나까지 세심하게 확인해주셔서 감사합니다 사이몬님!

- ValidationStatus 도입을 통한 입력 검증 로직 체계화
- Result 클래스의 boardList 캡슐화 및 읽기 전용 뷰 제공
- 자료형 기반의 일관된 변수 명명(Type Suffix) 및 직관적인 영문 네이밍 적용
- 한글로 작성된 Enum 상수, 메서드명, 주석을 영문으로 통일
- 패키지 전체 경로 사용 제거 및 Import 문 정리

Signed-off-by: dev-wooyeon <une@kakao.com>
Copy link
Copy Markdown
Author

@dev-wooyeon dev-wooyeon left a comment

Choose a reason for hiding this comment

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

@youth-simon 님! 리뷰 감사합니다.
개인 일정으로 회신이 많이 늦어졌네요,,,
남겨주신 부분 답변 남겨두었고, 서로 Sync가 잘 맞을 수 있도록 해보겠습니다 ㅎㅎ.
잘 부탁드립니다!


String getNotAlphabetMessage();

String getTryCountExceededMessage();
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.

혹시 어떤 의도로 말씀해주신건지 구체적으로 말씀해주실 수 있을까요?
작성해주신 내용만 봐서는 어떤 점을 말씀해주신건지 제가 잘 이해를 못했습니다 🥲

Comment on lines +6 to +10

// 기본 생성자는 apple로 생성한다.
public Answer(){
this.value = "apple";
}
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.

초기 개발시에 답안지 생성을 빠르게 하기 위해서 작성해두었습니다!
기본 생성자만 사용하는 경우에는 항상 apple을 반환하도록 했고
답안지를 설정하려고 하면 String value으로 설정될 수 있도록 오버로딩을 적용해둔 상태입니다!

Comment on lines +12 to +13
public Answer(String value){
this.value = value;
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.

FileWordRepository::loadWords 에서 답안지 생성할 때 사용되는 데이터 자체를 필터했습니다!
null, blank 케이스에 대해서 항상 검증된 데이터가 들어옵니다.

try (BufferedReader reader = new BufferedReader(
       new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {

       String line;
       while ((line = reader.readLine()) != null) {
            String word = line.trim().toLowerCase();
            if (!word.isEmpty()) {
                wordSet.add(word);
                wordList.add(word);
            }
        }
}

Comment on lines +21 to +22
return String.valueOf(ResultValues.그린.getValue())
.repeat(Math.max(0, WordCondition.입력_제한_길이.getValue()));
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.

그렇네요. 비효율적인 코드 피드백 감사합니다!
수정해서 효율적으로 관리해보겠습니다 ㅎㅎ.

- 클래스들을 도메인 주도 패키지 구조(word, game, matching)로 이동
- 명확성을 위해 클래스명 변경 (Input -> GameInput, Result -> GameResult)
- 쉬운 영어 단어(check, match, make)로 메소드명 개선
- 새로운 구조와 네이밍에 맞춰 테스트 업데이트
- GameResult에서 Sequenced Collections (getLast) 활용
- Records 및 Enums와의 일관성을 위해 getter 이름을 value()로 통일
- 모든 호출부 및 테스트 업데이트
@dev-wooyeon
Copy link
Copy Markdown
Author

리뷰 답변드리면서, 본김에 보기 불편한거 한번 리팩토링 했어요!

주요 변경 내용입니다.

  • 프로젝트 구조 변경 (Hexagonal -> DDD)
  • 메소드명 쉬운 단어로 직관적으로 변경 (e. g check, make, match)
  • Java 21 버전에 따라 record랑 getLast() 활용

코드를 짧고 간결하면서도 직관적이게 보일 수 있게 변경했어요.
변경하고 보니 다시 코드를 읽고 이해하시는 시간이 오래걸릴 것 같아 마음이 좀 쓰이네요..
시간되시는대로 한번 봐주시면 감사하겠습니다!!

늘 감사해요. 사이몬님 😉

@youth-simon
Copy link
Copy Markdown

넵 수고하셨습니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants