본문으로 바로가기


스프링MVC를 이용하는 경우 작성되는 Controller는 다음과 같은 특징이 있음.

-HttpServletRequest,HttpServletResponse를 거의 사용할 필요가 없이 필요한 기능 구현

-다양한  타입의 파라미터 처리,다양한 타입의 리턴 타입 사용가능 

-GET방식,POST방식 등 전송 방식에 대한 처리를 어노테이션으로 처리가능

-상속/인터페이스 방식 대신에 어노테이션으로도 필요한 설정 기능


다른 프레임워크들과 달리 스프링MVC는 어노테이션을 중심으로 구성됨.(주의)


▶@Controller,@RequestMapping


프로젝트 내 org.zerock.controller 패키지 폴더에 SampleController클래스생성


SampleController클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package org.zerock.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
import lombok.extern.log4j.Log4j;
 
 
@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleController {
 
}
cs


SampleController의 클래스 선언부에는 @Controller라는 스프링 MVC에서 사용하는 어노테이션을 적용하고 있음.작성된SampleController클래스는 저번 글의 그림 처럼

자동으로 스프링 객체(Bean)로 등록되는데 servlet-context.xml에 그 이유가 있음.


servlet-context.xml마지막 부분


1
2
3
    <context:component-scan base-package="org.zerock.controller" />
    
</beans:beans>
cs


servlet-context.xml에는 <context:component-scan>이라는 태그를 이용해서 지정된 패키지를 조사(스캔) 하도록 설정 되어있음.해당 패키지에 선언된 클래스들을 조사하면서  스프링에서 객체(Bean) 설정에 사용되는 어노테이션들을 가진 클래스들을  파악하고 필요하다면 이를 객체로 생성 해서 관리하게 됨.


SampleController클래스가 스프링에서 관리되면 화면상에는 클래스옆에 작게 's'모양의 아이콘이 추가됨.



클래스 선언부에는@Controller와 함께@RequstMappring을 많이 사용함.


@RequstMappring은 현재 클래스의 모는 메서드들의 기본적인 URL 경로가 됨.

예를 들어 ,SampleController클래스를 다음과 같이 '/sample/*'이라고 경로를 지정하면 다음과 같은 URL은 모두SampleController에서 처리가 됨.

-/sample/ddd

-/sample/aaa


@RequstMappring 어노테이션은 클래스의 선언과 메서드 선언에 사용할 수 있음.

SampleController클래스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package org.zerock.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
import lombok.extern.log4j.Log4j;
 
 
@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleController {
 
    @RequestMapping("")
    public void basic() {
        log.info("basic.............");
    }
}
 
cs


SampleController는 Lombock의 @Log4j를 사용함.

(@Log4j는 @Log가 java.util.Logging을 이용하는데 반해 Log4j 라이브러리를 활용함.Spring Legacy Project로 하면 기본적으로 Log4j가 추가되어있음.별도설정X)

근데 저는 문제가 먼지 모르겠지만 에러가 계속나서 찾아보니 

1
2
3
4
5
6
7
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-1.2-api -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-1.2-api</artifactId>
    <version>2.7</version>
</dependency>
 
cs

이걸 추가해야 에러가 사라 졌습니다 안된다면 !!!! 이걸 pom.xml에 추가 해 주세용


프로젝트를 WAS에서 실행해보면 스프링이 인식할 수 있는 정보가 출력되는 것을 볼 있는데 ,위와 같은 경우 아래와 같이 로그가 찍힘.


1
2
INFO : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/],methods=[GET]}" onto public java.lang.String org.zerock.controller.HomeController.home(java.util.Locale,org.springframework.ui.Model)
INFO : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/sample/*]}" onto public void org.zerock.controller.SampleController.basic()
cs

(와 톰켓실행시....... log.info()........ log가 아에 실행이 안되고 콘솔창에 에러가 뜨지만 프로젝트가 이상 없이 돌아 갈때 가있습니다........ㅜㅜ(2일 찾음...))


경고: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:ex01.sample' did not find a matching property.



Tomcat6.0.16부터  source라는 프로퍼티가 추가 되었는데 WTP가 source라는 속성을 프로젝트의 context에 추가해서 발생하는 현상....

실제로는 서비스 상의 문제는 발생하징낳아서  보통은 무시하고 진행하지만......

내로그에 경고메세지......라고 .... 조치방법은 아래

Ecllipse에서 Tomcat서버를 더블클릭해서 설정부분의 Server Options에 있는 Publish module contexts to separate XML files를 체크한 뒤 다시..


▶@RequestMapping의 변화 

@Controller어노테이션은 추가적인 속성을 지정할 수 없지만 ,@RequestMapping의 경우 몇 가지의 속성을 추가할 수 있습니다.이 중에서도 가장 많이 사용하는 속성이 method 속성임.Method 속성은 흔히 GET방식,POST방식을 구분해서 사용할 때 이용함.

스프링 4.3버전 부터는 이러한 @RequestMapping을 줄여서 사용할 수 있음.@GetMapping,@PostMapping이 등장하는데 축약형의 표현이므로, 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleController {
    @RequestMapping(value="/basic", method= {RequestMethod.GET,RequestMethod.POST})
    public void basicGet1() {
        log.info("get basic ..........");
    }
    @GetMapping("/basicOnlyGet")
    public void basicGet2() {
        log.info("basic get only get ..........");
    }
 
}
 
cs

@RequestMapping은 GET,POST방식모두를 지원해야 하는 경우에 배열로 처리해서 저장할 수 있음. 일반적인 경우에만 GET,POST방식만을 사용하지만 최근에는 PUT,DELETE방식 등도 점점 많이 사용하고 있음 .

@GetMapping의 경우 오직GET방식에만 사용할 수 있으므로 ,간편하기는 하지만 기능에 대한 제한은 많은 편임.