[JUnit]테스트 코드 배우기 - Controller

gamja·2023년 1월 20일
0
post-thumbnail

ApiController 본코드 작성

1. 책등록 기능

@RestController
@RequiredArgsConstructor
public class BookApiController {    // 컴포지션 = has 관계

    private final BookService bookService;
    // 1. 책등록
    // 기본 파싱 형식
    // key=value&key=value  
    // spring에서 json 방식 파싱
    // { "key" : value, "key" : value }
    @PostMapping("/api/v1/book")   
    public ResponseEntity<?> saveBook(@RequestBody BookSaveReqDto bookSaveReqDto){
        BookRespDto dto = bookService.책등록하기(bookSaveReqDto);
        CMRespDto cmRespDto = CMRespDto.builder()
                                                                    .code(1)
                                                                    .msg("성공")
                                                                    .body(dto).build();
        return new ResponseEntity<>(cmRespDto, HttpStatus.CREATED);    // 프론트에 전송할 dto를 따로 만들어서 함께 전달해준다.
    }

controller 테스트 할 때는 postman 사용하여 제대로 작동하는지 확인해준다.

1-2. CMRespDto 생성

package site.metacoding.junitproject.web.dto.response;

import lombok.Builder;
import lombok.Getter;

@Getter
public class CMRespDto<T> {
    private Integer code;   // -1: 실패, 1: 성공
    private String msg;
    private T body; // 이게 항상 object가 다르기 때문에 제네릭으로 설정해준다. - 

    @Builder
    public CMRespDto(Integer code, String msg, T body){
        this.code = code;
        this.msg = msg;
        this.body = body;
    }
}

ResponseEntity에 body를 실어보낼 때 body에 들어갈 responseDto를 따로 만들어 필요한 정보를 프론트에 전달해줄 수 있다.

1-3. 책등록 테스트 결과 - postman

👀에러가 뜬다면?!


위와 같이 에러메시지가 뜬다. 이러한 에러 메시지를 프론트가 보기 좋게 수정을 해주는 것이 좋다.

에러를 방지하기 위해서 validation을 사용해줄 거임.

validation을 사용해서 사용자가 입력한 값이 entity를 통해 db에 들어가기 전에 dto에서 적절하지 못한 값들을 막아주는 것이다.

Book - Entity

@Entity
@NoArgsConstructor
@Getter
public class Book {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;

    @Column(length = 50, nullable = false)
    private String title;

    @Column(length = 20, nullable = false)
    private String author;
}

BookSaveReqDto

@Getter
@Setter // controller에서 Setter가 호출되면서 Dto에 값이 채워진다.
public class BookSaveReqDto {
    @Size(min = 1, max = 50)    // Entity와 값을 맞춰준다.
    @NotBlank   // NotBlank : 공백과 null을 검사한다.
    private String title;

    @Size(min = 2, max = 20)
    @NotBlank
    private String author;

    public Book toEntity(){
        return Book.builder()
                    .title(title)
                    .author(author)
                    .build();
    }
}

Entity의 조건에 맞게 Dto도 validation을 통해 값을 체크해준다.
유효성 검증은 되도록이면 Controller에서 @Valid를 통하여 해준다. 불가피하게 다른 계층에서 해줘야 하는 경우에는 @Validated를 사용해서 검증해줄 수 있다.

ApiController

  @PostMapping("/api/v1/book")   
    public ResponseEntity<?> saveBook(@RequestBody @Valid BookSaveReqDto bookSaveReqDto, BindingResult BindingResult){
        System.out.println(BindingResult.hasErrors());
        BookRespDto dto = bookService.책등록하기(bookSaveReqDto);
        CMRespDto cmRespDto = CMRespDto.builder()
                          				.code(1)
                                        .msg("성공")
                                        .body(dto)
                                        .build();
        return new ResponseEntity<>(cmRespDto, HttpStatus.CREATED);    // 프론트에 전송할 dto를 따로 만들어서 함께 전달해준다.
    }

controller에서 @Valid를 통해 들어온 값이 유효한 값인지 체크해준다.

@Valid 에 대한 블로그
https://mangkyu.tistory.com/174

profile
눈도 1mm씩 쌓인다.

0개의 댓글

관련 채용 정보