728x90
REST의 @Annotation
전송방식에 따른 Annotation
전송방식에 따른 어노테이션
작업 | HTTP Method | URI 예제 | 어노테이션 | Operation Performed |
---|---|---|---|---|
등록(Create) | POST | /members/new | @PostMapping | 리소스를 가져옴 |
조회(Read) | GET | /members/{id} | @GetMapping | 정의된 의미가 없으면 자원을 생성 |
수정(Update) | PUT | /members/{id}+body(json데이터 등) | @RequestMapping | 자원을 생성하거나 업데이트 |
삭제(Delete) | DELETE | /members/{id} | @DeleteMapping | 자원을 삭제 |
예제
package org.zerock.controller;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.zerock.domain.Criteria;
import org.zerock.domain.ReplyPageDTO;
import org.zerock.domain.ReplyVO;
import org.zerock.service.ReplyService;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;
@RequestMapping("/replies/")
@RestController
@Log4j
@AllArgsConstructor
public class ReplyController {
private ReplyService service;
//댓글 등록
@PostMapping(value="/new", consumes="application/json", produces= {MediaType.TEXT_PLAIN_VALUE})
public ResponseEntity<String> create(@RequestBody ReplyVO vo){
log.info("ReplyVO: " + vo);
int insertCount = service.register(vo);
log.info("Reply INSERT COUNT: " + insertCount);
return insertCount == 1
? new ResponseEntity<>("success", HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
//삼항 연산자 처리
}
// 댓글 목록
@GetMapping(value="/pages/{bno}/{page}", produces= {MediaType.APPLICATION_ATOM_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE})
public ResponseEntity<ReplyPageDTO> getList(@PathVariable("page") int page, @PathVariable("bno") Long bno){
Criteria cri = new Criteria(page, 10);
log.info("get Reply List bno: " + bno);
log.info("cri : " + cri);
return new ResponseEntity<>(service.getListPage(cri, bno), HttpStatus.OK);
}
// 댓글 조회
@GetMapping(value="/{rno}", produces= {MediaType.APPLICATION_ATOM_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE})
public ResponseEntity<ReplyVO> get(@PathVariable("rno") Long rno){
log.info("get : " + rno);
return new ResponseEntity<>(service.get(rno), HttpStatus.OK);
}
// 댓글 삭제
@DeleteMapping(value="/{rno}", produces= {MediaType.TEXT_PLAIN_VALUE})
public ResponseEntity<String> remove(@PathVariable("rno") Long rno){
log.info("remove : " + rno);
return service.remove(rno) == 1
? new ResponseEntity<>("success", HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
// 댓글 수정
@RequestMapping(method= {RequestMethod.PUT, RequestMethod.PATCH}, value="/{rno}", consumes="application/json", produces= {MediaType.TEXT_PLAIN_VALUE})
public ResponseEntity<String> modify(@RequestBody ReplyVO vo, @PathVariable("rno") Long rno){
vo.setRno(rno);
log.info("rno : " + rno);
log.info("modify : " + vo);
return service.modify(vo) == 1
? new ResponseEntity<>("success", HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@PathVariable
@PathVariable
- '?' 뒤에 파라미터를 추가하는 형식의 '쿼리 스트링' 방식 대신 사용
- URL 상에 경로의 일부를 파라미터로 사용
// http://localhost:8080/controller/sample/product/bags/234
// http://localhost:8080/controller/sample/product/bags/234.json
@GetMapping(value="/product/{cat}/{pid}")
public String[] getPath(@PathVariable("cat") String cat, @PathVariable("pid") int pid) {
return new String[] {"category: " + cat, "productid: " + pid};
}
```
</details>
-------
<details markdown="1">
<summary>@RequestBody</summary>
- ## @RequestBody
- JSON 데이터를 원하는 타입의 객체로 변환해야 하는 경우에 주로 사용
- 전달된 요청(request)의 내용(body)을 이용해서 해당 파라미터의 타입으로 변환을 요구함
- 내부적으로는 HttpMessageConverter 타입의 객체들을 이용해서 다양한 포맷의 입력 데이터를 변환할 수 있음
- 대부분의 경우에는 JSON 데이터를 서버에 보내서 원하는 타입의 객체로 변환하는 용도로 사용되지만, 경우에 따라서는 원하는 포맷의 데이터를 보내고, 이를 해석해서 원하는 타입으로 사용하기도 함
> TicketVO.java
```java
package org.zerock.domain;
import lombok.Data;
@Data
public class TicketVO {
private int tno;
private String owner;
private String grade;
}
```
> SampleController.java
```java
@PostMapping("/ticket")
public Ticket convert(@RequestBody TicketVO vo) {
log.info("convert....ticket" + ticket);
return ticket;
}
```
> REST Controller 응용
```java
@PostMapping(value="/new", consumes="application/json", produces= {MediaType.TEXT_PLAIN_VALUE})
public ResponseEntity<String> create(@RequestBody ReplyVO vo){
log.info("ReplyVO: " + vo);
int insertCount = service.register(vo);
log.info("Reply INSERT COUNT: " + insertCount);
return insertCount == 1
? new ResponseEntity<>("success", HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
//삼항 연산자 처리
}
}
```
</details>
----------
<details markdown="1">
<summary>@Produces</summary>
- ## @Produces
- @Produces 어노테이션은 자원이 생성하여 클라이언트로 다시 보낼 수있는 MIME 미디어 유형 또는 표현을 지정하는 데 사용
- @Produces가 클래스 수준에서 적용되면 리소스의 모든 메서드는 기본적으로 지정된 MIME 형식을 생성할 수 있음
- 메서드 수준에서 적용되면 클래스 수준에서 적용된 모든 @Produces 어노테이션을 재정의
- 자원의 메소드가 클라이언트 요청에서 MIME 유형을 생성 할 수없는 경우 Jersey 런타임은 HTTP "406 Not Acceptable"오류를 다시 보냄
```java
// 방법 1
@Produces({"application/xml", "application/json"})
public String doGetAsXmlOrJson() {
...
}
// 방법 2
@GetMapping(value="/{rno}", produces= {MediaType.APPLICATION_ATOM_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE})
public ResponseEntity<ReplyVO> get(@PathVariable("rno") Long rno){
log.info("get : " + rno);
return new ResponseEntity<>(service.get(rno), HttpStatus.OK);
}
@Consumes
@Consumes
- @Consumes 어노테이션은 리소스가 클라이언트에서 받아 들일 수 있거나 소비 할 수있는 표현의 MIME 미디어 유형을 지정하는 데 사용
- @Consumes가 클래스 수준에서 적용되면 모든 응답 메서드는 기본적으로 지정된 MIME 형식을 허용함
- @Consumes가 메소드 레벨에서 적용되면, 클래스 레벨에서 적용된 @Consumes 어노테이션을 대체
- 자원이 클라이언트 요청의 MIME 유형을 사용할 수 없으면 Jersey 런타임은 HTTP "415 지원되지 않는 매체 유형" 오류를 다시 보냄
// 방법 1
@POST
@Consumes("text/plain")
public void postClichedMessage(String message) {
// Store the message
}
// 방법2
@PostMapping(value="/new", consumes="application/json", produces= {MediaType.TEXT_PLAIN_VALUE})
public ResponseEntity<String> create(@RequestBody ReplyVO vo){
log.info("ReplyVO: " + vo);
int insertCount = service.register(vo);
log.info("Reply INSERT COUNT: " + insertCount);
return insertCount == 1
? new ResponseEntity<>("success", HttpStatus.OK)
: new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
//삼항 연산자 처리
}
MIME 타입 전체목록
MIME 타입 전체목록
MIME Type
확장자 문서 종류 MIME 타입 .aac
AAC 오디오 파일 audio/aac
.abw
AbiWord 문서 application/x-abiword
.arc
아카이브 문서 (인코딩된 다중 파일) application/octet-stream
.avi
AVI: Audio Video Interleave video/x-msvideo
.azw
아마존 킨들 전자책 포맷 application/vnd.amazon.ebook
.bin
모든 종류의 이진 데이터 application/octet-stream
.bz
BZip 아카이브 application/x-bzip
.bz2
BZip2 아카이브 application/x-bzip2
.csh
C-Shell 스크립트 application/x-csh
.css
Cascading Style Sheets (CSS) text/css
.csv
Comma-separated values (CSV) text/csv
.doc
Microsoft Word application/msword
.epub
Electronic publication (EPUB) application/epub+zip
.gif
Graphics Interchange Format (GIF) image/gif
.htm
.htmlHyperText Markup Language (HTML) text/html
.ico
Icon 포맷 image/x-icon
.ics
iCalendar 포맷 text/calendar
.jar
Java 아카이브 (JAR) application/java-archive
.jpeg
.jpg
JPEG 이미지 image/jpeg
.js
JavaScript (ECMAScript) application/js
.json
JSON 포맷 application/json
.mid
.midi
Musical Instrument Digital Interface (MIDI) audio/midi
.mpeg
MPEG 비디오 video/mpeg
.mpkg
Apple Installer Package application/vnd.apple.installer+xml
.odp
OpenDocuemnt 프리젠테이션 문서 application/vnd.oasis.opendocument.presentation
.ods
OpenDocuemnt 스프레드시트 문서 application/vnd.oasis.opendocument.spreadsheet
.odt
OpenDocument 텍스트 문서 application/vnd.oasis.opendocument.text
.oga
OGG 오디오 audio/ogg
.ogv
OGG 비디오 video/ogg
.ogx
OGG application/ogg
.pdf
Adobe Portable Document Format (PDF) application/pdf
.ppt
Microsoft PowerPoint application/vnd.ms-powerpoint
.rar
RAR 아카이브 application/x-rar-compressed
.rtf
Rich Text Format (RTF) application/rtf
.sh
Bourne 쉘 스크립트 application/x-sh
.svg
Scalable Vector Graphics (SVG) image/svg+xml
.swf
Small web format (SWF) 혹은 Adobe Flash document application/x-shockwave-flash
.tar
Tape Archive (TAR) application/x-tar
.tif
.tiffTagged Image File Format (TIFF) image/tiff
.ttf
TrueType Font application/x-font-ttf
.vsd
Microsft Visio application/vnd.visio
.wav
Waveform Audio Format audio/x-wav
.weba
WEBM 오디오 audio/webm
.webm
WEBM 비디오 video/webm
.webp
WEBP 이미지 image/webp
.woff
Web Open Font Format (WOFF) application/x-font-woff
.xhtml
XHTML application/xhtml+xml
.xls
Microsoft Excel application/vnd.ms-excel
.xml
XML
application/xml
.xul
XUL application/vnd.mozilla.xul+xml
.zip
ZIP archive application/zip
.3gp
3GPP 오디오/비디오 컨테이너 video/3gpp
audio/3gpp
if it doesn't contain video.3g2
3GPP2 오디오/비디오 컨테이너 video/3gpp2
audio/3gpp2
if it doesn't contain video.7z
7-zip 아카이브 application/x-7z-compressed
출처
728x90
'개발 지식 > Memo' 카테고리의 다른 글
REST API JunitTest(MockMvc) (0) | 2022.01.27 |
---|---|
MockMvc Annotation 정리 (0) | 2022.01.26 |
REST Controller 반환 타입 정리 (0) | 2022.01.25 |
String to Double Array (String -> Double[]) 변경 (0) | 2021.05.26 |
String to Int Array (String -> int[]) 변경 (0) | 2021.05.26 |