본문 바로가기

기술/소프트웨어 디자인

IntelliJ를 이용한 리펙토링 - Rename 편 (1/3)

IntelliJ를 이용해 리펙토링을 수행하는 방법(Rename, Extract, Move)에  대해 총 3편으로 나누어 설명하도록 하겠습니다. 

이번 편은 그 시작으로써 Rename에 대해 다룹니다.




IntelliJ를 이용한 리펙토링

주대연




목차


소개

리펙토링이란?

리펙토링의 필요성

IntelliJ가 지원하는 리펙토링 기능

Rename

Rename이란?

Rename을 수행하기 위한 절차

Extract

Move

참고자료

프로젝트 윈도우와 코드 에디터의 위치





소개


  IntelliJ는 JetBrains 사에서 판매하는 자바를 위한 통합 개발툴 (IDE, Integrated Development Environment)로써 자바 이외에도 다양한 언어를 지원하며 소프트웨어의 품질을 향상 시키기 위한 리펙토링이나 소프트웨어 분석 도구, 효율적인 소스 코드 관리와 협업을 위한 VCS (Version Control System) 기능 등을  제공하고 있다. 


  나는 작년 부터 더이상 Eclipse를 사용하지 않게 되었다. 자바 기반 소프트웨어 개발의 교과서인 Eclipse를 사용하지 않게 된 이유는 바로 느린 속도와 직관적이지 않은 사용성에 있었다. IntelliJ는 Eclipse와 비교했을 때 거의 동등한 수준의 자바 개발을 위한 환경을 제공하고 있으며, Eclipse에 비해 훨씬 가볍고, UI 또한 보다 더 직관적이다. 부가적으로 IntelliJ는 높은 수준에서의 Eclipse와의 호환성을 제공하고 있다.  Eclipse에서 작업한 프로젝트를 IntelliJ로 불러와 작업을 할 수 있으며, IntelliJ에서 작업한 프로젝트 역시 무리없이 Eclipse에서 작업할 수 있도록 내보낼 수 있다. 마지막으로 IDE의 외형을 결정하는 테마 기능이 더욱 다양하다. 매우 주관적인 기준일 수 있지만, IntelliJ로 교체한 후 생산성이 매우 향상되었음은 의심할 수 없는 사실이 되었다. 


  이러한 IntelliJ가 제공하는 여러 가지 기능 중 생산성 향상에 가장 많은 기여를 한 기능은 리펙토링 (Refactoring), 코드 포멧팅 (Code Reformatting and rearrangement) 그리고 코드 생성 (Code generating) 기능 이었다. 그 중에서도 가장 빈번하게 사용되는 리펙토링 기능에 대해서 소개해 보도록 하겠다.






리펙토링이란?

  리펙토링이란 이미 개발된 코드를 외부로 드러나는 동작의 변화 없이 재구성하는 과정이다. 이때 가장 중요한 것은 소프트웨어의 동작이 변경되서는 안된다는 것이다. 따라서 이를 확실히 하기 위해 리펙토링을 하면서 JUint과 같은 테스트 자동화 툴을 적극적으로 이용하는 것은 매우 큰 도움이 된다. 

  이러한 리펙토링을 제대로 적용하고 나면 코드의  나쁜 냄새 (Bad Smell) 이 사라지게 되고 코드의 품질은 향상되게 된다. 다시 말하면 중복 코드가 사라지고, 클래스의 역할이 명확해지며, 응집도 (Cohesion)가 높아지고 결합도 (Coupling) 이 낮아진다.





리펙토링의 필요성

  우리가 코드를 작성할 때 개발 완료 일정이 촉박하다면 코드를 급하게 작성할 수 밖에 없다. 이런 경우에 필연적으로 작성된 코드에서 여러 가지 나쁜 냄새가 날 수 밖에 없다. 예를 들어Copy & Paste 로 코드를 개발하여 많은 중복 코드가 존재한다던가 지나치게 매직 넘버를 사용했다던가 하여 코드의 유지보수를 어렵게 만드는 것들이 있을 수 있겠다. 

  툴의 도움없이 이러한 나쁜 냄새를 없애려면 매우 번거롭다. 만약 Copy & Paste를 100개쯤 했다고 치면, 우리는 먼저 이 중복 코드를 하나의 메소드로 만든 후 (Extract Method), 모든 중복 코드가 위치하는 부분을 찾아 새로 만든 메소드를 호출하도록 변경하여야 한다. 손으로 일일히 하는 것이 가능하기는 하지만 중간에 한개라도 빠뜨리는 경우, 완벽하게 나쁜 냄새가 제거되지 못하게 되어 리펙토링을 하는 의미가 퇴색될 수 있다. 게다가 ‘제대로 리펙토링’을 하는데 아주 많은 시간이 필요할 것이다.

  따라서 IntelliJ는 이러한 것을 자동으로 수행하여 개발자로 하여금 간편하고 신속하게 리펙토링을 할 수 있도록 지원하고 있다. 소스 코드의 구조를 자동으로 분석하여 리펙토링 기법을 적용했을 때 영향을 받는 코드를 자동으로 찾아내고 자동으로 적용한다.





IntelliJ가 지원하는 리펙토링 기능

  IntelliJ는 다양한 리펙토링 기능을 제공하고 있다. 이 중에서 내가 가장 잘 사용하는 것은 크게 Rename, Extract, Move 이 세 가지이다. 아마 대부분의 개발자들 역시 위의 세가지 기능을 가장 빈번히 이용할 것이라 생각한다. 

  IntelliJ 에서 이러한 리펙토링을 수행하는 방법은 크게 세 가지이다. 첫 번째는 상단 메뉴에서 ‘Refactor’ 를 이용하는 방법, 두 번째는 단축키를 이용하는 방법, 마지막으로  일종의 리펙토링 메뉴판인 ‘Refactor this’ 를 이용하는 방법이다. 

  앞으로 IntelliJ의 리펙토링 기능과 함께 상단 메뉴를 이용한 방법, 단축키를 이용한 방법에 대해 설명하도록 하겠다. Refactor this는 맥을 기준으로 단축키 ’Shift + Option + Command + T’를 이용해 접근할 수 있으며 나타나는 메뉴의 형태는 상단 메뉴를 이용하는 방법과 동일 하므로 제외하겠다.



Rename

Rename이란?

  Rename은 파일, 메소드, 변수, 상수 등의 이름을 편리하게 변경할 수 있도록 하는 기법이다. 이름을 변경하는 경우IntelliJ는 코드 내에서 이름이 변경되어야 하는 모든 요소들을 자동으로 분석하여 함께 변경해준다. 



Rename을 수행하기 위한 절차

Rename을 수행하기 위한 두 가지 접근 방법은 다음과 같다.

 접근 방법

 접근 경로 혹은 단축키 

 상단 메뉴

 ‘Refactor’ -> ‘Rename’ or ‘Rename file’ 

 단축키

 Shift + F6



메뉴에서 보면 두 가지이지만 실제로 하나의 기능이다. 나는 주로 단축키를 이용한다. Rename을 수행하기 위한 절차는 다음과 같다.


1) 이름을 변경하고자 대상을 선택


  이름을 변경할 수 있는 대상은 클래스, 인터페이스, 메소드, 변수, 상수, 파라메터 등이며, 대상을 선택하고 Shift + F6을 누른다.  만약 코드 에디터에서 대상을 선택했다면 2-1로, 프로젝트 윈도우에서 대상을 선택했다면 2-2를 본다.


* 프로젝트 윈도우와 코드 에디터의 위치는 맨 아래의 참고 자료에 표시되어 있다.


2-1) 새로운 이름을 코드 에디터에서 직접 입력


  코드 에디터에서 대상을 선택하고 이름 변경을 실행하였다면 다음의 그림 처럼 선택한 클래스명에 빨간색 입력창이 나타난다.  입력창에 새로운 이름을 입력하고 Enter 키를 누르면 된다. 녹색으로 강조된 클래스들은 새로운 이름으로 바뀌게 될 모든 후보들이다.







2-2) 새 이름 입력창에서 입력

  프로젝트 윈도우에서 대상을 선택했다면 다음의 그림에서 보는 것과 같은 이름 변경 윈도우가 나타난다. 여기에 새로운 이름을 입력하고 Refactor 버튼을 누르면 리펙토링이 실행된다. 만약 선택한 대상이 Public 클래스라면 파일명도 함께 변경된다. IntelliJ는 이 또한 자동으로 수행한다.


3) 함께 변경할 연관된 객체들의 선택

  객체 이름을 만들 때 클래스명과 비슷하게 짓는 습관이 있다면 IntelliJ의 Rename 기능은 더욱 유용할 것이다. Employee 클래스의 이름을 MyEmployee로 변경하였다 가정하고, 기존에 Employee 클래스의 인스턴스로를 employee1, employee2로 명명하였다면, IntelliJ는 이들의 이름도 myEmplyee1, myEmployee2로 일괄 변경해준다. 그러나 유사하지 않은 이름을 사용한 경우 자동으로 일괄 변경되지 않는다.




  위의 그림에서 볼 수 확인할 수 있듯이 employee 혹은 employee1 과 같은 이름은 모두 myEmployee 와 유사하게 변경된다. 함께 변경할 객체들을 선택한 후 OK 버튼을 누르면 실제로 변경 작업이 시작된다. 모든 변경 작업이 끝나고 나면 프로젝트 윈도우와 코드 에디터에 실제 변경된 결과가 나타난다. 아래의 그림들은 Employee 클래스의 이름을 MyEmployee로 변경한 화면이다. 제대로 Rename이 되어 클래스의 이름이 일괄 변경된 것을 볼 수 있다.






참고자료

프로젝트 윈도우와 코드 에디터의 위치