본문 바로가기
Log/우아한테크코스

[우아한테크코스 5기] 프리코스 2주차 소감문

by 재영(ReO) 2023. 1. 30.

2주차 미션 소감문


쌓여있는 읽을 책들을 보며 흐뭇해하고, 한권씩 읽어나가며 더미를 줄여나가는 쾌감을 즐기는 제게, 이번주도 지난 주에 이은 행복한 주간이었습니다. 1주차에 정말 많은 것을 배웠습니다. Git과 GitHub의 본격적인 사용법 부터 Java의 기본적인 문법들과 자료구조, Stream API, 람다, 기능별로 커밋을 하는 이유와 메시지 컨벤션 등을 포함하여 미처 다 적지 못한 수많은 것들까지 즐겁게 알아갔습니다. 이후에 다른 지원자들의 코드를 리뷰하고 의견을 나누며 재밌는 경험을 했습니다. 그렇게 행복한 한 주를 보내면서도 마음 한 켠에는 ‘혹시 다음 주부터 이번 주보다는 배울 것들의 양이 줄어들지 않을까’하는 걱정이 있었습니다. 솔직히 2주차 미션을 접하고 난 직후에는 요구사항이 간단해보였기 때문에 우려가 현실이 되는 줄 알았습니다. 그렇지만 정말 제 오만이고 기우였다는 것을 이번 주를 보내며 깨달았습니다. 오히려 1주차 미션보다 훨씬 더 많은 것을 배웠고 하루하루를 즐거움 속에서 보낼 수 있었습니다. 함수를 작게 쪼개고, 그 쪼갠 기능들이 잘 동작하는지 확인을 하며 쌓아올리는 과정을 통해서 설계와 테스트의 중요성을 알았고 복잡한 문제를 해결하는 힘을 얻었습니다. 테코톡 채널과 테코블 사이트를 통하여 Java와 프로그래밍 전반에 대해서 많은 지식을 얻었고 이를 적용해보는 경험을 했습니다. 악기를 놓은지 꽤 시간이 지났는데 프로그램을 설계하고 작은 것부터 차근차근 만들어 나가는 과정을 통해서 마치 오랜만에 곡을 쓰는 느낌이 들어서 아련하고 익숙한 복잡한 감정도 느꼈습니다.

2주차 미션에서 배운 것


함수의 분리

처음에 요구사항을 보니, 학창시절과 군대에서 자주하던 숫자야구게임을 구현하는 것이라 재밌을 것 같으면서도 ‘간단하겠는데?’라는 안일한 생각을 잠시 했습니다. 하지만 막상 구현을 하려니까 어디서부터 시작해야할지 막막했습니다.
제가 설명회부터 오티, 그리고 이번 코수타까지 빠지지 않고 항상 참여하고 있는데, 거기서 해주시는 말씀들이 미션을 진행하며 정말 도움이 많이 됩니다. 이번에 닥친 어려움도, 준님과 왼손님이 코수타에서 하셨던 “’분할정복’처럼 기능을 먼저 쪼개보라”는 말씀을 떠올리고 최대한 기능을 작게 분리해봤습니다.

  • 우선 진행과정을 최대한 자세히 적어보기
    게임이 전체적으로 어떻게 흘러가는지를 파악해야 어떤 것부터 구현해야할지 감이 잡힐 것 같았습니다. 그래서 다음과 같이 쭉 게임에서 일어나는 일들을 적고, README에 정리했습니다.


    1. 숫자 야구 게임을 시작합니다.”라는 안내를 출력한다.
    2. 컴퓨터가 3개의 숫자를 선택한다.
      • 3개의 숫자가 서로 다르다.
      • 순서가 없다. (정렬되어 있지 않다.)
    3. ”숫자를 입력해주세요 : “라는 안내를 출력한다.
    4. 사용자가 3개의 숫자를 입력한다.
      • 숫자가 중복되지 않아야 한다.
        (이하 생략)

    이렇게 과정을 순서대로 적고나니 우선적으로 어떤 기능을 구현해야할지 조금은 감이 잡히는 것 같았습니다. 그러나 각 기능을 어떻게 모아줄지, 어떤 설계로 프로그램을 구성해야할지는 아직 감이 잘 오지 않았습니다. 그래서 각 과정을 담당하는 주체 별로 나누어보았습니다.


  • 각 진행의 역할의 주체 별로 과정을 나눠보기
    각 과정을 쭉 적다보니, 전체적인 구조가 바로 머리에 떠오르지는 않았지만 각 과정을 담당해야하는 주체는 명확하게 보였습니다. 사용자, 컴퓨터, 그리고 둘이 진행한 과정들을 묶어주는 역할을 하는 컨트롤러 이렇게 크게 3개의 주체를 두고 쭉 정리한 과정들을 나눠담아보았습니다.


    • 사용자
      • 입력
        • 사용자가 3개의 숫자를 입력한다.
          (중략)
    • 컴퓨터
      • 컴퓨터가 3개의 숫자를 선택한다.
        • 3개의 숫자가 서로 다르다.
          (중략)
    • 진행
      • ”숫자 야구 게임을 시작합니다.”라는 안내를 출력한다.
        (중략)

    이처럼 각 과정을 나누어 담으니 자연스레 구조도 어느정도 눈에 들어왔습니다. 그래서 우선은 러프하게 위의 세 주체로 패키지를 구성하고 각 기능을 비슷한 것들끼리 묶어서 클래스를 만들어서 구현을 시작했습니다.
    구현을 우선 마치고 보니, 서로가 서로를 많이 참조하는 형태로 설계가 되어있었습니다. 이를 가능하게 하기 위해서 static 선언을 남발한 문제점도 생겼고, 한 주체의 메소드를 수정했는데 다른 주체의 메소드 또한 수정해야하는 번거로움도 생겼습니다. 이를 해결하기 위한 방법을 고민해봤습니다.


  • 적절한 협업을 위한 재분류
    방법을 고민하며 설계 구조에 대해서 구글링을 하다가 MVC 패턴에 대한 글을 많이 접했습니다. 비즈니스 로직이 담긴 도메인의 앞단에서 데이터를 담아두는 모델과 사용자와 직접 소통하는 뷰어, 그리고 이 모델과 뷰어를 조절하는 컨트롤러로 구성된 디자인 패턴이라고 해서, 분류해놨던 사용자, 컴퓨터, 컨트롤러와 어느 정도 공통된 부분이 있다고 판단했습니다. 그래서 MVC 패턴에 대한 공부를 하고 블로그에 정리해봤습니다. 그리고 여기에 적용된 객체지향의 원리를 고민해보고, 이를 적용해봤습니다. 프로그램의 기능상 모델이 존재하지 않겠다고 판단을 했기 때문에 MVC 패턴을 그대로 사용하지는 않았지만 최대한 객체지향적으로 설계해봤습니다. 서로 몰라야 할 클래스와 패키지들은 서로 모를 수 있도록 했고 메소드들은 하나의 역할을 수행하며 내부에 무분별하게 다른 클래스 호출을 지양함으로써 이리저리 꼬여있던 코드들을 나름대로 깔끔하게 정리할 수 있었습니다.

위와 같은 과정을 통해서 프로그램을 구현할 수 있었습니다. 디자인 패턴이 뭔지 모르고 시작을 했지만 기능을 잘게 쪼개서 정리하니 처음의 분류에서도 어느정도 비슷한 형식으로 정리할 수 있었고, 이 후 디자인 패턴을 배우고 난 후 설계를 변경할 때도 아예 바꾸거나 할 필요 없이 메소드들만 클래스 간에서 옮기는 정도로 쉽게 정리할 수 있었습니다. 만약 한 덩어리에서 순차적으로 모든 과정이 일어나도록 구현을 했다면 대체 몇 줄을 다시 쓰고 옮겨야 했을지 정말 식겁했습니다. 그래서 기능과 함수를 최대한 작은 단위로 하는 것이 중요한 것을 깨달았습니다.


함수별로 테스트 작성

테스트 코드의 존재도 몰랐고 당연히 접해본 적도 없었고 직접 작성해본 적은 당연히 없었습니다. 전혀 들어보지 못한 것을 배울 수 있어서 정말 행복했고 우테코에 지원하길 잘했다고 생각했습니다. 테스트 도구를 학습하고, 테스트 주도 개발에 대해서 알아보면서 테스트의 중요성을 알았습니다. 그리고 실제로 아주 작은 기능 단위로 테스트 코드를 작성하고 잘 구현했는지 확인해가면서 설계가 변경되거나 메소드들을 통폐합할 때도 추가적인 시간 낭비 없이 원활하게 진행할 수 있었습니다.

  1. 테스트 주도 개발, 테스트 도구 학습
    메일에 이번에 테스트를 처음 접하는 사람들은 언어별 테스트 도구를 학습하고 작은 단위의 기능부터 테스트를 작성해보라고 설명해주셔서 우선 자바의 테스트 도구를 구글링 해봤습니다. JUnit과 AssertJ를 사용해서 단위 테스트를 많이 진행한다는 것을 알았고, 여러 블로그 글을 참고해서 TDD의 개념, JUnit과 AssertJ, 단위 테스트에 대해서 학습하고 블로그에 정리했습니다.

  2. 구현한 모든 메소드에 대해서 테스트 코드 작성
    친절하게도 이번 미션 파일 내에 StringTest라는 학습용 테스트코드가 있어서 정말 도움이 많이 됐습니다. StringTest에 주어진 코드들과, 구글링을 하면서 찾은 테스트 코드 작성법을 토대로, 저만의 테스트코드를 만들어나갔습니다. 무식한 방법이지만, 테스트 코드의 작성에 익숙해지기 위해서 처음에는 제가 구현한 모든 메소드를 전부 다 테스트 했습니다. 테스트 코드를 먼저 작성하고, 그 테스트가 제대로 돌아가도록 구현을 해봤습니다. 나중에, 구현한 메소드들이 private으로 숨겨지고 public 메소드 하나에 함께 존재하더라도 이전에 다 테스트를 했었기 때문에 테스트를 통과하지 못하더라도 이전 메소드에 들어가서 보는 시간을 줄일 수 있었습니다.

  3. NsTest 내부 탐색
    기본적으로 주어진 테스트코드에서, NsTest를 상속했음을 확인했습니다. 입력을 조작하고 출력을 검증하기 위해서는 StringTest에 있던 코드들 외에도 다른 방법을 사용했어야 하는데 구글링을 해도 검색을 잘 못해서인지 적절한 답을 찾지 못했습니다. 그런데 처음에 주어진 테스트코드에서 입력을 조작하고 출력을 검증하는 코드가 있어서 이것을 확인하기 위해서 NsTest 소스파일을 정독해봤습니다. 제가 아직 접해보지 못한 조금 더 하드웨어나 입출력 등 자바의 기저에 접근하는 코드들을 보고 정말 신기했습니다. 사실 이런 것까지 할 수 있는지 몰랐었는데 역시나 상상한 것 이상을 할 수 있었고, 개발자로 진로를 선택한 것을 잘했다고 생각했습니다. NsTest 소스코드를 자세히 살펴보며 입력과 출력을 제어하는 하나의 방법을 알게되었고 이것을 통해서 제가 구현한 메소드 또한 테스트할 수 있었습니다.


2주차 미션에서 느낀 것


이번 주의 목표인 위의 두 가지 학습 외에도 테코톡과 테코블의 많은 자료들을 통해 수많은 것을 배웠습니다. 개발은 배운 것을 바로바로 적용해 볼 수 있다는 것이 참 매력적인 것 같습니다. 테코블에 있던 이동욱님의 자바 Enum 활용기를 읽고나서 이번에는 상수를 static final이 아닌 enum 파일을 만들어서 담아봤고, AssertJ를 열심히 공부해서 “doesNotHaveDuplicates”라는 메소드를 찾아내 적용하여 가독성을 확보할 수 있었습니다. 이 외에도 공통 피드백에서 언급된 사항들을 지키는 것에 집중을 하니 코드가 깔끔해지는 것도 확인했습니다.
일곱 분에게 코드리뷰를 했고 여섯 분에게 코드리뷰를 받았습니다. 슬랙에서 잡담을 하기도 하고 스터디도 구해서 이번주 목요일부터 객체지향에 대해서 스터디를 시작합니다. 커뮤니티의 아고라에서 다른 분들의 고민을 들으며 몰랐던 것을 많이 알고 있습니다. 이제 2주째인데도 홀로 공부하던 것이 잘 기억이 나지 않을 정도로, 많은 분들과 함께 미션을 해결해나가며 성장해나가고 있는 느낌을 받습니다. 다시 혼자 공부할 것이 두려워 프리코스가 끝나지 않았으면 하는 느낌도 듭니다. 그래서 더욱 열심히 해서 반드시 우테코에 합격하여 동료들과 함께 커나가는 지금의 행복을 계속 느낄 수 있도록 하겠습니다.