본문 바로가기
Dev/Spring Boot

[스프링 부트 개념과 활용] 스프링 웹 MVC 2, 3부

by dev_jsk 2020. 8. 25.
728x90
반응형

HttpMessageConverters

HTTP 요청 본문 -> 객체 또는 객체 -> HTTP 응답 본문으로 변경할때 사용

// 예시
{"username":"jinseo", "password":"123"} -> User Object

// User.java
public class User {
    private Long id;
    private String username;
    private String password;
    
    getter/setter
}

 

특징

  • 요청에 따라 사용하는 MessageConverter가 달라진다.
  • Composition Object Type일 경우 JsonMessageConverter사용 String일 경우 StringMessageConverter사용
  • @RestController사용 시 @ResponseBody생략 가능
  • @Controller사용 시 @ResponseBody생략 할 경우 MessageConverter가 미적용 되어 ViewResolver에 의해 리턴값에 해당하는 View를 찾게된다.

* Composition Object : 기존 클래스들을 조합해서 새로운 클래스를 만드는것 has-a 관계

 

예시

// UserControllerTest.java

@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
    @Autowired
    MockMvc mockMvc;

    @Test
    public void createUser_JSON() throws Exception {
        String userJson = "{\"username\":\"jinseo\",\"password\":\"12345\"}";
        mockMvc.perform(MockMvcRequestBuilders.post("/users/create")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .accept(MediaType.APPLICATION_JSON_UTF8)
                .content(userJson))
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andExpect(MockMvcResultMatchers.jsonPath("$.username", Matchers.is(Matchers.equalTo("jinseo"))))
            .andExpect(MockMvcResultMatchers.jsonPath("$.password", Matchers.is(Matchers.equalTo("12345"))))
        ;
    }
}

 

참고

https://docs.spring.io/spring/docs/5.0.7.RELEASE/spring-framework-reference/web.html#mvc-config-message-converters

 

Web on Servlet Stack

This part of the reference documentation covers support for Servlet stack, WebSocket messaging that includes raw WebSocket interactions, WebSocket emulation via SockJS, and pub-sub messaging via STOMP as a sub-protocol over WebSocket. 4.1. Introduction The

docs.spring.io

 

ViewResolver

ContentNegotiatingViewResolver

들어오는 요청의 Accept Header에 따라 응답을 변환할 때 사용하고 경우에 따라 Accept Header를 제공하지 않을경우 format이라는 파라미터명의 값으로 리턴 포맷을 결정한다.

 

* Accept Header : Browser 또는 Client가 어떠한 타입의 응답을 원한다 라고 서버에게 알려주는것

 

예시

// pom.xml
// xml 리턴타입일 경우 의존성 추가 필요

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.6</version>
</dependency>
// UserControllerTest

@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
    @Autowired
    MockMvc mockMvc;

    @Test
    public void createUser_XML() throws Exception {
        String userJson = "{\"username\":\"jinseo\",\"password\":\"12345\"}";
        mockMvc.perform(MockMvcRequestBuilders.post("/users/create")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .accept(MediaType.APPLICATION_XML)
                .content(userJson))
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andExpect(MockMvcResultMatchers.xpath("/User/username").string("jinseo"))
            .andExpect(MockMvcResultMatchers.xpath("/User/password").string("12345"))
        ;
    }
}
728x90
반응형

댓글