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

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

## 소개

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

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

> \[!NOTE] 예시 응답은 이 문서에 포함되어 있습니다. GitHub Copilot Chat은 여기에 표시된 응답과 다른 응답을 제공할 수 있습니다.

## 코드 이해

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

1. IDE 편집기에서 관련 코드를 선택합니다.
2. 인라인 채팅 열기:

   * **VS Code에서:** <kbd>Command</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>i</kbd>(Windows/Linux)를 누릅니다.
   * **Visual Studio에서** <kbd>Alt</kbd>+<kbd>/</kbd>를 누릅니다.
   * **JetBrains IDE에서:** <kbd>Control</kbd>+<kbd>Shift</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>g</kbd>(Windows/Linux)를 누릅니다.
3. 인라인 채팅의 입력 상자에 슬래시(`/`)를 입력합니다.
4. 드롭다운 목록에서 **/explain**을 선택하고 <kbd>Enter</kbd> 키를 누릅니다.
5. Copilot이(가) 반환하는 설명이 몇 줄 이상인 경우 **채팅에서 보기**를 클릭하여 설명을 더 쉽게 읽을 수 있습니다.

## 비효율적인 코드 최적화

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

### 예제 코드

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

```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` loop 또는 파일의 전체 내용을 선택합니다.

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

   * ```
               **VS Code and Visual Studio:**<kbd>Control</kbd>+<kbd>Command</kbd>+<kbd>i</kbd> (Mac) / <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>i</kbd> (Windows/Linux)
     ```
   * **JetBrains**: <kbd>Control</kbd>+<kbd>Shift</kbd>+<kbd>c</kbd>

3. 채팅 패널 아래쪽의 입력 상자에 `Can this script be improved?`을 입력합니다.

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

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

   * **VS Code 및 JetBrains에서:** 채팅 패널의 제안 항목에 마우스를 올린 후 나타나는 **커서 위치에 삽입** 아이콘을 클릭합니다.

     ![Copilot Chat 패널에 있는 ‘커서에 삽입’ 아이콘의 스크린샷입니다.](/assets/images/help/copilot/insert-at-cursor.png)

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

### Copilot 인라인 채팅 사용

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

1. `for` loop 또는 파일의 전체 내용을 선택합니다.

2. 인라인 채팅 열기:

   * **VS Code에서:** <kbd>Command</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>i</kbd>(Windows/Linux)를 누릅니다.
   * **Visual Studio에서** <kbd>Alt</kbd>+<kbd>/</kbd>를 누릅니다.
   * **JetBrains IDE에서:** <kbd>Control</kbd>+<kbd>Shift</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>g</kbd>(Windows/Linux)를 누릅니다.

3. `optimize`을 입력하고 <kbd>Enter</kbd> 키를 누릅니다.

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

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

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

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

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

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

## 반복 코드 정리

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

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

```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에서:** <kbd>Command</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>i</kbd>(Windows/Linux)를 누릅니다.
   * **Visual Studio에서** <kbd>Alt</kbd>+<kbd>/</kbd>를 누릅니다.
   * **JetBrains IDE에서:** <kbd>Control</kbd>+<kbd>Shift</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>g</kbd>(Windows/Linux)를 누릅니다.

3. `move repeated calculations into functions`을 입력하고 <kbd>Enter</kbd> 키를 누릅니다.

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

   ```javascript
   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 코드는 사각형 영역과 원을 출력하지만 더 간결하게 작성할 수 있습니다.

```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에서:** <kbd>Command</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>i</kbd>(Windows/Linux)를 누릅니다.
   * **Visual Studio에서** <kbd>Alt</kbd>+<kbd>/</kbd>를 누릅니다.
   * **JetBrains IDE에서:** <kbd>Control</kbd>+<kbd>Shift</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>g</kbd>(Windows/Linux)를 누릅니다.

3. `make this more concise`을 입력하고 <kbd>Enter</kbd> 키를 누릅니다.

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

   ```python
   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 코드는 매우 간단한 예제이지만 단일 함수를 특정 작업을 수행하는 두 함수로 분할하는 원리를 보여줍니다.

```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에서:** <kbd>Command</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>i</kbd>(Windows/Linux)를 누릅니다.
   * **Visual Studio에서** <kbd>Alt</kbd>+<kbd>/</kbd>를 누릅니다.
   * **JetBrains IDE에서:** <kbd>Control</kbd>+<kbd>Shift</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>g</kbd>(Windows/Linux)를 누릅니다.

3. `split into 2 separate functions: one for cleansing data, the other for printing`을 입력하고 <kbd>Enter</kbd> 키를 누릅니다.

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

   ```python
   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` 문을 사용하여 수행할 작업을 결정합니다.

```java
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에서:** <kbd>Command</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>i</kbd>(Windows/Linux)를 누릅니다.
   * **Visual Studio에서** <kbd>Alt</kbd>+<kbd>/</kbd>를 누릅니다.
   * **JetBrains IDE에서:** <kbd>Control</kbd>+<kbd>Shift</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>g</kbd>(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. <kbd>Enter</kbd> 키를 누릅니다.

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

   ```java
   /**
    * 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에 이 함수가 있다고 가정해 보겠습니다.

```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에서:** <kbd>Command</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>i</kbd>(Windows/Linux)를 누릅니다.
   * **Visual Studio에서** <kbd>Alt</kbd>+<kbd>/</kbd>를 누릅니다.
   * **JetBrains IDE에서:** <kbd>Control</kbd>+<kbd>Shift</kbd>+<kbd>i</kbd>(Mac) 또는 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>g</kbd>(Windows/Linux)를 누릅니다.
3. `use arrow notation and better parameter names`을 입력하고 <kbd>Enter</kbd> 키를 누릅니다.

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

   ```javascript
   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에 설치되어 있는지에 따라 달라집니다. 모든 언어 확장이 이 기능을 지원하는 것은 아닙니다.

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

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

2. <kbd>F2</kbd> 키를 누릅니다.

3. **Visual Studio만 해당:**<kbd>Ctrl</kbd>+<kbd>Space</kbd>를 누릅니다.

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

   ![기호 이름에 대한 대안을 제공하는 VS Code의 드롭다운 목록 스크린샷.](/assets/images/help/copilot/rename-symbol.png)

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

   이름은 project 전체에서 변경됩니다.