Java

Template Pattern(템플릿패턴) 적용기

Daniel0617 2022. 3. 4. 08:23

템플릿 패턴이란?

어떤 작업 처리 일부분을 서브 클래스로 캡슐화해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계 수행에 있어서는 서브 클래스에서 정의한 작업을 실행하는 디자인 패턴. 즉, 전체적인 큰 흐름은 슈퍼클래스를 따라가고 특정 부분에 있어서만 서브 클래스가 정의한 작업을 실행한다는 내용입니다.

내용은 이해했지만, 막상 어떻게 적용해야 될지 모르다가 이번에 업무에 사용했던 내용을 간단히 작성해 봅니다.

요구사항

회원가입 시 사용자가 업로드한 신분증 이미지를 저장합니다. 이미지 저장 시 신분증 타입(ex. 운전면허증, 외국인등록증 등)에 따라 파일명이 다르며, 내국인은 운전면허증과 주민등록증. 외국인은 여권과 외국인등록증만 업로드할 수 있습니다. 또한 이미지 파일 저장 시 공통된 키 값으로 암호화가 필요합니다.

  1. 1) 내국인(운전면허증, 주민등록증), 외국인(외국인등록증, 여권) 신분증 타입 구분
  2. 2) 신분증 이미지 저장 시 파일 암호화.
  3. 3) 공통된 키 값 사용
  4. 4) 이미지 타입에 따라 파일명 지정

위의 내용과 같이 요구사항을 정리해 할 수 있는데, 이때 공통 부분과 분리되는 부분을 나누면 공통부분은 2,3번. 분리되는 부분은 1,4번이라고 볼 수 있습니다. 그럼 요구사항을 반영한 기존 코드를 살펴봅시다~

 

Service 기존 코드

@Service 단에서 리팩토링하기 전 작성된 코드입니다. 요구사항을 반영해 기능을 수행하고 있으나 모든 로직을 한 곳에 작성해 다중 조건문(if else)으로 나열되어 있으며, 중복된 코드(ex. EncryptUtils)가 발생하고 있습니다. 또한 하나의 책임만 수행하는 것이 아니라 동시에 여러 작업들이 수행됨으로써 차후 로직 변경 시 변경에 취약한 메서드가 될 수 있습니다.

 

해당 코드를 리팩토링 해봅시다!

 

우선 저는 위에 요구사항을 반영해 추상화했을 경우 아래와 같은 클래스 다이어그램이 나왔습니다.

 

해당 신분증(IdentityCard) 클래스를 국내(LocalIdentityCard), 외국인(ForeignerIdentityCard) 클래스에서 상속받아 공통 로직인 이미지 파일은 그대로 사용하지만, 추상화한 파일명 생성(fileNm) 메서드는 각각의 클래스에서 로직을 수행할 수 있도록 작성했습니다. 작성한 코드 내용은 아래와 같습니다.

IdentityCard
LocalIdentityCard
ForeignerIdentityCard

 

이미지 저장(imgSave) 시 큰 흐름은 부모 클래스를 따라가지만, 파일명 생성은 추상 메서드로써 내국인(LocalIdentityCard), 외국인(ForeignerIdentityCard) 클래스에서 각각 정의해 줍니다.

 

위와 같이 각 객체를 클래스로 분리한다면, @Service 코드는 아래와 같이 간단하게 수행될 수 있습니다.

@Controller에서 각각의 신분증 클래스를 생성하게 된다면, 이전과 달리 @Service에서는 이미지 저장 하나의 책임만 수행하게 됩니다. 이미지 암호화와 파일명 생성은 각 클래스에서 수행할 수 있도록 기능을 분리함으로써 객체지향 언어의 특성이 드러나고 있습니다. 신분증 클래스의 캡슐화. 해당 신분증 클래스를 상속받은 내외국인 클래스 상속화. 파일명 생성의 추상화. @Service에서 내외국인 클래스를 신분증 클래스가 대신할 수 있는 다형성 특징이 나타납니다.

 

이처럼 객체지향 언어의 특징으로 템플릿 패턴을 적용할 경우 중복된 코드를 방지하고, 단일 책임 원칙으로 코드를 수정할 수 있게 되었습니다.