각종 후기/우아한테크코스

[우아한 테크코스 3기] LEVEL 1 회고 (3일차)

제이온 (J.ON) 2021. 2. 4.

안녕하세요? 제이온입니다.

 

오늘은 목요일이라서 코치님의 수업은 없었고, 페어인 '나봄'과 거의 하루 종일 페어 프로그래밍을 진행하였습니다.

 

 

오늘 한 활동

(1) 데일리 미팅

늘 그렇듯이 오전 10시에는 데일리 미팅을 진행합니다. 모두 제 시간에 들어와 있어서 따로 출석 체크는 하지 않았고, 바로 공지 사항을 전달받은 후 각자 자기가 왜 개발자가 되기로 하였는지 이야기를 하였습니다. 저는 원래 화이트해커를 지망하였지만, 웹 사이트의 취약점을 찾는 일보다는 스스로 안전한 사이트를 만들고 싶다는 생각에 개발자로 전향하였다고 말하였습니다.

 

대화 중 놀란 점은 우테코에서 비전공자거나 비전공자에서 컴공으로 전과한 사람이 많았다는 것입니다! 데일리 조가 13명인데 그 중 절반 이상이 비전공자거나 비전공자에서 컴공으로 전과한 사람이었습니다. 전체 백엔드 교육생으로 넓혀보면 어떨지는 모르겠지만, 그럼에도 꽤 많은 수였고 다들 웬만한 전공자보다도 잘하는 사람처럼 느껴졌습니다.

 

 

(2) 페어 프로그래밍 -1

데일리 미팅이 끝난 후, 나봄과 어제 하였던 문자열 덧셈 계산기 미션을 리팩토링하였고, 본격적으로 프리코스때 하였던 자동차 경주 미션의 업그레이드된 버전을 수행하기로 하였습니다.

 

 

 

 

기본적으로 구현할 내용 자체는 똑같지만, 요구 사항이 강화되었습니다. 기존의 두 단계의 들여쓰기에서 한 단계로 줄었고, 메소드의 길이는 10라인까지만 허용하도록 변경되었습니다. 다행히, 저는 우테코 전에 열심히 람다와 스트림을 연습해 두었기때문에 크게 문제가 되지는 않았습니다. 다만, 어제 배운 단위 테스트를 사용하여 각 메소드를 충실히 테스트해야한다는 점은 저에게 어려웠습니다.

 

그리고 프리코스 때 작성하였던 코드와 설계 과정을 서로 공유하였는데, 나봄의 코드는 전체적으로 단일 책임 원칙을 지키려고 노력한 모습이 보였고, 저는 그렇지 않았습니다. 입력과 출력이 대충 RacinGame 클래스에서 한 번에 다루었고, 하나의 메소드 내에서 여러 가지 일을 하도록 설계하였죠. 이것을 보고, 저는 페어한테 많은 것을 배울 수 있겠다고 기대하였습니다. 설계 과정은 대부분 나봄의 방식을 따르기로 하였고, 오후 1시 30분부터 온보딩 팀 프로젝트가 있었기때문에 회의는 여기서 잠시 마쳤습니다. 

 

 

(3) 온보딩 팀 프로젝트

온보딩 팀 프로젝트는 '보이는 라디오'로 주제는 기존의 '클라이언트와 서버의 통신 과정'이 아닌 가벼운 'MBTI 성향에 따른 개발자의 유형'으로 변경되었습니다. 그리고 발표 방식은 '도시남녀의 사랑법'이라는 드라마에서 따온 인터뷰 방식을 선정하였고, 이것은 전적으로 '주모'의 의견이었습니다. 저나 다른 팀원들도 모두 동의하였고, 프로그래머스의 개발자별 MBTI 정리글을 보면서 5가지 상황에 대해 MBTI별 반응을 각자 연기하기로 결정하였습니다. 여기서 5가지 상황은 우테코에서 과거에 일어났거나 현재 일어난 상황을 말하며, '우테코 시작 D-1', 'OT 중 포비의 정신 교육', '페어 프로그래밍' 등이 있습니다.

 

약 1시간 30분 동안의 회의 끝에 각자 맡을 MBTI 역할을 배분하였고, 오늘 안에 대사와 시나리오를 노션에 작성하기로 하였습니다. 일요일에 최종적으로 ZOOM에서 서로 연극 타이밍을 맞춰보기로 하였습니다.

 

 

(4) 페어 프로그래밍 - 2

약 10분 간 숨을 돌리고, 이제 본격적인 자동차 경주 미션이 시작되었습니다. 요약하자면, 3시50분부터 7시10분까지 쉬지 않고 쭉 달려서 아래 사진의 기능을 구현하였습니다.

 

 

 

 

이 중 체크 표시 안 된 우승자와 RacingResult의 테스트 코드를 제외하고는 모두 구현하고 커밋까지 완료하였습니다.

 

과거의 저 혼자 자동차 모델을 설계하였을 때는 자동차 객체인 Car, 운전사 객체인 Player을 두어서 랜덤값에 따라 Player가 drive()를 호출하면 Car가 move()을 호출하도록 설계하였습니다. 하지만, 나봄은 랜덤값을 연료로 보고, 연로를 주입하는 주유소와 운전사 없이 자동차 모델로 2가지로 나누었습니다. 그 이유는 어차피 Car와 Player는 1:1 관계고 Car는 단순히 한 칸 움직이거나 멈추기만할 뿐이죠.

 

 

 

 

주유소 클래스를 보면, 눈에 띄는 특징이 있는데 바로 Supplier 함수적 인터페이스입니다. 저는 원래 인자로 Supplier가 아닌, 단순히 기존의 주어진 유틸 패키지에 있는 RandomUtils 파일을 이용하여 연료를 받으려고 하였습니다. 하지만, 테스트하려는 값을 랜덤으로 설정하면 우리가 기댓값을 설정할 수 없으므로 테스트를 할 수 없게 됩니다. 따라서, Supplier를 통해 프로그램 내에서는 RandonUtils을 통해 nextInt()를 사용하되, 테스트 상에서 연료가 충전되었는지 확인하기위하여 '() -> 4'와 같은 임의의 수를 넣을 수 있습니다.

 

 

 

 

다음과 같이 테스트 코드를 작성할 수 있습니다. 저는 여기서 굉장히 참신하다고 느껴졌습니다.

 

 

다음으로, RacingManager 클래스입니다. 이곳은 전반적인 게임을 진행하는 클래스입니다. 입력과 출력은 내일 하기로 하였고, 그 외의 요소는 모두 구현하기로 목표하였습니다.

 

먼저, 게임을 시작하는 start()를 정의해야하였는데, 저는 이 함수 안에서 입력, 턴 동안 자동차 경주, 출력이라는 3가지 일을 하려고 하였으나, 이것은 메소드가 하나의 일만 하는 것이 아니라고 나봄이 알려주었습니다. 그래서 대처 방안을 물어보니, 입력은 메인에서 하여 클래스의 멤버 변수로 넘겨주고, 메소드 내에서는 경주 게임을 진행하고, 반환을 RacingResult 객체로 하여, 이 객체를 통해 출력하는 것이었습니다. 저는 프리코스에서도 이 부분을 어떻게 해결할 수 있을지 고민하였는데, 단번에 해결이 되어서 참 속이 시원한 순간이었습니다.

 

 

 

 

여기서 participants라는 것이 궁금하실텐데, 오늘 페어 프로그래밍에서 가장 인상 깊은 부분이라서 이따가 소개하겠습니다. 그 외에는 앞서 말씀드렸다시피 반환을 RacingResult 객체로 하였습니다.

 

이 객체는 출력할 내용을 담을 것인데, 경주의 진행 상황과 우승자를 담습니다. 여기서 진행 상황을 담는 방법에 대해서 서로 고민을 많이 하였습니다. 처음에는 key를 턴, value를 또 다시 map으로 하여 key를 자동차의 이름, value를 위치로 하려고 하였습니다. 하지만, 코드 작성 중 생각보다 복잡해져서 이를 폐기하고 StringBuilder 클래스를 이용하여 "%s : %s" 형태로 문자열을 쭉 담기로 변경하였습니다.

 

 

 

 

그리고 다행히 진행 상황이 출력되는 것을 보고, 시간이 오후 7시10분이 되어 잠시 저녁을 먹고 9시에 만나기로 하였습니다.

 

 

(5) 페어 프로그래밍 - 3

9시보다는 15분 일찍 오후 8시 45분 정도부터 다시 페어 프로그래밍을 시작하였습니다. 저녁 전에는 힘들어서 코드가 잘 읽히지도 않았는데 신기하게 조금 쉬고 오니 코드의 양도 짧게 느껴지고 술술 코드가 잘 짜졌습니다.

 

먼저, Participants 클래스를 말씀드리자면 이것은 일급 컬렉션이라고 부릅니다. 일급 컬렉션은 비지니스에 종속적이고, 컬렉션의 불변성을 보장하고, 상태와 행위를 한 곳에 관리하며, 컬렉션에 이름을 부여할 수 있다는 장점이 있습니다. 만약 이것을 쓰지 않는다면, 저는 멤버 변수에 'List<Car> cars'와 같이 정의해야하는데, wrapping을 함으로써 일급 컬렉션으로 만들 수 있습니다. 저도 완전히 이것이 뭐다라고 설명은 어렵지만, 유지 보수나 가독성 측면에서는 확실히 장점이 있다고 느껴졌습니다.

 

 

 

 

이후, 우승자를 결정하는 코드를 작성하였습니다.

 

 

 

 

먼저, 스트림을 사용하여 최대 위치를 구하고, 자동차 중 가장 먼 거리에 간 자동차가 여러 대일 수 있으므로 컬렉션으로 모았습니다. 그리고 이것도 Winner라는 일급 컬렉션에 따로 보관하였습니다.

 

 

 

 

이 Winner는 추후 OutputView에서 출력하는 데 사용될 것입니다.

 

그리고 RacingResult에 대한 테스트 코드를 작성한 뒤, 다시 재할당되지 않을 변수에 대해서 모두 final 처리를 하였습니다.

 

 

정리

오늘은 오전 10시부터 시작하여 현재 포스팅을 마치며 하루가 끝날 것 같습니다. 마찬가지로 굉장히 고되고 힘들지만, 운 좋게도 잘하는 페어를 만나서 하루 하루 성장을 하고 있습니다. 내일은 나머지 입력과 출력 기능을 구현하고, 예외 처리 및 전체적인 리팩토링을 하여 자동차 경주 게임 개발을 끝내려고 합니다.

 

위 미션의 코드가 궁금하신 분은 이곳을 참고하시길 바랍니다.

추천 글