2021-01-12 :: 설계 및 구현시 각 단계에서 생각해봐야할것들 정리

레이어및 컴포넌트 설계 구현시 생각해 봐야할 것들

컨트롤러 레이어

  1. url 패턴 설계
  2. 현재 상태에서 갈 수 있는 다음 상태 설계
  3. 반환 DTO 구현 (hateoas 적용)
  4. 반환 header 구현
  5. 반환 body 구현

서비스 레이어

  1. Mapper 구현
  2. 비즈니스 로직 구현
  3. 최대한 한 서비스는 한 동작만 하도록 구현

레퍼지토리

아직 직접 작성한 쿼리가 없음

Mapper

  1. 맵핑이 안되는 필드가 없는지 확인
  2. 맵핑될 필요가 없다면 꼭 무시하는 맵핑 어노테이션을 달아주자
  3. Collection에 대한 맵핑은 꼭 직접 확실히 구현.
  4. Object to Object는 해당 객체에 필요한것에 맞게 놓치는 필드가 없도록 구현

Validator

해당 변수가 서비스했을때 동작 가능할 임계값을 생각하자.

필요하다면 정규식도 사용해보자.

테스트 코드 작성시 생각해봐야할 것들

위에 내용을 참고하여 설계한 내용을 테스트 코드로 먼저 작성 이후 테스트 코드를 따라가면서 구현

**주의**

유닛 테스트는 전체 흐름을 동작한 결과물이 아님.
내가 원하는 입력에 대한 예상 결과값만 나오는걸 유닛 테스트라고 생각.

예를 들어
controller를 테스트 하는데 service 동작이 제대로 수행되는지는 알 필요 없음.
controller를 테스트 하는데 mapper가 제대로 동작하는지 알 필요 없음.
controller를 테스트 하는데 validator가 제대로 동작하는지 알 필요 없음.

우리는 의존있는 객체를 가짜 객체로 만든 후 mock 객체가 올바른 결과를 던져주도록 구현하고
해당 레이어에서 동작하는 코드만 테스트하면 됨.
(처음에는 자꾸 의존된 객체의 동작을 생각하는데 그렇게 생각하지 않으려고 노력해야함)

현재까지 프로젝트 진행하면서 해야할 유닛 테스트 목록 정리

  1. controllerTest

    컨트롤러에서 테스트 해야할것은 해당 url로 api 요청시 어떤 값을 반환할지만 확인 (서비스, 벨리데이터 등등 어떻게 동작하는지 확인할 필요 x)

  2. serviceTest

    입력에 대한 비즈니스 로직이 제대로 동작하는지 확인(db에 잘 저장했는지 확인할 필요 x)

    비즈니스 로직이 에러를 반환하는 경우도 생각해야함.

    (예를 들어 만약 객체가 레퍼지토리에서 받아온 값이 없다면 에러처리 같은 경우)

  3. repositoryTest

    db에 원하는 요청대로 저장이 되는지 확인

  4. exceptionHandlerTest

    api 요청 후 동작 중 에러가 발생했을때 에러를 처리하고 원하는 결과값을 반환하는지 확인하면 됨

  5. mapperTest

    단순히 mapper가 제대로 맵핑 되는지 확인

  6. validatorTest

    내가 만든 유효성 검증 어노테이션이나 기본적으로 구현된 검증 어노테이션이 제대로 동작하는지 확인


단순히 프로젝트를 진행하면서 느낀 내 생각이므로 정답이라고 할순 없음. 테스트를 더 편하게 짜기위해 극단적인 유닛테스트로만 진행하는것이 아닌 통합테스트로도 진행할 수 있음. 사람마다 생각하는 방향이 다르기 때문에 혼자하는 프로젝트가 아니라면 팀원과 생각을 맞춘 후 진행하면 될것같음.