태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

No bean named 'egovFileIdGnrService' is defined..

분류없음 2013.08.30 14:04

 

Eclipse  maven Project 에서 서버 등록, 실행시 하기와 같은 에러메시지가 나온다면.

     Error creating bean with name 'xxxxxxxx': 

     ..

     No bean named 'xxxxxxxxxxx' is defined 

 

프로젝트 설정 파일들이 제대로 배포가 안되어서 발생한 오류다.

설정 파일들이 제위치에 배포되도록 되어 있는지 확인하고 없으면 추가해준다.

 


1. 프로젝트 > Properties > Deployment Assembly  을 선택

2. 아래 항목이 없으면 추가

     Source              |     Deploy Path

    /src/main/java                 WEB-INF/classes

    /src/main/resource          WEB-INF/classes      <- 이녀석이 누락되어서 발생한 경우..

    /src/main/webapp           / 

    Maven Dependencies       WEB-INF/lib


출처 : http://eknote.tistory.com/1820

블로그 이미지

구본숭 하늘을사랑한사람

진실된 사람으로 태어 나기 위한 조건들, 사랑하기 위해 필요한 것을 찾습니다.

maven 설정

pom.xml 설정

-------------

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.7</version>
        </dependency>          
       
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.7</version>
        </dependency>        

------------

전자정부 프레임웍의 dispatcher-serlvet.xml 설정

dispatcher-serlvet.xml 위치는 설정하기 나름이지만 전자정부프레임웍에서는 WEB-INF/config/egovframework/springmvc/dispatcher-serlvet.xml 있다

----------

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  

       <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter"/>
            </list>
        </property>
 </bean>

<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" p:prefixJson="false"/>

------------

org.springframework.web.servlet.view.json.MappingJacksonJsonView 설정시 order는 설정하면 에러 발생한다. 왜 발생하는지는 공부좀 해야 할것 같고 일단은 없으면 안난다.

다른곳에 참고할때는 web.xml도 action 에 대해 json 설정을 하라고 되어 있지만 확장자를 *.json으로 사용하지 않으므로 설정할 필요는 없다.


java 에서는 @ResponseBody 어노테이션을 사용하여 리턴처리를 한다.

-------------------

@Controller

public class UserInfoController {

Logger logger = Logger.getLogger(this.getClass());

.......

    @RequestMapping("/userInfo/selectMemberJq.do")
    public @ResponseBody UserInfoVO selectMemberJq(@ModelAttribute("userInfoVO") UserInfoVO  

         userInfoVO) throws Exception{
        UserInfoVO resultVO = new UserInfoVO();
        resultVO = userInfoService.selectUserInfoData(userInfoVO);
        return resultVO;
    }

}

--------------------

UserInfoVO 형태의 json을 리터하게 된다 [userId=aa15,userEmail=aa15@aa.aa, ....]

jsp 부분에서는 별다는 처리하지 않는다. jquery를 쓰던 Ajax를 쓰던 처리를 하면된다.

모 외국 사이트를 찾던중 @ResponseBody만 사용하면 되는것 처럼 예제를 써 놓았지만 실제로는 일부 내용이 빠진것 같다. 아니면 내가 잘 몰라서 그럴수도 있음....

블로그 이미지

구본숭 하늘을사랑한사람

진실된 사람으로 태어 나기 위한 조건들, 사랑하기 위해 필요한 것을 찾습니다.


원문 : http://bbangjem2.tistory.com/112


스프링 프레임 워크를 사용했고 데이터 가지고 와서 보내 줄때 다음과 같이 설정도 했고 다른데이터도 제대로 받고

1
2
3
response.setHeader("Content-Type", "application/xml");
response.setContentType("text/xml;charset=UTF-8");
response.setCharacterEncoding("utf-8");
java 파일도 jsp 파일도 js 파일에서도 전부 utf - 8 로 설정 했는데...... 한글만 유독 ???? 로 깨져서 나왔음 톰캣 설정에 URIEncoding ="utf-8" 도 붙여 봤고 그래도 안되서 계속 검색 검색 web.xml 에서 필터 부분이 기존
1
2
3
4
5
6
7
8
9
10
11
12
13
<filter>
     <filter-name>encodingFilter</filter-name>
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
      </init-param>
</filter>
   
<filter-mapping>
     <filter-name>encodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
</filter-mapping>
여기서
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<filter>
     <filter-name>encodingFilter</filter-name>
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
      </init-param>
      <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
</filter>
   
<filter-mapping>
     <filter-name>encodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
</filter-mapping>
이렇게 변경 했더니 해결 ~~~ 추가한 부분은
1
2
3
4
<init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
</init-param>
이부분 입니다.


블로그 이미지

구본숭 하늘을사랑한사람

진실된 사람으로 태어 나기 위한 조건들, 사랑하기 위해 필요한 것을 찾습니다.

@Aspect annotation 기반 AOP 사용

1. 로그인 하지 않은 사용자가, 로그인페이지를 제외한 다른페이지에 접근했을 때 

2. 접근권한이 없는(세션값) 사용자가, 접근할 수 없는 페이지에 접근했을 경우 등

   로깅이나, 공통기능을 사이트 전반에 적용시켜야 할 때 이용한다.


@Aspect 어노테이션은 AspectJ 5버전에 새롭게 추가된 어노테이션으로서, xml파일에 Advice 및 Pointcut 등의 설정을 하지않고도,

자동으로 Advice를 적용할 수 있다.


#STS를 사용할 경우 메이븐 dependency 추가

<!-- AspectJ -->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

<version>${org.aspectj-version}</version>

</dependency>


<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>${org.aspectj-version}</version>

</dependency>


# spring 환경 설정 xml 파일에 아래 내용을 추가한다.

<aop:aspectj-autoproxy />

<bean id="loginAspect" class="com.common.LoginAspect"/>


# aspect 구현 소스

@Aspect

public class LoginAspect {

 

    @Pointcut("execution(public * com.admin..*(..))")

    private void adminMethod(){}

     

    @Pointcut("execution(public * com.bbs..*(..))")

    private void bbsMethod(){}

     

    @Pointcut("execution(public * com.common..*(..))")

    private void commonMethod(){}

     

    @Pointcut("execution(public * com.onm.administrator..*(..))")

    private void onmAdministratorMethod(){}

     

    @Pointcut("execution(public * com.onm.membership..*(..))")

    private void onmMembershipMethod(){}

     

    @Pointcut("execution(public * com.onm.report..*(..))")

    private void onmReportMethod(){}

         

    private String[] access_url = {

            };

     

    @Around(value ="adminMethod() || bbsMethod()  || commonMethod()

                                || onmAdministratorMethod() || onmMembershipMethod() || onmReportMethod()")

    public Object trace(ProceedingJoinPoint joinPoint) throws Throwable{

 

System.out.println("#### LoginAspect 시작 ####");     

        HttpServletRequest request = null;

        HttpServletResponse response = null;

        for ( Object o : joinPoint.getArgs() ){ 

            if ( o instanceof HttpServletRequest ) {

                request = (HttpServletRequest)o;

            } 

            if ( o instanceof HttpServletResponse ) {

                response = (HttpServletResponse)o;

            } 

        }

        try{

            HttpSession session = request.getSession();

 

                String loginId = (String) session.getAttribute("loginId");

                String userEnterType = (String) session

                        .getAttribute("UserEnterType");

 

                System.out.println("### Margo ==> loginId : " + loginId);

                if (loginId == null || "".equals(loginId)) {

                    System.out.println("### Margo ==> in if loginId : "

                            + loginId);

                    throw new RuntimeException("먼저 로그인을 하셔야 합니다.");

                }           

        }catch(Exception e){

             

            throw new RuntimeException("먼저 로그인을 하셔야 합니다.");

 

        }       

        Object result = joinPoint.proceed();

System.out.println("#### LoginAspect 끝 ####");      

        return result;

    }

}


1라인 에 적용한 @Aspect 어노테이션을 적용한 클래스는 advice구현메소드나, pointcut정의를 포함할 수 있게된다.


4 라인에 AspectJ의 pointcut 표현식으로 pointcut을 정의한다. 


execution(수식어패턴 리턴타입 클래스이름패턴 이름패턴(파라미터패턴))


수식어패턴: public, protected 등


각패턴은 * 를 이용하여 모든 값을 표현할 수 있고. '..' 를 이용하여 0개 이상이라는 의미를 표현가능

Controller라고 끝나는 이름의 클래스에만 적용할때는 - execution(public * com.bbs..*Controller.*(..))


5라인 처럼 pointcut 정의 메소드는 무조건 리턴타입이 void여야한다.

 이 메소드는 advice 관련 어노테이션인 @around의 값으로 사용될 메소드이다.




이제 trace메서드를 이용해서, 필요한 처리를 구현하면된다.

!!!!!!!!!!!!!!!! 여기서...중요한게 있다!!!!!!

27라인에서 joinPoint는 수행될 메소드인데, 보통 세션값 이용할때 request에서 빼내오는데

그 원래 해당메소드 파라메타로 HttpServletRequest가 지정되어 있지 않으면, request가 null이 되겠지..


끝으로 51,55라인에서 뿌린 Exception을 잡을 놈도 xml에 정의해야한다.

servlet xml에다가 추가해주자

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

<property name="exceptionMappings">

<props>

<prop key="java.lang.Exception">

index

</prop>

</property>

</bean>


출처 : http://winmargo.tistory.com/164

블로그 이미지

구본숭 하늘을사랑한사람

진실된 사람으로 태어 나기 위한 조건들, 사랑하기 위해 필요한 것을 찾습니다.

최근의 대부분 프로젝트는 Sitemesh를 사용하여 개발했었다.
이번에 문서들을 보면서 확인해보니 Tiles2가 나오면서 성능등이 많이 개선이 되었다고한다.
그럼, 해봐야 하지 않겠어?! 해보자.

pom.xml 추가

<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-core</artifactId>
	<version>2.2.2</version>
</dependency>
<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-jsp</artifactId>
	<version>2.2.2</version>
</dependency>
<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-servlet</artifactId>
	<version>2.2.2</version>
</dependency>


스프링소스 사이트에서 다운로드받은 STS의 경우 메이븐 pom.xml업데이트만 해도 자동으로 라이브러리가 추가되더라.
따로 메이븐을 설치하여 사용해야하나 고민하고 있었는데, 조금 두고 봐야겠다. 

이제 servlet-context.xml에 Tiles사용을 위한 설정을 해보자.

<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
	<beans:property name="definitions">
		<beans:list>
			<beans:value>/WEB-INF/config/tiles_layouts.xml</beans:value>
		</beans:list>
	</beans:property>
	<beans:property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory"/>
</beans:bean>
<beans:bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
	<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/> 
</beans:bean>


Tiles2에서 view를 연결하기 때문에 InternalResourceViewResolver를 사용하지 않아도 된다.
하지만, 나는 혹시나 발생할 수 있는 레이아웃없이 jsp페이지만 호출할 일이 있을까 싶어서,
InternalResourceViewResolver를 삭제하지 않았다.

이제 Tiles2의 레이아웃 설정이다.
설정파일은 위에서 지정한 "/WEB-INF/views/config/tiles_layouts.xml" 이 파일이 되겠다.

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
	<definition name="layouts-tiles" template="/WEB-INF/views/template/layouts-tiles.jsp">
		<put-attribute name="header"    value="/WEB-INF/views/template/header.jsp" />
		<put-attribute name="content"   value="" />
		<put-attribute name="footer"    value="/WEB-INF/views/template/footer.jsp" />
	</definition>
	 
	<definition name="*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}.jsp" />
	</definition>
	<definition name="*/*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}/{2}.jsp" />
	</definition>
	<definition name="*/*/*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}/{2}/{3}.jsp" />
	</definition>
</tiles-definitions>


layouts-tiles설정에서 기본 레이아웃 페이지와 이름을 설정한다.
content의 경우는 유동적으로 바뀌기에 하단에서 layouts-tiles를 extends받아서 추가해 준다.
자신에 맞게 바꾸면 되겠다.

layouts-tiles.jsp 내용

<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>Digigroove Intranet</title>
</head>
<body>
<tiles:insertAttribute name="header"/>
<tiles:insertAttribute name="content"/>
<tiles:insertAttribute name="footer"/>
</body>
</html>


여기까지가 끝이다.
header와 footer는 일반적인 html레이아웃 짜듯이 구성해 주면되겠다.
하나 불편한 점이 있는데, sitemesh의 경우는 header와 body의 내용 혹은 속성을 레이아웃에서
받아서 처리할 수 있있지만 Tiles녀석도 가능한지 아직모르겠다.
문서를 좀 읽어봐야겠다. 

아름답게도 잘 설명해준 블로그가 있어서 살살 따라하다보니 쉽게 되었다.
출처를 밝히며 감사의 마음을 표한다. 앞으로도 이곳 저곳의 자료를 모아올 것 같다.. ㅋㅋ

출처 : http://blog.naver.com/PostView.nhn?blogId=jazz1234k&logNo=40123376205 

블로그 이미지

구본숭 하늘을사랑한사람

진실된 사람으로 태어 나기 위한 조건들, 사랑하기 위해 필요한 것을 찾습니다.

Tag tiles2

새로운 프로잭트 프리젠테이션 레이어에 Apache Tiles 를 적용 할 것이냐 OpenSymphony Sitemesh를 사용 할것인가 고민을 좀 했다.

과거에 두가지 모두 사용해본 경험으로는
일단 간편하게 적용하기엔 Sitemesh가 편리했지만 구현 방식에 따른 성능이슈때문에 조금 손이 가더라도 Tiles를 선호했던 것 같다.

잠깐 두개를 비교한 블로그 포스팅을 검색해 보고 Tiles 를 선택 하기로 했다.

전자정부프레임워크에 Tiles 관련 종속 jar를 올려보자.

1. /[프로잭트]/pom.xml

properties 추가

 <properties>
  <spring.maven.artifact.version>3.0.5.RELEASE</spring.maven.artifact.version>
  <org.apache.tiles-version>2.2.2</org.apache.tiles-version>
 </properties>

dependency 추가

  <!-- Tiles -->
  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-core</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>

  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-servlet</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>
  
  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-jsp</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>

2. Spring 설정에 View Resolver 수정

/[프로잭트]/src/main/webapp/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml 수정

기존 JSTL View 를 2순위로 내리고

Tiles 우선순위를 1로 설정한다.

    <!-- Tiles 2 Resolver -->
 <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
  <property name="order" value="1" />
 </bean>

 <!-- Tiles 2 Configurer -->
 <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
  <property name="definitions">
   <list>
    <value>/WEB-INF/tiles/default-layout.xml</value>
   </list>
  </property>
 </bean>
 
    <!--
        - This bean configures the 'prefix' and 'suffix' properties of 
        - InternalResourceViewResolver, which resolves logical view names 
        - returned by Controllers. For example, a logical view name of "vets" 
        - will be mapped to "/WEB-INF/jsp/vets.jsp".
    -->
    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="2
    p:viewClass="org.springframework.web.servlet.view.JstlView" 
    p:prefix="/WEB-INF/jsp/egovframework/rte/" p:suffix=".jsp"/>

 

기존 리졸버의 order를 2로 바꾸는 것을 빼먹지 않도록 한다.

 

3. 프로잭트에 맞는 layouts.xml을 설정한다.

layout 설정은 다음 포스트에.


- 참조 사이트 : http://opensrc.tistory.com/116

블로그 이미지

구본숭 하늘을사랑한사람

진실된 사람으로 태어 나기 위한 조건들, 사랑하기 위해 필요한 것을 찾습니다.

프로젝트를 하다 보면 현재 요청된 HttpServletRequest를 찾고자

할때가 있습니다.

Service,DAO에서 현재의 request가 필요할때가 있을수 있습니다.

(물론 컨트롤러에 인자로 넘기면 됩니다.)

정확한 케이스를 말하긴 힘들지만 실무에서

꼭 필요할때가 있습니다.

그래서 현재의 Request를 스프링에서 가져 오는 방법을

설명 하고자 합니다.


* RequestContextListener 설정하기


web.xml 파일에 아래와 같이 리스너를 설정 합니다.


<listener>

  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>

</listener>


* 현재 HttpServletRequest 객체 가져오는 함수 만들기


public static HttpServletRequest getCurrentRequest() {


       ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder

               .currentRequestAttributes();


       HttpServletRequest hsr = sra.getRequest();

       return hsr;

}


출처 : http://beyondj2ee.tumblr.com/

블로그 이미지

구본숭 하늘을사랑한사람

진실된 사람으로 태어 나기 위한 조건들, 사랑하기 위해 필요한 것을 찾습니다.

spring 3.2 이상에서 사용할 수 있는 messageConverter 방법

오늘 json 데이터를 가져오는 방법을 코드로 짜보면서 도움이 될 거 같아 정리했다.

servlet.xml 에 보면 "컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 1" 과

"컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 2" 가 있다.

원하는 방법으로 사용하면 된다.


아래는 Ref는 AnnotationMethodHandlerAdapter가 deprecated 된 이유를 알 수 있는 좋은 블로그가 있어서 참조했다.

Description Ref :)

http://javaiyagi.tistory.com/357

Spring 3.0 의 DefaultAnnotationHandlerMapping 과 AnnotationMethodHandlerAdapter가  Spring 3.1 에선 @Deprecated 되고, 

대신 RequestMappingHandlerMapping과 RequestMappingHandlerAdapter 로 바뀌었다.

이유인즉슨, Controller 의 요청이 메소드 단위로 세분화 되면서 , 

DefaultAnnotationHandlerMapping 이 AnnotationMethodHandlerAdapter로 handler 를 전달해줄 때, 문제가 생겼기 때문이다 .


pom.xml

<!-- jackson Json -->

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.7.3</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-core</artifactId>

<version>2.7.3</version>

</dependency>


<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-annotations</artifactId>

<version>2.7.3</version>

</dependency>

<dependency>

    <groupId>org.codehaus.jackson</groupId>

    <artifactId>jackson-core-asl</artifactId>

    <version>1.9.13</version>

</dependency>


<dependency>

    <groupId>org.codehaus.jackson</groupId>

    <artifactId>jackson-mapper-asl</artifactId>

    <version>1.9.13</version>

</dependency>


servlet-context.xml

<!-- 컨트롤러에서 넘어온 데이터(JSON 같은)를 messageConverter로 사용할 수 있는 방법 2 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

<property name="messageConverters">

    <util:list list-class="java.util.ArrayList">

<ref bean="mappingJackson2HttpMessageConverter"/>

    </util:list>

</property>

</bean>

<bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

<property name="supportedMediaTypes">

    <list>

<value>text/html;charset=UTF-8</value>

<value>application/json;charset=UTF-8</value>

    </list>

</property>

</bean>

블로그 이미지

구본숭 하늘을사랑한사람

진실된 사람으로 태어 나기 위한 조건들, 사랑하기 위해 필요한 것을 찾습니다.

스프링 2.5 부터는 Controller 인터페이스를 구현하지 않은 클래스도 어노테이션을 사용하여 컨트롤러로 사용할 수 있게 되었다. 이를 위해 스프링은 @Controller, @RequestMapping 등 컨트롤러를 구현하는데 필요한 어노테이션을 제공하고 있다.

어노테이션을 이용하여 컨트롤러를 구현할 때는 요청 URL 매핑을 @RequestMapping 어노테이션을 이용하여 설정한다.
@RequestMapping 어노테이션을 처리하기 위해서 DefaultAnnotationHandlerMapping 을 HandlerMapping 으로 등록해 주어야 한다.

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"
p:alwaysUseFullPath="true" />


그런데 DispatcherServlet 이 사용하는 설정 파일에 별도의 HandlerMapping 명시를 하지 않으면, DispatcherServlet 은 기본적으로 DefaultAnnotationHandlerMapping 을 등록하므로 디폴트로 설정 파일에 명시를 하지 않아도 된다.

(만약 DispatcherServlet 이 사용하는 스프링 설정 파일에 HandlerAdapter 를 등록했다면, 추가적으로 AnnotationMethodHandlerAdapter 를 빈으로 등록해주어야 어노테이션을 이용한 컨트롤러가 정상 동작함)


이제 @Controller 어노테이션에 대해서 알아보자. @Controller 어노테이션은 클래스 타입에 적용되며, @Controller 를 붙이면 해당 클래스를 웹 요청을 처리하는 컨트롤러로 사용할 수 있다.

@Controller
public class HelloController {
...
}


컨트롤러로 사용하기 위해 @Controller 가 적용된 클래스는 <bean> 태그에서 스프링 빈으로 등록해주면 된다.

<bean id="helloController" class="...package.HelloController" />


아니면 <context:component-scan> 태그를 이용하여 @Controller 를 적용한 클래스를 자동으로 로딩할 수 있다.

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context2.5.xsd">
    
    <context:component-scan
        base-package="...package" />


</beans>


위에서 component-scan 영역은 base-package 까지만 잡아주면 된다. 클래스 명을 제외한 패키지 이름까지만.

정리해보면 @Controller 어노테이션을 적용한 클래스는 <bean> 태그를 이용하거나 <context:component-scan> 태그를 이용하여 등록하면, DefaultAnnotationHandlerMapping 을 통해 컨트롤러로 사용이 되는 것이다.

 

이제는 @RequestMapping 어노테이션을 이용한 요청 매핑에 대해서 알아보자.

@RequestMapping 어노테이션은 컨트롤러가 처리할 요청 URL 을 명시하는데 사용되며, 클래스나 메서드에 적용된다.

@RequestMapping 을 클래스에 적용하지 않고 메서드에만 적용할 경우 각각의 메서드가 처리할 요청 URL 을 명시하게 된다.

@Controller
public class RequestController {

    @RequestMapping("/test/mapping1.do")
    public String mappingFirst(@RequestParam("id") String id, @RequestParam("pwd") String pwd, ModelMap modelMap) {
        // 로직 처리와 리턴 구문
    }

    @RequestMapping("/test/mapping2.do")
    public String mappingSecond(@RequestParam("id") String id, @RequestParam("pwd") String pwd, ModelMap modelMap) {
        // 로직 처리와 리턴 구문
    }
    ...
}

다수의 메서드에 @RequestMapping 을 적용하면, MultiActionController 처럼 한 개의 컨트롤러에서 다수의 요청을 처리할 수가 있다.

그리고 @RequestMapping 의 method 엘리먼트를 이용하면 처리할 수 있는 Http Method 를 지정할 수도 있다.

@RequestMapping(value="/test/mapping1.do", method=RequestMethod.POST)
public String mappingSomething(...) {...}

@RequestMapping 을 클래스 타입에 적용하게 되면, 해당 컨트롤러 클래스는 지정한 URL 만을 처리할 수 있다.
이 경우 메서드에 적용되는 @RequestMapping 은 더 이상 URL 명시를 할 수 없고, method, params 엘리먼트만 지정할 수 있게 된다.


출처 : http://northface.tistory.com/

블로그 이미지

구본숭 하늘을사랑한사람

진실된 사람으로 태어 나기 위한 조건들, 사랑하기 위해 필요한 것을 찾습니다.