Suvlet
- 자바를 이용하여 웹페이지를 동적으로 생성하는 서버 프로그램
- 스프링을 사용하지 않고 자바에서 서버를 구현할 수 있다.
- 클라이언트는 자바스크립트, 서버는 자바로 서로 다른 언어이기 때문에 데이터를 주고받을 때는 JSON 이라는 데이터 형식을 사용
suvlet 으로 POST API 구현
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 요청 Body 의 JSON -> 자바 객체
ProductRequestDto requestDto = null;
StringBuffer jb = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null)
jb.append(line);
ObjectMapper objectMapper = new ObjectMapper();
requestDto = objectMapper.readValue(jb.toString(), ProductRequestDto.class);
} catch (Exception e) { /*report an error*/ }
// 요청받은 DTO 로 DB에 저장할 객체 만들기
Product product = new Product(requestDto);
LocalDateTime now = LocalDateTime.now();
product.setCreatedAt(now);
product.setModifiedAt(now);
// DB 연결
try {
Connection connection = DriverManager.getConnection("jdbc:h2:mem:springcoredb", "sa", "");
// DB Query 작성
PreparedStatement ps = connection.prepareStatement("select max(id) as id from product");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
// product id 설정 = product 테이블의 마지막 id + 1
product.setId(rs.getLong("id") + 1);
} else {
throw new SQLException("product 테이블의 마지막 id 값을 찾아오지 못했습니다.");
}
ps = connection.prepareStatement("insert into product(id, title, image, link, lprice, myprice, created_at, modified_at) values(?, ?, ?, ?, ?, ?, ?, ?)");
ps.setLong(1, product.getId());
ps.setString(2, product.getTitle());
ps.setString(3, product.getImage());
ps.setString(4, product.getLink());
ps.setInt(5, product.getLprice());
ps.setInt(6, product.getMyprice());
ps.setString(7, product.getCreatedAt().toString());
ps.setString(8, product.getModifiedAt().toString());
// DB Query 실행
ps.executeUpdate();
// DB 연결 해제
ps.close();
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
// 자바 객체 -> JSON 으로 변환
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
String productJson = objectMapper.writeValueAsString(product);
// 응답 보내기
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.print(productJson);
out.flush();
}
controller로 POST API 구현
@RequiredArgsConstructor
@RestController
public class ProductRestController {
private final ProductRepository productRepository;
// 등록된 전체 상품 목록 조회
@GetMapping("/api/products")
public List<Product> getProducts() {
return productRepository.findAll();
}
// 관심 상품 저장
@PostMapping("/api/products")
public Product createProduct(@RequestBody ProductRequestDto requestDto){
Product product = new Product(requestDto);
return productRepository.save(product);
}
}