class
, Method
단위에서 사용되게 되는 로직이 생성되게 됩니다.인증
과 인가
등의 공통 로직은 Filter
나, Servlet
(Spring-DispatcherServlet)을 사용하여 관심사를 분리 할 수 있습니다.AOP
기능을 사용하여 Class
, Method
Level 에서의 관심사를 분리 할 수도 있습니다.Github 의 web-v0 패키지 참조.
//출력결과
2024-09-03T23:08:52.819+09:00 INFO 248552 --- [designpattern] [nio-8080-exec-1] b.designpattern.web.v0.TestRepository : [a7e2849c][save] : Running Time : 1013
2024-09-03T23:08:52.820+09:00 INFO 248552 --- [designpattern] [nio-8080-exec-1] b.designpattern.web.v0.TestService : [4682f049][saveName] : Running Time : 1014
2024-09-03T23:08:52.820+09:00 INFO 248552 --- [designpattern] [nio-8080-exec-1] b.designpattern.web.v0.TestController : [56017a09][saveName] : Running Time : 1015
testService.saveName(name);
입니다.Repository
, Service
에도 완전 동일한 로직이 추가되어 버렸습니다.단일 책임 원칙
을 가볍게 무시하는 모습입니다. 이렇게 개발하면... 같이 일하시는 분들이 참 많이 힘들 것 입니다.Github 의 web-v1 패키지 참조.
//결과
2024-09-03T23:32:42.975+09:00 INFO 230764 --- [designpattern] [nio-8080-exec-2] b.designpattern.global.ThreadLogger : [06878be1][save] : Running Time : 1009
2024-09-03T23:32:42.975+09:00 INFO 230764 --- [designpattern] [nio-8080-exec-2] b.designpattern.global.ThreadLogger : [06878be1][saveName] : Running Time : 1009
2024-09-03T23:32:42.975+09:00 INFO 230764 --- [designpattern] [nio-8080-exec-2] b.designpattern.global.ThreadLogger : [06878be1][saveName] : Running Time : 1009
2024-09-03T23:33:02.210+09:00 INFO 230764 --- [designpattern] [nio-8080-exec-4] b.designpattern.global.ThreadLogger : [ac7b56da][save] : Running Time : 1005
2024-09-03T23:33:02.210+09:00 INFO 230764 --- [designpattern] [nio-8080-exec-4] b.designpattern.global.ThreadLogger : [ac7b56da][saveName] : Running Time : 1005
2024-09-03T23:33:02.210+09:00 INFO 230764 --- [designpattern] [nio-8080-exec-4] b.designpattern.global.ThreadLogger : [ac7b56da][saveName] : Running Time : 1005
2024-09-03T23:33:02.375+09:00 INFO 230764 --- [designpattern] [nio-8080-exec-5] b.designpattern.global.ThreadLogger : [7681b74f][save] : Running Time : 1009
2024-09-03T23:33:02.375+09:00 INFO 230764 --- [designpattern] [nio-8080-exec-5] b.designpattern.global.ThreadLogger : [7681b74f][saveName] : Running Time : 1009
2024-09-03T23:33:02.376+09:00 INFO 230764 --- [designpattern] [nio-8080-exec-5] b.designpattern.global.ThreadLogger : [7681b74f][saveName] : Running Time : 1010
템플릿 메서드 패턴
을 적용 해 보겠습니다.Github 의 web.v2 패키지, global.templatemethodpattern 패키지 참조
상세 코드는 github 코드 참조 부탁드립니다.
ThreadLogger
와 유사합니다.execute
메서드를 보면, call()
메서드 전/후로 Logger의 메서드를 실행하게 됩니다.2024-09-04T06:04:39.541+09:00 INFO 264360 --- [designpattern] [nio-8080-exec-4] b.d.g.t.ThreadLocalLogger : [6cbfb17e][save] : Running Time : 1013
2024-09-04T06:04:39.541+09:00 INFO 264360 --- [designpattern] [nio-8080-exec-4] b.d.g.t.ThreadLocalLogger : [6cbfb17e][saveName] : Running Time : 1013
2024-09-04T06:04:39.541+09:00 INFO 264360 --- [designpattern] [nio-8080-exec-4] b.d.g.t.ThreadLocalLogger : [6cbfb17e][saveName] : Running Time : 1013
2024-09-04T06:04:39.766+09:00 INFO 264360 --- [designpattern] [nio-8080-exec-5] b.d.g.t.ThreadLocalLogger : [1c59ddb2][save] : Running Time : 1001
2024-09-04T06:04:39.766+09:00 INFO 264360 --- [designpattern] [nio-8080-exec-5] b.d.g.t.ThreadLocalLogger : [1c59ddb2][saveName] : Running Time : 1001
2024-09-04T06:04:39.766+09:00 INFO 264360 --- [designpattern] [nio-8080-exec-5] b.d.g.t.ThreadLocalLogger : [1c59ddb2][saveName] : Running Time : 1001
비지니스 로직 > 공통 로직
이다.Github 의 web.v3 패키지, global.strategypattern 패키지 참조
- 전략 패턴은 간단하게, 사용할 전략을 주입 받는 것입니다.
- Spring의 의존성 주입과 매우 흡사 합니다.
interface
객체로, 람다식을 활용하여 필요한 전략(로직)을 구현 합니다.2024-09-04T07:01:36.638+09:00 INFO 61684 --- [designpattern] [nio-8080-exec-5] b.d.g.t.ThreadLocalLogger : [35ca09f3][save] : Running Time : 1004
2024-09-04T07:01:36.638+09:00 INFO 61684 --- [designpattern] [nio-8080-exec-5] b.d.g.t.ThreadLocalLogger : [35ca09f3][saveName] : Running Time : 1004
2024-09-04T07:01:36.638+09:00 INFO 61684 --- [designpattern] [nio-8080-exec-5] b.d.g.t.ThreadLocalLogger : [35ca09f3][saveName] : Running Time : 1004
2024-09-04T07:01:36.814+09:00 INFO 61684 --- [designpattern] [nio-8080-exec-6] b.d.g.t.ThreadLocalLogger : [029c10eb][save] : Running Time : 1013
2024-09-04T07:01:36.814+09:00 INFO 61684 --- [designpattern] [nio-8080-exec-6] b.d.g.t.ThreadLocalLogger : [029c10eb][saveName] : Running Time : 1013
2024-09-04T07:01:36.814+09:00 INFO 61684 --- [designpattern] [nio-8080-exec-6] b.d.g.t.ThreadLocalLogger : [029c10eb][saveName] : Running Time : 1013
StrategyLogger
생성 시점에 전략을 주입해야 된다는 부분이 조금 범용성이 낮게 느껴집니다.Github 의 web.v4 패키지, global.strategypatternrefactoring 패키지 참조
- 공통적인 로직은 하나로 묶되, 생성자를 통해 전략을 주입받지 않고, 메서드를 실행할 때, 전략을 주입받도록 하겠습니다.
2024-09-04T07:18:28.786+09:00 INFO 171476 --- [designpattern] [nio-8080-exec-2] b.d.g.t.ThreadLocalLogger : [9704c8dd][save] : Running Time : 1009
2024-09-04T07:18:28.786+09:00 INFO 171476 --- [designpattern] [nio-8080-exec-2] b.d.g.t.ThreadLocalLogger : [9704c8dd][saveName] : Running Time : 1009
2024-09-04T07:18:28.786+09:00 INFO 171476 --- [designpattern] [nio-8080-exec-2] b.d.g.t.ThreadLocalLogger : [9704c8dd][saveName] : Running Time : 1009
2024-09-04T07:18:28.996+09:00 INFO 171476 --- [designpattern] [nio-8080-exec-3] b.d.g.t.ThreadLocalLogger : [bc72c712][save] : Running Time : 1010
2024-09-04T07:18:28.996+09:00 INFO 171476 --- [designpattern] [nio-8080-exec-3] b.d.g.t.ThreadLocalLogger : [bc72c712][saveName] : Running Time : 1010
2024-09-04T07:18:28.996+09:00 INFO 171476 --- [designpattern] [nio-8080-exec-3] b.d.g.t.ThreadLocalLogger : [bc72c712][saveName] : Running Time : 1011