즉, 리팩토링은 코드 스멜을 제거하기 위해서 진행하는 것이다.
코드 스멜 | 리팩토링 기법 | 설명 |
---|---|---|
Duplicated Code | Extract Method Extract Class Extract Interface | 중복된 코드를 별도의 메소드, 클래스, 인터페이스로 추출하여 재사용이 가능하게 만드는 것 |
Long Method | Extract Method Split Temporary Variable Introduce Explaining Variable | 긴 메소드를 여러 개의 작은 메소드로 분리하여 가독성을 높이고, 이해하기 쉽도록 하는 것 |
Long Class | Extract Class Extract Subclass Extract Interface | 방대한 클래스를 여러 개의 클래스로 나누어 각 클래스가 단일 책임을 가지도록 하는 것 |
Overlong Parameter List | Introduce Parameter Object Extract Method | 많은 파라미터를 가진 메소드를 하나의 객체로 묶거나, 메소드를 분리하여 파라미터 개수를 줄이는 것 |
Divergent Change | Extract Class Extract Interface Separate Interface | 클래스가 여러 가지 변경에 영향을 받는 경우 클래스를 분리하거나 인터페이스를 통해 책임을 나누는 것 |
Shotgun Surgery | Extract Method Extract Class Move Method Move Field | 하나의 변경이 여러 클래스를 수정해야 하는 경우, 메소드와 필드를 적절한 클래스로 이동시켜 책임을 분리하는 것 |
Feature Envy | Move Method Move Field Extract Class | 메소드가 자신이 속하지 않은 클래스의 데이터에 과도하게 의존하는 경우, 메소드와 필드를 적절한 클래스으로 이동시키는 것 |
Data Clump | Extract Class Introduce Parameter Object | 관련된 데이터를 하나의 객체로 묶거나 클래스로 추출하여 데이터의 응집도를 높이는 것 |
Temporary Field | Extract Method Remove Assignment to Parameters Extract Class | 특정 상황에서만 사용되는 임시 변수를 적절한 메소드나 클래스로 추출하여 변수의 범위를 줄이는 것 |
Switch Statements | Replace Conditional with Polymorphism Extract Method Use Enum | 스위치 문을 다형성, 메소드 추출, 또는 열거형을 사용하여 대체하여 중복 코드를 줄이고 확장성을 높이는 것 |
Comments | Remove Comment Refactor Code | 코드가 스스로 설명하도록 리팩토링하여 불필요한 주석을 제거하는 것 |
Autowired 어노테이션을 제거한 후 생성자 주입을 사용하여 의존성 주입
@RequiredArgsConstructor
public class AttendancePostsService {
//생성자 말고 setter 메소드를 만들어서 자동 호출
//Autowired, setter 메소드, 생성자 중 골라야 함 -> setter가 보안상 좋음
private final AttendancePostsRepository attendancePostsRepository;
private final UserRepository userRepository;
private final OpenAIService openAIService;
}
private int determineAttendanceType(String attendanceType) {
int answer = 0;
switch (attendanceType) {
case "'과소비'":
answer = 1;
break;
case "'절약'":
answer = 2;
break;
case "'판단안됨'":
answer = 3;
break;
}
return answer;
}
기존의 switch문을 Map으로 구현하였다. 그와 동시에 각 타입에 대한 final 변수를 선언해 주었다(추후 이름 변경에 대비)
private static final Map<String, Integer> attendanceTypeMap = new HashMap<>();
private static final String TYPE_OVRSPENDING = "'과소비'";
private static final String TYPE_SAVING = "'절약'";
private static final String TYPE_UNDETERMINED = "'판단안됨'";
static {
attendanceTypeMap.put(TYPE_OVRSPENDING, 1);
attendanceTypeMap.put(TYPE_SAVING, 2);
attendanceTypeMap.put(TYPE_UNDETERMINED, 3);
}
private int determineAttendanceType(String attendanceType) {
return attendanceTypeMap.getOrDefault(attendanceType, 0);
}
public String switchPostTypeFromNumToWord(int typeNum){
if(typeNum == 1){
return "overspending";
}
return "saving";
}
if문을 삼항연산자를 사용하여 간결하게 변경
public String switchPostTypeFromNumToWord(int typeNum) {
return typeNum == 1 ? "overspending" : "saving";
}
String[] responses = new String[2];
responses[0] = responseType;
responses[1] = responseContent;
return responses;
기존에는 배열을 만들어서 그 배열에 각각을 담고 return을 해 주었다면, 한번에 배열에 요소를 담아서 return하도록 수정
return new String[]{responseType, responseContent};