개발/Junit

⑦Junit Controller 초기설정 및 책 등록, 책 리스트 보기

외노자개발 2022. 10. 22. 18:21
반응형

먼저 Controller 초기 설정

@RequiredArgsConstructor
@RestController
public class BookApiController { 
	
	private final BookService bookService;
	
	//1. book save
	//{ "key" : value, "key" : value } //Jsonは@RequestBodyが必要
	@PostMapping("/api/v1/book")
	public ResponseEntity<?> saveBook(@RequestBody @Valid BookSaveReqDto bookSaveReqDto, BindingResult bindingResult) {
		
		if(bindingResult.hasErrors()) {
			Map<String, String> errorMap = new HashMap<>();
			for (FieldError fe : bindingResult.getFieldErrors()) {
				errorMap.put(fe.getField(), fe.getDefaultMessage());
			}
			System.out.println("==============================================");
			System.out.println(errorMap.toString());
			System.out.println("==============================================");
			
			throw new RuntimeException(errorMap.toString()); 
		}
		
		BookRespDto bookRespDto = bookService.bookSave(bookSaveReqDto);
		return new ResponseEntity<>(CMRespDto.builder().code(1).msg("Bookセーブ成功").body(bookRespDto).build(), 
				HttpStatus.CREATED); // 201 = insert , saveした、BODYデータを一緒に戻り値に上げる
	}

BookApiController

메서드 등등 정의 해보겠다. 

@RestController // URL을 반환 하는 것이 아닌 데이터를 반환 해주는 컨트롤러 ..

@RequestBody // HTTP body안에 JSON을 매핑 ,, 즉 JSON값으로 넘어온 것을 JAVA에서 자동으로 객체에 값을 넣어줌.

@Vaild // 파라미터로 @RequestBody 어노테이션 옆에 @Valid를 작성하면, RequestBody로 들어오는 객체에 대한 검증을 수행한다. 

BindingResult // @Valid선언된객체에 설정을 바탕으로 검사후 BindingResult에 담아준다.

・에러를 발생하려면 FieldError객체를 만들어서 BindingResult에 넣어준다.

제네릭함수 // 예 ) ResponseEntity<?> 

 '일반적인'이라는 뜻이다. '데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법'이다.  

제네릭함수에 대해서는 따로 자세히 작성하도록 하겠다. 

 

그러면 코드 해석을 해보자,, 

 

1. 북 등록 PostMapping은 값을 여러 개를 넣어줘야 하므로 book등록할 때에 쓰인다. 반환 타입을 ResponseEntity<?>으로 반환해준다.  BookSaveReqDto를 @RequestBody를 JSON값으로 받아준다. @Vaild를 이용해서 에러, 검사를 해준 것을 bindingResult에 넣어준다.

 

 if를 이용해서 bindingResult에 있는 값을 hasErrors() 로 에러가 있는지 확인한다. 

 

Map<String, String> errorMap = new HashMap<>();

이 부분에 대해서 많이들 모르고 사용하는 것으로 안다... 사실 본인도 모르고 사용해와서 이번에 

정리좀 하려고 한다. 

우선 , 인터페이스.. 

List가 인터페이스라서 List를 new로 해서 사용하지 못한다. 

똑같이 Map은 인터페이스라서 Map을 new해서 사용하지 못한다. 

그래서 HashMap을 이용해서 인터페이스를 구현한다. 

Map<String, String>  의<String, String> 은 Map은 Key와 Value로 이루어져 있으므로 

그것을 표현 한 것이다. 

ErrorMap은 Error를 담기에 <String, String> 으로 담았다. 

List와 Map에 관해서는 더 자세히 올리도록 하겠다... !

 

다시 돌아와서 .. 에러가 발생하면 FieldError를 발생해서 BindingResult에 필드와 에러 메시지를 넣어줌으로써

만약 if에서 에러가 있다는 것을 확인하면 

For을 이용해서 bindingResult를  getFieldErrors()를 해서 값을 fe에 담아주고, errorMap에 담아준다. 

그리고 System.out.println이 있는데 이것은 눈으로 확인하기 위해 사용했다. 

마지막으로 throw new RuntimeException(errorMap.toString());으로 throw해준다. 

 

만약 if에서 에러가 없으면 정상 코드를 한다.  bookservice에서 bookSave()메서드를 실행시켜 인자로 bookSaveReqDto를 담아서 bookRespDto를 생성해준다. 

return 으로 CMRespDto가 있는데 이것은 에러나 http코드 200, 400등을 표시해주기 위해서 반환 값에 값을 추가한 Dto이다. code로써 1을 반환 그리고 메시지로써는 book등록 성공을 붙여 body로 bookRespDto를 넣어 build()해주고 반환한다. 

 

이 후에 book List, search 이어서 올리도록 하겠습니다.

 

반응형