Skip to content

Commit f166bcc

Browse files
authored
Merge pull request #45 from codingbaraGo/refactor/config/di/#44
[Config-DI] 싱글톤을 보장하는 싱글톤 컨테이너 개발
2 parents 2643c30 + 422f02d commit f166bcc

2 files changed

Lines changed: 164 additions & 68 deletions

File tree

src/main/java/config/AppConfig.java

Lines changed: 143 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -11,127 +11,202 @@
1111
import http.request.InputStreamHttpRequestConverter;
1212
import http.response.HttpResponseBufferedStreamConverter;
1313
import http.response.HttpResponseConverter;
14-
import web.dispatch.argument.ArgumentResolver;
1514
import web.dispatch.Dispatcher;
1615
import web.dispatch.HandlerAdapter;
1716
import web.dispatch.adapter.DefaultHandlerAdapter;
1817
import web.dispatch.adapter.SingleArgHandlerAdapter;
18+
import web.dispatch.argument.ArgumentResolver;
1919
import web.dispatch.argument.resolver.HttpRequestResolver;
2020
import web.dispatch.argument.resolver.QueryParamsResolver;
2121
import web.handler.StaticContentHandler;
2222
import web.handler.WebHandler;
23-
import web.renderer.StaticViewRenderer;
2423
import web.renderer.HttpResponseRenderer;
24+
import web.renderer.StaticViewRenderer;
2525

2626
import java.util.List;
2727

28-
public class AppConfig {
29-
//Http
30-
public HttpRequestConverter httpRequestConverter(){
28+
public class AppConfig extends SingletonContainer {
29+
30+
/**
31+
* ===== Http =====
32+
*/
33+
public HttpRequestConverter httpRequestConverter() {
3134
return inputStreamHttpRequestConverter();
3235
}
33-
public HttpResponseConverter httpResponseConverter(){
36+
37+
public HttpResponseConverter httpResponseConverter() {
3438
return httpResponseBufferedStreamConverter();
3539
}
3640

37-
public BufferedReaderHttpRequestConverter httpBufferedReaderRequestConverter(){
38-
return new BufferedReaderHttpRequestConverter();
41+
public BufferedReaderHttpRequestConverter httpBufferedReaderRequestConverter() {
42+
return getOrCreate(
43+
"httpBufferedReaderRequestConverter",
44+
BufferedReaderHttpRequestConverter::new
45+
);
3946
}
4047

41-
public HttpResponseBufferedStreamConverter httpResponseBufferedStreamConverter(){
42-
return new HttpResponseBufferedStreamConverter();
43-
}
44-
public InputStreamHttpRequestConverter inputStreamHttpRequestConverter(){
45-
return new InputStreamHttpRequestConverter();
48+
public HttpResponseBufferedStreamConverter httpResponseBufferedStreamConverter() {
49+
return getOrCreate(
50+
"httpResponseBufferedStreamConverter",
51+
HttpResponseBufferedStreamConverter::new
52+
);
4653
}
4754

48-
49-
//Web
50-
public Dispatcher dispatcher(){
51-
return new Dispatcher(
52-
webHandlerList(),
53-
handlerAdapterList(),
54-
webHandlerResponseHandlerList()
55+
public InputStreamHttpRequestConverter inputStreamHttpRequestConverter() {
56+
return getOrCreate(
57+
"inputStreamHttpRequestConverter",
58+
InputStreamHttpRequestConverter::new
5559
);
5660
}
5761

58-
private List<WebHandler> webHandlerList(){
59-
return List.of(
60-
staticContentHandler(),
61-
registerWithGet(),
62-
registerWithPost()
62+
/**
63+
* ===== Web =====
64+
*/
65+
public Dispatcher dispatcher() {
66+
return getOrCreate(
67+
"dispatcher",
68+
() -> new Dispatcher(
69+
webHandlerList(),
70+
handlerAdapterList(),
71+
webHandlerResponseHandlerList()
72+
)
6373
);
6474
}
65-
private RegisterWithGet registerWithGet(){
66-
return new RegisterWithGet();
75+
76+
public List<WebHandler> webHandlerList() {
77+
return getOrCreate(
78+
"webHandlerList",
79+
() -> List.of(
80+
staticContentHandler(),
81+
registerWithGet(),
82+
registerWithPost()
83+
)
84+
);
6785
}
68-
private RegisterWithPost registerWithPost(){
69-
return new RegisterWithPost();
86+
87+
public RegisterWithGet registerWithGet() {
88+
return getOrCreate(
89+
"registerWithGet",
90+
RegisterWithGet::new
91+
);
7092
}
7193

72-
private List<HttpResponseRenderer> webHandlerResponseHandlerList(){
73-
return List.of(
74-
staticViewResponseHandler()
94+
public RegisterWithPost registerWithPost() {
95+
return getOrCreate(
96+
"registerWithPost",
97+
RegisterWithPost::new
7598
);
7699
}
77-
private StaticContentHandler staticContentHandler(){
78-
return new StaticContentHandler();
100+
101+
public List<HttpResponseRenderer> webHandlerResponseHandlerList() {
102+
return getOrCreate(
103+
"webHandlerResponseHandlerList",
104+
() -> List.of(
105+
staticViewResponseHandler()
106+
)
107+
);
79108
}
80-
private StaticViewRenderer staticViewResponseHandler(){
81-
return new StaticViewRenderer();
109+
110+
public StaticContentHandler staticContentHandler() {
111+
return getOrCreate(
112+
"staticContentHandler",
113+
StaticContentHandler::new
114+
);
82115
}
83116

117+
public StaticViewRenderer staticViewResponseHandler() {
118+
return getOrCreate(
119+
"staticViewResponseHandler",
120+
StaticViewRenderer::new
121+
);
122+
}
84123

85-
//Adapter
86-
public List<HandlerAdapter> handlerAdapterList(){
87-
return List.of(
88-
singleArgHandlerAdapter(),
89-
defaultHandlerAdapter()
124+
// ===== Adapter =====
125+
public List<HandlerAdapter> handlerAdapterList() {
126+
return getOrCreate(
127+
"handlerAdapterList",
128+
() -> List.of(
129+
singleArgHandlerAdapter(),
130+
defaultHandlerAdapter()
131+
)
90132
);
91133
}
92134

93-
private SingleArgHandlerAdapter singleArgHandlerAdapter(){
94-
return new SingleArgHandlerAdapter(
95-
argumentResolverList()
135+
public SingleArgHandlerAdapter singleArgHandlerAdapter() {
136+
return getOrCreate(
137+
"singleArgHandlerAdapter",
138+
() -> new SingleArgHandlerAdapter(
139+
argumentResolverList()
140+
)
96141
);
97142
}
98-
private DefaultHandlerAdapter defaultHandlerAdapter(){
99-
return new DefaultHandlerAdapter();
143+
144+
public DefaultHandlerAdapter defaultHandlerAdapter() {
145+
return getOrCreate(
146+
"defaultHandlerAdapter",
147+
DefaultHandlerAdapter::new
148+
);
100149
}
101150

102-
//Resolver
103-
public List<ArgumentResolver<?>> argumentResolverList(){
104-
return List.of(
105-
httpRequestResolver(),
106-
queryParamsResolver()
151+
// ===== Resolver =====
152+
public List<ArgumentResolver<?>> argumentResolverList() {
153+
return getOrCreate(
154+
"argumentResolverList",
155+
() -> List.of(
156+
httpRequestResolver(),
157+
queryParamsResolver()
158+
)
107159
);
108160
}
109161

110-
private HttpRequestResolver httpRequestResolver(){
111-
return new HttpRequestResolver();
162+
public HttpRequestResolver httpRequestResolver() {
163+
return getOrCreate(
164+
"httpRequestResolver",
165+
HttpRequestResolver::new
166+
);
112167
}
113-
private QueryParamsResolver queryParamsResolver(){
114-
return new QueryParamsResolver();
168+
169+
public QueryParamsResolver queryParamsResolver() {
170+
return getOrCreate(
171+
"queryParamsResolver",
172+
QueryParamsResolver::new
173+
);
115174
}
116175

117-
//Exception
118-
public ExceptionHandlerMapping exceptionHandlerMapping(){
119-
return new ExceptionHandlerMapping(
120-
List.of(
121-
serviceExceptionHandler(),
122-
errorExceptionHandler(),
123-
unhandledErrorHandler()
176+
/**
177+
* ===== Exception =====
178+
*/
179+
public ExceptionHandlerMapping exceptionHandlerMapping() {
180+
return getOrCreate(
181+
"exceptionHandlerMapping",
182+
() -> new ExceptionHandlerMapping(
183+
List.of(
184+
serviceExceptionHandler(),
185+
errorExceptionHandler(),
186+
unhandledErrorHandler()
187+
)
124188
)
125189
);
126190
}
127191

128-
private ServiceExceptionHandler serviceExceptionHandler(){
129-
return new ServiceExceptionHandler();
192+
public ServiceExceptionHandler serviceExceptionHandler() {
193+
return getOrCreate(
194+
"serviceExceptionHandler",
195+
ServiceExceptionHandler::new
196+
);
130197
}
131-
private UnhandledErrorHandler unhandledErrorHandler(){
132-
return new UnhandledErrorHandler();
198+
199+
public UnhandledErrorHandler unhandledErrorHandler() {
200+
return getOrCreate(
201+
"unhandledErrorHandler",
202+
UnhandledErrorHandler::new
203+
);
133204
}
134-
private ErrorExceptionHandler errorExceptionHandler(){
135-
return new ErrorExceptionHandler();
205+
206+
public ErrorExceptionHandler errorExceptionHandler() {
207+
return getOrCreate(
208+
"errorExceptionHandler",
209+
ErrorExceptionHandler::new
210+
);
136211
}
137212
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package config;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.function.Supplier;
6+
7+
public abstract class SingletonContainer {
8+
private static final Map<String, Object> singletonMap = new HashMap<>();
9+
10+
@SuppressWarnings("unchecked")
11+
public <T> T getOrCreate(String name, Supplier<T> factory) {
12+
Object instance = singletonMap.get(name);
13+
if (instance != null) {
14+
return (T) instance;
15+
}
16+
T created = factory.get();
17+
singletonMap.put(name, created);
18+
return created;
19+
}
20+
21+
}

0 commit comments

Comments
 (0)