study/우아한테크코스

우아한테크코스 7기 백엔드 레벨1 장기 미션 회고

듀2 2025. 4. 17. 15:49

드디어? 벌써? 레벨 1의 마지막 미션!

6기까지만 해도 레벨 1 마지막 미션은 장기가 아니라 체스였다.
나는 체스를 둘 줄도 모르고 룰은 당연히 몰랐기 때문에 브라운과 원온원을 할 때 체스 룰을 공부해 두는 게 좋을지 물었었다.
브라운은 현재 블랙잭 미션이 진행 중이니 블랙잭에 집중하는 것이 좋겠다고 답해주셨다🤣
그땐 몰랐지 체스가 미션 시작 당일 장기로 바뀔 줄은!ㅋㅋㅋ

코치 말을 잘 듣는 나는 브라운 말대로 블랙잭에 집중하고 체스는 나중에 생각하기로 했다.
미션 시작 날, 굿샷에 외쳐진 한 마디..
’체스가 갑자기 장기가 됐어!!‘

ㅋㅋㅋㅋㅋㅋㅋ 많은 크루들이 캠퍼스에서 체스를 두면서 지냈기 때문에 더 당황했던 것 같다.

지원서 되돌아보기

장기 미션 페어를 시작하자마자 감기에 걸려버렸다.
지원서에 적었던 가장 첫 목표가 ‘건강하게 개발하기’였는데, 이때 세운 정량적인 실행 목표들을 지켰음에도 감기에 걸려 속상했다.

페어였던 헤일러에게 민폐를 끼칠 수는 없어서 최대한 헤일러의 구현을 따라가려고 노력했다.
블랙잭보다 페어 제출이 하루가 짧았고 요구사항은 더 불친절했다. 심지어 뷰 예시도 없었다!
다행히 제출 전 날에는 감기가 심하지는 않아서 빡세게 야근까지 하며 어려웠던 장기 말들의 이동을 구현할 수는 있었다. 처음으로 왔다감 채널에 닉네임도 올리고 인증샷도 남겼다!

미션 제출과 동시에 감기는 더 심해졌고 병원으로 달려갔음에도 쉽게 낫지 않았다.
심지어 제출 다음 날인 금요일엔 거의 트랙룸 빈백에서 잠에 취해 하루를 보냈다.
몸이 따라주지 않아 속상했지만, 속상해할 시간에 빨리 낫는 게 더 좋겠다고 생각했다.

다행히도 리뷰어인 이스트는 여유 있게 피드백을 주시는 분이었고, 빡세게 하기보다 체력을 회복하면서 진행할 수 있었다.

사실 헤일러와 페어를 하면서 헤일러가 미션의 대부분을 구현해 주었기 때문에 미안한 마음도 있고 속상하기도 했다.
장기가 나에게 초면인 도메인이기도 했지만 더 적극적으로 구현에 참여할 수도 있었을 텐데 아쉽기도 했다.
몸 상태가 안 좋았기 때문에 부정적인 생각만 드는 것 같았다. 부정적인 생각은 생각할수록 자꾸만 커져가는 걸 알고 있으니 다른 방향으로 생각을 전환하려고 노력했다.

유연함의 힘에서 읽었듯 학습 마인드셋을 장착했다.
헤일러는 알고리즘에 뛰어난 크루였고, 나는 알고리즘에 약한 사람이다. 장기 말을 구현하는 동안 헤일러는 알고리즘적 사고로 문제해결을 하는 모습을 많이 보여주었고, 이렇게 구현할 수도 있구나 느끼며 많이 배울 수 있었다.
또 나는 타인의 코드를 잘 읽는 편이기에 헤일러가 큰 그림을 구현할 때 세심한 부분을 잡아줄 수 있었다.
이런 식으로 아픈 와중에도 긍정적인 생각을 강화하려고 노력했다. 사실 어떻게 보자면 자기 합리화가 될 수도 있었을 텐데, 미션을 놓지 않고 잘 마무리했으니 좋은 공부였다고 생각된다.
실제로 헤일러가 주었던 피드백도 긍정적이었다🥹

 

Docker, 왜 쓰는데..?

step2에 들어가면서 DB를 도입해야 했다. 예전에 스프링부트 책을 따라 하면서 로컬에 설치해 둔 mysql이 존재했고, 로컬의 mysql을 종료하지 않고 도커로 mysql을 실행하려고 하자 포트가 중복되어 실행되지 않았다.
그래서 일단 미션을 로컬 mysql로 진행해야지! 생각했는데, 다시 생각해 보니 '리뷰어에게 어떻게 내가 생성한 테이블을 공유할 수 있지?' 의문이 들었다.
 
해결책을 찾아 보니 Docker 컨테이너가 이때 유용하겠다고 생각되었고, 로컬의 mysql을 종료시키고 Docker에서 mysql을 띄워 실행시켰다.

프로젝트의 루트에 docker 폴더를 생성하고, docker-compose.yml로 설정 파일을 넣어둔 다음 리뷰 요청 시 프로그램 실행 전 도커 컨테이너를 실행해야 DB가 동작함을 안내했다.



게다가 ’내가 생성한 테이블을 리뷰어에게 어떻게 전달해 주지?‘와 같은 의문에도 도커가 답이 되었다.
docker 폴더 내에 init.sql을 추가하고, docker-compose.yml 설정 파일에 경로만 추가해 주면 되었다!

확실히 다른 사람들이 다 쓰니까 사용하는 것보다 ‘왜’를 스스로에게 묻고, 필요성을 체감할 때 사용할 때 배우는 것이 더 많다고 느꼈다.

테스트 더블, In-memory 테스트

‘DB는 외부 의존성인데 테스트를 어떻게 해야하지?’라는 의문이 들었다.
사실 우테코에서는 매 미션마다 학습 프롤로그를 제공해주는데, 이때 프롤로그가 방향을 잡는데 도움이 많이 됐다.


step1에서 장기판 객체에 모든 장기말들을 테스트마다 세팅해주기 번거로워 판 초기화만 해둔 fixture를 만들어서 테스트를 활용했다.

직접 사용하면서 fixture는 이렇게 쓰는 거구나~ 알게 됐는데, 프롤로그에서 질문하고 있는 Mock, Fake에 대해서는 알지 못했다.
좋은 코드, 나쁜 코드라는 책을 보니 테스트 더블에 대해 자세히 설명해주고 있었다.
Fake 객체를 만들어 자바 컬렉션 프레임워크를 가지도록 해서 DB와 연결되는 Dao를 테스트했다.

추가로 DB와의 연결을 테스트하고 싶어 알아보니 In-memory 테스트로 주로 H2를 많이 사용한다고 했다.
다른 크루들을 보니 H2 이외에도 테스트용 도커 컨테이너를 하나 더 추가한 경우도 있었다.


처음엔 mysql 연결 테스트만 했었는데, 리뷰어 이스트가 ‘테스트는 어떤 환경에서든 동작해야 하지 않을까요?‘라고 질문해 주셔서 이러한 이유라면 도커 컨테이너를 하나 더 추가하는 것보다 H2를 사용하는 게 낫겠다고 판단했다.
실제 mysql 쿼리와는 조금 다르기도 하지만, 복잡한 쿼리를 사용하지 않는 미션이었고, DB가 연결되는지, 내가 작성한 쿼리가 의도대로 실행되는지만 테스트하면 되었기에 H2로도 충분하다고 생각했다.

이 외에도 Service 네이밍에 외부 의존성 명시하지 않기, 수동으로 트랜잭션 관리해 보기, 테이블에서 데이터가 존재하는지만 select 할 때 count(*) 보다 select 1 from table limit 1을 사용하는 이유, null을 반환하지 않는 이유와 같이 여러 가지 배움을 얻을 수 있었다.
 

로또 미션 때 받았던 피드백
장기 미션에서 받은 피드백

첫 미션인 로또에서는 리뷰어가 피드백해주시는 부분을 맞다고 생각해 무조건 반영했어서, 성장하기 위해 거절하는 연습도 해보면 좋겠다는 피드백을 받았었다.
레벨 1 마지막 미션인 장기에서는 리뷰어가 피드백해 주시는 부분에 '왜 반영하는지' 동의하는 이유를 함께 설명하니 위와 같은 피드백을 주셨다.
첫 미션에서 개선이 필요한 부분을 마지막 미션에서 좋았던 점으로 피드백받으니 정말로 성장한 것 같고 좋았다!
 
1단계 PR : https://github.com/woowacourse/java-janggi/pull/25

[1단계 - 장기] 듀이(이주희) 미션 제출합니다. by ljhee92 · Pull Request #25 · woowacourse/java-janggi

안녕하세요 이스트! 백엔드 7기 듀이입니다. 장기 미션에서 만나뵙게 되어 반갑습니다! 리뷰 잘 부탁드립니다~!😄 체크 리스트 미션의 필수 요구사항을 모두 구현했나요? Gradle test를 실행했을

github.com

 
2단계 PR : https://github.com/woowacourse/java-janggi/pull/119

[2단계 - 장기] 듀이(이주희) 미션 제출합니다.  by ljhee92 · Pull Request #119 · woowacourse/java-janggi

체크 리스트 미션의 필수 요구사항을 모두 구현했나요? Gradle test를 실행했을 때, 모든 테스트가 정상적으로 통과했나요? 애플리케이션이 정상적으로 실행되나요? 프롤로그에 셀프 체크를 작성

github.com

728x90