java-school logo

구글 앱 엔진에서 스프링 최적화

구글 클라우드에서 애플리케이션 초기화 시간이 길어지면 500 에러가 발생한다.

스프링의 컴포넌트 스캔과 오토와이어드는 초기화 시간을 늘리는 주요 원인이다.

구글 문서에서 권고하는 대로 컴포넌트 스캔과 오토 와이어드 대신 빈을 일일이 정의하는 것으로 수정해 보자.

guestbook-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:security="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        
	<security:global-method-security pre-post-annotations="enabled" />
	    
	<mvc:resources mapping="/resources/**" location="/resources/" />
	
	<mvc:annotation-driven />
	
	<!-- <context:component-scan base-package="net.java_school.guestbook" /> -->
	<context:annotation-config />
	
	<bean id="internalResourceViewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass">
			<value>org.springframework.web.servlet.view.JstlView</value>
		</property>
		<property name="prefix">
			<value>/WEB-INF/views/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>
	
	<bean id="guestbookController" class="net.java_school.guestbook.GuestbookController">
		<property name="guestbookService" ref="guestbookService" />
	</bean>

	<bean id="guestbookService" class="net.java_school.guestbook.GuestbookServiceImpl" />
	
</beans>

component-scan 대신 추가한 context:annotation-config는 스프링의 빈 컨테이너가 빈을 등록할 때 빈에 적용된 애너테이션이 그 기능을 하도록 한다. 예를 들어, 빈에 @Controller 애너테이션이 적용되었다면, 해당 빈을 컨트롤러로 등록한다. context:annotation-config도 mvc:annotation-driven 설정이 필요하다.

다음으로 오토 와이어드 기능을 제거한다. GuestbookController에 @Autowired 애너테이션을 제거하고 세터를 추가한다.

@Controller
public class GuestbookController {
  
	private GuestbookService guestbookService;
	
	public void setGuestbookService(GuestbookService guestbookService) {
		this.guestbookService = guestbookService;
	}
	
	//.. omit ..
	
}

Guestbook 최종 소스

예제 다운로드

최종 소스에는 다음 기능을 추가했다.

  1. 앱의 모든 뷰가 메인 메뉴와 로그인 페이지를 이용해 화면을 구성하도록, 메인 메뉴main-menu.jsp와 로그인login.jsp 페이지를 만들었다. /index.jsp, /admin/index.jsp, /guestbook/guestbook.jsp는 메인 메뉴와 로그인 페이지를 인클루드하도록 수정했다. 간편한 구현을 위해, 로그인 페이지를 통해 로그인이나 로그아웃하면 홈페이지로 이동하도록 했다.
  2. 예제를 진행하면서 Guestbook 예제에 서비스 계층을 만들었다. GuestbookController의 "/guestbook" 요청 핸들러가 서비스 계층을 사용하도록 수정했다.
  3. 전달받은 데이터를 보여주는 역할만을 수행하도록, JSTL를 사용해서 guestbook.jsp를 수정했다.
참고