2021-01-13 :: 컨트롤러의 메소드 마다 반환값에 대한 생각

User 도메인 구현을 통해 생각해 본 것들

컨트롤러는 메소드마다 반환값이 존재할 것이다. RestApi에서는 반환되는 도메인은 현재 상태를 나타내는것이며 다음 상태로의 정보를 가지고 있을 것이다. 이러한 생각을 가지고 기본적인 CRUD에서 반환되는 상태들이 어떤 다음 상태를 가져야하는지 정리해보겠다.

(다음 상태로 가는 종류는 프로젝트마다 다를것이다. 내가 진행하는 단어장 어플리케이션에서 다음 상태에 대한 생각은 지극히 내가 원하는대로 만든것이다.)

Create

생성 메소드의 반환 상태는 현재 만든어진 나의 도메인 상태일 것이다. 예를 들어 User를 만든다면 Create의 반환값은 생성된 User일 것이다. 내가 User 라는 정보를 가지고 있는 상태라면 다음 갈수 있는 상태는 User를 Update 하거나 Delete 혹은 내부에 다른 도메인이 있다면 ( User 안에 WordBook이라는 리스트가 있을때) 해당 도메인에 대한 내용을 불러오는 정도가 될 것이다. 이런 기준으로 현재 프로젝트에서 나는 Create 메소드 실행 후 반환되는 상태 값을 아래와 같이 정의하였다.


@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@Data
public class UserDetailResponseDTO extends RepresentationModel<UserDetailResponseDTO> {
    private Long id;
    private String name;
    private String email;
    private List<WordBookDTO> wordBookDTOList;
    private List<StudyGroupDTO> studyGroupList;

		// 중간 생략 ...

    @EqualsAndHashCode(callSuper = true)
    @NoArgsConstructor
    @Data
    public static class StudyGroupDTO extends RepresentationModel<StudyGroupDTO> {
        private Long id;
        private String name;

        @Builder
        public StudyGroupDTO(Long userId, Long id, String name) throws Exception {
            this.id = id;
            this.name = name;

            add(linkTo(methodOn(StudyGroupController.class).get(userId, this.id)).withRel("get_studyGroup"));
        }
    }
    @Builder
    public UserDetailResponseDTO(Long id, String name, String email, List<WordBookDTO> wordBookDTOList, List<StudyGroupDTO> studyGroupList) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.wordBookDTOList = wordBookDTOList;
        this.studyGroupList = studyGroupList;

        WebMvcLinkBuilder selfLinkBuilder = linkTo(UserController.class).slash(this.id);
        add(selfLinkBuilder.withSelfRel());
        add(selfLinkBuilder.withRel("update_user"));
        add(selfLinkBuilder.withRel("delete_user"));
    }
}

중간 부분은 생략하였다. 서비스에서 로직이 동작후 아래와 같은 DTO로 컨트롤러에게 넘겨준다. 링크를 만드는 주체를 DTO로 넘겼기 때문에 다음 상태를 알려주는 정보는 모두 DTO에서만 관리한다. 간단하게 설명을 하면 self 링크를 통해 현재 내 링크를 알려준다. 그리고 user라는 현재 상태에서는 update, delete 을 수행할 수 있는 링크들을 제공한다. (다음 상태의 링크를 제공. api를 요청하게 되면 요청자는 해당 현재 상태의 도메인을 다음 상태로 이동할 수 있게 된다는 개념)

그리고 StudyGroupDTO 또한 get_studygroup를 할 수 있는 링크가 존재한다. 이유로는 일단 내 서비스에서 생각하기로 user를 받아올때 wordbook과 studyGroup들은 함께 받아오는 일이 많을 것이다. 때문에 user에서 wordbook과 studygroup를 함께 반환하도록 하였다. (필요하지 않은데 무분별한 데이터를 많이 제공하는것은 성능 측면에서는 좋지 않을것이다.) studygroup으로만 설명하면 따로 studygroupList를 반환하는 api 없이 user에서 studygroupList 정보를 함께 받아오고 필요할때마다 바로 studygroup을 조회할 수 있도록 구현하였다.

(studygroupList를 따라 조회하고 studygroup를 조회하는 것에 대한 설계는 자신의 프로젝트에 맞게 진행하면 될 것이다.)

Update

update도 create와 유사하다 생각한다. 어짜피 기존에 도메인 상태값에서 수정된 값으로 상태를 반환 한 것이기때문에 갈 수 있는 상태는 Create와 같다고 설계하였다.

Delete

아직은 구현하지 않았지만 User 라는 도메인은 계정을 뜻한다. 계정이 삭제 되었다는건 처음 상태로 돌아가야하므로 로그인 상태로 돌아가는 정보를 제공하거나 로그인 요청 상태를 반환하면 될 것 같다