HTTP 메시지 컨버터
@RestController
public class SampleController {
@GetMapping("/message")
public @ResponseBody String message(@RequestBody String body){
return body;
}
}
테스트 작성
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class SampleControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void stringmessage() throws Exception{
this.mockMvc.perform(get("/message")
.content("hello"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string("hello"));
}
}
기본 HTTP 메시지 컨버터
여기서부터는 classpath에 있는 경우만 등록된다.
어떤 메시지 컨버터를 쓸지는 요청 헤더에 Content-Type, accpet을 보고 결정한다.
또 WebMvcConfigure에 configureConverters라는 메소드를 통해 메시지 컨버터를 추가할 수도 있지만 이를 사용해 메시지 컨버터를 추가하면 기본 컨버터는 사용할 수 없다. 따라서 추가만 하고 싶은 경우는 extendMessageConverts라는 메소드를 사용하면 된다.
설정 방법
스프링 부트를 사용하지 않는 경우(WebMvcConfigurationSupport)
스프링 부트를 사용하는 경우
도메인 클래스
@Entity
public class Person {
@Id @GeneratedValue
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
컨트롤러 클래스
@RestController
public class SampleController {
@GetMapping("/jsonMessage")
public Person jsonMessage(@RequestBody Person person){
return person;
}
}
테스트 코드
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class SampleControllerTest {
@Autowired
MockMvc mockMvc;
@Autowired
PersonRepository personRepository;
@Autowired
ObjectMapper objectMapper;
@Test
public void jsonMessage() throws Exception {
Person person = new Person();
person.setId(2019l);
person.setName("spring");
String jsonString = objectMapper.writeValueAsString(person);
this.mockMvc.perform(get("/jsonMessage")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.content(jsonString)
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.id").value(2019))
.andExpect(jsonPath("$.name").value("spring"));
}
}
json 응답의 본문을 확인할 때는 JSON path를 사용할 수 있다.
또는 postman이라는 클라이언트를 통해 서버를 띄워서 테스트할 수도 있다.
OXM(Object-XML Mapper) 라이브러리 중에 스프링이 지원하는 의존성 추가
스프링 부트를 사용하는 경우
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring-framework.version}</version>
</dependency>
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public Jaxb2Marshaller jaxb2Marshaller(){
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setPackagesToScan(Person.class.getPackageName());
// Person.class가 있는 패키지 이름을 scan해서
// @XmlRootElement 애노테이션이 있는지 확인
return jaxb2Marshaller;
}
}
@XmlRootElement
@Entity
public class Person {
@Id @GeneratedValue
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class SampleControllerTest {
@Autowired
MockMvc mockMvc;
@Autowired
PersonRepository personRepository;
@Autowired
Marshaller marshaller;
@Test
public void xmlMessage() throws Exception {
Person person = new Person();
person.setId(2019l);
person.setName("spring");
StringWriter stringWriter = new StringWriter();
Result result = new StreamResult(stringWriter);
marshaller.marshal(person, result);
String xmlString = stringWriter.toString();
this.mockMvc.perform(get("/jsonMessage")
.contentType(MediaType.APPLICATION_XML)
.content(xmlString)
.accept(MediaType.APPLICATION_XML))
.andDo(print())
.andExpect(status().isOk())
.andExpect(xpath("person/name").string("seonju"))
.andExpect(xpath("person/id").string("2019"));
}
}
xml 응답의 본문을 확인할 때는 Xpath를 사용할 수 있다.
역시 postman이라는 클라이언트를 통해 서버를 띄워서 테스트할 수도 있다.
참고