포틀릿 아키텍처: 포털 안에서 재사용 가능한 웹 컴포넌트
포틀릿의 역할과 서블릿과의 차이, 포털 구성 구조, 요청 처리와 생명주기, 구현 표준을 정리합니다.
2026-08-14 · 최초 발행 2025-05-23
포털 화면을 조립하는 컴포넌트
포틀릿은 하나의 포털 페이지 안에서 동작하는 웹 컴포넌트다. 각각은 독립적인 애플리케이션처럼 개발되지만, 포털 안에서는 다른 포틀릿과 함께 하나의 화면을 이룬다. 서블릿과 요청·응답 패러다임을 공유하면서도, 전체 HTML 페이지가 아니라 개인화된 마크업 조각을 만든다는 점에서 역할이 다르다.
포틀릿은 복합 페이지의 컨텍스트에서 결합되며, 보통 다음 특성을 가진다.
- 독립적인 애플리케이션 단위로 개발한다.
- WAR 파일 형태로 배포할 수 있다.
- 컨테이너가 생명주기를 관리한다.
- 요청과 응답을 기반으로 동작한다.
서블릿과 다른 화면 생성 단위
서블릿은 일반적으로 완전한 웹 페이지를 생성하고 독립적으로 실행된다. 반면 포틀릿은 포털이 조합할 화면 일부를 생성하며, 여러 포틀릿이 같은 페이지에 동시에 표시될 수 있다.
이 차이 때문에 포틀릿 환경에서는 개별 기능의 구현뿐 아니라 포털 안에서의 배치, 제어, 개인화까지 함께 고려해야 한다.
페이지·윈도우·프래그먼트가 만나는 구조
포털 페이지는 여러 포틀릿 조각을 담는 최상위 사용자 인터페이스 컨테이너다. 페이지 안의 각 포틀릿은 포틀릿 윈도우에 표시되고, 윈도우에는 제목과 제어 요소가 포함된다. 포틀릿이 실제로 생성하는 콘텐츠는 포틀릿 프래그먼트다.
데코레이션과 컨트롤은 포틀릿 제목, 최소화·최대화·닫기 버튼, 설정 변경 인터페이스를 제공한다. 프래그먼트는 포틀릿이 생성하는 핵심 마크업 코드다.
요청을 나누어 콘텐츠와 상태를 처리한다
포틀릿은 사용자 요청에 따라 콘텐츠를 동적으로 생성할 수 있다. 데이터베이스나 외부 시스템과 연결해 정보를 제공하고, 사용자별 정보를 화면에 표시하는 방식도 여기에 포함된다.
요청은 목적에 따라 구분된다.
- 액션 요청(Action Request)은 상태 변경을 처리한다.
- 렌더 요청(Render Request)은 콘텐츠를 표시한다.
- 리소스 요청(Resource Request)은 AJAX를 지원한다.
포틀릿은 전체 페이지가 아니라 일부만 책임진다. HTML, XML 등 다양한 마크업 형식을 지원하며 CSS를 통해 포털 화면의 스타일과 통합할 수 있다.
사용자별 설정과 표시 상태
포틀릿별 설정 정보는 영구적으로 저장할 수 있고, 사용자별 개인화 설정과 포틀릿 인스턴스별 설정 분리를 지원한다. 현재 로그인한 사용자의 정보와 프로필에 접근해 역할 기반으로 콘텐츠를 제어할 수도 있다.
표시 목적에 따라 포틀릿 모드를 전환한다.
- VIEW: 일반 콘텐츠를 표시하는 모드
- EDIT: 사용자 설정을 바꾸는 모드
- HELP: 도움말과 사용 지침을 제공하는 모드
- CONFIG: 관리자용 설정 모드(확장)
포틀릿 윈도우의 상태도 제어 대상이다.
- NORMAL: 기본 표시 상태
- MAXIMIZED: 확대 표시 상태
- MINIMIZED: 축소 표시 상태
컨테이너가 관리하는 생명주기
포틀릿 컨테이너는 초기화부터 종료까지의 과정을 관리한다. 실행 중에는 액션, 렌더, 이벤트, 리소스 요청을 처리하고 종료 시에는 할당한 리소스를 정리한다.
- init(): 포틀릿을 초기화하고 리소스를 할당한다.
- processAction(): 액션 요청을 처리한다.
- render(): 마크업을 생성한다.
- processEvent(): 이벤트를 처리한다.
- serveResource(): 리소스 요청(AJAX)을 처리한다.
- destroy(): 리소스를 정리하고 종료한다.
통합 화면이 필요한 곳
기업 인트라넷에서는 공지사항, 일정 관리, 결재 문서함, 메일 확인 기능을 각 포틀릿으로 구성할 수 있다. 대학교 포털에서는 강의 일정, 성적 확인, 공지사항, 캠퍼스 지도를 분리된 포틀릿으로 제공할 수 있다.
개인화된 대시보드도 같은 방식으로 구성된다. 날씨 정보, 주식 시세, 뉴스 헤드라인, 이메일 요약처럼 서로 다른 정보를 하나의 포털 화면에 배치한다.
구현 표준과 포털 컨테이너
JSR 168 / JSR 286은 자바 기반 포틀릿 표준 규약으로, 포틀릿 API와 컨테이너 요구사항을 정의한다. WSRP(Web Services for Remote Portlets)는 다른 서버에 있는 포틀릿을 호출하고 이기종 포털 사이에서 공유하기 위한 웹 서비스 표준이다.
포틀릿 컨테이너로는 Apache Pluto, Liferay Portal, IBM WebSphere Portal, Oracle WebCenter Portal이 있다.
포털이 공통 기능을 맡는 방식
포틀릿 기술은 기존 웹 애플리케이션 개발 지식과 Java, JavaScript 같은 기술을 재사용하게 한다. 웹 표준 기술도 적용할 수 있다.
포털은 SSO(Single Sign-On) 통합 인증, 개인화, 일관된 UI/UX, 권한 기반 접근 제어처럼 여러 애플리케이션에 공통으로 필요한 문제를 처리한다. 애플리케이션 로직과 포털 인프라를 분리하므로 개발자는 비즈니스 로직에 집중하고, 컨테이너는 공통 기능을 제공한다.
마이크로프론트엔드와 이어지는 원칙
포틀릿은 독립 개발, 배포, 결합이라는 점에서 마이크로프론트엔드의 선구자적 개념으로 볼 수 있다. 현대 웹 컴포넌트 아키텍처는 이 원칙을 다른 방식으로 확장하고 있다.
Angular, React 같은 SPA 프레임워크와 포틀릿을 결합하거나 Ajax 기반으로 포틀릿을 갱신하는 하이브리드 아키텍처도 등장했다. 컨테이너화된 포틀릿 배포, 쿠버네티스 기반 스케일링, 마이크로서비스 아키텍처 통합은 클라우드 네이티브 포털의 방향이다.
포털 안에서 독립성을 지키는 설계
포틀릿 사이의 강한 결합은 피하고 각 컴포넌트의 독립성을 유지해야 한다. 다양한 윈도우 상태를 고려한 반응형 디자인, 페이지 블로킹을 줄이기 위한 비동기 처리, 성능 최적화를 위한 캐싱 전략도 필요하다.
국제화(i18n)를 고려해 다국어 지원을 설계하고, 웹 접근성 지침을 준수하며, 포털 테마에 맞게 적용할 수 있도록 만드는 일도 포틀릿 구현의 일부다. 여러 애플리케이션을 하나의 인터페이스로 제공해야 하는 환경에서, 포틀릿은 컴포넌트 기반 웹 개발의 기반이 되는 방식을 제시한다.