일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- pandas
- 졸프
- Spring Boot
- Loss Function
- google cloud
- Expo
- AWS
- Spring
- 양방향 매핑
- 순환참조
- OG tag
- JPA
- @Transactional
- 커스텀 데이터 학습
- google login
- marksense.ai
- oauth
- google 로그인
- STT
- 코드업
- skt fellowship 3기
- YOLOv5
- 2021 제9회 문화공공데이터 활용경진대회
- idToken
- react native
- matplotlib
- html
- yolo
- javascript
- C++
- Today
- Total
민팽로그
servlet과 객체지향 프로그래밍(OOP:Object-Oriented Programming) 본문
servlet은 웹 페이지를 동적으로 생성하기 위한 자바 프로그램으로, JAVA 코드 안에 HTML이 삽입되어 있다.
controller, service, repository를 사용하지 않고도 servlet을 통해 웹 에플리케이션을 만들 수 있지만 매우 복잡한 코드를 작성하게 된다.
이런식. 스프링 없이 자바만 사용하여 서버 구현이 가능하다.
@WebServlet(urlPatterns = "/api/products/*", loadOnStartup = 1)
public class AllInOneServlet extends HttpServlet {
// 신규 관심상품 등록
// POST /api/products
@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();
String productJson = objectMapper.writeValueAsString(product);
// 응답 보내기
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.print(productJson);
out.flush();
}
}
이 경우 doPost, doGet 등을 오버라이드하여 요청과 응답에 관한 코드, DB연결에 관한 코드, JSON처리에 관한 코드까지 모두 신경써주어야 하기 때문에 개발자들이 신경써야 할 부분이 매우 많다. spring은 개발자가 중요한 비즈니스 로직 개발에 더 집중할 수 있도록 DB연결, JSON으로 변환 등의 반복적이고 실수가 많은 작업을 대신 처리해준다.
-> 클라이언트로부터 request가 들어오면 DispatcherServlet에 전달한다.
-> DispatcherServlet이 request를 받아 url이 어떤 컨트롤러에 해당하는지 Handler mapping을 통해 알아낸 후 Controller에 request를 전달한다.
-> Controller가 request를 처리한 후 Response를 보내준다.
@RestController
@Controller + @ResponseBody의 역할을 함 -> header의 content-type을 셋팅해줌(application/json같은거로 셋팅해주는건가?)
1. View를 통한 HTML 응답
@Controller
class ExamController {
@GetMapping("/home")
public String home() {
return "/home.html"; //html 문서를 내려줌
}
}
2. @Controller에서 JSON 응답이 필요할 때
-> JSON 응답이 필요한 메소드에 @ResponseBody를 붙여주어야 한다.
@Controller
class ExamController {
@Autowird
private ProductRepository productRepository
@GetMapping("/product/list")
public @ResponseBody List<Product> getProducts() {
return productRepository.findAll();
}
}
3. @RestController
@RestController
class ExamController {
@Autowird
private ProductRepository productRepository
@GetMapping("/product/list")
public List<Product> getProducts() {
return productRepository.findAll();
}
}
위에서 servlet을 활용한 api 처리 내용은 해야 할 일을 쭉 나열하여 코딩한 절차적 프로그래밍이다. controller, service, repository를 사용하면 객체지향 프로그래밍(OOP)을 할 수 있다.
OOP는 객체 하나가 하나의 역할을 하도록 관련 기능들을 모아놓은 프로그래밍 방식이다. 스프링에서 기본으로 나뉘던 controller, service, repository가 객체지향 프로그래밍의 흔한 예시이다.
controller는 클라이언트의 요청을 받아 응답하는 역할을, service는 controller에서 넘어온 요청에 대한 처리(비즈니스 로직 처리) 역할을, Repository는 DB 관리 및 CRUD 작업 처리를 한다.
OOP를 하게 되면 역할이 확실하게 나뉘어 있어 관리, 리팩토링을 쉽게 할 수 있다.
리팩토링(refactoring) 이란?
기능 상의 변경 없이 코드의 내부 구조를 개선하는 것. 가독성을 높이고 역할별로 잘 분리된 코드를 만드는 것으로 협업 환경 개선에도 도움이 된다.
'🍃spring boot' 카테고리의 다른 글
스프링 AOP 개념 간단 이해 (0) | 2021.09.14 |
---|---|
[OAuth] 웹에서 카카오 소셜 로그인 (0) | 2021.09.13 |
DI(Dependency Injection)와 스프링 IoC 컨테이너 (0) | 2021.09.12 |
[spring] scheduler - cron (0) | 2021.08.24 |
스프링 구조 - Controller, Service, Repository (0) | 2021.07.31 |