이전에 만든 뉴스 API는 JAX-RS를 사용했다.
이번에는 RestController을 사용할것이다.
물론 REST API는 이미 어노테이션을 이용해 구현한 것이므로 어노테이션만 스프링 버젼으로 바꾸면된다.
기존코드는 거의 변경할게 없다.
우선 이전에 생성해둔 NewsApoiController.java에 기존코드 내용을 복사해 어노테이션만 바꿔주자.
1️⃣ NewsApiController 코드작성
클래스 선언
package com.example.news;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/news")
public class NewsApiController {
final NewsDAO dao;
@Autowired
public NewsApiController(NewsDAO dao) {
this.dao = dao;
}
}
API 요청은 /api/news로 시작한다.
addNews()
뉴스 추가를 위한 addNews() 메소드는 POST요청에 동작해야하며
Request Body로 전달되는 JSON 데이터를 News 객체로 매핑해야한다.
@RequestBody 어노테이션을 사용해주면된다.
@PostMapping
public String addNews(@RequestBody News news) {
try {
dao.addNews(news);
}
catch (Exception e) {
e.printStackTrace();
return "News API : 등록 실패!";
}
return "News API : 뉴스 등록됨!!"
}
REST API를 통해 등록되는 뉴스의 경우 파일은 별도로 전송해야한다.
여기서 구현한 버전은 Request Body에 json으로 데이터를 전달하기 때문에
multipart-form-data 형식으로 데이터와 파일을 함께 전송하지 못한다 . . .
여기서는 별도의 파일전송은 생략 하므로 api로 등록하는 뉴스의 경우 url로 참조 가능한 이미지를 사용해주자.
delNews()
뉴스 삭제를 위한 delNews() 메소드는 DELETE 요청에 동작해야한다.
경로는 파라미터로 aid 값을 받아 사용할것이다.
웹이랑 마찬가지로 @PathVariable 어노테이션을 사용한다.
@DeleteMapping("{aid}")
public String delNews(@PathVariable("aid") int aid) {
try {
dao.delNews(aid);
}
catch (SQLException e) {
e.printStackTrace();
return "News API : 뉴스 삭제 실패!";
}
return "News API : 뉴스 삭제됨!";
}
getNewsList()
뉴스 목록을 제공하기 위한 getNewsList() 메소드는 GET 요청에 동작한다.
List<News> 타입을 리턴하면 기본적으로 Json 으로 전달된다.
@GetMapping
public List<News> getNewsList() {
List<News> newsList = null;
try {
newsList = dao.getAll();
}
catch (Exception e) {
e.printStackTrace();
}
return newsList;
}
getNews()
뉴스 상세 정보 제공을 위한 getNews() 메소드는 GET요청에 동작한다.
aid 참조는 delNews()와 똑같다.
@GetMapping("{aid}")
public News getNews(@PathVariable("aid") int aid) {
News news = null;
try {
news = dao.getNews(aid);
}
catch (SQLException e) {
e.printStackTrace();
}
return news;
}
전체코드
package com.example.news;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.sql.SQLException;
import java.util.List;
@RestController
@RequestMapping("/api/news")
public class NewsApiController {
final NewsDAO dao;
@Autowired
public NewsApiController(NewsDAO dao) {
this.dao = dao;
}
//뉴스 등록
@PostMapping
public String addNews(@RequestBody News news) {
try {
dao.addNews(news);
}
catch (Exception e) {
e.printStackTrace();
return "News API : 등록 실패!";
}
return "News API : 뉴스 등록됨!!";
}
//뉴스 삭제
@DeleteMapping("{aid}")
public String delNews(@PathVariable("aid") int aid) {
try {
dao.delNews(aid);
}
catch (SQLException e) {
e.printStackTrace();
return "News API : 뉴스 삭제 실패!";
}
return "News API : 뉴스 삭제됨!";
}
//뉴스 목록
@GetMapping
public List<News> getNewsList() {
List<News> newsList = null;
try {
newsList = dao.getAll();
}
catch (Exception e) {
e.printStackTrace();
}
return newsList;
}
//뉴스 상세 정보
@GetMapping("{aid}")
public News getNews(@PathVariable("aid") int aid) {
News news = null;
try {
news = dao.getNews(aid);
}
catch (SQLException e) {
e.printStackTrace();
}
return news;
}
}
2️⃣ 실행 및 테스트
이전에 사용해본 Postman으로 진행 가능하다.
이전에 Postman을 사용한 게시글과 같이 동일하게 테스트해보자!
주의할점으로 뉴스등록을 테스트할때는 헤더 부분에 Content-Type을 application/json으로 추가해줘야한다.
JAX-RS에선 요청 헤더가 없어도 처리를 해주지만
원칙적으론 정확한 Content-Type을 넣어주는것이 좋다.
지금까지 따라오느라 고생이 많았습니다.
[메인으로 돌아가기]
'Java Spring > 책공부 1 (JSP와 스프링)' 카테고리의 다른 글
32. 스프링 뉴스 웹 구현 (0) | 2022.07.20 |
---|---|
31. 프로젝트 개요 및 설정 (0) | 2022.07.19 |
30. 스프링 RestController구현 (0) | 2022.07.19 |
29. 스프링 MVC 컨트롤러 구현 (0) | 2022.07.19 |
28. 스프링 개발환경 설정 (0) | 2022.07.19 |