[JSP] 기초적인 MVC 패턴과 서블릿 pt.2

반응형



현재 계속하여 HTTP 프로토콜, 클라이언트와 웹서버, 컨테이너, 서블릿에 대한 내용을 포스팅 하고 있습니다.

아직 얄팍하게 나마 MVC 패턴을 공부했던 적이 있었습니다.
사실 얼마 되지도 않았네요 ㅎㅎ
어쨋든 여러가지로 초보시절이었던 시기였는데, MVC 패턴을 제대로 이해하지도 못햇었거니와,
그런 지식을 블로그에 올릴만한 글쓰기 능력과 설명력이 없었습니다.

읽기전에 손가락 한번 클릭~ >_<

고마워요 ~ Chu ~ ♥



그러나 또 블로그에 올려본다고 해서 지금생각해보면 거의 졸작 수준인 글을 하나 쓰게 되었지요.
2010/02/10 - [Programing/JSP & Servlet] - 기초적인 MVC 패턴과 서블릿


많은분들이 조회해 주시고, 댓글 주셨는데,
설명부족 + 저의 능력 부족으로 초보분들이 시간만 많이 허비하고 결국 아무것도 남지 않는 글을
고의가 아니게 쓰게 되어 많이 고민했습니다.

어쨋든, 지금 pt2 를 포스팅 할까 합니다. 기초적인 MVC 패턴과 서블릿 pt2 입니다.
기존 글을 수정하지 않고 pt2 로 새글을 작성하는 이유는, 그때의 기록 을 사라지게 하지 않기 위함입니다.
많은 채찍을 받은것을 기록으로 남겨두고 싶은 마음도 있고요...;;

미리 말씀 드리겠지만 좀 더 정확하고 확실한 설명을 위해 글이 많이 길어질듯 합니다.
하지만 '더보기' 기능은 이용하지 않겠습니다. 따라서 스크롤바가 쪼오~끔 길어질 수도 있습니다^^




MVC 패턴.

MVC 패턴이 무엇인지는 자세히 설명하지 않아도 될듯 합니다. 왜냐하면 구성을 보면 바로 생각할 수 있기도 하고,
워낙에 프레임워크에 기본이 되는 패턴이라 많이들 알고 계시지요.
또한 이 글을 보기 위해서는 'mvc패턴' 등으로 검색해서 글을 보실텐데, 그 분들이 mvc패턴의 정의보단,
 mvc 패턴이 어떤것인지 알려고 하는 목적이라 판단하였기 때문입니다.

우선 MVC 패턴의 핵심은 비지니스 로직과 보여주는 로직의 분리입니다.
즉, 이 둘 사이에 뭔가 다른 로직을 넣을수도 있고 비지니스 로직이 재 사용 가능한 자바 클래스로 독립적으로 존재하며, 이것은 뷰가 무엇이 되든 관계 없다는 뜻이 됩니다.

하지만 MVC 패턴은 JSP 나 서블릿에 국한된 패턴은 아닙니다.
' 스펙 ' 은 항상 변하기 때문에 비지니스 로직과 보여주는 로직의 분리는 소프트웨어 개발에서 아주 중요한 문제가 되죠.



MVC 패턴의 구조

이해를 돕기 위해 직접 그린 그림으로 포스팅 합니다.


MVC 패턴에 맞는 총 3개의 기능적인 컴포넌트들이 있습니다.

M : 모델
V : 뷰
C : 컨트롤러

의 약자입니다.

어쨋거나 저쨋거나 각각의 컴포넌트가 하는 일들부터 알아보죠
● 모델 : 일반적인 자바 Class 로써 비지니스 로직이 들어갑니다.
             DB 처리나 다른 처리등을 모두 여기에서 한다고 보면 됩니다.

● 뷰 : JSP 페이지나 HTML 페이지등이 됩니다. 보여주는 로직을 처리하는 부분이고요.
          컨트롤러로부터 모델 정보를 읽어옵니다. 또한 사용자가 입력한 정보를 컨트롤러에게 넘겨주는 역할도 합니다.

● 컨트롤러 : Request 객체에서 정보를 얻어와서 모델 역할에서 데이터 처리를 합니다.



J2EE 서버의 컨테이너

아마 지금 이 글을 읽고 계신 분들의 대부분은 웹 컨테이너로써 톰캣을 연동하셨을 것입니다.


MVC 패턴을 적다가 갑자기 J2EE 컨테이너로 잠시 숨을 돌린 이유는 앞으로도 그렇겠지만, MVC 패턴의 처리과정을 알려면 우선 컨테이너가 이해되야 하기 때문입니다.

J2EE( Java 2 Enterprise Edition ) 에 부합되는 웹 컨테이너와 EJB(엔터프라이즈 자바빈) 컨테이너로 나뉘고,
서버는 이것을 모두 필요로 합니다.
웹 컨테이너는 웹 컴포넌트(서블릿, JSP) 를 위한 것이고,
EJB 컨테이너는 비지니스 컴포넌트용 입니다.

톰캣은 웹 컨테이너 입니다. 따라서 톰캣에는 EJB 컨테이너는 없지요
톰캣이 아파치 만큼의 역할을 하진 못하므로, 대부분 아파치와 톰캣을 연동하여 사용합니다.
가장 많이쓰는 J2EE 서버로는 웹로직, JBoss 등이 있겠네요.
J2EE 에는 서블릿과 JSP 스펙, 그리고 EJB 스펙도 함께 들어 있습니다!


테스트 코드

드디어 대망의 테스트 코드입니다.
총 5개의 컴포넌트를 만들 것입니다.
테스트 소스코드로써 한글 명을 선택하면 영어단어를 보여주는
일종의 단어장 비슷한 MVC 패턴 기능을 구현해 보려 합니다.

● 처음 제공되는 HTML 페이지
● 서블릿 이름으로 매핑된 배포서술자(web.xml)
● 모델 클래스
● 서블릿 클래스
● JSP 페이지



HTML 페이지 입니다. 전송방식은 POST를 사용합니다.
그 옆 select.do 는 논리적인 이름이죠.( 앞에 "/"를 포함한 디렉토리 구조가 없으니까요 ^^ )
이 이름은 HTML 에서 사용할 가상의 이름입니다. 실제 파일명은 아닙니다.
클라이언트가 실제 서블릿에 접속하는건 여러가지로 좋지않기 때문에 논리적인 이름을 사용하는 것이지요.
이 이름은 배포서술자(web.xml) 에서 실제 서블릿 클래스에 매핑되어 사용됩니다.




배포서술자(web.xml)입니다.
보라색으로 체크된 TestMVC 부분은 가상의 이름입니다.
즉, DD(배포서술자 : web.xml)에서만 사용하는 이름으로써 <servlet> 란과 <servlet-mapping> 란에 동일하게 기입해야 됩니다.
<servlet-class> 란에는 실제 서블릿클래스의 이름을 넣어주세요.
<url-pattern> 란에는 클라이언트가 사용할 이름입니다. 주의할점은 앞에 꼭 루트("/")를 넣어주세요!



모델 클래스 입니다.
getSelect() 메소드는 서블릿에서 쓰기위한 메소드를 정의한 것입니다.
선택값을 입력받은 뒤 결과값을 저장할 result 변수의 자료형을 ArrayList 로 한 이유는
여러가지 값 ( 동의어등 여러가지요 ^^; ) 가 있을 수 있어서 입니다 ;;



JSP 페이지 입니다.
<%@ page import ... %> 부분은 Page 지시가 부분인데, 자세한 내용은 쫌 길어질 수 있어서 논외로 하겠습니다.
( 우선 자바클래스의 import 구문과 같다고 보면 됩니다 )

request.getAttribute() 부분은 JSP 기본 내장 객체인 request 객체를 이용하여 속성을 읽어오는 메소드 입니다.

<% ... %> 부분이 바로 스크립틀릿 이라는 부분인데 여기에다가 자바 언어를 코딩하면 됩니다.

★ 주의 : JSP 는 컴파일 하지 않습니다. JSP 호출시 컴파일러가 자동으로 컴파일 해주니까요 ^^



마지막, 서블릿 클래스 입니다.
TestMVC.html 페이지에서 메소드를 POST 로 정의했기 때문에 여기서도 doPost() 메소드를 재정의 합니다.
그런 뒤 모델 클래스의 인스턴스를 만든뒤, getSelect() 메소드를 호출합니다.

setAttribute() 는 JSP 페이지가 읽을 수 있도록 request 객체에 속성을 설정하는 역할입니다.
JSP 에서는 이제 "animal" 이란 이름으로 속성을 읽어 올 수 있게 되죠.

JSP 로 작업을 넘겨주는 RequestDispathcer 를 인스턴스화 하고,
forward() 를 이용하여 디스패처는 컨테이너에게 JSP 를 요청 후 JSP 로 request, response 객체를 넘깁니다.




결과 화면 입니다.
초기화면 입니다.
여기에서 강아지, 고양이, 파랑새 중 하나를 선택하여 쿼리 전송 해보겠어요~



고양이 선택 후 결과 화면 입니다.
정상적으로 잘 출력되네요!



MVC 패턴 어플리케이션의 처리과정

마지막으로 MVC 패턴 어플리케이션의 처리과정을 그림으로 표현하고
포스팅을 끝낼까 합니다.
어쩌면 위의 테스트 코드같은건 인터넷이나 책에서 얼마든지 구할 수 있습니다.
하지만 사람들이 왜 같은 내용을 게속 검색하고 공부하는지 생각해보니,
저의 결론은 머리에 기억이 나질 않거나, 제대로 이해하기 힘들거나,
맹목적이었던 소스코드만 있었기 때문! 이라는 결론에 봉착하였지요.

따라서 최근 포스팅에서 최대한 그림의 비중을 높이고 소스코드보단 이해에 조금이나마 도움되게
쓰고 있습니다.
많은 분들에게 작은 도움 되었다면 좋겠네요..

따라서 모든 처리과정을 그림으로 표시한 MVC 패턴의 처리과정을 꼭 읽어보시고 나가시길 ^^



처음으로 클라이언트가 컨테이너에게 TestMVC.html 을 요청 합니다.



컨테이너는 TestMVC.html 을 읽어옵니다.




읽어온 파일을 클라이언트에게 넘겨줍니다.


클라이언트는 요청에다가 데이터를 더하여 컨테이너에게 요청을 보냅니다.



컨테이너는 URL을 분석한 뒤, 해당 서블릿에게 요청을 넘깁니다.


서블릿은 모델 클래스를 호출합니다.



모델 클래스는 해당 처리후 그것을 서블릿에게 넘겨줍니다.



서블릿은 이 정보를 request 객체에 저장을 하지요.



그런다음 서블릿은 JSP 에게 이 request 객체를 포워딩 합니다.



JSP는 request 객체에 저장된 데이터를 추출합니다.



JSP 는 추출한 정보를 기초로 동적으로 페이지를 생성한 후에 컨테이너에게 넘깁니다.



마지막으로 컨테이너는 클라이언트에게 페이지를 넘겨줍니다.




휴.. 굉장히 길어진 글이었네요..

생각보다 훨씬 많은 시간이 들었네요 -_-;;

어쨋든 다음번 포스팅에서도 서블릿에 대한 주제에 계속 이어집니다요~

뿅~!




반응형

댓글(5)

  • 김영성
    2011.08.26 14:23

    안녕하세요
    이제 막 jsp 공부를 하는 학생입니다.
    책에서는 갑자기 모델1로 코드를 진행하다가 갑자기 mvc 모델2로 넘어가면서
    전반적인 사항(어떻게 컨트롤러를 작성하며 값이 어떻게 넘어가는지의 로직 등등...)을설명해주기보다는
    그냥 소스코드를 보고 따라오라는 식으로 설명이 되어 애매했던 부분이 있었습니다.

    특히 배포서술자에서 서블릿 매핑하는법 같은건 안나와서....
    이 글을 보고 도움받고 갑니다.
    아직도 뚜렷하게 개념은 잡히지 않지만;;
    자주 와서 정보좀 얻어가겠습니다.

  • 이예림
    2012.02.15 14:11

    안녕하세요. 저도 이제 막 공부를 시작한 학생입니다.
    좋은 글 잘 보고 갑니다. 특히 그림으로 과정 하나하나 알려주시니 이해가 잘 되었어요.

  • 홍길동
    2020.05.16 22:09

    관리자의 승인을 기다리고 있는 댓글입니다

Designed by JB FACTORY