Java Suvlet, Spring Controller 비교

김선미·2022년 6월 16일

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);
    }
}
profile
백엔드 개발 공부

0개의 댓글