Spring/공부

[Spring MVC] JSON 변환처리 및 talend api tester를 이용한 테스트

하루인생 2021. 2. 8. 13:11

@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인 학생을 삭제했다. 

 

 

결과이다.