본문 바로가기
프로그래밍/JavaWebProgramming

[Lesson06] 리플랙션 API를 이용

by Luhie 2016. 12. 29.

1) MVC 프레임워크 컨트롤러 자동화

2) DI 객체 관리 자동화

3) 에노테이션을 이용한 자동화 

리플렉션을 사용 하려면 인터페이스도 써야하고 여러가지가 필요하다.

controller가 '나는 응답하는게 있다' 라고 하면 필요로 하는 객체가 달라진다.

어떻게 이 필요로 하는 것을 알까? 표시를 해야한다. 



DataBinding.java

인터페이스 구현 Object배열로 데이터의 이름과 타입정보를 담는다.



MemberAddController.java

DataBinding 인터페이스를 선언

getDataBinders();메소드 구현

return을 할때 new Member[1]; 을 하여

받을 땐 Object 클래스로 받아서 Member클래스로 넘길수도 있지만

이렇게 되면 받아서 사용할 때 다시 형 변환을 시켜줘야 하기때문에 

코드를 통일 할 수 없다. 


짝수번 째는 String 홀수번 째는 Class로 형변환

그래서 Object[] 배열로 {"A", B}

A라는 이름으로 B 클래스 정보를 담아서 리턴


String[]{"",""} 로 할 수있지만 부모를 찾아가면

Object가 나오기때문에 통일


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
        if ("/member/add.do".equals(servletPath)) {
            if (request.getParameter("email"!= null) {
                model.put("member"new Member()
                .setEmail(request.getParameter("email"))
                .setPassword(request.getParameter("password"))
                .setName(request.getParameter("name")));
            }
        } else if ("/member/update.do".equals(servletPath)) {
            if (request.getParameter("email"!= null) {
                model.put("member"new Member()
                    .setNo(Integer.parseInt(request.getParameter("no")))
                    .setEmail(request.getParameter("email"))
                    .setName(request.getParameter("name")));
            } else {
            model.put("no"new Integer(request.getParameter("no")));
            }
        } else if ("/member/delete.do".equals(servletPath)) {
            model.put("no"new Integer(request.getParameter("no")));
        } else if ("/auth/login.do".equals(servletPath)) {
            if (request.getParameter("email"!= null) {
                model.put("loginInfo"new Member()
                        .setEmail(request.getParameter("email"))
                        .setPassword(request.getParameter("password")));
            }
        }

cs

모델객체를 만들어야 하기 때문에 이 코드가 남아 있다.


예를 들면 이 코드를 아래에 public void test(){} 안으로 이동 후

this.test(); 호출 하면 무엇을 하든 실행이 되어서

분기를 시켜야 한다. (add, update, delete 등)

결론 적으로는 똑같아 지기 때문에 

if(pageConteroller instanceof DataBinding) { this.test() }

instaceof[각주:1]를 써서 줄일 수 있다. 

pageController.getDataBinders(); 호출을 하면 필요한 모델타입을 풀어낸다.

(모델 객체를 자동으로 만들어 주는 메소드 호출)


String dataName 가져온 데이터 이름

Class<?> dataType 클래스 타입

(어떤 타입인지 모르니까 물음표 , 생략해도 무관)

Object DataObject 객체 타입


어떤 메소드를 호출(dataObject = 메소드호출();) 하면 해주는 일이

dataTpye+request 바인딩 되어 온다.

request에 넘기는 매개변수 이름이 

Member에 선언되어 있는 이름과 같아야 한다


ServletRequestDataBinder.java






DispatcherServlet.java

어렵다 대충 이해는 되는데 자세하게 정리가 안된다.

오늘은 여기까지 다시 수정해야겟다. 


  1. 들어갈 수 있으면 true, 들어갈 수 없으면 false [본문으로]