나에 대한 실망이 가득했던 저번 주차를 극복하고 마지막 주차는 제법 만족스러운 결과물을 완성하였다.
지난 3주차를 진행하는 과정에서 익숙하지 않았던 UI / Domain 로직을 분리하는 일 그리고 Enum 클래스를 통해 유사한 성질의 데이터를 묶어서 관리하는 일은 큰 벽으로 느껴졌다.
때문에 만족스러운 결과물을 만들어내지 못하였고 이를 극복하기 위해 모든 주차 중 가장 많은 시간을 4주차 과제에 투자하였다.
부족했던 부분에 관한 내용을 디테일하게 정리하고 학습하며 아쉬웠던 부분을 보완해나갔다.
SRP원칙을 기준삼아 하나의 객체는 하나의 책임을 가지게 하며, 메서드는 기능 단위로 작게 분할해나가는 등 저번 과제보다 훨씬 객체지향에 가깝게 구현해나갔다.
많은 시간을 투자한 덕분에 이해도가 낮아 저번 주차에서 사용하지 못하였던 일급 컬렉션까지 적용하여 과제를 마무리할 수 있었다.
그리고 4주의 여정이 모두 끝난 지금 추후에 돌아보았을 때 현재 내가 배운 것들을 떠올려낼 수 있도록 4주간 어느 부분이 부족하였고, 어느 부분이 성장하였는지, 그리고 아직 부족하여 노력해야 할 부분에 대하여 정리해보려고 한다.
유용하게 사용한 것들
우선 유용하게 사용하였던 것들에 대해 정리해보고자 한다.
:: StringJoiner
StringJoiner는 값을 정해진 형식에 맞춰 출력해야 할 때에 정말 편리하게 사용할 수 있다.
아래 예시 코드를 통해 알아보자
만약 1,2,3,4,5를 그냥 출력하는 것이 아닌 [1-2-3-4-5] 와 같은 형태로 출력해야 할 때에
아래와 같이 코드를 작성하면 간편하게 해결할 수 있다.
// public StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
StringJoiner sj = new StringJoiner("-", "[", "]");
sj.add(first);
sj.add(second);
sj.add(third);
sj.add(fourth);
sj.add(fifth);
String joinerResult = sj.toString();
System.out.println(joinerResult);
new StringJoiner("값 사이에 들어갈 문자","preffix","suffix")
생성자에 위처럼 값을 집어넣어 StringJoiner 인스턴스를 생성해준 후, add() 메서드를 통해 값을 설정해준다.
그럼 StringJoiner 인스턴스 toString() 값으로 원하던 값인 [1-2-3-4-5] 을 출력할 수 있다.
다리게임 게임보드의 상단과 하단을 출력할 때에 StringJoiner를 사용하여
[ O ][ ][ O ]
[ ][ O ][ ]
위와 같은 형태의 문자열을 얻어낼 수 있어 편리했다.
참고 자료
Java StringJoiner (문자열 구분자 붙이기)
:: System.in / System.out 테스트
콘솔을 통해 입력 받은 값으로 결과를 출력해야하는 메서드 테스트를 어떻게 구현할 지 몰라 서칭한 결과 아래와 같은 좋은 기능을 학습할 수 있었다.
OutputStream과 InputStream을 통해 테스트하는 방법인데 이를 통해 편리하게 테스트 케이스를 작성해낼 수 있었다.
참고 자료
저번 주차에 아쉬웠던 점
:: Enum
보통 서버를 개발할 때 Enum을 유저 권한(일반 유저, 관리자)을 부여할 때만 사용하였기 때문에 Enum의 활용법을 알지 못하였다.
:: 일급 컬렉션
3주차 과제에서 Lotto 클래스를 List<LottoNumber> 컬렉션 객체를 포장한 일급 컬렉션으로 만들어 사용하려하였지만 일급 컬렉션에 대한 이해도가 부족하여 이를 구현하지 못하였다.
:: Domain 로직 / UI 로직의 분리
도메인 기능과 UI기능 분리를 해야했지만 이 또한 도메인 로직과 UI 로직에 관한 지식과 이해가 부족하여 뜻에 맞게 분리하는 것에 실패하였다.
:: 테스트 구현
TDD방식으로 수행 해보고자 했으나 조급한 마음에 클래스와 메서드를 제대로 분리하지 못하여 기능 단위로 테스트하는 것에 실패하였다.
:: 네이밍
변수는 명사, 메서드는 동사로 네이밍 하는 것은 잘 지켜졌지만, 영어 실력이 부족하여 네이밍 작업에 많은 시간을 소모하게 되었다.
:: 클래스/패키지 분할 미숙
클래스와 패키지를 제대로 분할하는 것은 프로젝트가 어떤 동작을 하는 지 파악하는 데에 큰 역할을 한다고 생각한다. 이처럼 중요한 작업이지만 경험이 부족하여 이 작업에도 많은 시간을 소모하게 되었다. 특히 네이밍 실력이 부족했기 때문에 패키지와 클래스를 더 분할하기 어려웠다.
저번 주차보다 성장한 점
:: Enum
단편적으로만 알고 있던 Enum을 유사한 값의 집합으로 사용하는 등 Enum의 진정한 사용법을 깨달을 수 있었다.
상수로 만들어 사용하는 것도 좋은 방법이지만 유사한 성질을 가진 값들은 Enum으로 묶어 사용한다면 더욱 가독성있는 코드를 작성할 수 있다.
:: 일급 컬렉션
일급 컬렉션은 코드 가독성에 큰 영향을 미치며 클린 코드에 있어 중요한 요소이다.
사용할 때마다 작성해야 하기 때문에 중복이 불가피한 값 검증과 같은 비즈니스 로직을 일급 컬렉션 내부에 작성하여 중복을 피할 수 있을 뿐더러 컬렉션에 이름을 붙여 사용할 수 있게 해주기 때문에 변수명이 아닌 자료형에서 이 변수가 어떤 역할을 하는 아이인지 파악할 수 있도록 돕는다.
여러모로 편리한 기능이니 잘 기억해두자.
:: Domain 로직 / UI 로직의 분리
개인적으로 우테코에서 배운 제일 큰 녀석이다. Domain로직과 UI로직이라는 것 자체를 모르고 코드를 짜왔는데, 이것을 분리하는 것이 코드 수정, 테스트 구현 등에 있어 큰 역할을 하고 있다는 것을 배웠다.
객체 지향은 알면 알 수록 신기하고 재미있는 것 같다. 자바 학습을 시작한 지 얼마 되지 않았을 때엔, 대체 왜 객체 지향이라고 부르는 지에 대해 전혀 이해하지 못하였었다. 하지만 이제는 어느 정도 알 것 같다.
객체를 역할과 기능에 맞게 적절히 분리하여 개발하게 되면 어떤 객체가 필요한 상황이 왔을 때, 커다란 프로그램 내부에서 필요한 작은 녀석 하나만 가져와 사용할 수 있다.
마치 나사를 조이려고 할 때, 다양한 도구가 있는 커다란 공구함에서 작은 드라이버 하나만을 꺼내어 사용하듯이 말이다.
:: Single Responsibility Principle
하나의 클래스는 하나의 역할만을 가질 수 있다는 SOLID 원칙의 SRP를 4주차에선 잘 지켜나간 것 같다. 전문가가 보기엔 부족한 부분이 많았을 테지만 이전보다는 성장하였기에 성장한 점에 두었다. 뿐만 아니라 메서드도 기능 단위로 작게 분할하여 기능 테스트를 위한 테스트 코드를 작성하는 데에 불편함을 줄였다. 이번 우테코를 진행하며 가장 신경을 많이 쓴 것들 중 하나인데, 앞으로도 더 좋은 코드를 위해 계속해서 고민해야 하는 부분이라고 생각한다.
노력해야할 점
:: 테스트 구현
테스트 구현은 아직 미숙한 부분인 것 같다. 그래도 4주차에선 우아한테크코스에서 제공해준 NsTest 라이브러리를 통해 편안하게 테스트 코드를 작성할 수 있었다. 하지만 이는 내가 작성한 테스트가 아니기 때문에 아직 많은 아쉬움이 남는 부분이다. 테스트 구현에서 많이 막히는 나의 모습을 보며 AssertJ와 Junit5에 대한 이해도와 지식을 쌓는 것이 시급하다고 생각하게 되었다.
:: 네이밍
네이밍은 영어 실력과 센스가 많이 필요한 부분인 것 같다. 번역기를 통해 해답을 얻는 것은 한계가 있다는 것을 많이 느낀 4주였다. 한글 → 영어 번역기를 돌리면 한 가지 단어만을 추천해주는데 변수명이나 메서드명으로 사용하기에는 너무 어려운 영어 단어인 경우가 꽤 많았다. 우테코 프리코스 덕분에 개발 공부 뿐만 아니라, 영어 공부도 꾸준히 병행하며 학습해야겠다고 다짐 할 수 있었다.
:: 클래스/패키지 분할
클래스와 패키지 분할은 문제없을 거라고 생각했지만, 3주차 과제 리팩터링 시에 시간을 정말 많이 투자했던 것들 중 하나였다. 큰 분류 주제를 잡되 최대한 세부적으로 나누는 것이 핵심이라는 것을 배울 수 있던 좋은 시간이었다.
4주차 과제 진행시에는
domain / view / constant / service / controller / util 이정도로 분리하여 깔끔하게 구현할 수 있었다.
하지만 앞으로도 계속 고민하고 노력해야 할 것들 중 하나라고 생각하여 노력해야 할 점에 추가하게 되었다.
프리코스 팁
:: main에 구현하기 전에 더미 데이터로 Test코드 작성해보고 구현하면 빠르게 구현 가능
TDD 방식으로 개발해나가라는 소리이다. main 메서드에 바로바로 기능을 구현하기 이전에 먼저 테스트 코드를 작성해라. 테스트 시에 실제 값을 통하여 테스트를 하지 못하더라도 실제와 유사한 더미 데이터로 테스트를 진행하여 테스트를 마친 기능들만 사용해라
기능이 생각대로 움직인다고 하더라도 예외가 터지는 상황까지 고려가 가능한 테스트를 먼저 진행해야 나중에 문제가 발생할 확률이 줄어든다.
꼭 예외 상황까지 테스트를 하도록 하자.
:: main메서드에 순차적으로 기능 구현될 때마다 적용하면서 구현
기능 단위로 구현을 마칠 때마다 main 메서드에 구현된 기능을 적용해보면서 구현해나간다면 테스트는 잘 되지만 출력 결과가 이상한 경우를 없앨 수 있으며 빠른 오류 수정이 가능했다.
또한 모든 기능 구현이 완료되었을 때 메인 메서드를 Controller와 Service 객체에 잘 분리하여 넣기만 하면 리팩터링만 남게 되어 개발 시간을 단축할 수 있었다.
마지막으로..
우아한 테크코스와 함께한 시간 클린코드를 사용하는 이유를 알게 해주었고 객체지향스럽게 자바를 사용하는 방법을 배우게 해주었다.
나의 한계를 경험하고 그 한계를 극복하게 해준 너무나도 감사한 경험이었다.
개발자로 살아가는 동안 프리코스에서 겪은 4주간의 여정을 항상 기억하며 "클린코드를 지향하는 개발자"로 계속해서 성장해 나갈 것이다.
좋은 기회를 만들어주신 우아한테크코스 모든 멘토분들과 관계자분들께 너무 감사하다.
클린코드를 마스터할 때까지 정진!
'부트캠프 > 우아한테크코스 5기 프리코스' 카테고리의 다른 글
[우테코 5기] 최종 코딩테스트 회고록 (2) | 2023.01.02 |
---|---|
[우테코 5기] 프리코스 3주차 회고록 (2) | 2022.11.22 |
[우테코 5기] 프리코스 2주차 회고록 (1) | 2022.11.20 |
[우테코 5기] 프리코스 1주차 회고록 (0) | 2022.11.09 |