Struts2 핵심 구성 요소
필터 디스패처(FilterDispatcher)
FilterDispatcher는 Struts2 프레임워크의 프론트 컨트롤러 역할을 수행하며 MVC 패턴에서 컨트롤러에 해당합니다. web.xml에 단 한 번만 설정하면 됩니다:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
주의사항: 다른 필터가 존재할 경우 FilterDispatcher 설정은 필터 체인의 마지막에 위치하는 것이 좋습니다.
액션(Action)
액션 클래스는 MVC의 모델 부분으로, 비즈니스 데이터를 캡슐화하고 사용자 요청을 처리합니다. processRequest() 메소드가 기본 요청 처리 메소드입니다.
결과(Result)
결과는 액션 실행 후 이동할 다음 페이지를 나타냅니다. Struts2는 jsp, velocity, freemarker, jasperreports 등 다양한 결과 유형을 지원하며, 동일한 웹 애플리케이션에서 여러 결과 유형을 혼합하여 사용할 수 있습니다.
인터셉터(Interceptor)
인터셉터는 Struts2의 핵심 개념 중 하나입니다. 모든 Struts2 프로젝트는 내장 인터셉터와 기본 인터셉터 설정을 사용합니다. Struts2의 대부분 기능은 인터셉터를 통해 구현됩니다:
- 요청 파라미터를 액션 속성에 자동 설정
- 파일 업로드 기능 구현
- 중복 제출 방지
- 검증 프레임워크 구현
- 공통 오류 처리
- 애플리케이션 국제화
액션컨텍스트, 값 스택, OGNL
Struts2는 각 액션이 실행될 때마다 별도의 ActionContext를 생성합니다. 요청 파라미터, 요청 속성, 세션 정보 등 모든 접근 가능한 데이터를 ActionContext에 저장합니다. 이를 통해 데이터 접근과 할당이 단순화됩니다.
OGNL(Object-Graph Navigation Language)은 강력한 표현식 언어로, 객체 속성 접근, 메소드 호출, 객체 구조 순회, 타입 변환 등의 기능을 제공합니다.
값 스택은 여러 객체를 담을 수 있는 컨테이너로, 주로 임시 객체 저장에 사용됩니다. OGNL로 값 스택 객체 속성에 접근할 때 스택顶端에 가까운 객체의 속성이 우선적으로 참조됩니다.
Struts2 태그
Struts2 태그 라이브러리는 강력하고 사용하기 쉬워 뷰 개발 작업을 크게 단순화합니다. 국제화, 검증 등 프레임워크의 다른 부분과 자연스럽게 통합됩니다.
자동 타입 변환
액션에서 다양한 방식으로 페이지 데이터를 매핑하여 자동으로 값을 얻을 수 있습니다. request에서 받은 값은 String 타입이지만 액션 속성은 다양한 타입일 수 있습니다. Struts2의 타입 변환 메커니즘이 이를 처리하여 수동 타입 변환 개발 시간을 절약해 줍니다.
국제화(i18n)
국제화(internationalization)는 웹 애플리케이션이 다국어를 지원하도록 합니다. 클라이언트의 국가와 언어에 따라 다른 언어의 사용자 인터페이스를 표시할 수 있습니다. Struts2는 국제화를 자연스럽게 구현하며, 요구사항에 따라 다른 언어 정보를 해당 위치에 배치하기만 하면 됩니다.
검증 프레임워크
안정적인 웹 애플리케이션은 서버 측 검증이 필수적입니다. Struts2는 완전하고 확장 가능한 검증 프레임워크를 제공하여 액션 실행 전에 사용자 제출 정보의 완전성과 유효성을 보장합니다.
Struts2 시스템 아키텍처
Struts2 아키텍처는 내부 모듈과 실행 흐름을 보여줍니다:
- 주황색: 서블릿 필터 체인 - 모든 요청이 필터 체인을 통과
- 하늘색: Struts 코어 - 실제 개발에서 수정할 필요 없는 부분
- 연녹색: 인터셉터 - 기본 제공 인터셉터와 사용자 정의 인터셉터
- 연노란색: 사용자 생성 - struts.xml, 액션, 템플릿 등
모듈 상세 설명
- FilterDispatcher: Struts2의 중심调度器, ActionMapper 결과에 따라 요청 처리 여부 결정
- ActionMapper: HTTP 요청과 액션 실행 간의 매핑 제공
- ActionProxy: 액션과 xwork 간의 특별한 중간 계층
- ConfigurationManager: xwork 설정 관리 센터, struts.xml의 메모리 표현
- ActionInvocation: 실제 액션 호출 및 실행, 액션 인스턴스와 의존 인터셉터 관리
- Interceptor: 상태 없는 클래스, 액션 실행 전후에 기능 코드 실행 기회 제공
- Action: 사용자 요청 처리 및 비즈니스 데이터 캡슐화
- Result: 다양한 뷰 타입의 추상 캡슐화 모델
- Templates: JSP 등 다양한 뷰 타입의 페이지 템플릿
- Tag Subsystem: JSP, velocity, freemarker 등 다른 뷰 기술에서 동일하게 사용 가능한 태그 라이브러리
Struts2 실행 흐름
실행 환경
사용자 로그인 기능이 구현된 웹 프로젝트를 예로 설명합니다: - web.xml에 Struts2 필터 설정 - LoginAction 액션 클래스 작성 - struts.xml에 액션 설정 - 로그인 페이지와 환영 페이지 작성
실행 과정
사용자가 로그인 요청을 제출하면 URL은 /webapp/loginAction.do가 됩니다. Tomcat 서버는 웹 컨텍스트를 기준으로 처리할 웹 애플리케이션을 선택합니다.
웹 컨테이너는 web.xml을 읽고 .do 접미사 요청을 Struts2 필터가 처리하도록 결정합니다. FilterDispatcher가 프론트 컨트롤러로서 요청을 처리합니다.
FilterDispatcher는 ActionMapper에 요청을 전달합니다. ActionMapper는 현재 요청이 Struts2 처리가 필요한지 확인합니다. 필요하다고 판단되면 FilterDispatcher는 필터 체인의 나머지 부분을 중단하고 ActionProxy 객체를 생성합니다.
ActionProxy는 URL 정보를 가지고 ConfigurationManager에 어떤 액션을 실행해야 하는지 문의합니다. ConfigurationManager는 struts.xml 설정 정보를 메모리에 캐시하고 있어 URL을 매칭하여 답변합니다.
ActionProxy는 액션 실행 정보, 관련 인터셉터, 사용 가능한 결과 정보를 얻어 ActionInvocation 객체를 생성합니다. ActionInvocation은 액션 실행 전체 과정을 관리합니다.
ActionInvocation 실행 과정: 1. 인터셉터 순서대로 전처리 부분 실행 2. 액션의 processRequest() 메소드 실행 3. 반환된 결과에 따라 struts.xml에서 다음 페이지 매칭 4. 페이지에서 Struts2 태그로 데이터 접근 및 최종 페이지 생성 5. 인터셉터 역순으로 후처리 부분 실행
ActionInvocation 실행 완료 후 HttpServletResponse 객체가 생성되고, 필터 체인 역순으로 응답 결과가 사용자에게 전달됩니다.
주요 상수 설정 상세 설명
인코딩 및 요청 처리 관련
<constant name="struts.i18n.encoding" value="UTF-8" />
웹 애플리케이션의 기본 인코딩 지정, HttpServletRequest의 setCharacterEncoding() 메소드 호출과 동일
<constant name="struts.action.extension" value="action,do" />
Struts2가 처리할 요청 접미사 지정, 여러 접미사는 쉼표로 구분
개발 환경 설정
<constant name="struts.devMode" value="true" />
개발 모드 활성화, 상세한 오류 정보 출력
<constant name="struts.configuration.xml.reload" value="true" />
struts 설정 파일 수정 시 자동 재로드, 개발 단계에서 활성화 권장
<constant name="struts.serve.static.browserCache" value="false" />
브라우저 정적 콘텐츠 캐싱 비활성화, 개발 단계에서 권장
UI 및 템플릿 설정
<constant name="struts.ui.theme" value="simple" />
기본 뷰 테마 지정
<constant name="struts.ui.templateDir" value="template" />
뷰 테마 템플릿 파일 위치 지정
기능 제어 관련
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
동적 메소드 호출 지원 여부
<constant name="struts.objectFactory" value="spring" />
액션 객체 생성을 Spring 컨테이너에 위임
국제화 설정
<constant name="struts.custom.i18n.resources" value="messages,errors" />
국제화 리소스 파일 지정, 여러 파일은 쉼표로 구분
URL 생성 설정
<constant name="struts.url.includeParams" value="get" />
URL 생성 시 요청 파라미터 포함 여부 (none/get/all)