본문 바로가기

Server Oriented/Spring

스프링 Controller Step 1, request 할당 (Annotation Mapping)

(웹브라우저 주소창에 입력 및 실행되면)

이를 처리할 서버측 .java 와 method 를 할당하는 것.

 

크게 3가지인데,

A. RequestMapping 이 기본

B. RequestMapping 간소화

C. Annotation 파라미터


1. 요청 경로 매핑, RequestMapping

  메소드가 void 리턴이면 @RequestMapping path 값과 동일한 view 파일 호출,

  메소드가 String 리턴이면 String 값과 동일한 view 파일 호출.

  매핑 관련해서는 RequestMapping 이 기본이고, 다른 매핑은 이를 간소화.

 

2. 경로 패턴 매핑

  RequestMapping 시 파라미터 1개?

  URL 경로 상의 변하는 값을 경로 변수로 취급.

 

3. Http 메서드 매핑

@GetMapping 과 @PostMapping

@PutMapping (Rest Ajax 용도)

@DeleteMapping

@PatchMapping

 

4. Params 매핑

  버튼이나 링크를 매핑시, @GetMapping 이나 @PostMapping 에 params 인자 사용

 

5. Headers 매핑

  요청 헤더를 매핑시, @PutMapping 에 headers 인자 사용

 

6. ContentType 매핑

  Content-Type 을 매핑시, @PutMapping 에 consumes 인자 사용

 

7. Accept 매핑

  Accept 헤더값을 매핑시, @GetMapping 에 produces 인자 사용


* RequestMapping 이나 Http 메서드 매핑이나..

  return 으로 View 를 호출할 때는 절대 경로를 세팅해야 에러나지 않음.

  다만 '/aaa/bbb' 형태가 아니라, 'aaa/bbb' 형태.

  RequestMapping 으로 기본 경로가 바뀐 것이 아니기 때문..?


@RequestMapping 이 class 에 지정되지 않은 경우,

메소드 수준에서는 아래와 같이 세팅.

- @RequestMapping(value="/aaa/bbb")

  value={"/aaa/bbb", "/bbb/ccc", ...} 도 가능

- @RequestMapping(path="/aaa/bbb")

  value 와 path 는 동등하게 사용

- @RequestMapping("/aaa/bbb")

  값이 하나인 경우, 속성명 생략

 

@RequestMapping 이 class 에 지정되는 경우,

메소드 수준에서는 class 에 지정된 이후의 경로를 설정

- @RequestMapping(value="/aaa")

  라고 class 에 세팅했으면,

- @RequestMapping(value="/bbb")

  라고 method 에 세팅

- class 에서 @RequestMapping 기본 경로 설정후,

  메소드에서 @GetMapping 이나 @PostMapping 등을 사용하여 이후의 경로 설정 가능

 

@RequestMapping("/aaa")     // classA 의 모든 method 에서 매핑시 root 로 작용

class classA {

  @RequestMapping("/bbb")   // 실제로는 /aaa/bbb 에 해당

  public String methodA(...){

    ...

    return "ccc";                           // /aaa/ccc.html 이 아니고, /ccc.html 에 해당

    //aaa/ccc.html 을 찾으려면, return "aaa/ccc"; 라고 해야 함

  }

}


@RequestMapping("/aaa/{param})

public String method(@PathVariable int param)

또는 아래와 같이 명칭을 변경

@RequestMapping("/aaa/{param})

public String method(@PathVariable("param") int idx)


<form th:action="@{/aaa/bbb}">

 <input type="submit" value="클릭">

</form>

(form 태그에 method 속성을 주입하지 않으면 get type)

(class 에 @RequestMapping("/aaa") 세팅되어 있다고 전제)

@RequestMapping(path="/bbb", method=RequestMethod.GET)

또는

@GetMapping("/bbb")

 

<form th:action="@{/aaa/bbb}" method="post">

 <input type="submit" value="클릭">

</form>

@RequestMapping(path="/bbb", method=RequestMethod.POST)

또는

@PostMapping("/bbb")

 

@GetMapping("/register") public methodA(...){ ... } 는 등록 화면 호출용으로 사용,

@PostMapping("/register") public methodB(...){ ... } 는 등록 화면의 내용을 전달받아 DB 처리용으로 사용.


<a th:href="@{/aaa/bbb?파라미터}">클릭</a>

또는

<form th:action="@{/aaa/bbb}">

 <button type="submit" name="파라미터">클릭</button>

</form>

@GetMapping(path="/bbb", params="파라미터")

 

<form th:action="@{/aaa/bbb}" method="post">

 <button type="submit" name="파라미터">클릭</button>

</form>

@PostMapping(path="/bbb", params="파라미터")

 

bbb 를 하나로 두고, 실제 경로를 노출하지 않을 수 있음.

params 로 파라미터를 넘기는 방법은,

form 태그(get 과 post) 와 ? 를 이용하는 파라미터 전달 방식 모두 가능.


$.ajax({

 type:'put', // -- @PutMapping

 url:'/aaa/'+boardNoVal

 headers:{ 'X-HTTP-Method-Override':'PUT' },

 contentType:'application/json; charset=utf-8",

 ...

});

@PutMapping(path="/{boardNo}", headers="X-HTTP-Method-Override=PUT")


var boardObject = { boardNo:'1',  ... };

$.ajax 에 type:'post',  url:'/aaa/'+boardNoVal, data:JSON.stringify(boardObject), contentType:'application/json; charset=utf-8'

@PostMapping("/{boardNo}")

public ResponseEntity<String> methodA(

  @PathVariable("boardNo") int boardNo,

  @RequestBody Board board){

  ....

  ResponseEntity<String> entity = new ResponseEntity<String>("결과값",HttpStatus.OK);

  return entiry;

}

 

var boardObject = { boardNo:'1',  ... };

$.ajax 에 type:'put', url:'/aaa/'+boardNoVal, data:JSON.stringify(boardObject), contentType:'application/json; charset=utf-8'

@PutMapping(path="/{boardNo}", consumes="application/json")

 

var xmlData = '<Board><boardNo>1</boardNo>...</Board>';

$.ajax 에 type='put', url:'/aaa/'+boardNoVal, data:xmlData, contentType:'application/xml; charset=utf-8'

@PutMapping(path="/{boardNo}", consumes="application/xml")


$.get('/aaa/' +boardNoVal, function(data){

 alert(JSON.stringify(data));

}

@GetMapping(path="/{boardNo}", produces="application/xml")

public ResponseEntity<Board> readToXml(

  @PathVariable("boardNo") int boardNo){

  Board board = new Board(..,..,....);

  ResponseEntity<Board> entity = new ResponseEntity<Board>(board, HttpStatus.OK);

  return endtity;

}

- $.get 은 @GetMapping 만 사용. @PostMapping 은 에러 발생.

 

$.ajax({

 type:'get',

 url:'/aaa/'+boardNoVal,

 headers:{ 'Accept':'application/json' },

 success:function(result){

  alert(JSON.stringify(result));

 }

});

@GetMapping(path="/{boardNo}", produces="application/json")

 

$.ajax 에 type:'get', headers:{ 'Accept':'application/xml' }, success:function(result){ alert(xmlToString(result)) }

function xmlToString(xmlData){

 return window.ActiveXObject ? xmlsData.xml : (new XMLSerializer()).serializeToString(xmlData);

}

@GetMapping("/{boardNo}")