[Spring MVC] JSON 변환처리 및 talend api tester를 이용한 테스트
@RestController란?
스프링4에서 Rest API와 Web API를 개발하기 위해서 등장한 애노테이션이다.
@Controller와 @ResponseBody를 포함한다.
쉽게 설명하자면 클래스명 위에 @RestController애노테이션을 사용하면
@ResponseBody의 성질이 있어서 모든 메소드에서 반환하는 객체를 json파일로 변환시켜준다.
또 @Controller의 성질도 있어서 자동으로 DispatcherServlet에서 컨트롤러임을 알 수 있다.
MessageConverter란?
@ResponseBody또는 @RequestBody애노테이션이 있으면 MessageConverter를 이용해서
자바 객체와 HTTP 요청/응답 몸체 사이의 변환을 처리한다.
@EmableWebMvc애노테이션이나 <mvc:annotation-driven>태그를 사용하여
다양한 MessageConverter 구현 클래스를 등록할 수 있다.
(StringHttpMessageConverter, MappingJackson2HttpMessageConverter, ByteArrayHttpMessageConverter 등등)
MessageConverter를 설정하지 않으면 MessageConverter가 없다는 에러가 뜬다.
그래서 DispatcherServlet설정 클래스에 이렇게 @EmableWebMvc를 사용하였다.
...
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"kr.or.jdbcexam.controller"})
public class MainConfig implements WebMvcConfigurer{
...
}
코드로 이해하기
먼저 클래스 명 위에 @RestController애노테이션을 붙여 Controller와 ResponseBody 애노테이션 역할을 하게 했다.메서드 위에 매핑을 해주지 않고, 클래스명 위에 @RequestMapping(경로)를 설정해 줌으로써 /api경로로만 들어오는 요청을 처리할 수 있게 했다.또 StudentService인터페이스를 @Autowired해줌으로써 StudentServiceImpl클래스를 주입시켰다.
...
@RestController
@RequestMapping(path = "/api")
public class ApiController {
@Autowired
StudentService service;
}
학생 목록을 모두 불러오는 list메서드를 만들었다.
@GetMapping애너테이션을 작성하여 get방식으로 "/api" 경로로 들어오는 경우 이 메서드가 실행된다.
또 Student객체를 담은 List형 객체인 list를 반환한다.
...
@GetMapping
public List<Student> list(@RequestParam(name = "start",required = false, defaultValue = "0")int start){
List<Student> list = service.getStudentList(start);
return list;
}
또 학생을 등록하는 add메서드를 만들었다.
요청을 받는 과정에서 Json형태로 데이터가 들어오면 이 json데이터를
@RequestBody를 통해 Student객체로 변환해준다.
변환된 student객체를 등록해주고 이 객체를 응답으로 반환한다.
정리하면 다음과 같다.
요쳥 : json -> Student객체로 변환 (@RequestBody에 의해)
응답 : Student객체 -> json으로 변환 (@ResponseBody에 의해)
...
@PostMapping
public Student add(@RequestBody Student student) {
service.addStudent(student, "123");
return student;
}
마지막으로 등록된 학생을 삭제하는 delete메서드를 만들었다.
이 메서드에서 특이한점은 매핑될 URI 작성 방식과 처음보는 @PathVariable이다.
@PathVariable는 URI의 일부분을 변수로 전달할 수 있다.
그러기 위해서 URI에서는 "경로/{사용할 변수}" 와 같이 {}를 사용해야한다.
잘 삭제가 되었으면 Map객체를 반환한다.
...
@DeleteMapping("/{name}")
public Map<String, String> delete(@PathVariable String name) {
Map<String, String> map = new HashMap<String, String>();
map.put("result", service.deleteStudent(name, "123"));
return map;
}
Talend Api Tester 사용하기
1) 조회 테스트
get방식으로 요청을 선택하고 주소를 입력한다. 그리고 Send
http://localhost:8080/jdbcexam/api
결과이다.
2) 등록 테스트
Post방식으로 학생을 등록했다.
BODY부분에 Json형식으로 Student객체의 정보를 입력하였다.
응답으로 객체가 json형식으로 반환되었다.
3) 삭제 테스트
Delete방식으로 학생을 삭제했다.
http://localhost:8080/jdbcexam/api/dw의 경로로 name이 dw인 학생을 삭제했다.
결과이다.