It-hermes 배치서버 개발 과정에서, 배치로직을 구현하고, 코드리뷰를 받았을 때 하나의 피드백을 받았습니다.
결론만 말한다면, 구독할 서비스가 많아지게 된다면.. 그만큼 저 메서드는 반복적으로 실행할 수 밖에 없습니다. 그렇게 된다면, 파라미터 중, 하나만 바뀌어도, 200개 이상의 반복적인 코드에서 매의 눈(?)으로 코드를 수정해야 되는 이슈가 발생하게 됩니다. 따라서 이 부분을 리펙토링하여 유지보수성을 높이는게 좋을거라 판단했습니다.
이 부분을 수정할 수 있는 가장 좋은 방법은
findAndInsertNewCrawling(뉴스), findAndInsertYoutubeCrawling(유튜브), findAndInsertJobCrawling(채용) 메소드를 담을 수 있는 추상클래스를 통해 처리하는 것이 좋을거라 판단했습니다.
따라서 처음 생각한 것은 추상클래스를
해당 메소드를 처리하는 부분을 추상클래스를 통해 설정하는 것이 가장 좋을거라 판단했습니다.
추상화와 구현클래스를 3개(유튜브, 채용, 뉴스)를 만들어서 객체지향의 4대 특성 중, 추상화 및 다형성을 적용한다면, 지금처럼 서비스가 여러개로 늘어나더라도 해결할 수 있다고 생각했습니다. 생각한 것은 다음과 같습니다.
위의 해결방법을 적용하게 된다면
insertContents.findAndInsertContents(new FindAndInsertNewsCrawling(categoryTypes.NEWS)); insertContents.findAndInsertContents(new FindAndInsertYoutubeCrawling(categoryTypes.YOUTUBE)); insertContents.findAndInsertContents(new FindAndInsertJobCrawling(categoryTypes.JOB));
이렇게 기존 코드를 3줄로 줄일 수 있습니다. 하지만... 그럼에도 불구하고 1줄로 만들 수가 없습니다. 또한 제일 중요한 것은, findAndInsert 하나의 메소드만 호출하기 위해 불필요하게 Class를 4개나 만들어야 된다는 것입니다. 굳이 하나의 메소드를 실행하기 위해 만드는 것 보단 더 나은 방법이 있을거라 판단했습니다.
그리고 멘토분께 Enum 메소드를 활용 해보라는 조언도 받아서, 어떻게 할지 고민하던 중 저의 고민을 해결할 수 있는 자료를 참고했습니다. 해당 정보는 다음과 같습니다.
참고 URL : https://jojoldu.tistory.com/137 (jojoldu님의 Enum 적용기)
Enum 메소드를 쓰게 될 경우, 아까 말한 Class를 불필요하게 만들어야 되는 이슈를 해결할 수 있습니다. 또한, Enum을 쓰게 될 때는 기존에 쓰고 있는 CategoryType 클래스에 적용시키면 되서 어려움이 없을거라 판단했습니다.
먼저 Enum 클래스 부분을 다음과 같이 수정했습니다.
Enum 메소드를 쓸 때, 가독성을 목적으로, 람다를 활용하기 위해 함수형 인터페이스 역시 사용했습니다.
기존에 서비스마다 코드를 넣어줘야 되는 이슈를 한 줄로 처리할 수 있게끔 리펙토링한 코드입니다.
하나의 코드로 적용을 시킬 수 있는 이유는 Enum 메소드의 특징인 상태와 행위를 한 곳에서 관리할 수 있기 때문입니다.
지금과 같이 메소드를 하나만 쓰게 된다면, Enum 메소드를 통해 처리하는 것이 좋을거 같지만, 만약 구현클래스에 메소드가 늘어나게 된다면, 이전에 해결방안에 적었던, 추상클래스와 구현클래스를 통해 처리를 하는 것도 좋은 방안이라고 생각합니다.
실제 프로젝트를 할 때, 상황을 보고 적용하는게 좋을거라 봅니다.