Spring MVC
: servlet-context.xml로 설정하는 Web영역, root-context.xml로 설정하는 Java영역을 연동하여 구동하는 방식
WebApplicationContext는 기존 구조에 MVC 설정을 포함하는 구조이다. 스프링은 웹 애플리케이션을 목적으로 나온 프레임워크가 아니기 때문에 달라지는 영역에 대해 완전히 분리하고 연동하는 방식으로 구현된다.
JSP | HTML, CSS, JS | Service | Controller | Mapper | DB | |
역할 | View | Ajax, JSON | C R U D | C R U D | xml (MyBatis) | Table (Oracle) |
계층 | 프레젠테이션 계층 |
비즈니스 계층* | 영속성 |
* Service(서비스): 비즈니스 영역에 있는 객체
web.xml
<!-- 프로젝트 구동 시작은 여기서부터. Context Listener, root-context.xml 연동 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml/WEB-INF/spring/security-context.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- root-context에 정의된 Bean들은 스프링의 영역context 안에 생성, 객체 간 의존성 처리 -->
<!-- DispatcherServlet, servlet-context.xml 연동 -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- root-context에 정의된 Bean들은 스프링의 영역context 안에 생성, 먼저 만들어진 객체들과 연동 -->
Controller
- HttpServletRequest, HttpServletResponse를 거의 사용하지 않고 필요한 기능 구현
- 다양한 타입의 파라미터와 리턴 사용 가능
- GET, POST 등 전송 방식 어노테이션으로 처리
- 상속/인터페이스 대신 어노테이션만으로 필요한 설정 가능
@Controller
- 스프링의 객체로 등록할 것
- servlet-context.xml의 는 어노테이션을 가진 클래스들을 객체로 생성 및 관리(s)
- 파라미터의 타입에 따라 자동 변환하여 자동 수집
Tip) request.getparameter() 사용하지 않아 편리하다
Controller 메소드의 리턴 타입 (주로 사용하는 방식)
자료형 | 설명 |
String | jsp를 이용하는 경우에는 jsp 파일의 경로와 파일명을 나타 낸다 |
void* | void: 호출하는 URL(맵핑)과 동명의 jsp |
VO, DTO** | JSON 타입의 데이터를 만들어 반환 |
ResponseEntity | response 시 Http 헤더 정보와 내용 가공 |
Model, ModelAndView | Model로 데이터를 반환하거나 화면까지 지정하는 경우 |
HttpHeaders | 응답에 내용 없이 Http 헤더 메시지만 전달 |
* servlet-context.xml의 URL경로를 View로 처리하기 때문에 생기는 결과
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
** 주로 JSON 데이터를 만들어내는 용도로 사용한다
pom.xml
<!-- jackson-databind 라이브러리 추가 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactid>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
SampleController.java
@getMapping("/ex06")
public @ResponseBody SampleDTO ex06() {
SampleDTO dto = new SampleDTO();
dto.setAge(10);
dto.setName("홍길동");
return dto;
}
스프링 MVC는 자동으로 브라우저에 JSON타입으로 객체를 변환해서 전달!
@RequestMapping
@GetMapping
@PostMapping
수정할 값은 get으로 받고 수정한 값은 post로 전달할 경우: 필요한 url은 단 하나
@DateTimeFormat
@DateTimeFormat (pattern = "yyyy/MM/dd")
Model
: 컨트롤러에서 생성된 데이터를 Model영역에 담아 JSP에 자동 전달
model.addAttribute("serverTime", new java.util.Date());
Tip) 기본 자료형(ex) int, long은 파라미터로 선언하더라도 화면까지 전달되지는 않는다
ex) 목록에서 페이지 번호 bno = 2, 파라미터들에 대한 처리 후 결과를 전달해야 하는 경우
jsp의 경우
네 가지 영역 page, Request, Session, Application 은 ex) 생성 시 pageContext.setAttribute(k, v) 오ㅏ 같이 사용하면서
다른 페이지를 통해 받을 때는 parameter
안쪽에서는 설정한 값을 가져올 때 attribute
requestDispatcher dispatcher == 요청 처리 변수
RedirectAttribute 연결 속성
: 자동 전달
servlet에서 redirect
response.sendRedirect("/home?name=aaa&age=10");
스프링 MVC를 이용하는 redirect 처리
rttr.addFlashAttribute("name", "AAA");
rttr.addFlashAttribute("age", 10);
return "redirect:/";
파일 업로드
pom.xml
<!-- 파일 업로드 처리, 책 보고 해서 버전 다를 수도... -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
라이브러리 추가 후 임시 업로드 폴더 생성
servlet-context.xml
<!-- 파일 업로드 처리, 책보고! -->
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="defaultEncoding" value="utf-8"></beans:property>
<!-- 1024 * 1024 * 10bytes = 10MB -->
<beans:property name="maxUploadSize" value="104857560"></beans:property>
<!-- 1024 * 1024 * 2bytes = 2MB -->
<beans:property name="maxUploadSizePerFile" value="2097152"></beans:property>
<beans:property name="uploadTempDir" value="file:/C:/upload/tmp"></beans:property>
<beans:property name="maxInMemorySize" value="10485756"></beans:property>
</beans:bean>
SampleController.java
@GetMapping("exUpload")
public void exUpload() {
log.info("/exUpload......");
}
@PostMapping("/exUploadPost")
public vArrayList<E>oadPost(ArrayList) {
public void exUploadPost(ArrayList<MultipartFile> files) {
files.forEach(file -> {
log.info("-------------------------");
log.info("name:" + file.getOriginalFilename());
log.info("size:" + file.getSize()); //2MB보다 작은 크기의 파일
});
}
}
P154
파일 업로드용 4가지인데 스프링은 5가지
multipartResolver
defaultEncoding utf-8ㅎ ㅏㄴ글 깨짐 방지
maxUploadSize 최대 업로드 용량
maxUploadSizePerFile 단일 업로드 최대 용량(초과 시 쪼개서 압축해서 올림)
uploadTempDir 저장할 임시 폴더 경로
maxInMemorySIze 스트림처리해야 하기 때문에 메모리 영역 설정
6.6Controller의 Exception 처리
Controller가 하는 일: url 매핑... 하다가 잘못 치면?
@ControllerAdvice
: AOP (Aspect-Oriented-Programming) 공통적인 관심사 분리
@ExceptionHandler
@ResponseEntity
Tip)
public String except(Exception ex, Model model) { //파라미터를 통로라고 생각
Tip) 웹 프로젝트는 절대 경로 '/' 를 사용하자!
'Spring' 카테고리의 다른 글
Spring 04 (0) | 2024.02.29 |
---|---|
기본적인 웹 게시물 관리 (0) | 2024.02.28 |
Spring 02 - ConnPool (1) | 2024.02.27 |
Spring 01 - 스프링의 특징 (2) | 2024.02.27 |
Spring 00 - 초기 설정 방법 (0) | 2024.02.26 |