본문 바로가기
우아한테크코스/회고

[우아한테크코스] Lv. 1 - 3주차 회고: 리팩토링

by shyun00 2024. 3. 4.

페어와 작성했던 코드를 가지고 추가 기능을 구현하는 한 주였다.

페어와 함께 작업을 하다가 다시 혼자 작업을 하게 되니 처음 같이 작업했을때와는 반대로 또 다시 어색함을 느낀 한주였다.

사다리 게임 결과 로직 구현 (TDD) + 리뷰

지난주에 만들었던 사다리를 실행하고 결과를 출력하는 로직을 작성해야했다.

네이버 사다리타기 프로그램과 같은 기능을 만든다고 생각하면 된다..!

 

마찬가지로 TDD 방식으로 코드를 작성해야했는데, 페어와 함께했던 지난주와는 달리 혼자 진행해야해서 고민이 더 많이 됐다.

어떤걸 테스트해야할까? 어떤 방식으로 테스트할까? 이런것들을 함께 의논하고, 같이 방법을 찾아갔었는데

이번에는 그 과정을 혼자 해야하다보니 이게 맞는건가? 하는 의문이 계속 들었다. (바로바로 물어볼곳이 없어..)

우선 추가된 요구사항을 정리하고, 어떤 기능을 어떻게 만들어야할지 대략적으로 구상해보았다.

 

이 때 어려웠던 부분이 각 객체의 역할과 책임이 어디까지인가 였다.

어떤 기능을 어느 도메인에서 담당해야할지 구분하는것이 어려웠다.

 

그러다보니 사다리 한 줄내에서 이동하는것을 Point라는 별도의 객체가 수행하게 해보기도 했고,

(이 부분은 사다리 한 층내에서 담당해야하는 로직인것같아 Layer로 이동하였다.)

사다리 전체를 타는 로직을 GameResult에서 수행하도록 구현하기도 했다.

(마찬가지로 이 부분은 사다리가 스스로 해야하는 일인것같아 Ladder 자체에서 담당하도록 했다.)

 

이 부분은 코드를 구현하면서도 여러번 변경이 있었고, 리뷰를 받으면서도 변경이 생겼다.

물론 처음부터 완벽한 코드를 만들수는 없지만 역할에 대해 좀 더 깊게 미리 생각해봐야겠다는 생각이 들었다.

 

그리고 이번에 VO, DTO를 사용하면서 새로운 개념에 대해서도 학습하게되었다.

-> 이 부분은 추가로 정리할 예정이다.

 

그래도 생각보다 빠르게 미션을 구현할 수 있었고, 나머지 시간을 통해 패키지 구조도 정리하고

출력 형태도 과제에서 제시된것과 똑같이 만들어내려고 노력했다! (개행이나 출력 순서도 맞추고자했다.)

작고 귀여운 나의 결과물

리팩토링, 그거 어떻게 하는건데요?

리뷰를 받고 리팩토링을 하면서 한가지 어려운 부분이 있었다.

A라는 코드를 고치려고 하다보면 A를 사용하고 있는 다른 부분들도 연달아서 변경이 필요하다.

심지어 이 로직이 여러군데 들어가있을경우 수정을 하다보면 어느샌가 "어디를 고치려고 했던거지..?" 하는 상황이 되어서

다시 전체를 롤백하고 처음부터 작업한 적이 몇번 있다.

 

물론 그 과정에서 다시 한번 고민해보고 더 나은 방법을 찾을 수 있다는 장점도 있었지만, 시간이 한정적이라면 이는 치명적인 문제가 될 수 있다. 또한 예기치 않게 코드가 엉망진창이 되는 상황이 생길수도 있었다.

(실제 이번 미션에서 그걸 몇번 겪었다. 마치.. 루미큐브에서 기존에 있던걸 뜯어가며 정리하다가 중간에 무언가 놓쳐버려서 다시 되돌리지도 그렇다고 진행하지도 못하는 상황...🤦🏻‍♀️)

 

그래서 지난주에 네오의 강의가 아주 인상적이었다. 

나는 이때까지 리팩토링을 할 때 해당 코드를 바로 수정해버리는 만행을(?) 저지르고 있었다.

그런데 네오의 리팩토링 방식은 수정하려는 메서드를 복제하여 메서드명만 수정(ex. move() -> move2())한 뒤 내부 로직을 변경하고,

해당 메서드를 사용하는곳에서 변경된 이름(move2())을 적용해서 정상적으로 동작하는지 테스트했다.

이렇게 수정을 하니 혹시 잘못됐을 때 전체를 롤백하지 않고 수정중인 부분만 다시 확인하면 됐다.

그렇게 하니 리팩토링 과정이 비교적 덜 복잡하게 느껴졌다. (물론 엮여있는 코드가 많을경우 그 부분은 어쩔 수 없는것같다.)

 

다음 미션부터는 리팩토링을 할 때 해당 방식을 적용해보고자 한다! 부디 잘 할 수 있기를! :)