JAN's History
스프링과 JPA를 이용한 웹개발_스프링MVC 본문
🤔MVC가 도대체 뭐야?
비즈니스 로직은 Controller에서 처리하고 화면에 보여지는 것은 View에서 처리하고 DataBase, 모델과 관련된 것은 Repository에 담아서 처리하는 분류된 모델구조입니다!
Front Controller 패턴이란?
모든 요청은 일단 Front Controller라는 입구를 통과하고 여기서 분기되는 구조
Front Controller의 필요 기능
- 요청 종류 파악(Parsing)
- 처리 가능한 컨트롤러 찾기
- 처리 가능한 컨트롤러에 작업 위임
- 컨트롤러 실행결과를 view에 전달
- html에 데이터를 binding하여 응답 페이지 생성 및 전달
- Request가 날아오면 Dispatcher Servlet을 통해 Front Controller가 구현이 됩니다. (스프링 프레임워크에서 제공해줌) 그리고 Parsing을 해서 요청에 따른 종류를 파악합니다.
- Controller 안에 여러 메소드가 있는데, Handler Mapping으로 적절한 Handler를 찾습니다.
- Handler를 찾으면 HandlerAdapter를 실행합니다.
- HandlerAdapter 를 실행한 후 Controller를 실행하게 됩니다.
- Controller가 DB를 조회해서 view name(= html 파일명)를 전달해줍니다.
- 예를 들어 게시판의 첫 번째 페이지를 보여달라는 요청이 들어왔을경우, getBoardByPages와 같은 서비스를 통해 적절한 데이터를 들고올 것이고 view name을 HandlerAdapter 에게 전달하는 것!
- 그러면 View Resolver가 Controller가 전달하는 진짜 view name이 어떤 파일에 있는지를 파악한다.
- 그리고 그 view를 model 렌더링해서
- Response로 전달하게 된다.
➡️스프링 프레임워크가 알아서 해주기 때문에 개발자는 Controller, Service, Repository, view name 정의 정도만 해주면 된다.
Handler Mapping
- 프론트 컨트롤러의 역할을 수행하는 DispatcherServlet은 HTTP request를 받아 처리를 담당할 컨트롤러를 찾음
- Handler Mapping을 통해 적절한 핸들러를 찾았다면 핸들러 호출은 Handler Adapter를 통해 수행
- 핸들러를 등록하고 찾는 방법이 다양함에 따라 Handler Mapping도 여러 종류가 존재
- BeanNameUrlHandlerMapping
- 요청 url과 같은 이름의 빈을 찾음: ex) 요청: "/foo", 빈 이름 "/foo" → 매칭(정규 표현식과 같이 패턴 매칭도 가능)
- SimpleUrlHandlerMapping
- URL 패턴에 매핑되는 지정된 Controller를 사용하는 방법
- RequestMappingHandlerMapping: 어노테이션이 붙은 컨트롤러를 매칭
- 이 방법을 가장 많이 씁니다
- BeanNameUrlHandlerMapping
Handleradapter
- HandlerMapping을 통해 핸들러를 찾았다면 해당 핸들러의 실행은 Handleradapter를 통해 수행
- adapter: 실행과 반환에 대한 규약만 지키면 사용자가 다양한 형태로 핸들러 정의 가능
- invokeHandlerMethod를 통해 핸들러를 실행하고 실행 결과를 ModelAndView로 변환해서 반환
- 종류
- SimpleControllerHandlerAdapter
- SimpleServletHandlerAdapter
- AnnotationMethodHandlerAdapter
- RequestMappingHandlerAdapter
- RequestMappingHandlerMapping을 사용하면 선택되는 Adapter
➕우리가 이것들을 사용하진 않고 스프링이 알아서 사용해주긴 합니다
ViewResolver
- ModelAndView에 실행 결과를 담았다면 응답으로 사용될 html 파일을 찾아야 함
- ModelAndView의 setViewName, addObject 메소드를 이용하여 각각 html파일과 전달할 데이터를 저장
- 뷰의 논리 이름을 물리이름으로 바꿈
- "/WEB-INF/views/board.jsp" → view를 지정할 때 매번 이렇게 전체를 지정하는 것은 번거로움
- 논리적 이름: board (우리가 사용하는 파일 이름만!)
- 물리적 이름: /WEB-INF/views/board.jsp (전체 경로)
- 프로그래머는 prefix와 suffix를 제외한 "board"만 지정하면 됨
- 단, 특별한 설정이 없다면 특정 경로 하위에 view 파일을 위치시켜야 함
- ex) thymeleaf → resources/templates
템플릿 엔진
- 정의 : 템플릿 양식과 특정 데이터 모델에 따른 입력 자료를 합성하여 결과 문서를 출력하는 소프트웨어
- 대표 템플릿 엔진의 특징
- JSP: 스프링 부트에서는 권장하지 않음. 특히 JSP를 사용할 경우, WAR로 배포해야 한다는 단점이 있다.
- 스프링부트를 사용하면 Web을 JAR로 배포해서 단순히 실행하면 된다는 장점이 있는데, JSP를 쓰면 WAR로 배포해야한다는 단점이 존재한다.
- Thymeleaf: 스프링 진영에서 권장
- Mustache: 문법이 다른 템플릿 엔진보다 심플하지만 기능이 제한적
- JSP: 스프링 부트에서는 권장하지 않음. 특히 JSP를 사용할 경우, WAR로 배포해야 한다는 단점이 있다.
스프링 부트
자동 설정
@SpringBootApplication
@SpringBootConfiguration
- 스프링에서는 @Configuration이 붙은 클래스를 스프링 설정 파일로 인식
@ComponentScan
- @Component 어노테이션을 가진 Bean들을 스캔해서 등록
- @Configuration, @Repository, @Service, @Controller, @RestController
@EnableAutoConfiguration
- @ComponentScan으로 빈이 등록된 이후, 추가적인 Bean들을 읽어 등록
웹 관련 추가 설정이 필요할 때(Customize)
- EnableAutoConfiguration에는 WebMvcAutoConfiguration이 포함되어 있음
- WebMVC와 관련된 설정 정보를 가지고 있음
- 스프링 MVC 어플리케이션 개발 시 직접 설정해주어야 했던 것들을 스프링 부트가 자동으로 설정
public class WebMvcAutoConfiguration {
- 스프링 부트가 제공하는 MVC 기능을 모두 사용하면서 추가적인 설정을 하는 방법
@Configuration
public class CustomConfig implements WebMvcConfigurer {
}
- 스프링부트에서는 @EnableWebMvc은 붙이면 안됨(부트 설정이 무시됨)
외부설정
application.properties
설정파일은 따로 빼둬 관리한다!
- Spring Boot가 application.properties에 명시된 설정 정보를 기본적으로 읽음
- key와 value로 표현
- 'src/main/resources' 폴더에 위치
@Value("${name}")
private String name;
@RequestMapping("/log-test")
public String logTest() {
System.out.println("name=" + name);
return name;
}
프로퍼티를 정의하는 방법은 다양하며 우선순위가 존재한다.
YML (요즘 이걸 더 많이 사용합니다)
- YAML is a human-friendly notation used in configuration files
- properties 대비 장점
- 계층구조로 이루어져 가독성이 좋음
- 그래서 들여쓰기를 잘 해줘야 한다! 들여쓰기 틀리면 인식이 안되는 大참사..
- application.yml파일을 생성
- 계층구조로 이루어져 가독성이 좋음
name: spring2
spring:
output:
ansi:
enabled: always
'스프링' 카테고리의 다른 글
예시를 통해 알아보는 MVC 패턴 총정리 (RequestMapping, addAttribute) (0) | 2024.04.02 |
---|---|
스프링과 JPA를 이용한 웹개발_AOP (0) | 2024.04.02 |
스프링과 JPA를 이용한 웹개발_의존성 주입 (0) | 2024.04.01 |
스프링과 JPA를 이용한 웹개발_스프링 소개 (0) | 2024.03.31 |
스프링과 JPA를 이용한 웹개발_성능튜닝 (0) | 2024.03.30 |