Skip to main content

GitHub Copilot를 사용하여 코드 리팩터링

Copilot 인공 지능을 활용하여 코드를 빠르고 효과적으로 리팩터링할 수 있습니다.

소개

코드 리팩터링은 동작을 변경하지 않고 기존 코드를 재구성하는 프로세스입니다. 리팩터링의 이점은 코드 가독성 향상, 복잡성 감소, 더 간편한 코드 유지 관리 및 새로운 기능을 더 쉽게 추가할 수 있는 것 등이 있습니다.

이 문서에서는 Copilot을(를) 사용하여 IDE의 코드를 리팩터링하는 방법에 대한 몇 가지 아이디어를 제공합니다.

Note

예시 응답은 이 문서에 포함되어 있습니다. GitHub Copilot Chat은(는) 여기에 표시된 응답과 다른 응답을 제공할 수 있습니다.

코드 이해

기존 코드를 수정하기 전에 해당 용도와 현재 작동 방식을 이해해야 합니다. Copilot가 도움이 될 수 있습니다.

  1. IDE 편집기에서 관련 코드를 선택합니다.

  2. 인라인 채팅 열기:

    • VS Code에서: Command+i(Mac) 또는 Ctrl+i(Windows/Linux)를 누릅니다.
    • Visual Studio에서 Alt+/를 누릅니다.
    • JetBrains IDE에서: Control+Shift+i(Mac) 또는 Ctrl+Shift+g(Windows/Linux)를 누릅니다.
  3. 인라인 채팅의 입력 상자에 슬래시(/)를 입력합니다.

  4. 드롭다운 목록에서 /explain을 선택하고 Enter 키를 누릅니다.

  5. Copilot이(가) 반환하는 설명이 몇 줄 이상인 경우 채팅에서 보기를 클릭하여 설명을 더 쉽게 읽을 수 있습니다.

비효율적인 코드 최적화

Copilot를 사용하면 코드를 더 빠르게 실행하는 등 코드를 최적화하는 데 도움이 될 수 있습니다.

예제 코드

아래 두 섹션에서는 다음 예제 Bash 스크립트를 사용하여 비효율적인 코드를 최적화하는 방법을 보여줍니다.

#!/bin/bash

# Find all .txt files and count lines in each
for file in $(find . -type f -name "*.txt"); do
    wc -l "$file"
done

Copilot Chat 패널 사용

Copilot은(는) 예제 Bash 스크립트와 같은 코드를 최적화할 수 있는지 여부를 알려줄 수 있습니다.

  1. for 루프 또는 파일의 전체 콘텐츠를 선택합니다.

  2. 활동 표시줄에서 채팅 아이콘을 클릭하거나 바로 가기 키를 사용하여 Copilot Chat을(를) 엽니다.

    • VS Code 및 Visual Studio: Control+Command+i(Mac) / Ctrl+Alt+i(Windows/Linux)
    • JetBrains: Control+Shift+c
  3. 채팅 패널 아래쪽의 입력 상자에 Can this script be improved?을 입력합니다.

    Copilot은(는) 코드를 보다 효율적으로 만들 수 있는 제안으로 회신합니다.

  4. 제안된 변경 사항을 적용하려면:

    • VS Code 및 JetBrains에서: 채팅 패널의 제안 위로 마우스를 가져가서 커서 위치에 삽입 아이콘을 클릭합니다.

      Copilot Chat 패널의 '커서 위치에 삽입' 아이콘 스크린샷.

    • Visual Studio에서: 미리 보기를 클릭한 다음 비교 보기에서 수락을 클릭합니다.

Copilot 인라인 채팅 사용

또는 예제 Bash 스크립트와 같은 기존 코드가 비효율적이라는 것을 이미 알고 있는 경우:

  1. for 루프 또는 파일의 전체 콘텐츠를 선택합니다.

  2. 인라인 채팅 열기:

    • VS Code에서: Command+i(Mac) 또는 Ctrl+i(Windows/Linux)를 누릅니다.
    • Visual Studio에서 Alt+/를 누릅니다.
    • JetBrains IDE에서: Control+Shift+i(Mac) 또는 Ctrl+Shift+g(Windows/Linux)를 누릅니다.
  3. optimize을 입력하고 Enter 키를 누릅니다.

    Copilot는 수정된 코드를 제안합니다. 예시:

    find . -type f -name "*.txt" -exec wc -l {} +
    

    -exec ... +를 사용하면 발견된 각 *.txt 파일에 대해 wc를 한 번 호출하는 대신 find가 한 번에 여러 파일을 wc에 전달할 수 있기 때문에 이 문서의 앞부분에 표시된 원래 코드보다 더 효율적입니다.

  4. Copilot의 제안을 평가하고 변경에 동의하는 경우 다음을 수행합니다.

    • VS Code 및 Visual Studio에서: 수락을 클릭합니다.
    • JetBrains: 미리 보기 아이콘(이중 화살표)을 클릭한 다음 모든 Diff 적용 아이콘(이중 꺾쇠 괄호)을 클릭합니다.

모든 Copilot 제안과 마찬가지로 수정된 코드가 오류 없이 실행되고 올바른 결과를 생성하는지 항상 확인해야 합니다.

반복 코드 정리

반복을 방지하면 코드를 보다 쉽게 수정하고 디버그할 수 있습니다. 예를 들어 동일한 계산이 파일의 다른 위치에서 두 번 이상 수행되는 경우 계산을 함수로 이동할 수 있습니다.

다음의 매우 간단한 JavaScript 예제에서는 동일한 계산(항목 가격에 판매된 항목 수를 곱한 값)이 두 위치에서 수행됩니다.

let totalSales = 0;

let applePrice = 3;
let applesSold = 100;
totalSales += applePrice * applesSold;

let orangePrice = 5;
let orangesSold = 50;
totalSales += orangePrice * orangesSold;

console.log(`Total: ${totalSales}`);

Copilot에게 반복 계산을 함수로 이동하도록 요청할 수 있습니다.

  1. 파일의 전체 내용을 선택합니다.

  2. 인라인 채팅 열기:

    • VS Code에서: Command+i(Mac) 또는 Ctrl+i(Windows/Linux)를 누릅니다.
    • Visual Studio에서 Alt+/를 누릅니다.
    • JetBrains IDE에서: Control+Shift+i(Mac) 또는 Ctrl+Shift+g(Windows/Linux)를 누릅니다.
  3. move repeated calculations into functions을 입력하고 Enter 키를 누릅니다.

    Copilot는 수정된 코드를 제안합니다. 예시:

    function calculateSales(price, quantity) {
      return price * quantity;
    }
    
    let totalSales = 0;
    
    let applePrice = 3;
    let applesSold = 100;
    totalSales += calculateSales(applePrice, applesSold);
    
    let orangePrice = 5;
    let orangesSold = 50;
    totalSales += calculateSales(orangePrice, orangesSold);
    
    console.log(`Total: ${totalSales}`);
    
  4. Copilot의 제안을 평가하고 변경에 동의하는 경우 다음을 수행합니다.

    • VS Code 및 Visual Studio에서: 수락을 클릭합니다.
    • JetBrains: 미리 보기 아이콘(이중 화살표)을 클릭한 다음 모든 Diff 적용 아이콘(이중 꺾쇠 괄호)을 클릭합니다.

모든 Copilot 제안과 마찬가지로 수정된 코드가 오류 없이 실행되고 올바른 결과를 생성하는지 항상 확인해야 합니다.

코드를 보다 간결하게 만들기

코드가 불필요하게 자세한 정보 표시하면 읽고 유지 관리하기가 어려울 수 있습니다. Copilot은(는) 선택한 코드의 보다 간결한 버전을 제안할 수 있습니다.

다음 예제에서 이 Python 코드는 사각형 영역과 원을 출력하지만 더 간결하게 작성할 수 있습니다.

def calculate_area_of_rectangle(length, width):
    area = length * width
    return area

def calculate_area_of_circle(radius):
    import math
    area = math.pi * (radius ** 2)
    return area

length_of_rectangle = 10
width_of_rectangle = 5
area_of_rectangle = calculate_area_of_rectangle(length_of_rectangle, width_of_rectangle)
print(f"Area of rectangle: {area_of_rectangle}")

radius_of_circle = 7
area_of_circle = calculate_area_of_circle(radius_of_circle)
print(f"Area of circle: {area_of_circle}")
  1. 파일의 전체 내용을 선택합니다.

  2. 인라인 채팅 열기:

    • VS Code에서: Command+i(Mac) 또는 Ctrl+i(Windows/Linux)를 누릅니다.
    • Visual Studio에서 Alt+/를 누릅니다.
    • JetBrains IDE에서: Control+Shift+i(Mac) 또는 Ctrl+Shift+g(Windows/Linux)를 누릅니다.
  3. make this more concise을 입력하고 Enter 키를 누릅니다.

    Copilot는 수정된 코드를 제안합니다. 예시:

    import math
    
    def calculate_area_of_rectangle(length, width):
      return length * width
    
    def calculate_area_of_circle(radius):
      return math.pi * (radius ** 2)
    
    print(f"Area of rectangle: {calculate_area_of_rectangle(10, 5)}")
    print(f"Area of circle: {calculate_area_of_circle(7)}")
    
  4. Copilot의 제안을 평가하고 변경에 동의하는 경우 다음을 수행합니다.

    • VS Code 및 Visual Studio에서: 수락을 클릭합니다.
    • JetBrains: 미리 보기 아이콘(이중 화살표)을 클릭한 다음 모든 Diff 적용 아이콘(이중 꺾쇠 괄호)을 클릭합니다.

모든 Copilot 제안과 마찬가지로 수정된 코드가 오류 없이 실행되고 올바른 결과를 생성하는지 항상 확인해야 합니다.

복잡한 코드 단위 분할

여러 작업을 수행하는 대규모 메서드 또는 함수는 특정 작업을 수행하는 데 중점을 두는 더 작고 간단한 함수에 비해 재사용 기회가 적을 가능성이 높습니다. 또한 이해하고 디버그하기가 더 어려울 수 있습니다.

Copilot은(는) 복잡한 코드 블록을 재사용에 더 적합한 더 작은 단위로 분할하는 데 도움이 될 수 있습니다.

다음 Python 코드는 매우 간단한 예제이지만 단일 함수를 특정 작업을 수행하는 두 함수로 분할하는 원리를 보여줍니다.

import pandas as pd
from pandas.io.formats.style import Styler

def process_data(item, price):
    # Cleanse data
    item = item.strip()  # Strip whitespace from item
    price = price.strip()  # Strip whitespace from price
    price = float(price) # Convert price to a float
    # More cleansing operations here

    # Create and print a DataFrame
    data = {'Item': [item], 'Price': [price]}
    df = pd.DataFrame(data)
    print(df.to_string(index=False))

# Example usage
item = "   Apple "
price = " 1.25"
process_data(item, price)

process_data 함수를 분할하려면:

  1. 함수 이름에 커서를 놓습니다.

  2. 인라인 채팅 열기:

    • VS Code에서: Command+i(Mac) 또는 Ctrl+i(Windows/Linux)를 누릅니다.
    • Visual Studio에서 Alt+/를 누릅니다.
    • JetBrains IDE에서: Control+Shift+i(Mac) 또는 Ctrl+Shift+g(Windows/Linux)를 누릅니다.
  3. split into 2 separate functions: one for cleansing data, the other for printing을 입력하고 Enter 키를 누릅니다.

    Copilot는 수정된 코드를 제안합니다. 예시:

    def cleanse_data(item, price):
      # Cleanse data
      item = item.strip()  # Strip whitespace from item
      price = price.strip()  # Strip whitespace from price
      price = float(price)  # Convert price to a float
      return item, price
    
    def print_data(item, price):
      # Create and print a DataFrame
      data = {'Item': [item], 'Price': [price]}
      df = pd.DataFrame(data)
      print(df.to_string(index=False))
    
    def process_data(item, price):
      item, price = cleanse_data(item, price)
      print_data(item, price)
    

    Note

    위에 표시된 제안 예시는 기존 함수를 세 개의 함수로 바꿉니다. 세 번째 함수는 단순히 다른 두 함수를 호출하고 process_data 함수를 호출하는 기존 코드를 허용합니다.

  4. Copilot의 제안을 평가하고 변경에 동의하는 경우 다음을 수행합니다.

    • VS Code 및 Visual Studio에서: 수락을 클릭합니다.
    • JetBrains: 미리 보기 아이콘(이중 화살표)을 클릭한 다음 모든 Diff 적용 아이콘(이중 꺾쇠 괄호)을 클릭합니다.

모든 Copilot 제안과 마찬가지로 수정된 코드가 오류 없이 실행되고 올바른 결과를 생성하는지 항상 확인해야 합니다.

가독성을 높이기 위해 조건부 코드를 다시 작성합니다.

다양한 조건에 따라 실행되거나 실행되지 않는 코드를 작성하는 방법에는 여러 가지가 있습니다. 일부 조건부 구조는 다른 조건부 구조체보다 특정 사용 사례에 더 적합하며, 대체 조건부 구조를 선택하면 코드를 더 쉽게 읽을 수 있습니다.

이 Java 메서드는 일련의 if 문과 else if 문을 사용하여 수행할 작업을 결정합니다.

public String getSound(String animal) {
  if (animal == null) {
      System.out.println("Oops! A null animal?");
  } else if (animal.equalsIgnoreCase("Dog")) {
      return "Bark";
  } else if ( animal.equalsIgnoreCase("Cat")) {
      return "Meow";
  } else if ( animal.equalsIgnoreCase("Bird")) {
      return "Tweet";
  }
  return "Unknown";
}

switch 문은 동일한 논리를 적용하는 더 나은 방법이 될 수 있습니다.

  1. 메서드 이름에 커서를 놓습니다.

  2. 인라인 채팅 열기:

    • VS Code에서: Command+i(Mac) 또는 Ctrl+i(Windows/Linux)를 누릅니다.
    • Visual Studio에서 Alt+/를 누릅니다.
    • JetBrains IDE에서: Control+Shift+i(Mac) 또는 Ctrl+Shift+g(Windows/Linux)를 누릅니다.
  3. 유형: rewrite the condition to use a switch and use Java 21 syntax with null case, but also add documentation and provide a better function name.

    단일 프롬프트를 사용하여 Copilot에게 여러 가지 변경을 요청할 수 있는 방법을 보여줍니다.

  4. Enter 키를 누릅니다.

    Copilot는 수정된 코드를 제안합니다. 예시:

    /**
     * Retrieves the sound made by a given animal.
     *
     * @param animal The name of the animal.
     * @return The sound made by the animal, or "Unknown" if the animal is not recognized.
     */
    public String getAnimalSound(String animal) {
        return switch (animal) {
            case null -> {
                System.out.println("Oops! A null animal?");
                yield "Unknown";
            }
            case String a when a.equalsIgnoreCase("Dog") -> "Bark";
            case String a when a.equalsIgnoreCase("Cat") -> "Meow";
            case String a when a.equalsIgnoreCase("Bird") -> "Tweet";
            default -> "Unknown";
        };
    }
    
  5. Copilot의 제안을 평가하고 변경에 동의하는 경우 다음을 수행합니다.

    • VS Code 및 Visual Studio에서: 수락을 클릭합니다.
    • JetBrains: 미리 보기 아이콘(이중 화살표)을 클릭한 다음 모든 Diff 적용 아이콘(이중 꺾쇠 괄호)을 클릭합니다.

모든 Copilot 제안과 마찬가지로 수정된 코드가 오류 없이 실행되고 올바른 결과를 생성하는지 항상 확인해야 합니다.

다른 구조를 사용하도록 코드 서식 다시 지정

JavaScript에 이 함수가 있다고 가정해 보겠습니다.

function listRepos(o, p) {
 return fetch(`https://api.github.com/orgs/${o}/repos?per_page=${parseInt(p)}`)
   .then((response) => response.json())
   .then( (data) => data);
}

코딩 표준에서 함수에 화살표 표기법과 매개 변수에 대한 설명이 포함된 이름을 사용해야 하는 경우 Copilot을(를) 사용하여 이러한 변경을 수행할 수 있습니다.

  1. 함수 이름에 커서를 놓습니다.

  2. 인라인 채팅 열기:

    • VS Code에서: Command+i(Mac) 또는 Ctrl+i(Windows/Linux)를 누릅니다.
    • Visual Studio에서 Alt+/를 누릅니다.
    • JetBrains IDE에서: Control+Shift+i(Mac) 또는 Ctrl+Shift+g(Windows/Linux)를 누릅니다.
  3. use arrow notation and better parameter names을 입력하고 Enter 키를 누릅니다.

    Copilot는 수정된 코드를 제안합니다. 예시:

    const listRepos = (org, perPage) => {
      return fetch(`https://api.github.com/orgs/${org}/repos?per_page=${parseInt(perPage)}`)
        .then(response => response.json())
        .then(data => data);
    };
    

기호 이름 개선

Note

  • VS Code 및 Visual Studio만 해당됩니다.
  • 이 기능의 지원 여부는 사용 중인 언어에 적합한 언어 확장 프로그램이 IDE에 설치되어 있는지에 따라 달라집니다. 모든 언어 확장이 이 기능을 지원하는 것은 아닙니다.

이름을 잘 선택하면 코드를 더 쉽게 유지 관리할 수 있습니다. VS Code의 Copilot 및 Visual Studio에서 변수 또는 함수와 같은 기호에 대한 대체 이름을 제안할 수 있습니다.

  1. 기호 이름에 커서를 놓습니다.

  2. F2 키를 누릅니다.

  3. Visual Studio만 해당: Ctrl+Space를 누릅니다.

    Copilot은(는) 대체 이름을 제안합니다.

    기호 이름에 대한 대안을 제공하는 VS Code의 드롭다운 목록 스크린샷.

  4. 드롭다운 목록에서 제안된 이름 중 하나를 선택합니다.

    프로젝트가 진행되는 동안 이름이 변경됩니다.