디자인 패턴에 대해서 예제를 적어두고자 포스팅한다.
프로그래밍 코드를 짤 때
변하는 부분과 변하지 않는 부분을 구분해서 개발을 해야한다.
실제로 개발을 진행하다보면 작게는 로그 찍는 부분부터
크게는 호출관계 도출을 위해 이력을 쌓거나 디비에 적재 등 공통 부분들이 상당히 많이 존재한다.
예를 들어,
A라는 서비스와 B라는 서비스를 호출하는 메인서비스 개발 하였고
서비스가 실행되기 전과 후에는 언제 실행이 되었는지 로그를 찍고, 호출 시간을 DB에 저장하는 로직이 있다고 하면
public class Test(){ // A 서비스 관련 log.info("서비스 실행"); // A 비지니스 로직 실행 // 현재 시간 DB 저장 log.info("서비스 종료"); // B 서비스 관련 log.info("서비스 실행"); // B 비지니스 로직 실행 // 현재 시간 DB 저장 log.info("서비스 종료"); } |
위 서비스 2개는 비지니스 로직 실행 부분만 다르고 나머지에 대해서는 동일한 기능을 하는 코드가 중복으로 들어가있다.
그리고 만약 서비스가 수십개, 수백개가 되면 더욱 지저분하고 관리가 안되는 코드가 될 것이다.
이럴 경우 나머지 부분을 하나의 공통 템플릿으로 만들고, 변하는 비지니스 로직만 각각 짜주면
개발도 편하고 관리도 잘 되고 코드의 통일성 등 다양한 장점이 있다.
그럴 경우에 많이 사용되는 템플릿 메서드 패턴에 대한 예제를 정리한다.
위 예제 코드를 템플릿 메서드 패턴으로 변경해서 코드를 바꾸면,
- 추상클래스로 공통 코드를 담을 템플릿을 하나 만든다.
그리고 비지니스 로직을 담을 call 이라는 함수를 만들어줬다.
public abstract class AbstractTemplate { public void execute() { log.info("서비스 실행"); //business logic start call(); //business logic end // 현재 시간 DB 저장 log.info("서비스 종료"); } protected abstract void call(); } |
- 메인코드로 돌아가서 아래와 같이 익명클래스를 만들어주고 비지니스 로직을 그 안에 추상클래스를 오버라이드 해서 구현한다.
그리고 객체에서 execute를 호출하여 사용을 한다.
public class Test(){ // A 서비스 관련 AbstractTemplate templateA = new AbstractTemplate(){ @Override protected void call(){ // A 비지니스 로직 실행 } }; templateA.execute(); // B 서비스 관련 AbstractTemplate templateB = new AbstractTemplate(){ @Override protected void call(){ // B 비지니스 로직 실행 } }; templateB.execute(); } |
결과는 동일하게 나오고
다른 곳에서도 함께 사용하려면 익명클래스가 아니라 별도 클래스에서 구현해도 가능하다.
익명클래스, 추상클래스 관련해서는 아래 참고 포스팅 참고 바란다.
참고 포스팅
https://thenicesj.tistory.com/496
https://thenicesj.tistory.com/704
https://thenicesj.tistory.com/1050
https://thenicesj.tistory.com/87
'IT > Java' 카테고리의 다른 글
[Error] argument type mismatch (13) | 2024.10.27 |
---|---|
전략 패턴 예제(Strategy Pattern) (15) | 2024.10.25 |
익명클래스 -> Lambda(람다식) 변환 예제 (15) | 2024.10.22 |
[Spring Security] WebSecurityConfigurerAdapter / antMatchers 관련(SecurityFilterChain / requestMatchers) (15) | 2024.10.21 |
[Error] Executing an update/delete query (9) | 2024.10.20 |
댓글