Java는 객체지향 프로그래밍 언어이지만,

 

실제 개발을 진행하다보면 절차지향적인 코드를 구현할 때가 많이 있습니다.

 

이러한 절차지향적인 코드는 코드의 진행순서를 읽기 쉽다는 장점이 있으나

 

로직의 재사용성이 떨어지고 유지보수를 어렵게 만듭니다.

 

그래서, 객체지향의 5대 개발원리(SOLID) 중 하나인 단일책임원칙(SRP, Single Responsibility)에 의하여

 

두 개 이상의 역할을 수행하는 코드들은 하나의 기능을 하도록 분리하는 것이 좋습니다.

 

이를 자바에서는 메서드 분리(Method Extract)라고 합니다.

 

메서드분리는 다음과 같은 장점을 가지고 있습니다.

 

맴버변수의 쓰임을 제한하여, 예상치 못한 변수 사용을 막을 수 있다.

 

변수를 위쪽에 몰아서 선언하는 경우,

 

메서드분리가 제대로 되어있지 않으면 코드를 읽는 사람이

 

중간에 변수가 바뀌는 것을 눈치채지 못할 수 있습니다.

 

이는 컴파일 시점에 드러나지 않으므로 오류의 원인이 되는 객체와 오류가 발생하는

 

물리적 지점의 거리가 멀어지는 원인이 됩니다.

각 기능간의 의존성이 낮아지기 때문에, 유지보수가 쉽고 편해진다

파일함의 업로드 기능을 예시로 들면, “업로드”와 “로그 남기기” 기능을

 

메서드분리한다면 로그 남기기 기능에 다소 변경사항이 있더라도

 

“업로드” 기능에는 영향을 주지 않으므로 기능을 더 쉽게 변경할 수 있습니다.

 

코드 맥락(Context)의 가독성이 높아진다

** 절차지향적 코드는 if문 중첩이 조금만 반복되어도 맥락을 매우 파악하기 어렵습니다.

 

2천줄을 읽은 후에, 갑자기 else문이 등장했다면 과연 2천줄 전의 조건을 기억할 수 있을까요?

 

메서드분리는 몇천줄의 코드를 한 줄의 메서드로 줄일 수 있기 때문에,

 

중첩 if문이라 하더라도 어떤 조건을 이용하는지를 빠르게 파악할 수 있습니다.

 

 

 

이렇게 코드를 리팩토링 하면서 메서드분리를 염두에 둔다면

 

예상치 못한 변수의 변경 및 쓰임을 예방하면서 유지보수와 가독성을 높일 수 있습니다.

 

Intellj의 리팩토링 기능, 자동 메서드분리

 

intellij에서는 이런 메서드 분리를 위해 자동 메서드분리 기능을 제공합니다.

 

먼저 메서드분리를 원하는 코드블록 ( {} 로 표현되는 하나의 스택 블록 ) 을 드래그하여 선택합니다.

 

Ctrl + Alt + M 을 누르면 자동으로 메서드분리가 진행됩니다.

 

분리된 메서드는 intellij가 원 메서드에 있는 매개변수를 추적해서 넣어주므로,

 

어떤 매개변수와 타입이 필요한지 선언부에 일일히 적을 필요가 없습니다.

 

선언부와 매개변수는 직접 수정할 수도 있으나,

 

엄격하게 하려면 intellij에서 제공하는 “More options” 를 사용하는 것도 좋습니다.

 

이렇게 접근제한자, 이름, 매개변수를 설정할 수 있습니다.

 

다만, ReturnType을 여러개로 인식할 수 있는 코드블록이라면 메서드분리 기능을 제공하지 않으니

 

반환값에 따라 다시 단일 메서드로 분리하면 됩니다.

 

유지보수와 가독성 향상을 위한 메서드분리를 위해서 Intellij의 자동 메서드분리 기능을 활용해보시기 바랍니다.

참고 자료

intellij IDEA 메서드분리 기능 official Document

 

 

Extract method | IntelliJ IDEA

 

www.jetbrains.com

 

IDE에서 GIT을 이용하다 보면 가끔 

 

파일 전체가 변경되었다고 표기되면서 변경점을 잡아내지 못하는 경우가 있습니다. 

 

혹은 PULL 받아온 파일에는 분명 변경된 점이 없는데, GIT에서 변경점을 잡아 오류처럼 보이기도 합니다. 

 

이는 CRLF설정 때문에 발생하는 현상입니다. 

 

 

CRLF 개행문자, 운영체제별로 각각 설정이 다르다 

 

CRLF는 띄어쓰기를 입력할 때 코드를 \r, 혹은 \n, 혹은 \r\n 어느 것으로 개행문자를 입력할 지를 구분짓는 설정입니다. 

 

운영체제별로 설정이 달라 Unix, Linux는 \n 

 

클래식 Mac Os ( 9버전 이하 ) 는 \r

 

Windows OS는 \r\n으로 표기합니다. 

 

이러한 차이점 때문에, OS와 상관없이 공통된 코드를 관리하는 시스템 ( IDE, GIT 등 ) 에서는 아무런 차이가 없는 파일처럼 보이더라도

 

띄어쓰기의 개행문자를 해석하는 과정에서 차이가 있는 것으로 인식할 수 있습니다. 

 

이러한 점을 고려하여서 여러 IDE에서는 CRLF 설정을 지원하고 있습니다. 

 

Intellij, 하단 사이드바 및 설정페이지에서 변경 가능하다.

 

 

인텔리제이는 공식 문서에서 친절하게 CRLF 설정과 바꾸는 법에 대해 설명해주고 있습니다. 

 

 

Configure line separators | IntelliJ IDEA

 

www.jetbrains.com

 

첫째로, 아래의 사이드바의 버튼을 통해서 바꾸는 방법이 있습니다.

 

아래 사이드바에서 간단하게 변경할 수 있다.

 

둘째로, 직접 설정페이지의 Code Style에서 바꾸는 방법이 있습니다. 

 

CodeStyle 항목의 Line Separator, 운영체제에 의존하도록 바꿀수도 있다.

 

Eclipse, WorkSpace 설정 및 EGit의 auto CRLF 설정이 있다.

 

이클립스 역시 WorkSpace에서 "New text file line delimiter를 통해서 os, 혹은 windows/ Unix로 바꿀 수 있습니다. 

 

다만 바꿀 시에 어떤 개행문자를 사용하는지 명확하게 나타나지는 않습니다. 

 

CR, LF, CRLF 어떤 개행문자를 사용하는지 명확하게 표기되지는 않는다.

 

Eclipse 내부에서 사용할 수 있는 e-git에서는 git에서 제공하는 auto CRLF 기능을 추가적으로 설정할 수 있는데, 

 

이는 "git config --global core.autocrlf true" 라고 하는 git의 기본 설정을 IDE 내부에서 설정으로 바꿀 수 있도록 

 

UI를 구현해주는 기능입니다. 

 

이를 true로 구현하면 window에서는 파일을 가져올 때  \r( LF ) 가 \n\r ( CRLF )로 바뀌게 되고 

 

PUSH할 때는  \n\r ( CRLF )가 \r( LF ) 로 변경됩니다. 

 

autocrlf 설정을 바꿀 수 있다.

 

이 설정은 초기에 True처리 되어있기 때문에, e-git을 사용할 때 만일 다른 사람이 CRLF로 개행한 코드를 가져오게 되면 

 

변경사항이 없음에도 파일 전체가 변경된 것으로 인식할 수 있으니 

 

파일에 변경사항이 없는데도 변경된 것 처럼 인식될 경우 관련설정을 false 처리 해보시기 바랍니다. 

 

 

 

VsCode, 하단 사이드바 및 설정페이지의 Eol 항목에서 변경가능하다. 

 

VsCode 역시 하단의 CRLF 항목으로 현재 적용되는 개행문자를 변경할 수 있습니다. 

 

Intellij와 같이 바로 보여준다.

 

더 자세히 변경하고 싶다면 설정에서 Eol을 입력하면 됩니다. 

 

auto로 os에 의존하도록 변경할 수 있다.

 

 

혹시 형상관리 툴을 사용할 때, 변경사항이 없는데도 문제가 발생한다면 

 

이처럼 IDE의 여러 개행문자 설정을 다시 한 번 점검해 보시길 바랍니다. 

 

Intellij IDE에는 Javascript 및 java 파일의 부모-자식 관계를 파악할 수 있는 Call_hierarchy 기능이 있습니다.

 

기본 단축키는 Ctrl + Shift + H 이며, 키보드 커서가 위치하는 곳이 Type, 혹은 메서드에 따라서 다르게 작동합니다.

 

Type에 커서를 둔 후 작동시키면 상속관계에 대한 네비게이션이 제공됩니다.

Type hierarchy search

Method에 커서를 둔 후 작동시키면 메서드를 호출하는 위치를 모두 확인할 수 있습니다.

Method hierarchy search

Javascript 역시 메서드 호출 위치를 확인할 수 있습니다.

다만, JAVA처럼 위치관계가 명확하지 않아 “메서드 명” 중심으로 모든 JS파일을 스캔, 사용처를 가져오므로 

사용에 주의가 필요합니다. 

 

코드 변경 시, 다른 코드에 미치는 영향을 줄이기 위한 의존성 체크에 활용해보시기 바랍니다.

 

❗ 확인이 더 필요한 정보

IntelliJ에서는 기본적으로 Hot swap이라는 기술을 제공하는데 해당 기술로 별다른 플러그인이나 프로그램 없이 자바 소스 또는 정적 소스들을 서버 종료 없이 실시간으로 변경이 가능하다. 

 

사용방법에 대해서 알아보자.

우선 해당 소스는 ModelAndView에 데이터를 담아서 타임리프로 구성된 페이지에 넣은 뒤 해당 텍스트를 화면에 보여주는 예제이다.

 

여기서 서버를 끄지않고 내용을 바로 변경하기 위해서는 이렇게 하면 된다.

수정한 소스 페이지에서 마우스 오른쪽을 누르면 밑의 사진과 같은 것을 찾을 수 있다.

이걸 누르면
인텔리가 열일한다.

이렇게 서버 종료없이 간단하게 내용이 수정된다!

+ Recent posts