Programming/Spring Boot

스프링 웹 MVC - 1 (스프링 부트 활용 - 5)

흠냐아뤼 2020. 3. 10. 00:44
728x90

- 아무런 설정 없이 스프링 웹 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 를 두면 자동으로 홈페이지, 파비콘으로 인식
- 파비콘 설정 시 캐시 때문에 바로 변경 안되는 점 유의  (캐시 지우거나, 개인정보보호 모드로 테스트)



인프런 백기선님 '스프링 부트’ 강의를 듣고 정리한 내용입니다.
728x90