TIL - 0613

Issue 서비스 구현

개발 flow

  1. AcceptanceTest(인수테스트) 케이스를 먼저 작성함 : 서비스에 대한 요청을 했을 때 클라이언트는 어떤 응답을 받을 것인지 먼저 정함 - TestRestTemplate 사용
  2. Controller / Service / domain 객체 테스트케이스에 맞게 프로그래밍
  3. Service 테스트(단위 테스트) : 앞서 2단계에서 구현한 로직이 상황에 맞게 제대로 수행되는지 메소드(액션) 단위테스트 - Mockito 사용

create

  • @RequestBody : RestController와 함께 사용하는 것, json 데이터를 받아서 객체로 변환할 때 사용하는 것
    • API 보기 : 메세지 컨버터를 거치게 되어있음
Annotation indicating a method parameter should be bound to the body of the web request.
The body of the request is passed through an {@link HttpMessageConverter} to resolve the
method argument depending on the content type of the request. Optionally, automatic
validation can be applied by annotating the argument with {@code @Valid}.
  • @Valid : 사용하면 바인드 되는 엔티티의 기준에 따라 익셉션을 발생시킴
    • @Size, @Column에 선언되어있는 조건에 따라 익셉션 여부
    • try, catch를 해야함 : 보통 @ControllerAdvice에 구현시켜둠 - 비즈니스 로직과 분리
    • 질문 : 같은 익셉션인데, Controller와 RestController는 익셉션 응답을 다르게해야하는데, 이떄 어떻게 분기를 할까?
@ControllerAdvice
public ValidationControllerAdvice {
    private static final Logger log = LoggerFactory.getLogger(ValidationControllerAdvice.class);

    @ExceptionHandler(ValidationException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public void handleValidationException() {
        log.debug("ValidationException is happened!"
    }
}

show

  • 레이어 간에는 DTO로 이동을 하되, 마지막에 클라이언트에 전달할 때는 엔티티로 변경해서 넘기기
    • DTO에 @JsonIgnore 했을 때 문제 생김 : 분명 클라이언트에 전달하지않아도 되는 데이터인데도 불구하고 무시 설정을 할 수 없으니 중요 정보가 노출될 수 있음
  • 인프라, 부가기능은 서비스에서 구현 : 엔티티 발견하지 못했을 때 어떻게 처리할지는 서비스가 정하도록
    • 컨트롤러는 서비스에 위임을 해버림

entity validation test

  • 테스트할 때 필요한 객체 : Validator(javax.validation) - 자바에서 제공하는 API
    • 빈 검증할 떄 쓰는 테스트 클래스
    • ConstraintViolation : 제약조건
public IssueValidationTest {

    private Validator validator;
    
    @Before
    public void setUp() throws Exception {
        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
        validator = validatorFactory.getValidator();
    }
    
    @Test
    public void invalid_titile() {
        Issue issue = new Issue("t", "contents");
        Set<ConstraintViolation<Issue>> results = validator.validate(issue);
        assert(result.size(), is(1));
       
        for (ConstraintViolation violation : results) {
            log.debug("validation result : {}", violation.getMessage()); 
        }
    }
}

구현 중인 코드