백엔드 멘토링

Car-Racing 토이 프로젝트 step 1 회고록 (1)

piedra_de_flor 2023. 7. 11. 01:33

2023.06.15 토이 프로젝트 시작


 

3학년 여름 방학 때 공부하며 아주...작은..토이 프로젝트를 하나 진행하였다.

자동차 경주 게임을 개발하는 일 이었는데 인터넷을 검색해보니 이미 유명한 프로젝트였고,

여러 코드들도 많이 있었지만 무슨 객기인지 다른 사람의 코드를 보고싶지 않았다.

그걸 보게 되면 처음 설계부터 기능 요구사항 까지 연습하려던 계획이 무산될 것 같았다ㅋㅋ

 

처음 프로젝트 시작할때는 기능 요구사항, README.md를 먼저 작성해 주었다.

 

 

다른 사람들이 어떻게 README를 작성하는지 참고하며 나도 따라 썼던 것 같다.

개발 기간과 개발 환경은 그렇다 쳐도 요구사항 부분은 수정해야 할 부분이 참 많아 보인다.

나는 개인적으로 받고있는 멘토링을 해주시는 멘토분이 코드 리뷰를 해주셨는데,

README 부분만 4~5번은 빠구를 먹은거 같다...ㅎㅎㅎ

 

뼈대라고 하기에도 하찮은 기능 요구사항을 적은 뒤 바로 설계를 시작했는데 사실 이때까지만 하더라도

설계는 무슨 그냥 무작정 개발부터 시작했던 거 같다ㅋㅋ

 

 

 

그래도 기능별 커밋을 진행하려고 노력했던게 보인다.

커밋 컨밴션을 찾아보고 최대한 잘 써보려고 노력했던 것 같다.

기능적으로만 보자면 이때도 완벽하게 돌아갔지만.....코드는 전혀 완벽하지 못했다...

기능별로 커밋을 시킨 후 pr을 올리면 멘토님이 이렇게 답변을 남겨 주셨고, 난 그 답변에 맞게 대답을 하거나 리팩터링을 진행하는 식으로 프로젝트가 진행되었다.

답변 2개만 찍어 왔는데 고칠게 상당히 많았던건지 답변이 셀 수도 없던건 비밀...^^

 

리팩터링을 진행하면서 나도 남들처럼 멋지게 Notion을 이용해보고 싶어서 한번 덤벼봤지만

쉽지 않았다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

부끄러운 나의 개떡같은 Notion ㅎㅎ^^

그래도 Notion쓰니까 해야할 일 정리하기는 편했던거 같기도 하고...?

 

 

 

 

 

지적을 많이 받은 부분이 네이밍, 상수화, 매직넘버, 클린코드 컨벤션등이 참 많았고 제일 도움이 된 부분이기도 했다.

 

특히나 기억에 남는 경험들에는

  • 의존성 관리
  • 일급 컬렉션
  • 싱글톤 패턴
  • Stream
  • 수직거리
  • Test 코드 작성

사실 이 프로젝트로 배워간게 너무 많아서 모든 것을 말할 수는 없겠지만 기억에 남는 경험들 위주로 정리해 보겠다.

 

 


 

1. 의존성 관리

 

보이는 것과 같이 많은 의존성 문제가 있었다, 자고로 객체지향적 설계라 함은 각 객체들이 자율적인 존재로 응집도는 높되 결합도는 낮아야 하지만 내 코드는 전혀 그렇지 못했다.

사실 이 부분에 대한 리팩터링을 할 때에도 협력 안에서의 객체의 책임을 생각하며 의존성을 관리 하도록 해야했지만

이때의 나는 의존성만 없애기에 급급했던것 같다.

사실 이때 코드를 갈아업고 다시 설계부터 시작해야 했었는데...좋은 경험이겠지.....?

 

 

2. 일급 컬렉션

일급 컬렉션이란 개념은 이때 처음 알게 되었다.

일급 컬렉션에 대해 공부해보라는 멘토님의 조언에 한번 공부를 해보았고, 이미 티스토리에도 일급 컬렉션에 대해 정리를 해 놓은 상태이다.

 

짧게 말하자면 일급 컬렉션이란 비지니스 로직에 종속적인 자료구조를 만들어서 사용하는 Collection을 Warpping한 형태를 말한다.

 

 

3. 싱글톤 패턴

싱글톤이란 하나의 클래스에 대한 인스턴스를 하나만 생성하고 다른 인스턴스의 생성을 막아 메모리를 효율적으로 사용하게 해주는 디자인 패턴이다.

 

해당 객체를 싱글톤 패턴으로 바꿔보는게 어떻겠냐는 멘토님의 조언에 따라 구글링을 해가며 열심히 리팩터링을 하였다.

확실히 싱글톤으로 바꾸니 자주 사용되었던 InputView 인스턴스의 생성이 없어져 메모리적으로 이득을 챙긴 것 같다는 걸 느낄 수 있었던 것 같다.

 

 

4. Stream

Stream....Java8때 새로 나온 Collection을 더 효율적으로 사용하기 위해 만들어진 기술이다....

java 버전별 특징을 공부할 때 이런게 있구나 라는 것만 알고 넘어갔지만, Stream, lambda와 같은 기술들은

매우 자주 사용되는 편이기에 특히나 이번 프로젝트를 진행함에 있어 자주 사용하려고 노력했다.

이처럼 lambda와 Stream을 적극적으로 활용하여 개발을 시도해 보았고

이건 진짜 미친거 같다. 진짜 편리하다....

계속 더 공부해보면서 자주 사용해봐야겠다는 생각이 많이 들었다.

 

 

 

5. 수직거리

수직거리는 Clean Code의 일종이다. 즉 코드가 더 깔끔하고 보기 좋은 소위 좋은 코드가 되기 위한 기술이다.

이 또한 멘토님이 공부해보라고 하셔서 공부해본 것이고, 이를 제외한 다른 Clean Code에 관한 내용도 함께 볼 수 있어

진짜 좋았던 것 같다.

 

수직거리란 연관성이 있는 코드들을 가까이 둔다는 내용이었고, 이를 알게 되고 내 코드를 보니 아주 엉망진창이었다.

모두 리팩터링을 시켰고 다음에 코드를 짤 때에는 Clean Code에 맞게 짜보도록 노력해봐야겠다ㅋㅋ

 

 

 

6. test코드 작성

사실 나는 test코드를 제대로 작성해 본 것이 이게 처음이다...

진짜 고역이었다... 자동차 경주에 관한 직접적인 로직은 진짜 금방 슥슥 짰는데 test 코드를 짜는데만 정말 오래걸렸다.

여러가지 의존성 문제, 접근성 문제 난리 였고 해결하기가 참 힘들어서 멘토님에게 질문도 꽤나 많이 했던 것 같다.

 

테스트 코드 또한 여러가지 고칠점이 참 많았고, 테스트 코드를 짜면서 test코드, System.in에 대한 공부, 접근제어자로 인해 접근이 불가 할때 접근 할 방법 등 여러가지 참 많이 배웠던 것 같다.

 

특히 @ParamiterizedTest 라는 것을 처음 공부해보았는데, 이건 내가 원하는 테스트 케이스들을 추가하여 여러번 테스트를 돌릴 필요 없이 테스트 케이스를 만들어 사용하는 기술이었다.

(멘토님이 주신 @ParamiterizedTest에 관한 링크 영어로 되어 있어서 너무 힘들었다....)

 

요게 바로 내가 쓴 @ParamiterizedTest ^^

 

 


 

 

이 외에도 자잘한 여러가지 문제점이 참 많았다.

그래도 그냥 개발만 하는 것이 아닌 좋은 코드를 짜기 위한 연습을 할 수 있는 기회가 나에게 얼마나 있을까를 생각하면

진짜 좋은 경험인 것 같다. 객체지향 개발....진짜 어렵다......

 

리팩터링을 열심히 한 결과 어찌저찌하여 Merge해도 된다는 말을 들었고, 난 너무 좋았다

사실 멘토님은 아직 맘에 안드셨을 거지만...ㅋㅋ

 

 

총 코멘트 수 101개ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

내 코드에 고칠 점이 step1만 해도 101개가 있다는 뜻이....사실 내가 답변으로 단 댓글도 있지만 그래도 50개는 넘네...

 

참고로 README.md도 많이 나아졌다.

그래도 진짜 많은걸 얻어갈 수 있는 프로젝트 진행인거 같다 보람찬거 같다.

이제 step2 진행하고 step2 Merge가 되면 그에 대한 회고록도 작성할 예정이다

 

 

끝!