2022년 4월 12일(화)
[스파르타코딩클럽] Spring 심화반 - 1주차
Servlet(서블릿): 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말함
예시 (현업에서 소수 Servlet을 사용한다 함)
@WebServlet(urlPatterns = "/api/search")
public class ItemSearchServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 1. API Request 의 파라미터 값에서 검색어 추출 -> query 변수
String query = request.getParameter("query");
// 2. 네이버 쇼핑 API 호출에 필요한 Header, Body 정리
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", [Naver-Client-Id]);
headers.add("X-Naver-Client-Secret", [Naver-Client-Secret]);
String body = "";
HttpEntity<String> requestEntity = new HttpEntity<>(body, headers);
// 3. 네이버 쇼핑 API 호출 결과 -> naverApiResponseJson (JSON 형태)
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=" + query, HttpMethod.GET, requestEntity, String.class);
String naverApiResponseJson = responseEntity.getBody();
// 4. naverApiResponseJson (JSON 형태) -> itemDtoList (자바 객체 형태)
// - naverApiResponseJson 에서 우리가 사용할 데이터만 추출 -> List<ItemDto> 객체로 변환
ObjectMapper objectMapper = new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonNode itemsNode = objectMapper.readTree(naverApiResponseJson).get("items");
List<ItemDto> itemDtoList = objectMapper
.readerFor(new TypeReference<List<ItemDto>>() {})
.readValue(itemsNode);
// 5. API Response 보내기
// 5.1) response 의 header 설정
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
// 5.2) response 의 body 설정
PrintWriter out = response.getWriter();
// - itemDtoList (자바 객체 형태) -> itemDtoListJson (JSON 형태)
String itemDtoListJson = objectMapper.writeValueAsString(itemDtoList);
out.print(itemDtoListJson);
out.flush();
}
}
@Controller
public class UserController {
@GetMapping("/user/login")
public String login() {
// ...
}
@GetMapping("/user/logout")
public String logout() {
// ...
}
@GetMapping("/user/signup")
public String signup() {
// ...
}
@PostMapping("/user/signup")
public String registerUser(SignupRequestDto requestDto) {
// ...
}
}
스프링 MVC : MVC (Model - View - Controller) 디자인 패턴
정적 (static) 웹 페이지에서 Controller
동적 (dynamic) 웹 페이지에서 Controller
스프링 MVC 동작원리
Client 와 Server 간 Request, Response 는 HTTP 메시지 규약을 따름
HTTP 메시지는 웹 서비스 개발자(백엔드, 프론트 개발자)에게 매우 중요한 내용이다. (API 통신시 안되는 이유를 쉽게 파악 가능)
HTTP Request 메시지 구조(필요 내용만)
HTTP Response 메시지 구조(필요 내용만)
추가 내용 : velog 참고
Controller 와 HTTP Response 메시지
동적 웹페이지 예시 (Thymeleaf 사용)
private static long visitCount = 0;
@GetMapping("/html/dynamic")
public String helloHtmlFile(Model model) {
visitCount++;
model.addAttribute("visits", visitCount);
return "hello-visit";
}
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Hello Spring</title></head>
<body>
<div>
Hello, Spring 동적 웹 페이지!!
</div>
<div>
(방문자 수: <span th:text="${visits}"></span>)
</div>
</body>
</html>
현재 Servlet 대신 Controller 사용중 문제점 발생
AllInOneController 클래스의 문제점
객체지향 프로그래밍(Object-Oriented Programming)을 통해 하나의 파일에 너무 많은 코드가 들어가지 않게, 역할별로 코드를 분리하고, 코드를 읽기 편하게 할 수 있다.