6월 중순부터 사내 개발팀 스터디를 진행하고 있어요.
저는 첫번째 책으로 리팩터링 2판을 읽고 있고, 이 책을 읽으며 드는 생각과 앞으로 개발팀 내에서 어떻게 발전해나가면 좋을지 공유하고자 스터디 내용을 정리하여 공유하고자 해요!
저자의 내용을 토대로 지극히 저의 주관적인 생각을 담고 있음을 알려드립니다.
리팩터링 2판 서론.
서론 내용은 다음과 같이 정리할 수 있어요.
1. 그냥 리팩터링하면 되지 않을까요? → 리팩터링엔 위험이 따라와요.
- 동작하는 코드 수정에 미묘한 버그 생길 가능성
- 잘못 수행시에 오류로 시간과 노력이 수포로 돌아갈 가능성
그렇다면 어떻게 리팩터링 하면 좋을까요?
계획적이고 체계적이도록 실행하자!(목표를 설정?!)
2. 리팩터링이란?
- 겉으로 드러나는 코드의 기능(동작)은 바꾸지 않지만 내부 구조를 “개선”하는 방식으로 소프트웨어 시스템을 수정하는 과정이에요.
- 단순하고 사소한 수정을 통해 설계가 개선되는 것을 목표로 설정해요.
- 이 책을 통해 얻고자 하는 것이 무엇일까요? (개인적 + 저자)
서론을 읽고나서 다시금 '어떤 개발자로 성장해야할까?'라는 질문에 저는 아래와 같은 개발자가 되고 싶다고 생각했어요!
- 리팩터링의 원리를 이해하여 프로젝트에 활용하는 개발자
- 앞으로의 함께하는 개발자와 리팩터링이 필요한 부분을 적용해주는 개발자
- 우리 팀문화에 맞게 리팩터링을 도입할 부분을 계획해가는 개발자
1. 리팩터링: 첫 번째 예시
코드의 설명보다는 나의 경험을 토대로 비교를 진행하며 QA를 통해 배운점을 적어가보려 해요.
Q1. 리팩터링시 프로그램의 설계를 보면서 어떤 관점을 갖고 봐야할까요?!
처음엔 “리팩터링이란 코드를 보면서 단순히 함수화하여 중복코드와 지저분해 보이는 코드를 정리하려는 목적이야”라는 생각을 갖고 했어요.
하지만 진짜 목적은 다음과 같이 설계를 개선해가는게 핵심이라고 생각해요.
- 새로운 개발자가 프로그램을 분석한다고 가정하면 아래와 같은 생각이 들지 않도록!
- 이 코드는 도저히 뭘하는게 목적이야?!
- 이 동작만 수정하면 되는데 뭘 수정해야하지?
- 새로운 기능을 추가할건데 여기다가 추가하면 되나?
- 프로그램의 나중을 위해 아래와 같은 일이 일어나지 않도록!
- 확장성없이 개발하여 중복코드가 매우 많아지는
- 하나의 로직/정책의 변경으로 여러 코드를 수정하게되어 버그를 유발
저는 이 책을 통해 위와 같은 일이 나오지않는 프로그램을 만드는 개발자가 되는걸 목표로 설정하려해요.
특히, 가장 중요하게 여기는 것은 코드리뷰와 페어프로그래밍을 통해 변수명과 함수명, 그리고 함수 분리를 같이 나눠보며 나중에 보더라도 우리가 무엇을 하려했었는지를 확실히 이해시켜주는 코드를 짜려고 해요!
Q2. 리팩터링을 할 때, 가장 중요한 것이 무엇일까요?
이 책에서 리팩터링의 첫 단계는 항상 똑같다는 말을 해요. 수정하여도 정상적으로 프로그램이 작동하는지 확인할 “테스트”의 역할을 강조해요.
실제로 저자는 예시를 통해 리팩터링을 하면서 조금의 수정을 함에도 항상 컴파일하고 테스트하고 커밋을 하는 습관을 갖도록 말해줘요. 그만큼 리팩터링은 테스트에 의지하기때문에 테스트를 작성하는 데 시간이 걸리지만, 전체 작업 시간은 오히려 단축됨을 알려줘요!
리팩터링하기 전에 제대로 된 테스트부터 마련한다. 테스트는 반드시 자가진단하도록 만든다.
최근에 회사 프로젝트에서 리팩터링을 진행하면서 일어난 일이 있어요.
리팩터링의 내용을 책의 예시를 통해 소개해드릴께요.
함수 추출하기 를 통해 재사용성, 목적과 구현 분리 두가지 측면에서 이점을 얻기 위해 API를 호출하는 부분을 모두 함수화하여 사용할 때 getNews()와 같은 형태로 쉽게 어떤 목적인지를 알기위해 리팩터링할 계획을 세웠어요.
하지만 제대로 테스트를 진행하지않고 함수를 추출하면서 단지 깔끔해졌다는 신남만 갖고 넘어간게 배포서버에 가서야 리턴값이 없없던 상황을... 인지하게 되었죠..
그리고서야 리팩터링을 하면서 반드시 테스트를 통해 자가진단을 하기로 다짐하게 되었어요.
그리고 이 일과 스터디를 진행한 일주일 뒤, 테스트 코드를 도입하면서 우리가 어떤 목적을 갖고 테스트를 하는지 명확히하며 제대로 도입하려고 해요!
Q3. 1단원에서 가장 인상깊은 내용이 무엇일까요??
1단원에선 기본적인 리팩터링(6단원 내용)의 기법을 통해 실제 예시를 리팩터링하는 과정을 다양한 기법들을 통해 쭉 보여줘요! 제가 가장 배우고 싶은 것은 위에서 말했듯 작성한 코드가 어떤 목적인지를 한눈에 알 수 있게 작성하여 수정하기 좋은 코드를 만들어가는 것이에요.
저자는 리팩터링을 진행한 후에 이렇게 말했어요.
“44줄짜리 코드가 리팩터링 후에 70줄이나 된다. 추가된 코드 덕분에 전체 로직을 구성하는 요소 각각이 더 뚜렷이 부각되었다”
처음엔 44줄의 코드가 쭉 나열되어있었지만, 모든 것을 이해하는데는 모든 코드를 읽어야했어요.
하지만 70줄이 되었지만, 고작 6줄만 읽고도 해당 함수가 어떤 역할을 할지 이해시키는 것을 보고 '아! 이게 리팩터링하는 이유구나'를 체감할 수 있었어요.
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. (좋은 코드라면 하는 일이 명확히 드러나야 한다)
위의 말처럼 하는 일이 명확히 드러나는, 그리고 컴퓨터만 이해하는 코드를 짜는 바보가 되지 않도록 노력해보는게 어떤가요?!
이러한 리팩터링을 많이 진행하면서 리팩터링을 해야하는 관점을 스스로 명확히 가져가려고 해요. 저자가 명확히 말하는 ‘수정하기 쉬운 정도’ 처럼요.
이러한 저만의 관점을 명확히 정해서 확실히 적용해가는 개발팀으로, 그리고 같은 관점을 갖고 진행하는 개발팀으로 앞으로도 계속해서 만들어가기위해 꾸준히 노력하려해요!
여러분이 생각하는 리팩터링은 무엇인가요?
다들 어떤 생각을 갖고 리팩터링을 하는지 궁금하네요!
'스터디' 카테고리의 다른 글
리팩터링 2판 - 06. 코드에서 나는 악취 (코드스멜) 2탄 (1) | 2023.07.16 |
---|---|
리팩터링 2판 - 05. 코드에서 나는 악취 (코드스멜) (1) | 2023.07.13 |
리팩터링 2판 - 04. 리팩터링하는 시기 및 고려할 문제 (YAGNI!) (1) | 2023.07.10 |
리팩터링 2판 - 03. 리팩터링하는 이유 (0) | 2023.07.08 |
[스터디] 리팩터링 2판 후기 - 02. 리팩터링을 알아보자 (1) | 2023.07.06 |