본문 바로가기

웹 개발(OLD)/Web(OLD)

MVC 패턴기반 Model2 방식으로 맛집 게시판 만들기 Ver 0.1

MVC 패턴기반 Model 2 방식


- Controller    :    모델과 뷰간의 흐름 제어. 

클라이언트로부터의 요청을 받아 이를 수행하기 위한 Model영역의 어떤 로직을 수행할지 결정하고 이를 처리 후, 이 결과를 보여주기 위한 뷰를 선택한다. 이때request.setAttribute("fsVO", fsVO); 와 같이 결과값 속성을 지정해준다. (이를 View인 jsp파일에서 ${fsVO.sname} 와 같이 EL(Expression Language)를 이용하여 데이터를 사용할 것이다.)  웹 브라우저에 처리 결과를 보여주기 위한 jsp파일을 선택한 후, 해당 jsp파일을 forwarding한다.

- Model       :      Controller로부터 요청받고 알맞은 로직 수행 후 (DB관련 작업), 다시 Controller로 이                     결과를 보낸다. 그러면 Controller를 거쳐 View에 전달 될 것이다.   

- View         :     Controller인 Servlet에서 지정해 놓은 결과 값 데이터를 사용해 알맞게 출력한다.    


- Model 2의 핵심

: 서비스가 바뀌더라도 서버단에서 jsp파일을 바꾸기 때문에 클라이언트에서는 URL의 변경없이 서비스를  받을 수 있다.





코드

M2.zip



설명 및 배운 것들


1. 가장 먼저 사용자가 /M2/fs/list 의 URI로 요청(get방식)을 한다. 그러면 Servlet 파일인 RegisterController 에서 doGet() 메소드가 호출되어 register.jsp 를 forwarding 한다.


2. 그럼 입력페이지에서 사용자가 맛집 데이터를 입력하고, 등록버튼을 누르게 된다. 그러면 URI 는 이전과 같으나 post방식으로 요청되어 RegisterController 의 doPost() 메소드가 호출된다. 여기서 form태그로 부터 넘어온 파라미터를 받아와서 VO 객체를 만들어서 서비스로 보낸다. 




3. 서비스에서는 DAO 로 다시 이 VO 객체를 넘긴다.


4. DAO 에서는 VO 객체를 DB의 테이블 구조에 맞게 가공한 후, DB에 쿼리를 날려서 맛집데이터를 추가하게 된다. 그러면 Model쪽에서 처리된 결과(새로운 맛집 데이터가 DB에 등록됨)를 다시 RegisterController 가 받게된다. 그러면 이 추가에 성공한 VO 를 request.setAttribute("fsVO", fsVO) 으로 지정한 후, result.jsp 로 forwarding한다.

위 사진에서 쿼리의 형태를 만들 때 String으로 간단히해도 될걸 왜 StringBuffer 클래스의 append() 메소드를 사용하여 처리했을까? 그 이유는 다음과 같다.

"abc" + "bcd" 처럼 문자열을 잇는 연산을 한다던가하는 문자열 처리를 할때, String의 경우 매번 새로운 인스턴스를 생성하는 방식이다. 그래서 메모리를 많이 잡아먹음과 동시에 성능 상의 issue가 있다. 그래서 문자열로 이용한 처리들이 많거나 연산이 복잡한 경우 StringBuilder 클래스를 사용하는데, 동기화의 지원이 되지 않는다 . 따라서 멀티 쓰레드상태에서의 동기화를 지원하는 StringBuffer 를 Web상에서 사용하는 것이다. 참고로 jdk1.5 이상에서는 String의 + 연산도 컴파일단계에서는 StringBuilder 로 바뀌기 때문에 성능상의 issue를 해결했다고 한다.


5. result.jsp 에서는 입력한 데이터가 등록완료 됐다는 성공 메세지를 띄워주면 된다. 이때 ${fsVO.sname} 형태의 Expression Language 를 이용한다. 이때 ${ }안의 내용은 getter & setter 방식으로 작동한다. 즉, 위의 표현은 fsVO.getSname() 이 호출되어 추가된 맛집데이터의 이름을 화면에 띄우는 것이다. 



6. 이후 result.jsp 파일에서 아래와 같이 javascript 메소드를 이용하여 1초 정도 지연 후, 맛집 리스트를 띄워주는 페이지로 이동을 시켜준다.(URI을 바꾼다.)

 이런 처리를 해준데는 이유가 있다.  만약 이런 처리를 해주지 않을때의 상황을 보자. 

입력화면에서 전송 버튼을 누르면 컨트롤러에서 doPost()가 호출되어 맛집객체를 추가하고, result.jsp 에서 등록완료 메세지를 띄워준다 . 이 일련의 작업이 완료된 후에도 url은 http://localhost:8081/M2/fs/register 으로 변하지 않는다. 그러면 브라우저에서 F5 번을 누르면 그대로 등록완료 메세지가 보여질 것이다. 사실은 또 다시 post방식으로 맛집데이터가 컨트롤러로 보내지고 그럼 doPost()가 호출되어 맛집객체를 DB에 추가하고 result.jsp 에서 등록완료 메세지를 띄워준것이다. 즉, 중복적인 데이터를 연속적으로 빠르게 넣을 수 있는 상황(도배)인 것이다. 따라서 데이터를 한번 넣고 1초 후(바로 바뀌면 성공 메세지를 볼 수 없으므로) /list 서블릿을 호출해서 url 이 바뀌도록 해준것이다. 그러면 새로고침을 통한 도배를 막을 수 있다.


# 이런 처리 안해 줬을때 f5눌러서 디비에 중복된 데이터 들어가는 영상



7. 이제 url이 /fs/list로 바뀌어 get방식으로 ListController 에 요청이 들어오게 된다. 그러면 doGet() 메소드가 호출된다. 서비스에게 맛집리스트를 가져와달라는 요청을한다. 그러면 서비스에서 DAO 로 맛집리스트를 가져와달라는 요청을 하고 DAO 에서는 DB에 쿼리를 날려서 맛집 리스트를 가져온다.



8.  그러면 DAO가 서비스로 이 결과 리스트를 반환하고, 서비스는 리스트 컨트롤러로 반환하게 된다.

 리스트 컨트롤러는 이 결과리스트를 request.setAttribute("list", fsList)로 속성을 지정해 주고, list.jsp를 forwarding한다. 



9. list.jsp에서는 다음과 같은 jstl을 사용하여 맛집리스트를 출력해준다. 

jstl을 사용하려면 해당 js 소스코드에 아래 코드도 추가해주어야 한다.



실행 결과





추가해야 할 것..

maven project에서 jar파일 다운받는 방법.

log4j 설정 방법 및 사용이유 

jstl 설정 방법및 동작 원리 

dbcp 설정 방법 및 사용이유