- 계획
- 문제점
- 키보드가 아직 오지 않음.. (화상 키보드 사용 중)
- 보완할 점
- 공부가 어려울수록 의자에 있기 힘들다.. ;ㅁ;
- 키보드 엿같다
- 내일 계획
- 오늘의 공부
1. MVC
- 소프트웨어 디자인 패턴 중 하나
- MVC를 각각 Model, View, Controller로 구분하여 각각 역할 분리
1) Model
- 데이터와 비즈니스 로직 담당
- 데이터베이스와 연동, 데이터를 저장하고 불러오는 작업 등을 수행
2) View
- 사용자 인터페이스 담당(보여지는것)
- 화면, 버튼, 폼 등을 디자인하고 구현
3) Controller
- model과 view 사이의 상호작용을 조정하고 제어
- 사용자 입력을 받아 model에 전달, model의 결과를 바탕으로 view를 업데이트
2. Spring MVC란?
- Spring에서 MVC 패턴을 적용하여 http 요청을 효율적으로 처리하기 위한 패턴
1) Servlet이란?
- 자바를 사용해 웹 페이지를 동적으로 생성하는 서버측 프로그램 또는 사양
- 개발자가 http 프로토콜 구조를 알고 있다고 하더라도 매번 그 데이터를 가져와 코드를 작성하면
비효율적이므로 HttpServletRequest 객체에 넣어 자동생성 해준다(이 뜻이 맞나?)
-> 응답을 위한 HttpServletResoponse 객체도 같이 생성
2) Front Controller
- 모든 API요청을 서블릿 동작 방식에 맞춰 구현하려면 너무 많은 클래스가 필요.
- 따라서 Spring은 DispatcherServlet을 사용해 Front Controller 패턴 방식으로 API 요청을 효율적 처리
- 분석
클라이언트(브라우저)에서 http요청 -> DispatcherServlet 객체가 요청 분석 -> Handler mapping을 통해 Controller를 찾아 요청 전달
- Controller -> DispatcherServlet 전달 시 데이터(Model)와 View정보 전달
- DispatcherServlet -> Client 전달 시 ViewResolver를 통해 Model이 적용된 View를 Client에게 전달
3. Controller 이해하기
- Spring MVC가 Front Controller패턴이 적용되지 않았다면 API처리를 위해 각각의 파일을 만들어 클래스를 별도로 만들었어야함.
- 유사한 성격의 API를 Controller로 관리 가능
- 메서드 이름도 자유(단, 클래스 내 중복 메서드 불가)
- @Controller 에너테이션은 해당 클래스가 Controller로서 역할 등록을 할 수 있게 해줌
- DispatcherServlet이 http 메소드에 매핑 되는 에너테이션 종류
@GetMapping, @PostMapping, @PutMapping, @DeletMapping
- @RequestMapping 에너테이션은 중복되는 URL을 단축가능 -> /api/get, /api/post 등에서 /api 생략가능
4. 정적페이지와 동적페이지
- 정적 페이지는 SpringBoot 서버에 html파일을 바로 요청하면 static 폴더 내 html 파일을 즉시 반환함.
- 이미 이대로 완성된 html파일이므로 Controller을 거치지 않고 반환함 -> Controller를 거칠 수 있지만 굳이?
(gradle에서 관련 코드를 주석처리하면 Controller를 거치고 반환 가능)
("redirect:"를 사용하면 gradle에서 코드 주석처리 하지 않고 Controller를 거치고 반환)
- 브라우저에서 바로 접근하지 못하게 하거나 특정 상황에서 Controller를 통해 제어하려면 templates를 사용하는 방법도 있음. (templates 폴더에 정적 html을 추가하고 파일명만 리턴하면 됨)
private static long visitCount = 0;
...
@GetMapping("/html/dynamic")
public String htmlDynamic(Model model) {
visitCount++;
model.addAttribute("visits", visitCount);
return "hello-visit";
}
- 동적페이지는 데이터(클라이언트 요청)를 모델에 넣는데(DB조회가 필요하면 DB작업 후 처리된 데이터를 저장), 스프링에서는 객체로 제공하고 있음(Model 클래스)
- 모델 어트리뷰트 부분이 동적으로 변함.
- Template engine(Thymeleaf)에게 View, Model을 전달
(View = 동적 Html파일, Model = View에 적용할 '정보')
- 여기서 View정보 = hello-visit 리턴 -> resources/templates/hello-visit.html
- model정보 = visit 횟수(visitCount)