2013. 7. 29. 16:35

■ MVC 관련 Spring annotation - 2 


목차

@Service

@Repository

@Controller

@RequestMapping

@requestParam

@ModelAttribute

@SessionAttributes

@InitBinder



@Service


개요 : @Service를 적용한 Class는 비지니스 로직이 들어가는 Service로 등록이 된다.

 

Controller에 있는 @Autowired는 @Service("xxxService")에 등록된 xxxService와 변수명이 같아야 하며

Service에 있는 @Autowired는 @Repository("xxxDao")에 등록된 xxDao와 변수명이 같아야 한다.


@Service("helloService")
      public class HelloServiceImpl implements HelloService {
    @Autowired
    private HelloDao helloDao;
           public void hello() {
  System.out.println("HelloServiceImpl :: hello()");
  helloDao.selectHello();
     }
      }

helloDao.selectHello(); 와 같이 @Autowired를 이용한 객체를 이용하여 Dao 객체를 호출한다.


예제

@Service("test2.testService") 
//괄호 속 문자열은 식별자를 의미한다.
//괄호를 생략할 경우 클래스명 그대로 사용한다. 
//따라서 ,같은 클래스명이 존재 할 시 같은 식별자가 생성되기때문에 에러가 발생한다.
public class TestService
{
 public String result(int num1, int num2, String oper)
 {
  String str = null;
  
  if(oper.equals("+"))
  {
... 
생략
...
  return str;
 }
} 

@Resouce로 연결

@Resource(name="test2.testService") 
 //name에 필요한 것은 @Service("test2.testService") <- 여기서 괄호 속 문자열, 즉 식별자
 private TestService service; 
        //TestService service = new TestService(); 라고 하는것과 같은 식
 
 @RequestMapping(value="/test2/oper.action", method={RequestMethod.GET})
 public String form() throws Exception
 {
  return "test2/write";
 }

@Repository 


패키지 : org.springframework.stereotype

버젼 : spring 2.0

개요 : 레포지 토리 어노테이션은 일반적으로 DAO에 사용되며 DB Exception을 DataAccessException으로 변환한다.


예제


@Repository("bbs.boardDAO")
public class BoardDAO
{
 private SqlSession sqlSession;
 
 public int insertBoard(Board dto) throws Exception
 {
  ...
 }
}

public class BoardServiceImpl implements BoardService
{
 @Resource(name="bbs.boardDAO")
 private BoardDAO dao;
 
 public int insertBoard(Board dto){}
}


@Controller


패키지 : org.springframework.stereotype

버젼 : spring 2.5

개요 : spring MVC의 Controller 클래스 선언을 단순화시켜준다. 스프링 컨트롤러, 

서블릿을 상속할 필요가 없으며, @Controller로 등록된 클래스 파일에 대한 bean을 자동으로 생성해준다.

 

Controller로 사용하고자 하는 클래스에 @Controller 지정해 주면 component-scan으로 자동 등록된다.

 

- xml 설정



- java


 package han.test;
 
       import org.springframework.stereotype.Controller;
 
       @Controller
       public class SpringC {
       }

@RequestMapping


개요 : RequestMapping annotation은 url을 class 또는 method와 mapping 시켜주는 역활을 한다. annotation을 쓰지 않을때 지정했던 Controller등록을 위한 url bean 설정을 생략 할 수 있다.

class에 하나의 url mapping을 할 경우, class위에 @RequestMapping("/url")을 지정하며

, GET 또는 POST 방식 등의 옵션을 줄 수 있다.

해당되는 method가 실행된 후, return 페이지가 따루 정의되어 있지 않으면 @RequestMapping("/url")에서 

설정된 url로 다시 돌아간다.


수업예제


@RequestMapping(value="/test3/oper.action"[, method=RequestMethod.POST])
public ModelAndView submit(int num1, int num2, String oper) throws Exception
{
 ....
} 

//요청된 URL에 따라 호출될 메서드를 지정한다.
//클라이언트가 /test3/oper.action 을 요청하면 위 메서드가 실행된다는 것이다.
//단, method 지정을 하면 해당 프로토콜에 해당된 요청에만 반응한다.
//여기서 method 는 get/post 둘 다 지정할 수도 있다.
 @RequestMapping(value="/...", method={RequestMethod.GET, RequestMethod.POST})
method=...get || method={...get, ...post}

상세 속성 정보

 (1) value  : "value='/getMovie.do'"와 같은 형식의 매핑 URL 값이다. 디폴트 속성이기 때문에 value만 정의하는 경우에는 'value='은 생략할 수 있다.

 

 예 : @RequestMapping(value={"/addMovie.do", "/updateMovie.do" })

 

이와 같은 경우 "/addMovie.do", "/updateMovie.do" 두 URL 모두 처리한다.

 

(2) method  : GET, POST, HEAD 등으로 표현되는 HTTP Request method에 따라 requestMapping을 할 수 있다. 'method=RequestMethod.GET' 형식으로 사용한다. method 값을 정의하지 않는 경우 모든 HTTP Request method에 대해서 처리한다.

 

예 : @RequestMapping(method = RequestMethod.POST)

 

위의 경우 value 값은 클래스 선언에 정의한 @RequestMapping의 value 값을 상속받는다.  

 

(3) params  : HTTP Request로 들어오는 파라미터 표현이다. 'params={"param1=a", "param2", "!myParam"}' 로 다양하게 표현 가능하다.

 

예 : @RequestMapping(params = {"param1=a", "param2", "!myParam"})

 

위의 경우 HTTP Request에 param1과 param2 파라미터가 존재해야하고 param1의 값은 'a'이어야하며,

myParam이라는 파라미터는 존재하지 않아야한다. 또한, value 값은 클래스 선언에 정의한 @RequestMapping의 value 값을 상속받는다. 

 

(4) headers  : HTTP Request의 헤더 값이다.'headers="someHader=someValue"', 'headers="someHader"', 'headers="!someHader"' 로 다양하게 표현 가능하다. Accept나 Content-Type 같은 헤더에 대해서 media type 표현 시 '*' 도 지원한다.

 

예 : @RequestMapping(value="/movie.do", headers="content-type=text/*")

 

위의 경우 HTTP Request에 Content-Type 헤더 값이 "text/html", "text/plain" 모두 매칭이 된다. 또한,

Type-Level, Method-Level에서 모두 사용할 수 있는데, Type-Level에 정의된 경우, 하위의 모든 핸들러 메소드 에서도 Type-Level에서 정의한 헤더값 제한이 적용된다.


 - 사용 예

@Controller
@RequestMapping("/han/test/*")
public class HelloController
{
@RequestMapping(method=RequestMethod.GET, value="go")
public returntype getMethodName(){
:
}

@RequestMapping(method=RequestMethod.POST, value="go2")
public returntype getMethodName2(){
:
}
}

@Controller("mainController")
@RequestMapping(value="/main.action")
public class MainController {
  
 @RequestMapping(method=RequestMethod.GET)
 public String method() {
  return ".mainLayout";
 }
}
 

@RequestParam


개요 : RequestParam annotation은 key=value 형태로 화면에서 넘어오는 파라미터를 맵핑 된 메소드의

파라미터로 지정해 준다. 주로 get 방식으로 들어오는 request에서 사용한다.

 

아래에서 xxx/editBlog.do?blogId=3 과 같이 접근할 때, editBlogHandler 메소드의 파라미터인 blogId에는 3이 셋팅된다. 필수 요건이 아닐 경우, @RequestParam(value="id", required="false")와 같이 옵션을 주고 사용할 수 있다.


@Controller
      public class BlogController {
 /* 중간생략 */
 
 @RequestMapping("/editBlog")
 public ModelMap editBlogHandler(@RequestParam("blogId") int blogId) {
  blog = blogService.findBlog(blogId); 
  return new ModelMap(blog);
 }
 
 /* 중간생략 */
     }

수업예제


@RequestMapping(value="/...", method={RequestMethod.GET, RequestMethod.POST})
public String submit(HttpServletRequest req
  , @RequestParam(value="num1") int num1
  , @RequestParam(value="num2") int num2
  , @RequestParam(value="oper") String oper) throws Exception
{
 ...  //value : form객체가 넘겨줄 값의 name
}
 
//@RequestParam 어노테이션이 적용된 파라미터는 기본적으로 필수 파라미터이다.
따라서, 명시한 파라미터가 존재하지 않을 경우 400 에러가 발생한다.
 
//여기서 파라미터에 값이 있을수도 없을수도 있는 로직을 구현하려면 다음처럼 작성한다.
 
 
@RequestMapping(value="/...", method={RequestMethod.GET, RequestMethod.POST})
 
public String submit(HttpServletRequest req
  , @RequestParam(value="num1", defaultValue = "0") int num1
  , @RequestParam(value="num2", defaultValue = "0") int num2
  , @RequestParam(value="oper", required=false) String oper) throws Exception
{
 ...
}

@ModelAttribute


개요 : ModelAttribute annotation은 화면의 form 속성으로 넘어온 model을 맵핑된 method의 파라미터로 지정해주는 역활을 한다. 주로 POST 타입으로 넘어오는 form 속성의 model 값을 받아 올 때 사용된다.

(get/post 모두 통용된다.)


 @Controller
     public class BlogController {
 /* 중간생략 */
 
 @RequestMapping("/updateBlog")
 public String updateBlogHandler(@ModelAttribute("blog") Blog blog) {
  blogService.updateBlog(blog);
  return "redirect:findBlogs.do";
 }
 
 /* 중간생략 */
    }

@SessionAttributes


개요 : SessionAttribute annotation은 세션상에서 model의 정보를 유지하고 싶을 경우 사용 할 수 있다.


 @Controller
     @SessionAttributes("blog")
     public class BlogController {
 /* 중간생략 */
 
 @RequestMapping("/createBlog")
 public ModelMap createBlogHandler() {
  blog = new Blog();
  blog.setRegDate(new Date());
  return new ModelMap(blog);
 }
 
 /* 중간생략 */
    }
 

@InitBinder


ο Annotation 기반 Controller 에서 ServletContext 구하기


  :
 
    @Controller
    @RequestMapping("/common/download")
    public class DownloadController {
        @Autowired
        private ServletContext sc;
 
        @RequestMapping
        public ModelAndView download(@RequestParam("filePath") String filePath) throws               Exception              
        {
            String path = sc.getRealPath(filePath);
            return new ModelAndView("common.download", "downloadFile", new File(path));
        }
    }


'Framework > Spring' 카테고리의 다른 글

Spring Framework/ DI / IOC 컨테이너 / POJO  (0) 2013.07.30
Annotation_Spring_MVC_1  (0) 2013.07.29
Annotation  (0) 2013.07.29
Posted by 1+1은?