관리 메뉴

공부 기록장 💻

우아한테크코스 프리코스 2주차 회고 본문

# Tech Studies/우아한테크코스 프리코스

우아한테크코스 프리코스 2주차 회고

dream_for 2022. 11. 8. 23:29

2주 차 미션의 목표는

1. 기능별로 메서드를 분리하는 것
2. 각 메서드별로 테스트를 작성하는 것
이었다.

지난주는 IntelliJ 환경에서 Git을 통해 Commit Convention을 지켜가며, 작성한 기능 구현 목록에 따라 기능을 완성하고 commit을 진행하며 오랜만에 Java 언어에 익숙해지는 온보딩 과정의 1주차였다면,
이번주는 처음으로 테스트 도구를 통해 프로그램을 작성하며 동시에 작성한 메서드의 동작 방식과 입력에 대한 결과를 미리 예측하여 테스트 도구를 통해 완성도 있는 프로그램을 구현해 나가는 과정을 경험하는 2주차였다.


TDD? 테스트가 무엇?


현업자분들의 개발 강의를 찾아 볼때마다, 자주 등장하는 용어 중 하나는 TDD 였다.
TDD를 적극적으로 도입하여 개발하는 사람을 찾고 있다는 채용 공고도 언뜻 많이 본 것 같다.
그래서 tdd...tdd.. 이 귀여운 이름의 개발 방법론이 도대체 무엇일까? 라고 생각하면서도 직접 나서서 찾아보진 않았다.
TDD (Test-Driven Development) , 테스트 주도 개발 방법론에 대해서 들어본 적은 많지만,
내가 당장 테스트라는 것을 학습하고 적용해야 하는 단계의 개발자라고 생각한 적은 없었기 때문이다.
학교 전공 과목에서 "소프트웨어 공학" 이라는 과목을 배울 당시 "테스트" 부분은 항상 책의 뒤쪽 파트에 위치해 있었고,
테스트 단계는 요구사항 분석과 설계, 개발 단계에 우선순위에 밀려 나중에 언젠가는 배워야 하는 부분이라고만 생각했다.

하지만 지난주 코수타에서 "TDD"라는 개념을 코치분들이 언급하시면서 2주차 미션에 대해 약간의 힌트를 던져주셨다.
"올게 왔구나!"
그리고 2주차 미션을 꼼꼼히 읽어보니, 테스트 도구를 학습하고 단위 기능의 테스트를 작성하는 것이 이번 주차의 목표임을 확인할 수 있었다. TDD 방법론은 아니지만, 테스트 단계를 경험하는 한 주가 되리라 예상했다.
전에는 테스트 단계를 도전해보고 싶어도 어디서부터 어떻게 시작해야 할지 몰라 시도해보지 못했지만,
이번 2주차 과제에서 "JUnit 5, AssertJ" 라는 테스트 도구를 사용하라는 친절한 프로그래밍 요구 사항과 학습용 테스트 코드 예시들이 제시된 덕분에, 어디서부터 시작하고 무엇을 학습해야 할지를 고민하며 찬찬히 계획해 볼 수 있었다.

테스트 도구에 대해 공부하기


그래서 내가 미리 계획한 학습법에 따라 공부한 방법은 다음과 같았다.
1. 먼저 제시된 학습용 테스트 코드 StringTest 클래스의 코드들 읽어보며 import된 모듈과 사용된 어노테이션, 작성된 각 메서드들을 하나하나 읽어보며 왜 이런 메서드가 사용되었는지, 어떠한 메서드인지, 하나씩 구글링하여 조사했다. (asserThat() 메서드와 체이닝 방식을 이용해 사용된 메서드들을 하나하나 찾아가며 공부함.)
2. 학습용 코드의 일부를 변형해가며 그에 따라 바꿔는 결과값을 통해 테스팅 메서드에 대한 이해를 확장하였다.
3. JUnit 5와 Assert J 가 어떠한 테스트 도구인지, 어떻게 사용되고 있는지 추가적으로 조사해보았다.
4. JUnit 5, Assert J 를 이용한 추가적인 테스트 코드 예제들을 찾아가며 이해를 도왔다.
5. 위의 과정을 블로그 글로 정리하여, 나의 생각과 의견들을 추가적으로 작성하며 배운 것을 까먹지 않도록 꼼꼼히 기록하였다.

이렇게 테스트 도구를 우선적으로 학습하고 나니, 왜 프로그램 코드를 작성하기 전에 꼼꼼하게 기능 요구사항들을 분석해야 하며, 요구사항에 알맞게 기능 목록들을 작성해야 하는지, 왜 기능 목록들을 최대한 세분화하여 각 기능들에 대한 테스트를 용이하게 하여 확장 가능한 프로그램을 만들 수 있도록 해야 하는지에 대한 답들을 찾아낼 수 있었다.

미션 수행 과정


결국 이번 2주차는 테스트에 대한 이해를 바탕으로, 조금 더 섬세한 기능 구현 목록을 만들기 위해 노력했다.
문제에 대한 전체적인 순서도 그림으로 도식화하여, 요구 사항에 대한 이해를 높였고, 순서도에서 중요한 핵심 기능과 세부적인 기능들을 나누어 세부적인 기능 목록들을 도출할 수 있었다.

노션에 따로 요구 사항들을 정리하고, 꼼꼼히 읽어가며 댓글 기능을 이용해 각 요구 사항들을 어떻게 구현해나가면 좋을지와 해결방법에 대한 고민들을 혼자 주저리주저리 써보았다.
도식화한 flowchart에 최대한 요구 기능들을 모두 담을 수 있도록 하였다.
그렇기 기능 요구 사항들도 혼자 표로 정리해보고, 테스트가 필요한 기능사항 목록들도 따로 정리해보았다.


크게 다음의 기능들로 분리할 수 있었고, 각 기능에 대해서도 세부적인 기능과 오류 처리 방안을 미리 설계하였다.

1. 컴퓨터에서 정수 난수 생성
2. 사용자 입력과 에러 처리
3. 볼, 스트라이크 개수 구하기
4. 사용자에게 다음 입력 받기

그렇게 설계에 더 많은 시간을 쏟고 나니, 막상 프로그램을 작성할 때에는 큰 어려움이 없었다.
테스트 코드를 작성하기 위해 메서드를 어떻게 더 잘게 쪼갤 수 있을까에 대해 많은 고민을 하는데 조금 시간이 걸리긴 했지만, 각 메서드의 핵심 기능이 무엇인지, 입력값과 출력값이 무엇인지를 명확히 하면 그리 어려울 것도 없었다.

프로그램을 작성하면서, 지난주 코수타에서 중요하게 언급되었던 "의미있는 변수명, 메서드명 만들기", "최대한 메서드를 잘게 쪼개기"와 1주차 전체 리뷰 문서에 나와있던 내용들, 그리고 이번에 추가된 프로그래밍 작성 요구사항에 제시된 Java Code Convention, indentation의 depth가 2 이하가 되도록 하기, 함수가 한 가지 일만 하기 를 명심하며 코드 리팩토링도 간간히 하였다.

2주차를 통해 깨달은 것


전에는 아직 내 수준에서는 거리가 맞지 않다 느끼며, 회피하곤 했던 "테스트"를 이번 2주차 과제를 통해 명확히 그 개념을 이해하고, 학습해 나가며, 직접 개발을 하는 과정에서 도입하여 적용할 수 있었다. 이제는 테스트라는 단계가 어느정도 개발이 완성된 즈음에 시도하는 단계가 아니라, 기능 목록을 작성하고 프로그램을 설계하는 그 순간부터 테스트 과정은 함께 병행하는 것임을, 테스트 도구를 통해 내가 작성하고 있는 메서드들을 조금 더 정교하게 분리하고 확장하며 논리적으로 프로그램을 짤 수 있도록 도와주는 도구임을 깨달았다.

직접 작성한 Tests들!


무엇보다, 이전에는 간단하게만 기능 요구 사항을 작성하고 바로 코드 작성 단계로 넘어가 프로그램을 완성한 후에서야, 다시 기능 요구 사항을 되짚어보며 그제서야 오류를 발견하게 되는 불상사를 만들지 않게 되었다. 프로그램 언어로 코드를 작성하는 것도 중요하지만, 꼼꼼한 설계가 밑바탕이 되어야 더 효율적으로 코드를 작성할 수 있으며, 테스트 도구를 통해 효율적인 코드의 정합성 검증 단계를 거칠 수 있음을 새로 배우게 되는 2주차 였다.

앞으로 남은 미션들을 수행할 때에도, 프로그램을 개발할 때에도, 테스트 코드를 개발 과정에서 작성하는 단계는 안 거칠래야 안 거칠 수 없는 필수적인 과정이 될 것이라 믿어 의심치 않는다.

열심히 설계해서 코드를 짜긴 했지만, 아직은 객체 지향과 클린 코드의 관점에서는 많이 부족한 것 같다.
저번주에는 감사하게도 두 분께 코드 리뷰를 받을 수 있었는데, 가장 어렵게 느껴졌던 핵심적인 6,7 번 문제에서는 리뷰를 받지 못해 아쉬움이 많다. 그리고 내 코드에 너무너무 자신감이 없어서 쉽사리 코드리뷰 스터디에 (참여하고 싶지만) 참여하지 못했다. 이번주에는 좀 더 용기를 내어 코드 리뷰를 받고, 나 또한 다른 누군가의 코드에 리뷰를 할 수 있는 기회가 있기를 바라며, 또 새로운 3주차 미션과 내일 진행될 코수타를 기대하며 2주차 회고를 마쳐보려고 한다.

728x90
반응형
Comments