코드 리팩토링
- Coding/Spring
- 2018. 5. 3.
관심사의 분리 (Separation Of Concerns)
관심이 같은 것끼리는 하나의 객체 안으로 또는 친한 객체로 모이게 하고, 관심이 다른 것은 가능한 한 따로 떨어져서 서로 영향을 주지 않도록 분리하는 것이다. 어떠한 기준 없이 모으는 편이 처음엔 간단하고 쉽겠지만 언젠가는 여러 종류의 관심사(기준)를 적절하게 구분하고 따로 분리하는 작업을 해줘야한다. 관심사가 같은 것끼리 모으고 다른 것은 분리해줌으로써 같은 관심에 효과적으로 집중할 수 있게 만들어주는 것이다.
중복 코드의 메소드 추출
여러 메소드에 중복 코드가 구현되어있다고 가정해보자. 만약 메소드가 1~2개라면 어떠한 변경이 일어났을때 어려움이 없다. 하지만 만약 중복 코드를 가진 메소드가 몇 백개, 몇 천개라고 생각해보자. 중복 코드의 코드 변경이 일어나야한다면 우리들은 몇 백개, 몇 천개가 되는 메소드를 모두 수정해줘야한다. 중복 코드는 하나의 관심사를 가지고 있을 것이고, 이 하나의 관심사가 중복되어있고 여기저기 흩어져있어서 다른 관심의 대상과 얽혀있으면, 변경이 일어날때 엄청난 고통을 일으키는 원인이 된다.
만약 우리가 중복 코드를 하나의 메소드로 추출 했다면?
한가지 관심에 대한 변경이 일어날 경우, 그 관심사에 해당하는 공통 메소드 1개만 수정해주면 된다. 관심이 다른 코드가 있는 메소드에는 영향을 주지않을 뿐더러, 관심 내용이 독립적으로 존재하므로 이전의 중복코드를 수정했을 때보다 훨씬 더 작업이 간단해졌다. 수정이 일어날 수도 있다는 가정(미래의 변화)에 좀더 손쉽게 대응할 수 있는 코드가 되었다는 사실이다.
이렇게 메소드로 중복된 코드를 뽑아내는 것을 리팩터링에서는 메소드 추출 기법 이라고 부른다.
리팩토링
리팩토링은 기존의 코드를 외부의 동작 방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 또는 기술을 말한다. 리팩토링을 하면 코드 내부의 설계가 개선되어, 코드를 이해하기가 더 편해지고 미래의 변화에 대해 효율적으로 대응할 수 있다. 위에서 배운 중복 코드의 메소드 추출 또한 리팩토링에서 메소드 추출 기법이라고 하는 것과 같다. 리팩토링을 함으로써 생산성이 올라가고, 코드의 품질은 높아지며 유지보수하기 용이해지고, 유연하게 개발할 수 있다. 리팩토링이 절실이 필요한 코드의 특징을 나쁜 냄새라고도 한다. 중복된 코드는 매우 흔하게 발견되는 나쁜냄새이다. 이런 코드는 적절한 리팩토링 방법을 통해 나쁜 냄새를 제거해야한다. 리팩토링은 개발자가 직관적으로 수행할 수 있기 때문에 개발자에게 학습과 훈련이 필요하다. 모든 개발자에게 리팩토링을 한다는 것이 중요하고, 리팩토링 방법이 무엇인기 꺠닫는 것도 중요하다.
템플릿 메소드 패턴
상속을 사용하는 패턴이다. 템플릿 메소드 패턴이란, 슈퍼 클래스에 기본적인 로직의 흐름을 만들고, 그 기능의 일부를 추상 메소드나 오버라이딩 가능한 protected 메소드 등으로 만든 뒤 서브 클래스에서 이런 메소드를 필요에 맞게 구현해서 사용하도록 하는 방법이다. 상속을 통해 슈퍼 클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법으로, 변하지 않는 기능을 슈퍼클래스에 만들어두고 자주 변경되며 확장할 기능은 서브 클래스에서 만들도록 한다. 슈퍼 클래스에서 디폴트 기능을 정의해두거나 비워두었다가 서브 클래스에서 선택적으로 오버라이드할 수 있또록 만들어둔 메소드를 훅(hook) 메서드 라고 한다. 서브 클래스에서는 추상 메소드를 구현하거나, 훅 메소드를 오버라이드 하는 방법을 이용하여 기능의 일부를 확장한다.
팩토리 메소드 패턴
템플릿 메소드 패턴에서의 서브클래스에서 구체적인 오브젝트 생성 방법을 결정하게 하는 것을 팩토리 메소드 패턴이라고 한다. 슈퍼클래스 코드에서는 서브 클래스에서 구현할 메소드를 호출해서 필요한 타입의 오브젝트를 가져와 사용한다. 서브 클래스는 다양한 방법으로 오브젝트를 생성하는 메소드를 재정의할 수 있다. 이렇게 서브 클래스에서 오브젝트 생성 방법과 클래스를 결정할 수 있도록 미리 정의해둔 메소드를 팩토리 메소드라고 하고, 이 방식을 통해 오브젝트 생성 방법을 슈퍼클래스의 기본 코드에서 독립시키는 것을 팩토리 메소드 패턴이라고 한다. 팩토리 메소드 패턴의 예시로, DB Connection 하는 메소드를 오버라이드 했을때 Connection 클래스의 오브젝트를 어떻게 생성할 것인지를 결정하는 방법을 구현하는데, 이렇게 메소드에서 오브젝트 생성 방법을 결정하는 것이라고 생각하면 될 것 같다.
상속을 활용한 패턴의 단점
템플릿 메소드 패턴, 팩토리 메소드 패턴은 상속이 주요 방법이기 때문에 단점이 존재한다. 자바는 다중 상속을 지원하지 않기 때문에 만약 슈퍼클래스가 이미 다른 목적을 위해 상속을 사용하고 있다면 문제가 생긴다. 또한 상속을 통한 상하위 클래스의 관계는 생각보다 밀접하다. 때문에 상속을 통해 관심이 다른 기능을 분리하고, 필요에 따라 다양한 변신이 가능하도록 확장성도 줬지만 상속 관계에 있는 두 관심사에 대한 밀접함을 허용한다. 이는 슈퍼 클래스의 내부의 변경이 일어났을 때 모든 서브 클래스들에도 수정이 함께 일어나야한다는 단점이 생겨버린다. 이는 우리가 이전에 배웠던 미래에 대한 변화에 손쉽게 대응할 수 있게 하자는 의견에 부합하지 않는다.
'Coding > Spring' 카테고리의 다른 글
필드주입과 생성자주입의 차이 (0) | 2019.02.15 |
---|---|
싱글톤 레지스트리 (0) | 2018.05.08 |
코드의 응집도와 결합도 (0) | 2018.05.03 |
제어의역전 IOC (0) | 2018.03.17 |
의존관계 주입 DI (1) | 2018.03.17 |