우아한테크코스 6기 : 프리코스 3주차 회고

Handwoong
self-retrospect
Published in
3 min readNov 11, 2023

3주차 미션 — 로또

3주차 미션의 목표

3주차 미션 메일에서 말하는 목표는 클래스(객체)를 분리하는 연습도메인 로직에 대한 단위 테스트 이다.
클래스를 분리하는 연습이라는 목표를 봤을때 나는 지금까지 미션을 진행하면서 나름대로 클래스를 잘 분리하고 있다고 생각했다. 하지만 미션의 목표가 단순히 클래스만 분리하는 것을 말하는게 아니라는 생각이 들었고, 어떤 의도로 목표를 주었는지 고민을 하게 되었다.

나는 현재 프리코스 지원자분들과 객체지향 사실과 오해라는 책 읽기 스터디를 진행하고 있다.
객체지향 사실과 오해에서는 객체의 책임, 역할, 협력을 강조한다.
지금까지 내가 만들어낸 객체들은 책임과 역할은 있을지언정 협력을 하고 있는가라는 의문이 떠올랐고 단호하게 아니라고 말하는 나를 발견했다.

이러한 생각 끝에 클래스(객체)를 분리하는 연습이란 목표의 의도는 객체에 알맞은 책임과 역할을 부여하고 그 객체들간의 협력을 이끌어내는 연습이라고 해석했다.

돌아보기

2주차 자동차 경주 코드를 보면 객체들이 협력하고 있지 않다.
아래는 자동차 경주 미션 코드 중 일부이다.

RacingGame 이라는 모델의 책임과 역할은 자동차 경주 게임을 관리하는 것이다. 그렇다면 RacingGame 은 게임에 참여할 자동차의 접수를 받을 책임이 있다.
하지만 외부(컨트롤러)에서 레이싱 게임에 참여할 자동차를 생성하여 자동차를 추가하고 있다.
내가 바라던 것은 RacingGame에게 ‘자동차 접수받아’ 라는 메시지를 전달하고, 외부에서는 어떤 자동차가 생성되고 접수되는지 알 필요가 없는것 이다.
결국 RacingGame 은 역할에 맞는 책임을 하지 않았고, Car 와의 협력 또한 하고 있지 않음을 알 수 있다.

개선 방향

2주차 미션을 진행하면서 중점으로 두었던 getter 를 지양하라에서 객체에 메시지를 전달하는 것에 정답이 있었다.
지금까지 단순히 getter 를 사용하지 않는것에 중점을 두었다면, 이번주 미션에서는 협력을 중점으로 메시지를 전달하고자 했다.

레이싱 게임에 참여할 자동차를 외부에서 생성하는 것이 아니라 RacingGame 에게 자동차를 등록하라고 메시지를 전달했다.
joinCar 내부에서는 전달받은 자동차 이름을 가지고 어떤 방법으로든 Car를 생성해서 게임에 참여시킬 것이다.

미션에 적용하기

로또 미션에 객체의 역할, 책임, 협력을 중점으로 구현하려고 노력하다보니 컨트롤러는 모델과 뷰 사이의 연결다리의 책임만 가지게 된 것을 확인할수 있었다.

로또 구매자는 로또 매니저를 통해 로또를 구매하고, 로또 구매자는 로또 결과를 통해 당첨 내역을 계산하는것을 확인할 수 있다.
객체의 역할에 맞는 메시지를 전달함으로써 객체들간의 협력을 이끌어낼 수 있었다.

이렇게 객체들에게 알맞은 역할과 책임을 부여하고, 협력함으로써 객체지향에 대해 조금 더 깊이있는 이해가 생긴것 같다.

--

--

Handwoong
self-retrospect
0 Followers
Editor for

Backend Developer (Java, Spring)