학습
Go 리팩토링 (Refactoring)
Go 리팩토링 (Refactoring) — 고급
리팩토링 (Refactoring)
1. 도입 (왜 배워야 하는가)
리팩토링(refactoring)은 기존의 코드 구조를 변경하지 않으면서 코드의 품질을 개선하는 과정입니다. 실무에서 리팩토링은 필수적입니다. 코드가 복잡해지거나 유지보수가 어려워지면 새로운 기능을 추가하는 데 방해가 됩니다. 리팩토링을 통해 코드를 깔끔하게 정리하면, 팀원들이 이해하기 쉬워지고, 버그를 수정하거나 새로운 기능을 추가하는 과정이 훨씬 수월해집니다.
리팩토링을 하지 않으면 코드가 점점 복잡해져서 결국 개발 속도가 느려지고, 에러 발생률이 높아지며, 기술 부채가 쌓이게 됩니다. 이는 결국 프로젝트의 성공 가능성을 낮추는 결과를 초래합니다.
2. 핵심 개념 설명
리팩토링의 핵심 개념은 다음과 같습니다:
- 코드 중복 제거: 같은 코드가 여러 곳에 존재하는 경우, 이를 하나의 함수로 묶어 중복을 제거합니다.
- 메서드 추출: 긴 메서드를 여러 개의 작은 메서드로 나누어 가독성을 높입니다.
- 변수 이름 변경: 의미 없는 이름의 변수를 보다 명확한 이름으로 수정합니다.
- 비유: 같은 요리를 여러 번 만드는 대신, 한 번 잘 만들어 놓고 그 요리를 여러 번 활용하는 것과 같습니다.
- 비유: 긴 이야기를 여러 개의 짧은 이야기로 나누어 각 이야기를 쉽게 이해할 수 있도록 하는 것입니다.
- 비유: "a", "b"라는 이름 대신 "userAge", "productPrice"와 같은 설명적인 이름을 사용하는 것입니다.
| 용어 | 정의 |
|---|---|
| 코드 중복 | 동일한 코드가 여러 곳에서 반복되는 현상 |
| 메서드 추출 | 긴 메서드를 여러 개의 짧은 메서드로 나누는 것 |
| 변수 이름 변경 | 의미 있는 변수 이름으로 변경하는 것 |
3. 기본 코드 예제
아래 예제는 중복된 코드를 제거하는 리팩토링을 보여줍니다.
package main
import "fmt"
func main() {
// 중복된 코드
user1Age := 30
user2Age := 25
fmt.Println("User 1 age:", user1Age)
fmt.Println("User 2 age:", user2Age)
// 리팩토링 후
printUserAge(user1Age)
printUserAge(user2Age)
}
func printUserAge(age int) {
fmt.Println("User age:", age)
}
실행 결과
User age: 30
User age: 25
main 함수에서 두 개의 사용자 나이를 출력하는 코드가 있습니다.printUserAge라는 함수를 만들어 호출했습니다.printUserAge 함수는 사용자 나이를 인자로 받아 출력합니다.4. 실전 활용 예제
예제 1: 쇼핑몰 장바구니 구현
쇼핑몰에서 장바구니에 아이템을 추가하는 로직이 복잡할 경우, 이를 메서드로 분리하여 가독성을 높일 수 있습니다.
package main
import "fmt"
type Cart struct {
items []string
}
func (c *Cart) addItem(item string) {
c.items = append(c.items, item)
fmt.Println(item, "has been added to the cart.")
}
func main() {
cart := Cart{}
cart.addItem("Apple")
cart.addItem("Banana")
}
예제 2: 사용자 정보 출력
사용자 정보를 출력하는 로직을 메서드로 분리하여 중복을 줄이고 유지보수를 용이하게 합니다.
package main
import "fmt"
type User struct {
name string
age int
}
func (u User) displayInfo() {
fmt.Printf("Name: %s, Age: %d\n", u.name, u.age)
}
func main() {
user1 := User{name: "Alice", age: 30}
user2 := User{name: "Bob", age: 25}
user1.displayInfo()
user2.displayInfo()
}
5. 흔한 실수와 주의사항
실수 1: 리팩토링 후 테스트 미비
// 리팩토링 후 테스트를 하지 않음
cart.addItem("Apple")
// 리팩토링 후 반드시 테스트를 해야 함
cart.addItem("Apple")
if len(cart.items) == 0 {
fmt.Println("Test failed: item not added.")
}
실수 2: 변경 사항을 팀원과 공유하지 않음
// 리팩토링 후 변경 사항을 공유하지 않음
// 리팩토링 후 팀원과 변경 사항을 공유해야 함
fmt.Println("Refactored addItem method to enhance readability.")
6. 정리
다음에 학습하면 좋은 주제로는 "테스트 주도 개발(TDD)"를 추천합니다. TDD는 리팩토링과 함께 코드 품질을 높이는 중요한 접근 방식입니다.