티스토리 뷰
[Kotlin] 인텔리제이(IntelliJ)에서 코틀린 move instance method(다른 클래스로 메소드 옮기기) 리팩토링 기능 활성화하기
망나니개발자 2024. 2. 13. 10:00
1. 코틀린에서 move instance method 리팩토링 기능 활성화하기
[ move instance method 리팩토링 기능 소개 ]
예를 들어 신용카드를 발급하는 유스케이스가 있고, 신용카드 발급을 위해서는 기본적으로 사용자가 20세 이상의 성인이여야 한다고 하자. 해당 코드는 자바로 다음과 같이 구현할 수 있다.
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int age;
}
@Service
@RequiredArgsConstructor
class IssueCreditCardUseCase {
public void issue(User user) {
if (isAdult(user)) {
...
}
...
}
private boolean isAdult(User user) {
return user.getAge() >= 20;
}
}
하지만 이렇게 작성된 코드는 문제가 하나 있는데, 사용자가 성인인지 검사하는 핵심 비즈니스 로직이 여러 유스케이스에 걸쳐 퍼질 수 있다는 것이다. 예를 들어 카드 목록을 조회하는 경우에도 성인이 아닌 경우에는 체크카드만을 반환하도록 처리해야 한다. 따라서 다음과 같이 성인인지 검사하는 핵심 비즈니스 로직이 분산되게 된다.
@Service
@RequiredArgsConstructor
class GetCardsUseCase {
public void getAll(User user) {
if (isAdult(user)) {
return getAllCards();
}
return getCheckCardsOnly();
}
private boolean isAdult(User user) {
return user.getAge() >= 20;
}
}
이러한 핵심 비즈니스 로직은 User 클래스 내부에 존재하여 여러 유스케이스에서 재사용할 수 있도록 해야 하는데, 이를 유스케이스에서 도메인으로 간편하게 옮기기 위해 move instance method 리팩토링 기능을 사용할 수 있다. 옮기기를 원하는 메소드 위에 커서를 두고 F6 키를 누르면 다음과 같이 메소드를 옮기도록 리팩토링할 수 있다.
그러면 다음과 같이 해당 메소드가 도메인 안으로 이동됨을 확인할 수 있다.
만약 리팩토링 기능을 사용하고 싶은데, 단축키 기억이 안난다면 Control + T를 눌러 Refactor This 창을 열어서도 확인할 수 있다. 해당 창에서 키워드를 검색하면 동일하게 사용할 수 있다.
하지만 해당 리팩토링 기능은 코틀린 언어에서 기본적으로 지원하지 않는다. 해당 기능을 사용하려고 하면 다음과 같이 에러가 발생하여 기능을 사용할 수 없다.
[ move instance method 리팩토링 기능 활성화하기 ]
해당 기능을 활성화하면 리팩토링 기능을 사용할 수 있으므로 다음과 같이 활성화해주도록 하자.
- Command + Shift + A를 입력하여 Actions 탭 열기
- Registry 검색
- kotlin.enable.move.method.refactoring 활성화하기
아직 해당 기능이 완벽하게 동작하지는 않는다. 자바의 경우에는 접근제어자(가시성)을 유연하게 변경해주었는데, 코틀린에서는 이를 지원하지 못한다. 해당 부분은 아쉽지만 그래도 리팩토링 필수 기능이니 반드시 설정해주도록 하자.
'Java & Kotlin' 카테고리의 다른 글
[JVM] 예시로 살펴보는 IntelliJ 프로파일링 결과 분석 및 성능 최적화 방법 (2) | 2024.03.12 |
---|---|
[JVM] Async-Profiler 소개 및 IntelliJ에서 프로파일링 결과 분석하는 방법 (6) | 2024.03.05 |
[Java] 스레드 로컬(ThreadLocal)과 상속 가능한 스레드 로컬( InheritableThreadLocal)에 대하여 (2) | 2024.02.06 |
[Java] Nested Class(중첩 클래스)에 대한 자바 스펙 문서 정리 (0) | 2024.01.30 |
[Java] 중복 문자열 제거를 통한 메모리 절약을 위한 -XX:+UseStringDeduplication GC 옵션 (0) | 2024.01.23 |