스프링 REST API

오의석·2022년 10월 27일

스프링

목록 보기
13/16

1. 어노테이션

  • @RestController
    컨트롤러가 Rest로 처리된다는 것을 알기 위함
  • @ResponseBody (RestController를 하면 생성된 함수들을 ResponseBody로 설정됨)
    데이터 자체를 전달
  • @PathVariable
    url 파라미터로 추출
  • @CrossOrigin
    ajax 크로스도메인 문제 해결(교차 정책)
    어떤 주소를 통해 온 사람만 허용할 수 있도록 설정(보안 문제)
  • @RequestBody
    원하는 타입을 전달받을 때(WAS기준)

2. 설계

예시

서비스			기능		method		URI		  request_DATA		response_DATA
게시판(article)저장		POST		/articles JSON				NONE			
			  수정	  UPDATE	  /articles JSON			  NONE
			  삭제	  DELETE	  /articles	NONE			  NONE
              목록	  GET		  /articles NONE			  JSON

3. CORS

교차 출러 리소스 공유
Cross-Origin Resource Sharing의 약자
추가 http 헤더를 사용하여, 접근 권한을 부여하도록 브라우저에 알려주는 체제입니다.
보안 상의 이유로, 브라우저는 스크립트에서 시작한 교차 출처 http 요청을 제한합니다.

4. 사용예시

@RestController
@RequestMapping("/articles")
@CrossOrigin("*")
public class ArticleRestController {

@GetMapping("/article/{id}")
	@ApiOperation(value = "{id}에 해당하는 기사 정보를 반환한다.", response = Article.class)
	public ResponseEntity<?> select(@PathVariable String id) {
		try {
			Article artcle = service.select(id);
			if (artcle != null)
				return new ResponseEntity<Article>(artcle, HttpStatus.OK);
			else
				return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
		} catch (SQLException e) {
			return new ResponseEntity<Void>(HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}
    
    @GetMapping("/article")
	@ApiOperation(value = "query string에 해당하는 검색 조건에 해당하는 기사 목록을 반환한다.", response = Article.class)
	public ResponseEntity<?> search(@RequestBody SearchCondition condition) {
		try {
			List<Article> articles = service.search(condition);
			if (articles != null && !articles.isEmpty())
				return new ResponseEntity<List<Article>>(articles, HttpStatus.OK);
			else
				return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);

		} catch (SQLException e) {
			return new ResponseEntity<Void>(HttpStatus.INTERNAL_SERVER_ERROR);

		}
	}
}

https:/blahblah/context-path/articles/article 로 받아올 수 있다.

5. jackson library를 사용

ResponseEntity<?>로 반환하면 자동으로 json으로 변환하여 전송한다.

ResponseEntity<?> 반환
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson-databind-version}</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.json/json -->
		<dependency>
		    <groupId>org.json</groupId>
		    <artifactId>json</artifactId>
		    <version>${json-version}</version>
		</dependency>

추가

session 등록을 하면 안된다(stateless 로 구현. 즉, 토큰을 전달해야 한다.)

profile
끊임없이 나아가는 사람이 되어볼게요.

1개의 댓글

comment-user-thumbnail
2022년 12월 11일

자세해서 좋아요~~

답글 달기