회고 / / 2024. 10. 5. 09:01

스프링 스터디 시작 전 Lotto Project. 그리고 인생 첫 코드리뷰

이번에 GDG on Campus Konkuk의 24-25 온보딩 이후 다양한 스터디들이 열렸고, 난 스프링 스터디에 참여하기로했다.

그리고 이 스터디를 하기전, 가벼운 Lotto Project와 함께 코드리뷰를 해주신다고 해서 설레는 마음으로 빠르게 코딩을 완료하고 PR을 날렸다.

Lotto Project는 우아한테크코스에서 프리코스 미션으로 사용하는 것으로 알고있어 꽤 유명한 리포지토리로 알고있다.


첫 번째 코드리뷰

PR을 올리고 코드리뷰가 시작됐는데, 엄청 많은 댓글들이 달려서 조금 놀랐지만 하나씩 읽어봤다.

이런 좋은 말들도 있었지만 어쨌든 코드리뷰는 비평을 들어야 성장한다고 생각해서 잠깐 기분만 좋았다가 접어뒀다..

 

나의 코드에서 가장 큰 문제는 다음과 같았다.
1. 코드에서 관심사의 분리 (SoC, Seperation of Concerns) 가 잘 이루어지지 않았다.
2. 객체는 추상화된 모델인데, 최초에 의도한 것처럼 추상화된 역할이 구분되지 않았다. (= 역할이 모호하다)
3. 특히 Application.java 에서, UI역할을 의도한 클래스 치고는 너무 모호하다.

 

댓글이 많았지만 커밋에서 부분부분에 이런 점들이 많았고, 멋진 스터디장님은 한줄한줄 리뷰해주셨다.

결국 계속 소통하면서 이렇게 4개의 커밋을 추가로했고, 

추가적으로 스터디장님이 각 클래스별 의도된 역할과 어떻게 상호작용하고 있는지를 주석으로 작성해달라고 하셔서 이 부분에 대해 적용을 한 뒤 두 번째 Pull Request를 열었다.

열일해주셔서 너무너무 감사합니다...

 


두 번째 코드리뷰

첫 번째 PR에서 받은 사항들을 리팩토링하여 다시 코드리뷰를 요청했다.

몇가지 저번 리뷰때 수정 권유 받은 사항들과 함께 스터디장님의 개인적인 코멘트를 남겨주셨다.

 

I/O를 담당하고 있는 로직들을 Application.java 클래스에서 분리하기를 권유하신건데 스프링을 공부해봤기때문에 이 말이 무슨말인지 알았다.

사실 Spring Framework를 사용한 프로그램이었으면 당연히 이렇게 안했다. Controller-Service-Repository 같이 Layered Architecture에 대해 습관처럼 적용을 하고있었기 때문이다. 이런 상황에서도 Application.java에는 스프링을 호출하고 config하는 코드가 포함되는 것처럼 일반 java 코드에서도 UI를 담당하는(Spring에선 Controller) 클래스를 IO.java에 적용했다.

 

그리고 몇가지 추가적인 디테일 리뷰를 받고 아래의 요약문을 받았다.

결국 내 코드에서 꾸준히 문제가 되고 있는건 각 클래스의 역할이 모호하다는것.

코드를 분리한다는 것이 곧 개념을 분리한 것이 아님을 명심하면서 리뷰를 반영했어야하는데, 너무 수정을 빠른 템포로 가져가다보니 꾸준히 실수가 나왔다.

 

결국 나는 Validation.java 라는 클래스를 만들어서 예외처리에 관한 (throws Exception) 내용을 아예 분리를 시켰고 이를 통해 IO.java의 의존도를 낮췄다.

아침에 이런저런 고민을 하면서 리팩토링을 했는데, 내가 객체지향에 대한 개념이 아직 많이 부족하구나를 느꼈다. 

JAVA Kotlin 개발을 하려면 결국 평생 SOLID 원칙에 대한 고민을 하면서 살아야할텐데 갈길이 멀다고 생각했다.

몇가지 질문에 답변을 받았고, 특히 4번의 답변으로 이제 이를 다시 리팩토링하여 MVC 패턴을 적용해보라는 리뷰를 주셨다.


세번째 코드리뷰

세번째 코드 리뷰는 메서드 네임과 관련된 몇가지 피드백 이후에 종료되었다.

또한, MVC 패턴에 대해 필수가 아님을 강조하면서 종료되었다.

내가 이전 코드리뷰에서, "IO.java의 역할이 너무 커지는 것 같은데 어떻게 하는게 좋을까요?" 라고 물었기에 MVC를 언급해 주신 듯 했다.


정리 및 느낀점

코드리뷰가 시작할 때:

코드리뷰가 끝날 때:

결국 이렇게 클래스들을 역할별로 쪼개면서 많은 클래스들이 생기고 끝이났다. 

 

가장 크게 와닿은 느낀점들은 다음과 같다.

  1. 코드리뷰는 정말 학습단계에서 중요한 절차이다. 내가 짠 코드가 완벽하다 생각했지만, 정말 많이 고쳐지면서 훨씬 좋은 코드가 되었다.
  2. 객체지향 프로그래밍 개념을 알고 있다면 적용을 해보자. 이 훈련은 많이 하는 방법밖에 없다고 들었다.
  3. 여기서 MVC패턴을 적용한 것처럼, 디자인 패턴은 내가 필요할 때 쓰는 것이다. 근데 뭐가있는지 알아야 적용할텐데,,,,ㅎ
  4. 클래스, 메소드 네이밍도 정말 어렵다. 내가 그럴싸하게 지어놓은 네이밍이 다른사람이 코드를 읽을 때 방해요소로 작용할 수 있다.
  5. 테스트 코드는 중요하다. 셀 수 없이 많은 수정에서 테스트코드로 코드의 동작여부를 파악했고 엄청 크게 도움되었다. 

나의 프로젝트 리포지토리 Link

https://github.com/SIKU-KR/24-25-study-java-lotto

 

GitHub - SIKU-KR/24-25-study-java-lotto

Contribute to SIKU-KR/24-25-study-java-lotto development by creating an account on GitHub.

github.com

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유