티스토리 뷰

2020_실전프로젝트1

MVC Annotations

carrot62 2020. 11. 28. 16:18

 Annotations 

  •  @RequestMapping URL과 controller의 메소드를 mapping(매칭해주는, 연결해주는)할 때 사용하는 annotation이다.

Spring에서 작업을 하면서 url 부분을 보면 꼭 특정 폴더에 들어있는 파일이 아니어도 url 상에서는 "/"로 구분되면서 마치 오느 폴더에 속해 있는 것 처럼 보이게 된다. 


이렇게 URL을 처리하는 방식은 controller에서 정의해놓은 형식을 통해서 요청된 페이지에 따라 특정 페이지를 나타내주는 방법이다. 따라서 /board/list 라는 url이 있다고 하더라고 list가 꼭 board 폴더 안에 있다는 것을 의미하지 않는다.

아래의 사진을 참고해보면 controller에서 @RequestMapping이라는 annotation을 사용함으로써 /board/list이라는 url이 요청 되었을때 list.jsp 페이지를 찾아서 view로 나타내는 메소드가 설정되어 있다는 것을 볼 수 있다.

이런 점에선 Spring을 이용하면 back-end에서 어떤 작업이 이뤄지는지 노출이 많이 되지 않는다는 장점이 있다.
@RequestMapping에서는 value, method, params, consumes, produces등의 속성이 있는데 그중에서 value는 String 타입으로 URL 값으로 매핑 조건을 부여하는 defualt 속성이다.

  •  @GetMapping 와 @PostMapping  : HTTP get 요청/post 요청을 처리하는 매소드를 mappping하는 어노테이션이다. 다시 말해 @RequestMapping을 맵핑하는 어노테이션인 것이다. URL에 따라 어떤 페이지를 보여줄지 결정하는 역할을 한다.

RequestMappping에 속성을 지정해서 사용하지 않고 간단하게 사용할 수 있도록 나온 annotation이다. 이 annotation으로는 특히 다중 맵핑이 가능하다.

하나만 맵핑 할 경우:
    @GetMapping("/main")

다중 맵핑 할 경우:
    @GetMapping(value = {"/", "/index", "/main"})

간단한 사용 예시:

@GetMapping("/onlyGet")
public void onlyGet(){
}

@PostMappping("/onlyPost")
public void onlyPost(){
}
  •  @RequestParam : HTTP request 파라미터를 받아 올 수 있는 annotation. 받아온 요청의 데이터를 읽어서 parameter 부분에, 주어진 method에 따라서 자동으로 binding 해준다. Edit이나 Delete 처리를 해서 특정 객체의 일ㄹ련 번호에 따라 어떤 작업을 처리해주고 싶을 때 유용하게 사용할 수 있다.

  •  @PathVariable : URL 경로에 변수를 넣는 annotation. {}를 사용해 변수를 넣는다.

  •  @RequestBody : HTTP 요청을 자바 객체로 변환해주는 annotation이다.

  •  @ModelAttribute : VO객체를 만들어서 데이터를 한번에 보낼 수 있도록 해주는 annotation이다.

 @Controller 

Controller 파라미터 종류:

  • HttpServletRequest/HttpServletResponse/ServletRequest/ServletResponse: 각 오브젝트를 파라미터로 사용하는 경우.
  • HttpSession: HTTP 세션만 필요할 경우에 사용한는 파라미터. 서버에 따라서 multithread 환경에서 보안이 보장되지는 않는다. 서버에 상관없이 안전하게 사용하기 위해서는 어댑터의 synchronizeOnSession 속성을 true로 설정해줘야 한다.
  • WebRequest/NativeWebRequest: WebRequest 또는 HttpServletRequest 의 요청 정보를 그대로 갖고 있고, servlet API 에 종속되어 있지 않는 오브젝트 타입이다.
  • Locale: java.util.Locale 타입으로 Dispatcher Servlet의 지역정보 resolver가 결정한 locale 오브젝트를 제공 받을 수 있다.
  • InputStream/Reader: HttpServletRequest의 getInputStran()을 통해서 받을 수 있는 콘텍트 스트림 또는 리더 타입 오브젝트를 받아올 수 있다.
  • OutputStream/Writer: HttpServeltResponse의 getOutputStream() 으로 가져올 수 있는 출력하기 위한 컨텍스트 스ㅡ림 또는 "쓰기" 타입 오브젝느를 받을 수 있다.

Controller의 리턴타입 종류

아래의 모든 코드 출처: sambalim.tistory.com/69

1. ModelAndView

[public ModelAndView]

return "jsp파일 이름" 을 리턴해 해당하는 jsp 페이지를 찾아서 View로 나타낸다 

@Controller
public class HelloController {
	@RequestMapping("/hello")
    public ModelAndView hello() {
    	ModelAndView view = new ModelAndView();
        view.setViewName("hello");
        view.addObject("name", "HarryPotter");
        return view;
        }
}

2. String

[public String]

String type으로 리턴하는 방식

@Controller
public class HelloController {
	@RequestMapping("/hello")
    public String hello() {
    return "hello";
    }
}

 

3. void

리턴 값이 없는 경우도 있다

@Controller
public class HelloController {
	@RequestMapping("/hello")
	public void hello() {
    }
}

4.Object

다음과 같이 VO 객체를 리턴할 수도 있다

5.@ResponseBody

이 어노테이션을 사용할 경우 리턴 값이 View를 통해서 출력되지 않고 HTTP response body에 직접 쓰인다.

@Controller
public class HelloController {
	@RequestMapping("/hello")
    @ResponseBody
    public String hello() {
    	return "<html><body><h1>Hello, ResponseBody!</h1></body></html>";
    }
}

6. List

다음과 같이 list 타입으로도 리턴할 수 있다

참고:

sarc.io/index.php/development/1139-requestmapping