!!! 우테코 자소서를 읽어봐달라는 메일 보내지 마세요 !!!
너무 많이와서 힘들어요 어차피 답장도 안할꺼니깐 보내지 마세요
보낼 생각 없었다면 ㅈㅅ함니다 ><
💋 인트로
이번 포스팅에서는, 우아한테크코스 5기 프리코스 3주차 로또 회고에 대해 작성해보려고 합니다.
3주차는 세 가지에 집중했다.
💋 1. 클래스와 메소드를 기능별로 나누되 불필요한 객체 생성을 최소화하고 MVC 패턴을 적용한다.
슬랙에서 참가자들끼리 자발적으로 만든 피어리뷰 커뮤니티에 들어가서 2주차 숫자 야구 과제부터 본격적으로 동료들의 리뷰를 받았다. MVC 패턴을 적용하면 더 좋은 코드가 될 것 같다는 피드백을 받았고 곧바로 검색했다.
model, view, controller 각각의 역할을 비유해서 설명한 자료는 많았지만, 막상 코드를 보면 감이 잘 오지 않았다. 어떤 식으로 클래스를 분리하면 좋을 지 고민하던 중에 우테코에서 진행했던 강의를 찾았다. model은 다른 것들에 의존성이 없어야 한다는 말의 의미를 model 안에 view, controller의 코드가 존재하면 안 된다고 풀어 주신 발표자님 덕분에 어떤 방식인지 곧바로 이해할 수 있었다.
나의 코드는 view에서 직접 데이터를 가져다 쓴 부분도 있었고, model에서 view, view끼리 호출하는 부분도 정말 많아서 한 번의 실행에 여러 파일을 오가며 실행되고 있었다. view가 model의 데이터를 직접 가져다 쓰지 않도록 정리하는 부분에서 함수의 파라미터를 설정하고 바뀐 부분에 따라 오류가 나는 코드를 수정했고 이 과정이 점차 빨라지면서 점점 재미가 붙었다.
💋 2. 테스트 코드를 통해 리팩토링에서 실수를 줄인다.
아래는 내가 생각한 테스트를 작성하는 이유이다.
테스트를 작성하기 전까지는 클래스를 생성한 후에 Application을 실행하고, 확인하고 싶은 클래스가 나오기 전까지의 모든 input을 제대로 넣어줘야 했다. 하지만 test code를 작성한 후로는 내가 구현한 클래스를 앞 과정을 모두 생략한 채 곧바로 테스트할 수 있어서 좋았다.
가장 특별했던 점은 리팩토링을 한 후에 바뀐 코드가 이전과 동일한 기능을 잘 구현하는지 많은 방면에서 확인할 수 있었다는 것이다. 같은 코드더라도, 예를 들어 count를 초기화하는 코드가 어느 위치에 있냐에 따라서도 테스트의 통과, 실패 여부가 달라졌다. 초기화 지점을 생각하며 객체가 어느 시점에서 복제되는 지와, static의 개념에 대해서 더 깊이 이해할 수 있었다.
구현만을 위해서 코드를 작성하다 보면 각 클래스의 입력값과 반환값이 헷갈릴 때가 많았다. 하지만 테스트 코드를 통해서 모호한 머릿속의 생각을 구체화할 수 있었다. 결과적으로 코드가 더 구체적으로 보이기 시작했고 에러가 났을 때에도 코드 독해력이 무척 빨라져서 어느 부분에서 에러가 날 지 예측하는 정도가 되었다.
💋 3. 데이터의 연관성을 파악하기 쉽도록 한다. (Java Enum 활용 등)
Enum을 활용하는 것이 이번 과제에서 가장 어려웠다. 나는 '내가 이 도구를 사용하면 사용하지 않았을 때에 비해 얼마나 효율적일 것인가'가 확실해야 그 도구를 코드에 가져다 쓸 수 있는 사람인데, 고민하는 과정에서 이틀 간 골머리를 앓다가 Enum을 사용하는 이유를 결국 찾았다.
처음에는 Enum을 사용하지 않은 채로 빠르게 구현을 완성했다. 정리되지 않은 코드였지만, List나 Map을 통해서 정리하면 충분히 깔끔해질 수 있을 것 같았다. 곧바로 브랜치를 만들어서 코드를 짜기 시작했다. 이 과정에서 로또 1등이라는 FIRST와 맞춘 숫자의 개수인 6개, 보너스 숫자를 포함하는 지의 여부, 상금의 액수, 출력해야 하는 문구의 문자열이라는 5가지 데이터를 계속 연관지어 생각하며 코드를 작성해야 했다. 코드가 기능적으로는 작동했지만 며칠 뒤에 내가 본다면 이 네 가지를 어떻게 연관지어야 할 지 주석을 통해 달아놓아야만 알아볼 수 있을 것 같았다. 나도 잘 알아보지 못하는 코드는 다른 사람이 보았을 때에는 절대 알아볼 수 없다고 생각했다. 나는 이 네 가지 데이터를 결합하여 클래스의 필드처럼 각각의 데이터를 언제나 연관지어 사용할 수 있다는 점에서 Enum의 효용을 알게 되었다. 그리고 곧바로 만들었다.
백엔드에서 이와 유사하게 데이터를 관리해야 할 일은 아주 많을 것 같다. 또한 데이터의 연관 관계를 고치고 싶다고 한다면? 예를 들어 이 문제에서는 보너스 숫자 포함 여부를 다른 등수에서도 고려해야 한다고 하면 Enum의 필드 하나만 고치면 된다. 하지만 Enum을 사용하지 않았을 때에는 연관 관계가 들어 있는 모든 코드를 찾아서 고쳐야 하는데 이는 컴파일 에러도 나지 않으며 모든 코드와 그 연관관계를 완벽히 파악하지 않으면 고치기가 매우 어려울 것이다.
마지막으로 다른 사람의 코드를 리뷰하면서 실력이 향상되는 것을 처음 경험했다. 로또 과제를 받고, 나는 새 과제에만 몰두하지 않고 이전 과제에서의 개선점을 찾으면 두 과제 사이에 유사성이 많기 때문에 크게 발전할 수 있다고 믿었다. 많은 분들의 코드를 리뷰하면서 나와 크게 다른 로직을 가진 분의 코드는 완전히 이해한 후에 나의 방식을 설명하는 식으로 리뷰를 남겼다. 많은 분들이 친절하게 내 코드도 리뷰해 주었고 정규표현식을 사용할 때 Pattern을 사용해야 효율적이라는 것, else를 남발해 가독성이 떨어진다는 것을 알려주셨다. 불필요한 반복을 줄일 수 있는 방법 등을 많이 제안해주었다.
다른 사람에게 내 코드의 개선점을 들을 때마다 정말 생각지도 못했던 부분을 많이 알게 되었고 내 코드를 더 객관적으로 바라볼 수 있게 되었다. 내 코드를 더 정갈하고 직관적으로 만들어서 코딩을 하지 못하는 사람도 나의 코드를 읽을 수 있으면 좋겠다고 생각했다. 우테코 과정을 경험한다면 많은 사람들의 피드백을 꾸준히 받고, 10개월 이후에도 그들과 소통하며 계속해서 발전할 수 있는 커뮤니티를 만들 수 있을 것 같아서 더 잘 해야겠다고 다짐했다.
나의 Pull Request 링크
https://github.com/woowacourse-precourse/java-lotto/pull/155
GETTER, SETTER를 지양해야 하는 이유
https://velog.io/@sezeom/Getter-Setter-%EC%A7%80%EC%96%91%ED%95%98%EA%B8%B0
MVC 패턴
https://m.blog.naver.com/jhc9639/220967034588
도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!
'우아한테크코스5기' 카테고리의 다른 글
[우테코] 코드 품질: 좋은 코드는 어떤 코드일까? (0) | 2023.02.08 |
---|---|
[우테코] 단위테스트: 좋은 단위테스트에 대한 고민... 단위테스트는 꼭 필요한 것일까? (0) | 2023.02.08 |
[우테코] 자바 쌩초보의 우아한테크코스 5기 최종 합격 후기 (11) | 2023.01.02 |
[우테코] 우아한테크코스 5기 프리코스 4주차 다리건너기 회고 (0) | 2022.11.22 |
[우테코] 우아한테크코스 5기 프리코스 2주차 숫자야구게임 회고 (5) | 2022.11.09 |