JDBC 리팩토링 과정 살펴보기
저의 멘토이신 Pobi의 동영상 강의를 참고하여 작성하였습니다.
우선 리팩토링을 시작하기 전에 테스트코드부터 먼저 작성해야 합니다. 테스트코드는 이후 리팩토링 과정에서 리팩토링 과정에 문제가 없는지 빠르게 피드백을 제공하기 때문에 꼭 필요합니다!!
먼저 중복되는 부분(라이브러리로 뺄 부분)과 중복되지 않는 부분(사용자가 구현해야 하는 부분)을 구분합니다.
그리고 중복되지 않는 부분(변경이 필요한 부분)은 리팩토링 기능을 이용하여 메서드로 추출합니다.
- 이전에는 중복되는 부분만 추출하는 것만 생각했는데 중복되지 않는 부분, 다른 부분도 빼야한다는 것을 알 수 있었습니다.
중복되는 부분은 클래스로 추출합니다(굳이 클래스로 추출할 필요없이 메서드로 추출할 수도 있습니다)
- 이렇게 추출하다보면 분명 빨간색 줄로 컴파일 오류가 생길 것입니다. 리팩토링 과정에서는 최대한 리팩토링 과정을 짧게 하여 사이클을 여러 번 돌리는 것이 좋기때문에 우선 컴파일 오류부터 보이는 곳부터 빠르게 해결합니다.
클래스로 추출할 때는 어떠한 경우일까요?
조금전 메서드로 뺀 중복되지 않는 부분을 가져오기 위해 매개변수로 해당 인스턴스 변수를 받아 썼습니다.
- 하지만 그렇게 매개변수로 받아쓰면 해당 인스턴스에 종속적일 수 밖에 없습니다. 그렇기 때문에 조금 전에는 빠르게 사이클에서 테스트를 성공시키기 위해 임시방편으로 매개변수로 받아썼지만 다른 방법이 필요합니다.
- 매개변수로 지웠을 때 컴파일 오류가 나는 메서드 부분을 해결하기 위한 방법이 하나 있습니다. 그건 바로 추상 클래스입니다. 그 메서드를 추상 메서드로 정의해두고 이 추상 클래스를 사용하는 쪽에서 익명 클래스로 바로 정의하고 인스턴스 변수로 생성하게 하면 됩니다.
- 위에서 그 메서드가
setParameters()
인데요. 이와 같이 라이브러리(중복되는 부분, 클래스로 추출한 부분)에서 결정할 수 없는 부분을 추상메서드로 빼 추상클래스로 만드는 디자인 패턴을 'Template Method 패턴'이라고 합니다.
클래스로 뺀 부분을 보면 매개변수로 특정 클래스의 인스턴스를 받습니다.
- 하지만 그 내용을 보면 익명 클래스 정의된 부분에서 사용되는 인스턴스 변수이기 때문에 굳이 매개변수로 넘기지 않아도 됩니다. 빼도 되는 것이죠.
- 이와 같이 특정 클래스에 종속적이지 않도록 하는 노력을 계속 진행합니다.
특정 클래스에 종속적이지 않으면서도, 굳이 추상 메서드로 정의할 필요가 없는 것은 매개변수로 넘깁니다.
String
형의 sql은 딱 한 줄인데 추상 메서드 정의하면서 코드를 지저분하게 만듭니다.- 이 경우는 특정 클래스에 종속적이지 않기 때문에 차라리 매개변수로 넘기는 것이 더 깔끔합니다.
이 외 배운부분
이전에 만들어둔 테스트코드가 리팩토링을 하면서 컴파일 오류가 발생하는 경우
- 이 부분은 저도 리팩토링하면서 많이 겪었고 대대적인 리팩토링이 이루어졌을 때는 이 테스트코드를 또 다시 복구하는데 드는 노력이 참 번거로웠습니다.
- 하지만 이 부분은 리팩토링 과정에서 어쩔 수 없는 부분이고 최대한 빨리 해결하는 것이 좋다고 하네요. 클래스가 분리되었다면 아마 기존 테스트 코드가 이동해야하는 경우가 발생할 것입니다.
리팩토링 과정을 짧게, 여러 번!
- 리팩토링은 저처럼 대대적으로 하기 보다는 짧게 짧게 사이클을 돌면서 조금씩 리팩토링이 진행되고 있다는 것을 볼 수 있었습니다.
- 이렇게 호흡을 짧게짧게 리팩토링 하는 것이 지치지도 않고 더욱 다음 단계를 잘 보이게 하는 것 같습니다!
'TIL' 카테고리의 다른 글
Today's Dev Notes(2019-03-09) (0) | 2019.03.10 |
---|---|
Intellij에서 디버깅 사용하기 (0) | 2019.02.24 |
Today's Dev Notes(2019-01-23) (0) | 2019.01.23 |
서버 N대 성능개선 (0) | 2019.01.22 |
Today's Dev Notes(2019-01-20) (0) | 2019.01.20 |