이전에 만든 뉴스서비스에 REST API를 추가하여
REST API 서버를 구현할것이다.
웹 기반 뉴스 서비스를 스마트폰에도 제공해야 하는 경우
REST API만 추가하면 스마트폰과 웹 모두 지원되는 웹 서비스 구현이 가능하다.
1️⃣ API 설계
뉴스 등록, 삭제, 목록, 상세 보기 기능 전부 API로 구현하며
세부 API는 아래와 같다.
기능 | 메소드 | URI | 설명 |
뉴스등록 | POST | /news | 뉴스 등록을 위한 데이터를 JSON으로 HTTP body에 전달. |
뉴스삭제 | DELETE | /news/aid | 뉴스 삭제를 위한 aid경로를 파라미터로 전달. |
뉴스목록 | GET | /news | 전체 뉴스 목록을 JSON으로 전달. |
뉴스상세보기 | GET | /news/aid | 특정 뉴스의 aid경로를 파라미터로 전달. |
2️⃣ API 구현
클래스 생성 및 뉴스 등록
src/main/java의 ch12패키지에 NewsApiService클래스를 만들어주자.
package ch12;
import ch10.News;
import ch10.NewsDAO;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
@Path("news")
public class NewsApiService {
NewsDAO dao;
public NewsApiService() {
dao = new NewsDAO();
}
//뉴스등록
@POST
@Consumes(MediaType.APPLICATION_JSON)
public String addNews(News news) {
try {
dao.addNews(news);
}
catch (Exception e) {
e.printStackTrace();
}
return "News API : 뉴스 등록됨!!";
}
}
ch10에서 만든 NewsDAO를 사용하기때문에 ch10을 임포트해줬다.
- @POST : POST 방식으로 요청 처리.
- @Consumes(...) : 클라이언트 요청에 포함된 미디어 타입의 유형을 지정
addNews() 메소드의 인자로 News타입이 요구된다.
@Consumes 설정에 따라 HTTP Body에 포함된 JSON 문자열이 자동으로 News로 변환된다ㅣ.
이를 위해 JSON 문자열의 키와 News 객체의 멤버 변수명이 동일해야한다.
결론은 API 요청을 받아들이는 부분만 제외하면
대부분은 dao의 메소드 호출해주는것으로 구현이 끝난다.
실질적으로 따져보면 dao.addNews() 하나이며,
나머지는 처리부분이다.
뉴스 삭제
뉴스 삭제를 위해서 삭제할 뉴스의 aid가 필요하다.
여기서는 경로 파라미터를 사용해 삭제할 id값을 전달할것이다.
요청 메서드는 DELETE이며, GET으로 삭제를 요청하면 동작하지 않는다.
경로 파라미터는 @Path로 지정하고
인자에 @PathParam 애너테이션을 사용해 데이터가 전달되도록 할것이다.
@DELETE
@Path("{aid}")
public String delNews(@PathParam("aid") int aid) {
try {
dao.delNews(aid);
}
catch (SQLException e) {
e.printStackTrace();
return "News API : 뉴스 삭제 실패 !! - "+aid;
}
return "News API : 뉴스 삭제됨 !! - "+aid;
}
삭제의 경우 dao 처리 과정에서 문제가 생길수도 있다.
따라서 문제 발생시 에러 메시지를 리턴해줘야 한다.
뉴스 목록 조회
전체 뉴스 목록 조회는 JSON 배열 형태로 전달되어야한다.
그리고 여기에 List 타입을 리턴하면 자동으로 변환되며 별도 작업이 필요없다.
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<News> getNewsList() {
List<News> newsList = null;
try {
newsList = dao.getAll();
}
catch (Exception e) {
e.printStackTrace();
}
return newsList;
}
- @Produces : 응답 콘텐츠의 타입으로 앞에서 요청처리에 사용된 @Consumes와 같은 개념이다. 지정한 타입에 따라 리턴 객체를 처리하는 방법이 다르다.
뉴스 상세 정보 조회
목록에서 특정 뉴스를 선택했을때 상세정보를 제공하기 위한 요청은 GET방식을 사용하고
삭제와 동일하게 동일하게 경로 파라미터를 사용해 aid를 전달할것이다.
@GET
@Path("{aid}")
@Produces(MediaType.APPLICATION_JSON)
public News getNews(@PathParam("aid") int aid) {
News news = null;
try {
news = dao.getNews(aid);
}
catch (SQLException e) {
e.printStackTrace();
}
return news;
}
- 리턴타입은 News이고 @Produces를 통해 json으로 전달하게된다.
3️⃣ 실행 결과 확인
뉴스 서비스와 연동하기 때문에 DB와 연결되어있어야 한다.
필자의 경우 MariaDB를 사용했다.
그리고 톰캣을 실행하고 Postman에서 API를 호출해 결과를 확인하면 된다.
GET 방식의 경우 브라우저만으로도 테스트가 가능하다.
뉴스 목록 조회
우선 필자의 DB의 데이터는 이렇게 되어있다.
이제 포스트맨에 GET 메소드로
localhost:포트/api/news를 입력하고 결과를 확인해보자.
뉴스 등록과 상세 정보 조회
뉴스를 등록해볼것이다.
그리고 아래처럼 설정해주자.
그리고 텍스트 작성공간에는 JSON데이터를 작성해줄것이다.
작성에 앞서 유의할점을 먼저 설명하겠다.
- aid값은 DB에서 자동처리되므로 aid필드가 포함되지 않도록 해야한다.
- 키와 값 모두 " "로 감싸야한다.
- 각 필드 끝에는 , 가 들어가야 한다.
- 마지막 데이터 필드에는 , 가 들어가면 안된다.
- 이미지의 경우 이미지의 URL을 사용해야한다.
다음으로 아래 json코드를 복사해서 넣어보자.
{
"title": "6인 이상 집합 금지",
"img": "https://imgnews.pstatic.net/image/056/2021/03/27/0011014592_004_20210327061918078.png?type=w647",
"date": "2021-03-28 13:55:35",
"content": "코로나로 인한 집합 금지"
}
뉴스 삭제
뉴스 삭제는 요청 메소드를 DELETE로 하고
파라미터로 aid값을 지정해서 보내보자.
만약 뉴스가 삭제되지 않는다면
NewsApiService에 아래 코드를 넣어주자.
import javax.websocket.server.PathParam;
[메인으로 돌아가기]
'Java Spring > 책공부 1 (JSP와 스프링)' 카테고리의 다른 글
29. 스프링 MVC 컨트롤러 구현 (0) | 2022.07.19 |
---|---|
28. 스프링 개발환경 설정 (0) | 2022.07.19 |
26. Postman으로 REST API 테스트 (0) | 2022.07.18 |
25. JAX-RS로 REST API 서버 구현 (0) | 2022.07.18 |
24. 한글 처리 필터 구현 (0) | 2022.07.15 |