๋ณธ ๋ด์ฉ์ ์คํ๋ง ํ๋ ์์ํฌ์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋๋ฐ ๋์์ด ๋๋ค.
๋ฆฌํ๋์ API๋ฅผ ์ด์ฉํ Front Controller ์๋ํ
์๋์ ๊ฐ์ ์ ๊ท ํ์(ํ์)์ ๋ฑ๋กํ๋ ํผ์ด ์๋ค.
์ฌ์ฉ์๊ฐ ๊ฐ์ ์ ๋ ฅํ๊ณ [๋ฑ๋ก] ๋ฒํผ์ ํด๋ฆญํด์ ์ ๊ท ํ์ ๋ฑ๋ก์ ์์ฒญํ๋ฉด ์์ ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ์๊ฒ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
|
// ๋งค๊ฐ๋ณ์๊ฐ์ ๊บผ๋ด์ Map์ ๋ด์
model.put("student", new Student()
.setStudentNo(req.getParameter("student_no"))
.setStudentName(req.getParameter("student_name"))
.setAddress(req.getParameter("address"))
.setAge(Integer.parseInt(req.getParameter("age")))
.setDepartment(req.getParameter("department"))
.setGender(req.getParameter("gender"))
.setGrade(Integer.parseInt(req.getParameter("grade")))
.setPassword(req.getParameter("password"))
.setPhoneNumber(req.getParameter("phone_number"))
);
|
cs |
์ด๋ฅผ ์ํด ์์ ๊ฐ์ด VO ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ setter()๋ฅผ ํตํด ์์ฒญ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ธํ ํ๋ ์ฝ๋๋ฅผ ์ง์ ์์ฑํ๋ค๋ฉด ์ถํ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๊ฒ ๋๋ค.
์ด ๋ ๋ฆฌํ๋์ API๋ฅผ ํ์ฉํ๋ฉด ์ด๋ ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์๋ํํ ์ ์๋ค.
์๋ํ ์๋๋ฆฌ์ค
์ ๊ท ํ์์ ๋ฑ๋กํ ๋ ์ ๋ฌํ ๋ฐ์ดํฐ ์ค๋น๋ฅผ ์๋ํํ๋ ์๋๋ฆฌ์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
โ ์น ๋ธ๋ผ์ฐ์ ์์ ํ์ ๋ฑ๋ก์ ์์ฒญํ๋ฉฐ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์๋ธ๋ฆฟ์ ์ ๋ฌํ๋ค.
โก ์๋ธ๋ฆฟ(Front controller)์ด ํ์ ๋ฑ๋ก์ ์ฒ๋ฆฌํ๋ StudentAddController์๊ฒ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ํ์ํ์ง ๋ฌผ์ด๋ณธ๋ค.
โข StudentAddController๋ ์์ ํ๋๋ฐ ํ์ํ ๋ฐ์ดํฐ์ ์ด๋ฆ๊ณผ ํ์ ์ ๋ณด๋ฅผ ๋ด์ ๋ฐฐ์ด์ ๋ฆฌํดํ๋ค.
โฃ Front controller๋ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ก StudentAddController๊ฐ ํ์ํ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
โค Front controller๋ StudentAddController๋ฅผ executeํ๋ฉด์ โฃ์์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
์๋ํ ๊ตฌํ
1. DataBinding ์ธํฐํ์ด์ค ์ ์ ๋ฐ ๊ตฌํ
๋ชจ๋ controller๊ฐ ํ๋ผ๋ฏธํฐ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ฑด ์๋๋ฏ๋ก DataBinding ์ธํฐํ์ด์ค๋ฅผ ์ ์ํด์ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ controller์๊ฒ๋ง ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ ๋ฌํ ๊ฒ์ด๋ค.
bind ํจํค์ง์ ์๋์ ๊ฐ์ DataBinding ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ค.
DataBinding.java
1
2
3
4
5
6
7
8
9
10
11
|
/**
* ์์ฒญ ํ๋ผ๋ฏธํฐ ๋ฐ์ดํฐ๊ฐ ํ์ํ controller๋ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
*/
public interface DataBinding {
/**
* ํ์ํ ๋ฐ์ดํฐ ์ ์
* @return ๋ฐ์ดํฐ์ ์ด๋ฆ๊ณผ ํ์
์ ๋ณด๋ฅผ ๋ด์ Object[]
* Ex) new Object[]{"๋ฐ์ดํฐ์ด๋ฆ", ๋ฐ์ดํฐํ์
, "๋ฐ์ดํฐ์ด๋ฆ", ๋ฐ์ดํฐํ์
, ...}
*/
Object[] getDataBinders();
}
|
cs |
getDataBinders()์ ๋ฆฌํด๊ฐ์ ๋ฐ์ดํฐ ์ด๋ฆ๊ณผ ๋ฐ์ดํฐ ํ์ ์ ๋ณด๋ฅผ ๋ด์ Object ๋ฐฐ์ด์ด๋ค.
์ด์ ์์ฒญ ํ๋ผ๋ฏธํฐ ๋ฐ์ดํฐ๊ฐ ํ์ํ controller์์ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก ๋ณ๊ฒฝํ๋ค.
StudentAddController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/**
* ์ ๊ท ํ์ ๋ฑ๋ก
*/
public class StudentAddController implements Controller, DataBinding {
/**
* ํ์ํ ๋ฐ์ดํฐ ์ ์
* @return ๋ฐ์ดํฐ์ ์ด๋ฆ๊ณผ ํ์
์ ๋ณด๋ฅผ ๋ด์ Object[]
*/
@Override
public Object[] getDataBinders() {
return new Object[]{"student", com.atoz_develop.spms.vo.Student.class};
}
|
cs |
์์ ๊ฐ์ด ๋ฐํํ๋ฉด ์์ฒญ ํ๋ผ๋ฏธํฐ ๋ฐ์ดํฐ๋ฅผ Student ๊ฐ์ฒด์ ๋ด์์ "student"๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ๋ฌํด ๋ฌ๋ผ๋ ์๋ฏธ์ด๋ค.
2. Front controller ๋ณ๊ฒฝ
์ด์ front controller์์ ์ง์ Student ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ setter()๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ค controller์๊ฒ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฌป๊ณ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
ํ์ํ ๋ถ๋ถ๋ง ๋ณผ ์ ์๋๋ก ๊ด๋ จ ์๋ ์ฝ๋๋ ์๋ตํ์๋ค.
DispatcherServlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
/**
* Front Controller
*/
@WebServlet("*.do")
public class DispatcherServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// DataBinding ๊ตฌํ ์ฌ๋ถ ํ์ธ ํ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ prepareRequestData() ํธ์ถ
if(pageController instanceof DataBinding) {
prepareRequestData(req, model, (DataBinding) pageController);
}
// PageController์ ์คํ ์์ฒญ
String viewUrl = pageController.execute(model);
}
/**
* ๋ฐ์ดํฐ ์ค๋น
* @param request
* @param model
* @param dataBinding
* @throws Exception
*/
private void prepareRequestData(HttpServletRequest request, Map<String, Object> model, DataBinding dataBinding) throws Exception {
// ํ์ํ ๋ฐ์ดํฐ ํ์ธ
Object[] dataBinders = dataBinding.getDataBinders();
String dataName = null;
Class<?> dataType = null;
Object dataObj = null;
for(int i=0; i<dataBinders.length; i+=2) {
dataName = (String) dataBinders[i];
dataType = (Class<?>) dataBinders[i+1];
// dataName๊ณผ ์ผ์นํ๋ ์์ฒญ ๋งค๊ฐ๋ณ์ ๊ฐ์ dataType ์ธ์คํด์ค์ ์ ์ฅํ๊ณ ๋ฐํ
dataObj = ServletRequestDataBinder.bind(request, dataType, dataName);
model.put(dataName, dataObj);
}
}
}
|
cs |
1) service()
service() ๋ฉ์๋์์ ๊ธฐ์กด์ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์ปจํธ๋กค๋ฌ๊ฐ DataBinding์ ๊ตฌํํ๋์ง ํ์ธํ ๋ค ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ ๋ฉ์๋์ธ prepareRequestData()๋ฅผ ํธ์ถํ๋๋ก ํ๋ค.
if (pageController instanceof DataBinding) {
prepareRequestData(...)
}
2) prepareRequestData()
๋จผ์ ์ปจํธ๋กค๋ฌ์๊ฒ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ค.
Object[] dataBinders = dataBinding.getDataBinders();
getDataBinders()๊ฐ ๋ฐํํ๋ ๊ฒ์ {"๋ฐ์ดํฐ ์ด๋ฆ", ๋ฐ์ดํฐ ํ์ , "๋ฐ์ดํฐ ์ด๋ฆ", ๋ฐ์ดํฐ ํ์ , ...}๊ณผ ๊ฐ์ Object ๋ฐฐ์ด์ด๋ค.
๋ฐ์ดํฐ ์ด๋ฆ๊ณผ ๋ฐ์ดํฐ ํ์ ์ด 1์ ์ฉ ๋ค์ด์์ผ๋ฏ๋ก 2์ฉ ์ฆ๊ฐ์ํค๋ฉฐ for๋ฌธ์ ๋๋ฆฐ๋ค.
for (int i=0; i<dataBinders.length; i+=2) {
dataName = (String)dataBinders[i];
dataType = (Class<?>) dataBinders[i+1];
...
}
3) ServletRequestDataBinder.bind()
๊ณง ๊ตฌํํ ServletRequestDataBinder๋ ์์ฒญ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์๋ฐ ๊ฐ์ฒด์ ๋ด์์ฃผ๋ ์ญํ ์ ์ํํ๋ค.
์ด ๋ฉ์๋๋ dataName๊ณผ ์ผ์นํ๋ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐพ๊ณ dataType์ ํตํด ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค. ์ฐพ์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ์ธ์คํด์ค์ ์ ์ฅํ๊ณ ๊ทธ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
dataObj = ServletRequestDataBinder.bind(request, dataType, dataName);
model.put(dataName, dataObj);
์ต์ข ์ ์ผ๋ก ๋ฐํ๋ฐ์ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ Map ๊ฐ์ฒด model์ ๋ด์ ์ปจํธ๋กค๋ฌ๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ์ค๋นํ๋ค.
3. ServletRequestDataBinder ํด๋์ค ๊ตฌํ
bind ํจํค์ง์ ServletRequestDataBinder ํด๋์ค๋ฅผ ์์ฑํ๊ณ ์๋์ ๊ฐ์ด ์์ฑํ๋ค.
bind(), isPrimitiveType(), createValueObject(), findSetter()์ ์ด 4๊ฐ ํด๋์ค ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค.
ServletRequestDataBinder.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
public class ServletRequestDataBinder {
/**
* ์์ฒญ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์๋ฐ ๊ฐ์ฒด์ ๋ด์์ ๋ฐํํ๋ค.
* Front controller์์ ํธ์ถ
* @param request ์์ฒญ ํ๋ผ๋ฏธํฐ ๊ฐ
* @param dataType ๋ฐ์ดํฐ ํ์
* @param dataName ๋ฐ์ดํฐ ์ด๋ฆ
* @return ๋ฐ์ดํฐ ๊ฐ์ฒด
* @throws Exception
*/
public static Object bind(ServletRequest request, Class<?> dataType, String dataName) throws Exception {
// ๋ฐ์ดํฐ ํ์
์ด primitive type์ธ์ง ํ์ธ
if(isPrimitiveType(dataType)) {
// primitive type์ด๋ฉด ์ฆ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํ
return createValueObject(dataType, request.getParameter(dataName));
}
// ์์ฒญ ํ๋ผ๋ฏธํฐ๋ช
Set<String> paramNames = request.getParameterMap().keySet();
for(String s:paramNames) {
System.out.println(s);
}
// ๊ฐ์ ์ ์ฅํ ๊ฐ์ฒด ์์ฑ
Object dataObject = dataType.getDeclaredConstructor.newInstance();
Method m = null;
// ์์ฒญ ํ๋ผ๋ฏธํฐ ๊ฐ์๋งํผ ๋ฐ๋ณตํ๋ฉด์ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ๊ฐ์ ํ ๋น
for(String paramName: paramNames) {
// ํ๋ผ๋ฏธํฐ๋ช
๊ณผ ์ผ์นํ๋ setter() ์ฐพ์
m = findSetter(dataType, paramName);
if(m != null) {
// setter()๋ฅผ ์ฐพ์์ผ๋ฉด dataObject์ ๋ํด ํธ์ถ
// setter() ํธ์ถ ์ ์์ฒญ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ํ์์ ๋ง์ถฐ ๋๊น
// invoke() : ๋ฉ์๋ ํธ์ถ
// getParameterTypes() : ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ ๋ฐฐ์ด๋ก ๋ฐํ
m.invoke(dataObject, createValueObject(m.getParameterTypes()[0], request.getParameter(paramName)));
}
}
return dataObject;
}
/**
* type์ด primitive type์ธ์ง ํ์ธ
* @param type
* @return int, long, float, double, boolean, java.util.Date, java.lang.String ํ์
์ด๋ฉด true, ์๋๋ฉด false
* byte, short๋ ํ์ ์ ์ถ๊ฐ
*/
private static boolean isPrimitiveType(Class<?> type) {
if(type.getName().equals("int") || type == Integer.class ||
type.getName().equals("long") || type == Long.class ||
type.getName().equals("float") || type == Float.class ||
type.getName().equals("double") || type == Double.class ||
type.getName().equals("boolean") || type == Boolean.class ||
type == Date.class || type == String.class) {
return true;
}
return false;
}
/**
* Primitive type์ ๊ฐ์ฒด๋ฅผ ์์ฑ
* @param type
* @param value
* @return
*/
private static Object createValueObject(Class<?> type, String value) {
if(type.getName().equals("int") || type == Integer.class) {
return Integer.valueOf(value);
} else if(type.getName().equals("long") || type == Long.class) {
return Long.valueOf(value);
} else if(type.getName().equals("float") || type == Float.class) {
return Float.valueOf(value);
} else if(type.getName().equals("double") || type == Double.class) {
return Double.valueOf(value);
} else if(type.getName().equals("boolean") || type == Boolean.class) {
return Boolean.valueOf(value);
} else if(type == Date.class) {
return java.sql.Date.valueOf(value);
} else {
return value;
}
}
/**
* ํด๋์ค(type)์ ์กฐ์ฌํด์ ์ฃผ์ด์ง ์ด๋ฆ(name))๊ณผ ์ผ์นํ๋ setter()๋ฅผ ์ฐพ๋๋ค.
* @param type
* @param name
* @return
*/
private static Method findSetter(Class<?> type, String name) {
// ๋ฐ์ดํฐ ํ์
์์ ๋ฉ์๋ ๋ชฉ๋ก ์ป์
// getMethods() : ํด๋์ค์ ์ ์ธ๋ ๋ชจ๋ public ๋ฉ์๋ ๋ชฉ๋ก์ ๋ฐฐ์ด๋ก ๋ฐํ
Method[] methods = type.getMethods();
String propName = null;
// ๋ฉ์๋ ๋ชฉ๋ก์ ๋ฐ๋ณตํ์ฌ setter()์ ๋ํด์๋ง ์์
์ํ
for(Method m: methods) {
if(!m.getName().startsWith("set")) continue;
// setter()์ผ ๊ฒฝ์ฐ
// ๋ฉ์๋ ์ด๋ฆ์์ 'set' ์ ์ธ
propName = m.getName().substring(3);
// ์์ฒญ ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ์ผ์นํ๋์ง ํ์ธ
if(propName.toLowerCase().equals(name.toLowerCase())) {
//์ผ์นํ๋ setter()๋ฅผ ์ฐพ์ผ๋ฉด ๋ฐํ
return m;
}
}
return null;
}
}
|
cs |
1) bind()
Front controller์์ ํธ์ถํ public ๋ฉ์๋์ด๋ค. request, ๋ฐ์ดํฐ ํ์ , ๋ฐ์ดํฐ ์ด๋ฆ์ ๋ฐ์์ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์ผ์ ์ํํ๋ค.
public static Object bind(ServletRequest request, Class<?> dataType, String dataName) throws Exception {
...
return dataObject;
}
์ฒซ ๋ฒ์งธ ์ฝ๋๋ dataType์ด primitive type์ธ์ง ํ์ธํ๋ ์ผ์ด๋ค. Primitive type์ผ ๊ฒฝ์ฐ ์ฆ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ฐํํ๋ค.
if (isPrimitiveType(dataType)) {
return createValueObject(dataType, request.getParameter(dataName));
}
Primitive type์ด ์๋๋ฉด ๋จผ์ request ๊ฐ์ฒด๋ฅผ ํตํด ์์ฒญ ํ๋ผ๋ฏธํฐ ์ด๋ฆ ๋ชฉ๋ก์ ์ป๋๋ค.
Set<String> paramNames = request.getParameterMap().keySet();
request.getParameterMap()์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ๊ฐ์ ๋งต ๊ฐ์ฒด์ ๋ด์ ๋ฐํํ๋ค. ๋๋ฌธ์ keySet()์ผ๋ก ํ๋ผ๋ฏธํฐ ์ด๋ฆ ๋ชฉ๋ก๋ง ๊บผ๋ธ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
new ์ฐ์ฐ์๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ฏ Class.getDeclaredConstructor().newInstance() ๋ฉ์๋๋ฅผ ํธ์ถํด์๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค.
Object dataObject = dataType.getDeclaredConstructor().newInstance();
๋ค์์ ์์ฒญ ํ๋ผ๋ฏธํฐ ๊ฐ์๋งํผ for๋ฌธ์ ๋๋ ค setter๋ฅผ ํธ์ถํด์ ๊ฐ์ ํ ๋นํ๋ค.
Method m = null;
for (String paramName: paramNames) {
m = findSetter(dataType, paramName);
if (m != null) {
m.invoke(dataObject, createValueObject(m.getParameterTypes()[0], request.getParameter(paramName)));
}
}
findSetter()๋ ๋ฐ์ดํฐ ํ์ ๊ณผ ํ๋ผ๋ฏธํฐ๋ช ์ ์ ๋ฌํ์ฌ setter()๋ฅผ ๋ฐํํ๋๋ก ๊ตฌํํ์๋ค.
invoke()๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฉ์๋๋ก ์ผ๋ฐ์ ์ผ๋ก ํ ์ธ์คํด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋
์ธ์คํด์ค.๋ฉ์๋(์ธ์๊ฐ)์ผ๋ก ํธ์ถํ๋ค๋ฉด invoke() ๋ฉ์๋๋ invoke(์ธ์คํด์ค, ์ธ์๊ฐ)๊ณผ ๊ฐ์ด ํธ์ถํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
2) isPrimitiveType()
isPrimitiveType() ๋ฉ์๋๋ ์ด ํด๋์ค ๋ด๋ถ์ ์ ์๋ private ๋ฉ์๋๋ก int, long, float, double, boolean, java.util.Date, java.lang.String ํ์ ์ primitive type์ผ๋ก ๊ฐ์ฃผํ์ฌ true๋ฅผ ๋ฐํํ๋ค.
3) createValueObject()
createValueObject() ๋ฉ์๋๋ ์์ฒญ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ฐ๊ณ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
if (type.getName().equals("int) || type == Integer.class) {
return Integer.valueOf(value);
}
...
4) findSetter()
findSetter()๋ ํด๋์ค๋ฅผ ์กฐ์ฌํ์ฌ ์ฃผ์ด์ง name๊ณผ ์ผ์นํ๋ setter() ๋ฉ์๋๋ฅผ ์ฐพ๋๋ค.
๋จผ์ Class์์ ๋ฉ์๋ ๋ชฉ๋ก์ ์ป๋๋ค.
Method[] methods = type.getMethods();
๋ฉ์๋ ๋ชฉ๋ก์ ๋ฐ๋ณตํ์ฌ setter()๋ฅผ ์ฐพ๋๋ค.
for (Method m: methods) {
if (!m.getName().startsWith("set")) continue;
...
Setter()์ผ ๊ฒฝ์ฐ ์์ฒญ ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ค.
์๋ฅผ ๋ค์ด ์์ฒญ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ด name์ด๋ฉด ๋ฉ์๋๊ฐ setName()์ธ์ง ํ์ธํ๋ค.
propName = m.getName().substring(3);
if (propName.toLowerCase().equals(name.toLowerCase())) {
return m;
}
์ผ์นํ๋ setter()๋ฅผ ์ฐพ์ผ๋ฉด ๋ฐํํ๋ค.
์ฌ์ฉ๋ ๋ฆฌํ๋์ API
๋ฆฌํ๋์ API๋ฅผ ํตํด ํด๋์ค์ ์ด๋ค ๋ฉ์๋๊ฐ ์๋์ง, ๋ฉ์๋์ ์ด๋ฆ์ ๋ฌด์์ธ์ง, ํด๋์ค์ ์ด๋ฆ์ ๋ฌด์์ธ์ง ๋ฑ์ ์ ์ ์๋ค. Controller๊ฐ ํ์ํ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์ฒญ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ธํ ํ๋ ๊ฒ์ ์๋ํํ๊ธฐ ์ํด ์ฌ์ฉ๋ ๋ฆฌํ๋์ API ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ฉ์๋ | ์ค๋ช |
Class.getDeclaredConstructor().newInstance() | ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑ |
Class.getName() | ํด๋์ค ์ด๋ฆ ๋ฐํ |
Class.getMethods() | ํด๋์ค์ ์ ์ธ๋ ๋ชจ๋ public ๋ฉ์๋ ๋ชฉ๋ก์ ๋ฐฐ์ด๋ก ๋ฐํ |
Method.invoke() | ๋ฉ์๋ ํธ์ถ |
Method.getParameterTypes() | ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ ๋ฐฐ์ด๋ก ๋ฐํ |
References
์ดํ๊ฐ์ ์๋ฐ ์น ๊ฐ๋ฐ ์ํฌ๋ถ(ํ๋ฆฌ๋ , 2016, ์์ง์)
'Javaยท๏ปฟServletยท๏ปฟJSP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA/์น] Annotation๊ณผ Reflections ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์๋ฐ ๋น ๊ด๋ฆฌํ๊ธฐ (0) | 2020.02.21 |
---|---|
JAVA ์น ํ๋ก์ ํธ์์ Properties ํ์ผ ํ์ฉํ๊ธฐ (0) | 2020.02.20 |
Tomcat ์๋ฒ DataSource ์ค์ ๋ฐฉ๋ฒ (+JNDI) (1) | 2020.02.17 |
ServletContextListener๋ก DB ์ปค๋ฅ์ , DAO ๊ณต์ ๊ฐ์ฒด ๊ด๋ฆฌํ๊ธฐ (0) | 2020.02.15 |
[IntelliJ] ํ์๊ฐ์ ์์ (MVC) - (7) DAO ๋ถ๋ฆฌํ๊ธฐ (0) | 2020.02.15 |
๋๊ธ