스프링 웹 MVC - 1 (스프링 부트 활용 - 5)
- 아무런 설정 없이 스프링 웹 MVC를 바로 사용할 수 있는 것은 AutoConfigure 덕분
- WebMvcConfigurer 을 구현하여 스프링 자동 설정에 더해서 여러 설정을 입맛대로 변경 가능
1. HttpMessageConverters
- 스프링 프레임워크에서 제공하는 인터페이스
- HTTP 요청 본문 객체로 변경하거나, 객체를 HTTP 응답 본문으로 변경할 때 사용
{"username":hongchan, "password":"123"} <-> User
- @RequestBody, @ResponseBody와 함께 쓰임
1) 테스트 코드 작성
@Test
public void createUser_JSON() throws Exception {
String userJson = "{\"username\":\"hongchan\", \"password\":\"123\"}";
mockMvc.perform(post("/user/create")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_JSON_UTF8)
.content(userJson))
.andExpect(status().isOk())
.andExpect(jsonPath("$.username", is(equalTo("hongchan"))))
.andExpect(jsonPath("$.password", is(equalTo("123"))));
}
2) UserController 작성
- @RestController를 명시하면, @ResponseBody 와 @RequestBody는 생략가능
@RestController
public class UserController {
@PostMapping("/user/create")
public @ResponseBody User createUser(@RequestBody User user) {
return user;
}
}
3) User 작성
public class User {
private long id;
private String username;
private String password;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2. ViewResolver
- Reqeust header에 있는 accept에 따라서 응답을 다르게 해줌
- accept란? 클라이언트가 응답 받기원하는 형태
- 테스트 코드에서 accept를 변경
@Test
public void createUser_XML() throws Exception {
String userJson = "{\"username\":\"hongchan\", \"password\":\"123\"}";
mockMvc.perform(post("/user/create")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.accept(MediaType.APPLICATION_XML)
.content(userJson))
.andExpect(xpath("/User/username").string("hongchan"))
.andExpect(xpath("/User/password").string("123"))
.andDo(print());
}
- 의존성 추가
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.6</version>
</dependency>
3. 정적 리소스 지원
- 이미 만들어져 있는 리소스를 제공하는 방법
- 동적으로 뷰를 만드는 것이 아니라, 이미 있는 리소스를 제공하는 것
- 기본 리소스 위치
classpath:/static
classpath:/public
classpath:/resources/
classpath:/META-INF/resources
예) "/hello.html" => /static/hello.html
- 맵핑 설정 변경 ("/hongchan/hello.html")
spring.mvc.static-path-pattern=/hongchan/**
- WebMvcConfigurer의 addResourceHandlers로 커스텀마이징 할 수 있음
새로운 패스를 추가 (대체가 아님)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/jiyun/**")
.addResourceLocations("classpath:/jiyun/")
.setCachePeriod(20);
}
}
3. 웹 JAR
- 클라이언트 사이드 자바스크립트 라이브러리(jQuery, Angular, Vue, React...)를 사용할 수 있게 함
- mvnrepository에서 의존성 추가 후 <script src=""> 사용
- 리소스 체이닝? 의존성 추가 후 버전 없이 읽어올 수 있음
4. Index 페이지와 파비콘
- static 디렉토리에 index.html / favicon.ico 를 두면 자동으로 홈페이지, 파비콘으로 인식
- 파비콘 설정 시 캐시 때문에 바로 변경 안되는 점 유의 (캐시 지우거나, 개인정보보호 모드로 테스트)
인프런 백기선님 '스프링 부트’ 강의를 듣고 정리한 내용입니다.