스터디

[스터디] 리팩터링 2판 후기 - 02. 리팩터링을 알아보자

developerYoung 2023. 7. 6. 22:15
반응형

2. 리팩터링 원칙

2주차 개발 스터디를 참여하며 리팩터링 2장을 읽으며, 공유해보자해요.

이번 단원부터는 본격적으로 리팩터링이 어떤 원칙을 중심으로 진행되는지 차근차근 알려드리도록 할게요!

 

2.1 리팩터링 정의

  • 리팩터링[명사] : 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉬도록 내부 구조를 변경하는 기법
  • 리팩터링하다[동사] : 소프트웨어의 겉보기 동작은 그대로 유지한 채, 여러 가지 리팩터링 기법을 적용해서 소프트웨어를 재구성하다.

자 리팩터링은 명사, 동사 두가지로 위와 같이 소개할 수 있어요.

중요한 점은 겉보기 동작이 그대로 유지된 채, 소프트웨어가 재구성(개선)되는 작업을 리팩터링이라고 한다는 것을 알 수 있죠!

자 그러면 본격적으로 리팩터링하러 가볼까요?!

 

여러분은 리팩터링을 한다고 하면 주로 어떤 행위를 할 때, 리팩터링한다고 말했었나요? (각자 직접 적어보던지, 해보세요! 나눠도 좋구요)

 

우리는 리팩터링을 한다면 단순 코드 정리가 아니라 어떠한 규칙에 따라(예를 들면 함수 추출하기, 함수 옮기기) 코드 정리를 해야하며 그 규칙들을 거치고 거쳐서 큰 변화(수정하기, 이해하기, 추가하기 쉬운)를 만들어내야만 해요.

 

이제 이해가 되시나요?! 우리는 리팩터링을 통해 얻을 목적에 집중해야해요!

 

아래 예시를 통해 보도록 할게요!

{
...
	let score = 0; // 테스트 점수 합산
	let questionCnt = 0; // 테스트 문제수 합산
	for (let test in testList){
		score += test.score;
		questionCnt +== test.questionCnt;
	}
	return `총 점수 : ${score}, 총 문제수 : ${questionCnt}`
}

위와 같은 예시를 이 책에서 말하는대로 리팩터링한다면 이렇게 변경할 수 있어요.

{
...
	return `총 점수 : ${getScoreBy(testList)}, 총 문제수 : ${getQuestionCntBy(testList)}`
}

const getScoreBy = (testList) => {
	let result = 0;
	for (let test in testList){
	result += test.score;
	return result
}

const getQuestionCntBy = (testList) => {
	let result = 0;
	for (let test in testList){
	result += test.questionCnt;
}
{
...
	return `총 점수 : ${getScoreBy(testList)}, 총 문제수 : ${getQuestionCntBy(testList)}`
}

const getScoreBy = (testList) => {
	return testList.reduce((acc, curr)=> acc + curr.score, 0)
}

const getQuestionCntBy = (testList) => {
	return testList.reduce((acc, curr)=> acc + curr.questionCnt, 0)
}
  • 반복문 쪼개기(1개의 반복문을 두개로)
  • 함수 추출하기(getScoreBy, getQuestionCntBy 추출)
  • 변수 인라인하기(score, questionCnt 변수 제거)
  • 함수 파이프라인으로 변경하기(for문에서 reduce)

물론 이렇게 잘게 짜르는 행위를 모든 개발과정에선 하지 않겠지만, 더 복잡한 로직에서 이러한 부분이 적용된다면 더 이해하기, 수정하기 쉬운 코드로 나아갈 수 있다고 생각해요.

 

위와 같은 코드를 리팩터링을 완료했다면, 리팩터링의 목적에 맞게 했는지 확인해보죠.

저는 이해하고, 수정하기 쉽게 만들었는지 확인해보려해요!

`총 점수 : ${getScoreBy(testList)}, 총 문제수 : ${getQuestionCntBy(testList)}`

어떤가요? 굳이 처음에 있었던 for문을 다 읽지 않아도 어떠한 행위를 할지 예측할 수 있을까요?

그렇다면 리팩터링은 성공적이었다고 저는 확신할 수 있어요!

 

2.2 두 개의 모자

저자에게 도움을 준 켄트 벡은 ‘기능 추가’ 모자와 ‘리팩터링’ 모자를 구분하여 개발해야한다고 했어요. 리팩터링할 때는 리팩터링에만, 기능 추가할 때는 기능 추가만 하라는 말이에요.

이 말은 정말 개발하면서 나 리팩터링해야해! 나 기능 추가해야해! 이렇게 분기를 나누라는게 아니에요.

여러분이 개발하면서 정확히 어떤 관점으로 개발할지를 갖고 코드를 살펴보라는 의미죠. 핵심은 5분주기로 번갈아 끼더라도 어떤 모자를 쓰고있는지를 스스로 알면서 개발해야해요!

 


오늘 다룬 내용은 리팩터링의 기술보단 리팩터링을 어떤 마음가짐을 갖고, 어떤 목적을 갖고 해야하는지 알아보는 시간이었습니다. 글이 길어지기보다 나눠쓰려고 좀 짧게 끝난 느낌이지만.. 다음 글도 금방 정리해서 올리도록 할게요!

 

다음 리팩터링 2판 스터디 글은 리팩터링하는 이유와 고려할 문제에 대해 다뤄볼게요! 그럼 이만!

 

 

반응형