본문 바로가기

카테고리 없음

(SERVLET) WebMvcConfigurer 커스텀(1) - Formatter

/hello url로 요청을 받고 "hello"를 리턴하는 단순한 컨트롤러를 테스트 해보자!

@RestController
public class SampleController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

파라미터를 받는 테스트 코드 

@ExtendWith(SpringExtension.class)
@WebMvcTest
class SampleControllerTest {
    @Autowired
    MockMvc mockMvc;

    @Test
    public void hello() throws Exception {
        this.mockMvc.perform(get("/hello/junwoo"))
                .andDo(print())
                .andExpect(content().string("hello junwoo"));
    }
}

당연히 테스트의 결과는 실패한다.

urlPath로 name 파라미터를 받아보자

@RestController
public class SampleController {

    @GetMapping("/hello/{name}")
    public String hello(@PathVariable String name) {
        return "hello "+name;
    }
}

테스트 결과 성공


Formatter

  • Printer: 해당 객체를 (Locale 정보를 참고하여) 문자열로 어떻게 출력할 것인가

지금은 파라미터를 문자열로 받았지만 객체로 받을 수 있도록 변경해보자

@RestController
public class SampleController {

    @GetMapping("/hello/{name}")
    public String hello(@PathVariable("name") Person person) {
        return "hello "+person.getName();
    }
}

 

테스트 결과 실패가 떨어진점을 확인할 수 있다.

왜일까?

현재 name 값을 객체 타입으로 변환 시킬 수 없기 때문이다.

 

 

Formatter 인터페이스를 구현하는 PersonFormatter 생성

public class PersonFormatter implements Formatter<Person> {
    @Override
    public Person parse(String s, Locale locale) throws ParseException {
        Person person = new Person();
        person.setName(s);
        return person;
    }

    @Override
    public String print(Person object, Locale locale) {
        return null;
    }
}

객체를 생성하여 세터에 해당 문자열을 넣어주어 파싱한다.

 

Foramtter 등록

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new PersonFormatter());
    }
}


스프링 부트에서는 이러한 설정이 어떻게 사용될까?

 

Bean으로만 등록되있으면 된다.

 

 

실행은 정상적으로 되지만 테스트는 깨진다.

왜일까?

@WebMvcTest 때문이다. 

 

@WebMvcTest는 Slicing Test용이기 때문에 Web과 관련되어있는 Bean들만 등록된다.

 

지금은 그냥 일반 Bean으로 등록하였기 때문이다.

@ExtendWith(SpringExtension.class)
//@WebMvcTest
@SpringBootTest
@AutoConfigureMockMvc
class SampleControllerTest {
    @Autowired
    MockMvc mockMvc;

    @Test
    public void hello() throws Exception {
        this.mockMvc.perform(get("/hello/junwoo")
                .param("name","junwoo"))
                .andDo(print())
                .andExpect(content().string("hello junwoo"));
    }
}

코드 참조

https://github.com/mike6321/Spring/tree/master/SpringMVC/demo-boot-web

 

mike6321/Spring

Contribute to mike6321/Spring development by creating an account on GitHub.

github.com