한 주간 배우면서 새로 알게된 개념이나 잘 못 알았던 개념을 서로 나누어 보아요.
- DTO ↔ Entity 변환은 Service Layer에서 해야하는지? Controller(Presentation Layer)에서 해야하는지?
- Service Layer 메소드에서 DTO를 파라미터로 받아도 괜찮을지?
- DTO를 inner class로 묶는 방법은 좋은 방법일까?
- @ControllerAdvice, @ExceptionHandler
- Bean의 접근제어자는 무엇으로 해야하나요?
- private는 빨간줄이 그어지고 public으로 하자니 protected가 가능해서 protected로 해야할까요? 아무것도 작성하지 않으면 default로 private 이외에 가장 접근 범위가 좁아서 작성하지 않는것을 고민하였습니다.
- 필요 x : 차피 스프링 빈에서 꺼내올 수 있음
- 필요 o : 스프링에서 싱글톤으로 관리안되고 Config클래스를 유저가 new 해서 악의적으로 이용할 수 있음
- Mock/ Stub
- Controller 테스트 코드 작성 시 Service쪽 예외 터지는거도 포함해야할까요? 아니면 DTO에 대한 validation만 하면 될까요?
- 테스트에 대한 범위 설정 기준
- DTO에 대한 Validation 테스트를 따로 작성해도 되나요?
- Validation 레이어마다 어느정도까지 해줘야 하는가?
팀 미팅
- Bean
- Controller, Service, Repository를 config로 빈 등록을 해주면 생성자가 수정될때 config쪽도 중복으로 작업해줘야 한다.
- 만약 서비스쪽 생성자가 수정되면 config 서비스 빈 생성자도 수정해야하므로!
- config를 통해 빈 등록을 하는 방식을 사용할 경우 서비스가 커지면 따로 관리 해줘야한다는 점이 있지만, 이런 방법이 나중에 유행 할 수도..?
- DTO
- DTO는 실무에서 인터페이스보다는 클래스로 많이 쓴다.
- 각 요청에 대한 모델을 만들어서 사용한다
ex) SaveUserRequest.class, UpdateUserRequest.class
- REST API
- rest api에서 리소스는 복수형으로 가져가자. ex) /vouchers , /users
- 검색 기능의 경우 검색에 대한 분기는 서비스에서 가져가자
- 컨트롤러에서 분기를 갖는거보다 서비스쪽 메소드에서 분기를 가져가서 처리하는 형식이 더 나음 (쿼리 파라미터에서의 null값에 대한 처리)
- Querydsl을 사용하면 where절에서 이러한 분기 처리를 해줄 수 있다. (Repository에서 처리해줄 수 있다)
- API에 버전을 표시하면서 얻는 이점은 레거시 API들을 남겨놓으면서 새로운 API로 리팩토링 하는 방식으로 활용할 수 있기 때문이다.
- API 마다 불러오는 서비스가 다를수 있다.
- 한 api에서 여러개의 api가 호출될 수 있다.
- 비동기 식으로 필요한 API를 모두 호출해놓고 묶어서 처리한다.
- DB
- 데이터 조회 시 UUID는 정렬이 제대로 안되지만, autoincrement를 사용하면 id를 통해 자동 정렬이 되서 데이터가 조회된다.
- TEST
- 컨트롤러 테스트는 우선 순위가 낮다. 차라리 통합테스트나 서비스쪽을 더 세세히 짜주는게 좋다
- 컨트롤러 테스트는 실제 api를 호출하면서 검증하는 WebTestClient 를 사용하기도 한다. 통합 테스트는 시나리오를 생각하면서 어떤 부분에 오류가 날 것이라고 예상하면서 짜기도 한다.
- 통합테스트는 보통 API 호출을 기반으로 테스트 한다.
- 이외 복잡한 여러가지 행동들은 QA들이 테스트한다.
- CQRS 패턴
- 명령을 처리하는 책임과 조회를 처리하는 책임을 분리하자
- 메소드를 호출했을때 내부에서 변경(사이드 이펙트)이 일어나는 메서드인지, 아니면 내부에서 변경이 전혀 일어나지 않는 메서드인지 명확히 분리하자
- 그렇게 되면 데이터 변경 관련 이슈가 발생했을 때, 변경이 일어나는 메서드만 찾아보면 된다.
- 아키텍쳐
- 주로 서비스에서 Exception을 던지고 컨트롤러에서 Error코드를 준다(ControllerAdvice)
- 서비스가 두꺼운게 컨트롤러가 두꺼운것보다 낫다