Struts2 맛보기!
개인적으로 Struts2 를 시작하는 입장에서 확실히 해야 할 것은 , Struts2 는 기존 Struts 와 다르다는 관점입니다 . 완전히 다르다고 생각하고 공부를 하는 편이 좀 더 나을리라 생각하면 될 듯 싶다 . 기본적인 형태는 Struts1 과 Webwork 가 병합된 모양이라고는 하지만 이게 그리 중요한 것은 아니다 . Struts1 을 몰랐어도 , Webwork 를 안 써봤어도 지금부터 하면 되기 때문이다 .
스트러츠 2 가 하는 일이 뭘까 ? 흔히 MVC 를 원활하게 만들어준다고 이야기 한다 . 간단히 이야기 하면 웹은 기본적으로 사용자 입력을 받고 이에 대한 응답을 해주는데 , 이 작업을 깔끔하게 하는데 도움을 준다는 이야기다 . 안타까운 점은 개인적으로 스트러츠 1 도 이것을 해주리라 하고 나왔는데 , 잘 못 다루게 되면 정글을 헤메는 느낌을 주곤 했다는 점이다 . 그러한 면에서는 스트러츠 2 로 프로젝트를 마치고 난 느낌은 그런 점이 없어질 것 같다는 느낌이다 . 그럼 어떻게 도와줄까 ? 이 부분은 MVC 를 깔끔하게 처리할 수 있는 환경과 규칙을 제공해준다 . 여기서 확실히 짚고 넘어가야 할 점은 환경과 규칙을 주기 때문에 이를 적절히 활용하지 않으면 우리는 다시 지저분한 정글을 누빌 수 밖에 없다는 점이다 .
모든 웹은 단순하다 . 사용자는 특정 action 을 취하기 위해서 우리가 제공하는 service 에 접근한다 . 그리고 우리가 제공하는 service 는 사용자 요청에 따라서 적절한 행동 을 취하고 그에 걸맞는 result 를 반환해 준다 . 이게 바로 웹이다 .
여기서 action은 모든 동작을 의미한다. 물론 사용자가 직접적으로 하는 action이 아닌 action도 다 action이다. 즉 시스템이 외부 요소들에 제공하는 모든 action은 action인 것이다. 그리고 요청에 따른 적절한 행동은 흔히 이야기하는 비지니스 로직과 연관된 부분이다. 그리고 마지막으로 result는 모든 결과물이다. 모든 결과물이라고 하면 단순한 jsp 페이지가 될 수도 있고, 사용자가 다운로드 받을 수 있도록 해주는 stream일 수도 있으며, 또 다른 action으로 연계하는 동작이 될 수 있다. 그런데, 여기서 스트러츠2에서 배우고 익혀야할 부분은 커스텀 태그다. 이제 지겹지 않는가 <%를 열자 마자 %>로 닫아야 하는 단순 작업이.
서론이 길었다. 이제 서론이 아닌 실전이다. 당연히 스트러츠2를 하기 위해서는 다운을 받아야 한다. 다운로드 주소는 다음과 같다.
http://apache.tt.co.kr/struts/examples/struts2-blank-2.0.11.war
현재로서는 위 주소에서 blank application을 얻을 수 있다. 해당 주소가 안 살아 있으면, struts2사이트 찾아가서 최신 blank application을 받도록 하자.
그리고 eclipse WTP를 다운 받아서 설치하자. WTP에서 "Dynamic Web Project"를 하나 만들어서 아까 받은 blank application 내부 "WEB-INF/lib" 하단에 있는 파일들을 가져다가 아까 만든 프로젝트 하단 WEB-INF/lib 하단에 복사하자. 잘 되었으면 아래와 같은 형태가 되어 있어야 한다.
아 위에 있는 pages 폴더는 테스트 페이지를 위치시키려 임의로 만든 폴더이니, 신경을 쓰지 않아도 됩니다. 이 상태에서 web.xml에 다가 이 web-app는 스트러츠2로 돌 수 있도록 설정해주도록 합니다.
다른 것 보다 위 파일 같이 <filter>항목과 <filter-mapping> 항목을 추가 합니다. 이게 의미하는 것은 우리가 만든 서비스에 요청 들어오는 것들을 스트러츠2가 우선 검사해서 필요에 따라서 처리한다는 이야기 입니다. 이에 대한 세부 내용을 알고 싶으면, FilterDispatcher에 대해서 알아보면 여러 정보를 접할 수 있을 것 입니다.
이제 사용자가 우리가 만든 시스템에 action을 취한다고 생각하고 이에 따라서 처리를 해봅시다. "ThinkFree"라고 찍힌 화면을 보고자 하는 경우를 가정하고 작업을 합시다. 이거 단순하죠. thinkfree.jsp를 만들고 그 안에 ThinkFree라고 적고 해당 페이지로 바로 사용자가 접근하면 되는 거죠. 그래도 스트러츠2 세계관을 이해하기 위해서 일부러 좀 더 어렵게 가봅시다.
아까 이야기 했죠. 모든 웹은 action에서 시작된다고. 그럼 우리는 왠지 그 action에 따른 행동을 어딘가에 적어서 컴퓨터가 알게 해주어야 겠다는 생각이 들지 않나요? 이를 위해서 아래 그림과 같이 classes 하단에 컴파일되어 들어갈 수 있도록 src 하단에 struts.xml을 만듭니다. (이는 시간 절약을 위해서 WTP에서 작업하는 기준으로 이야기하는 것이니 적절히 자신 상황에 맞춰서 작업하시면 됩니다. 무조건 돌릴 때에는 WEB-INF/classes 하단에 struts.xml이 위치하면 아무 문제 없습니다.)
이제 해당 파일을 열어서 다음과 같이 적어 줍니다.
사용자가 hello_thinkfree라는 action을 취하면 그 결과로 ThinkFree라고 적힌 thinkfree.jsp를 보여주라고 컴퓨터에게 이야기 해 준거지요. 음 스트러츠2 기본 확장자가 action이니깐 잘 구동 되는지 확인해보기 위해서 아래와 같이 주소 입력해서 확인해 봅니다.
이거 봤으면 이제 스트러츠2 좀 해봤다고 이야기 할 수 있습니다. ^^ 우선 아까 웹이 해주는 역할에 있어서 빠진 부분이 있죠. 바로 " 사용자 요청에 따라서 적절한 행동 을 취하고 "라는 부분입니다. 음 사용자가 자신의 이름을 명시해주면, 그 이름을 반영해서 "ThinkFree loves xxx"라고 처리를 해준다고 생각해 봅시다. 음 그럼 시스템은 우선 사용자에게서 이름을 받아야 겠네요. 그 이름에 대한 지칭자를 "name"이라고 하고 그 값을 준다고 생각합시다. Form 만들고 하는거 귀찮으니깐 사용자가 바로 GET 방식으로 호출을 한다고 합시다. 그럼 사용자는 다음 주소와 같이 호출을 할 것입니다.
http://localhost:8080/struts-test/hello_thinkfree.action?name=Web
그럼 이제 이 요청에 따라서 적절한 행동을 시스템이 하도록 해줍시다. 우선 HelloThinkFree 클래스를 아무 위치에 만듭니다. 그리고 아래 그림과 같이 public String execute() 함수를 정의합니다. 우리는 이 함수에서 기본 동작을 정의할 것입니다.
여기서 해당 함수가 반환하는 success라고 하는 것은 행동 결과가 어떤 상태라는 결과 상태를 명시하는 것으로 이해하시면 될 것 입니다. 그럼 이제 사용자가 입력한 값을 받도록 해야 합니다. 아무 생각없이 사용자가 주는 변수 이름을 기본으로 적당히 내부에 변수 선언합니다. name이라는 변수이름 이름을 주니깐 아래와 같이 private String name; 이라고 지정하고 이 변수에 getter, setter를 지정합니다.
음 이제 사용자가 볼 메세지를 만들어야 할 것입니다. 음 우선 사용자가 보는 화면이 이제 좀 조작된 것이니깐 message라는 변수를 String 형으로 만들고, 해당 값을 화면에서 가져가서 볼 수 있도록 getter, setter를 만듭니다.
아 그러고 보니 이 hello_thinkfree 액션을 통해 전달된 값이 위 클래스에서 처리된다고 컴퓨터에게 이야기 해주는 것을 잊어버렸군요. 이를 위해서 아래와 같이 struts.xml을 수정합니다.
이제 그러면 마지막으로 이렇게 처리된 결과를 적절히 화면에서 뿌려 주어야 겠죠. 화면에서야 아까 설정한 message만 화면에 뿌려 주면 됩니다. 우선 무조건 아래와 같이 해당 페이지에 써봅시다. 우선 struts2에서 제공해주는 tag를 쓰겠다고 선언을 합니다. 그 뒤에는 아까 결과로 얻은 message를 가져다가 뿌려주겠다고 s:property 태그와 뿌릴 변수 이름을 적어 둡니다.
이제 다 했습니다. 이제 제대로 되는지 테스트 해봅시다.
지금까지 한 것을 보면 참 간단합니다. 사실 워낙 간단한 예제니깐 당연히 간단하겠죠. 그럼 이제 정리해 봅시다. 우리는 다음과 같이 해서 간단한 action을 취하는 서비스를 만들었습니다.
-
시스템이 제공할 action을 나름 생각합니다.
-
정리된 action을 적절히 이름 지어서 struts.xml에 정의합니다.
-
그리고 사용자가 주는 정보들 이름들과 같은 이름을 가진 내부 변수를 가진 POJO를 만듭니다.
-
해당 POJO 클래스를 아까 정의한 struts.xml에 기록합니다.
-
이에 시스템이 최종적으로 내놓을 정보를 담은 변수들을 그 POJO에 정의하고, execute 함수를 정의해서 적절히 처리합니다.
-
최종 result로 나올 page를 정의한 jsp 페이지에서 tag-lib를 정의한 다음에 그에 적절히 tag를 사용해서 결과로 나온 정보들을 화면에 뿌려줍니다.
지금까지 한 것을 정상적으로 수행했다면, 이제 스트러츠2가 어떤 것인지 대충 감을 잡아갈 수 있을 것 입니다. 아마 기존에 스트러츠1을 사용했던 분은 왠지 깔끔하게 느껴지리라 생각합니다. 그럼 여기서 이만 줄이겠습니다.
출처 : http://docs.thinkfree.com/docs/view.php?dsn=842331