1.예제 개요
클라이언트가 카테고리에 맞는 피드만을 출력하길 원함.
카테고리 이름(ex. "한식" , "일식" 등 )을 서버에 요청(Request)시,
서버는 서버에 저장된 피드의 데이터 중, 클라이언트가 요청한 카테고리와 일치하는 피드ID를 응답(Response) 하는 코드를 작성.
2.전체 코드
@WebServlet("/category")
public class CategoryList extends HttpServlet {
private static final long serialVersionUID = 1L;
private String[] categoryArray = {
"한식",
"체험관광",
"카페",
"자연명소",
"양식",
"문화예술"
};
private class Feed {
private String feedName;
private String categoryName;
public Feed(String feedName, String categoryName) {
this.feedName = feedName;
this.categoryName = categoryName;
}
public String getCategoryName() {
return categoryName;
}
public String getFeedInfo() {
return "feedName :" + feedName + ", categoryName : " + categoryName + "\n";
}
}
private Feed[] feedArray = {
new Feed("1번피드", "한식"),
new Feed("2번피드", "체험관광"),
new Feed("3번피드", "카페"),
new Feed("4번피드", "자연명소"),
new Feed("5번피드", "양식"),
new Feed("6번피드", "한식"),
new Feed("7번피드", "체험관광"),
new Feed("8번피드", "카페"),
new Feed("9번피드", "카페"),
new Feed("11번피드", "양식"),
new Feed("12번피드", "한식"),
new Feed("13번피드", "체험관광"),
new Feed("14번피드", "카페"),
new Feed("15번피드", "문화예술"),
new Feed("16번피드", "양식"),
new Feed("17번피드", "문화예술"),
};
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String categoryName = request.getParameter("categoryName");
if(checkCategory(categoryName)) {
response.setCharacterEncoding("UTF-8");
response.setStatus(400);
response.getWriter().println("해당 카테고리는 존재하지 않습니다");
return;
}
Gson gson = new Gson();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
response.getWriter().println(gson.toJson(findFeedByCategoryName(categoryName)).toString());
}
private boolean checkCategory(String categoryName) {
for(int i = 0; i < categoryArray.length; i++) {
if(categoryArray[i].equals(categoryName)) {
return false;
}
}
return true;
}
private List<Feed> findFeedByCategoryName(String categoryName) {
List<Feed> feeds = new ArrayList<>();
for(int i = 0; i < feedArray.length; i++) {
if(feedArray[i].getCategoryName().equals(categoryName)) {
feeds.add(feedArray[i]);
}
}
return feeds;
}
}
3.오늘 학습한 Code 헤쳐보기
@WebServlet("/category")
public class CategoryList extends HttpServlet {
@WebServlet("/category") : 이 서블릿이 "/category" 경로의 요청을 처리할 것임을 지정
public class CategoryList extends HttpServlet { }
: HttpServlet을 확장하여 HTTP 요청과 응답을 처리하는 서블릿을 만듬.
private class Feed {
private String feedName;
private String categoryName;
public Feed(String feedName, String categoryName) {
this.feedName = feedName;
this.categoryName = categoryName;
}
-피드 이름과 카테고리 이름을 가지는 클래스(자료형)을 생성
-생성자 → 매개변수로 피드명과 카테고리명 받아와 인스턴수 변수에 저장
private Feed[] feedArray = {
new Feed("1번피드", "한식"),
new Feed("2번피드", "체험관광"),
new Feed("3번피드", "카페"),
// ...
};
feedArray 배열 : Feed 자료형(피드명, 카테고리명)을 가지며, 여러 피드(게시글) 데이터를 가지고 있는 배열로, 데이터를 선별하여 클라이언트에게 보내줄 대상이 되는 배열
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String categoryName = request.getParameter("categoryName");
if(!checkCategory(categoryName)) {
response.setCharacterEncoding("UTF-8");
response.setStatus(400);
response.getWriter().println("해당 카테고리는 존재하지 않습니다");
return;
}
}
// checkCategory() 내용
private boolean checkCategory(String categoryName) {
for(int i = 0; i < categoryArray.length; i++) {
if(categoryArray[i].equals(categoryName)) {
return true;
}
}
return false;
}
doGet 메서드 : GET(조회) 요청을 처리.
doGet 메서드의 매개변수는 HttpServletRequest HttpServletResponse 객체의 request, response 인스턴스를 가짐.
categoryName String 변수 = 클라이언트가 요청하는 정보
if문 : 유효성 검사,
if 안의 checkCategory 메서드 : 받아온 데이터가 있는지 유효성 검사함.
반복을 돌면서 일치하는 값이 없으면(유효하지 않으면) false를 반환, if문에선 true case, 클라이언트에게 오류응답을 보내고 일치하는 값이 없음을 알림.
일치하는 값이 있으면 바로 true를 반환하고 반복문 종료됨. true의 경우 아래의 case를 따르게 됨.
Gson gson = new Gson();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
response.getWriter().println(gson.toJson(findFeedByCategoryName(categoryName)).toString());
}
//findFeedByCategoryName() 내용
private List<Feed> findFeedByCategoryName(String categoryName) {
List<Feed> feeds = new ArrayList<>();
for(int i = 0; i < feedArray.length; i++) {
if(feedArray[i].getCategoryName().equals(categoryName)) {
feeds.add(feedArray[i]);
}
}
return feeds;
}
}
(유효성 검사 후 → true인 경우)
- Gson 객체를 생성, JSON 직렬화를 위한 준비
- 응답 문자 인코딩 : UTF-8, 컨텐츠타입 : Json 설정
response.getWriter().println(gson.toJson(findFeedByCategoryName(categoryName)).toString()); 부분 :
- findFeedByCategoryName 메서드 : 요청하는 데이터를 받아와서 피드에 일치하는 카테고리를 찾아오고 feeds라는 이름을 가진 새로운 ArrayList에 저장(선별) 후 이를 반환 :
- Json형식으로 변환(toJson) → 문자열로 변환( toString() ) → 응답을 보냄(getWriter().println(문자열)
그러면 클라이언트에서는 Json타입을 받아서 사용함!
4.결과
위 코드가 잘 작동하는지, Postman을 이용해 코드가 잘 작동하는지 테스트 해보았다.
4-1.유효한 데이터 요청시
JSON타입으로 응답했음을 알 수 있음.
4-2.유효하지 않은 데이터 요청시
작성한 코드처럼, 유효성 검사를 통과하지 못한 경우
400번 오류 응답과 함께 "해당 카테고리는 존재하지 않습니다" 응답을 해옴.
'Back-End > Java' 카테고리의 다른 글
(전공 정리)4강 - static, final, 오버로딩/오버라이딩, 상속, this, super, 메소드체이닝 (0) | 2024.06.22 |
---|---|
(전공 정리) 3강 - 배열, String, Scanner, 클래스, 접근제어자, 생성자 (0) | 2024.06.22 |
(전공 정리) 2강 - 변수, 자료형, 연산자, 반복문, 제어문 (0) | 2024.06.22 |
JDBC 사용하기(Java + MySQL) 쿼리날려보자! (0) | 2023.07.27 |
mySQL과 Java 연결하기(JDBC 라이브러리) (0) | 2023.07.26 |
for문, if문만 이용해 소수 찾는 프로그램 만들기 (기록용) (0) | 2023.05.27 |