Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ DtoMapper v1.0 #33

Merged
merged 9 commits into from
Nov 12, 2023
Merged

✨ DtoMapper v1.0 #33

merged 9 commits into from
Nov 12, 2023

Conversation

psychology50
Copy link
Member

작업 이유

  • JSend protocol을 준수하기 위한 DtoMapper Util 제작

작업 사항

🟡 SuccessResponse에 들어올 수 있는 Dto 타입

  1. Dto

    • 단일 객체만 응답으로 보내는 경우
    • @Dto 어노테이션의 name 값을 key로 하여 data를 object로 돌려준다.
  2. InnerDto가 존재하는 Dto

    • 다중 객체를 응답으로 보내는 경우
    • @InnerDto 어노테이션의 name 값을 key로 하여 data를 object로 돌려준다.
  3. Pageable Dto를 구현하는 Dto (아직 미구현)

    • Pageable 속성이 필요한 Dto의 경우에도 처리가 가능해야 한다.

🟡 DtoMapper.from() Specification

    /**
     * data 객체를 JSend 형식의 Map으로 변환한다. <br/>
     * 이 때, data 객체는 @Dto 어노테이션이 선언되어 있어야 하며, name 속성이 JSON의 key 값으로 사용된다. <br/>
     * 응답 도메인이 여러 개인 경우, 외부 클래스에서 중첩 클래스를 관리하는 필드는 @JsonIgnore 어노테이션을 선언해야 하며, <br/>
     * 최종 응답 형태에서 외부 클래스와 동일한 레벨로 분리된다. <br/>
     * 중첩 클래스는 @InnerDto 어노테이션을 선언해야 하며, name 속성이 JSON의 key 값으로 사용된다. <br/>
     * 중첨 클래스 내에서 직렬화를 원치 않는 필드는 @JsonIgnore 어노테이션을 선언해야 한다. (혹은 getter 메서드를 선언하지 않으면 된다.)
     * @param data Object : @Dto 타입 객체
     * @return Map<String, Object>
     */
    // TODO(YANG JAESEO) : 2021/10/14 Pageable 객체 처리
    // Pageable 객체를 JSend 형식의 Map으로 변환할 수 있도록 처리한다. (PageDto를 상속받아서 사용)
    // labels: enhancement
    public <T> Map<String, Object> from(T data) {
        // 1. data의 클래스를 가져온다.
        Class<?> type = data.getClass();

        // 2. 외부 및 내부 클래스를 가져온다.
        // (단, Builder 클래스 및 @Dto가 정의되지 않은 클래스는 제외한다.)
        List<Object> instances = Arrays.stream(type.getNestMembers())
                .filter(cl -> !cl.getName().endsWith("Builder") || cl.isAnnotationPresent(Dto.class))
                .map(this::getInstance)// 3. 클래스 생성자를 이용해 인스턴스 생성
                .toList();

        // 4. data의 값을 도메인 별로 binding하여 Map 형태로 포매팅한다. setter가 없으므로 getter 메서드를 이용한다.
        // (단, @JsonIgnore가 선언된 필드는 내부 클래스에 포함되지 않으며, 단지 중첩 클래스에 값을 복사하기 위해 사용한다.)
        instances.forEach(instance -> {
            if (instance.getClass().isAnnotationPresent(InnerDto.class)) {
                format.put(instance.getClass().getAnnotation(InnerDto.class).name(), extractInnerDtoValues(data, instance));
            } else {
                format.put(instance.getClass().getAnnotation(Dto.class).name(), extractDtoValues(data, instance));
            }
        });

        return format;
    }

이슈 연결

close #30

@psychology50 psychology50 added the enhancement New feature or request label Nov 10, 2023
@psychology50 psychology50 self-assigned this Nov 10, 2023
@heejinnn
Copy link
Contributor

확인요~

@heejinnn heejinnn closed this Nov 12, 2023
@heejinnn heejinnn reopened this Nov 12, 2023
Copy link
Contributor

@heejinnn heejinnn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인요~

@psychology50 psychology50 merged commit 51897d2 into develop Nov 12, 2023
5 checks passed
@psychology50 psychology50 deleted the feat/30 branch November 12, 2023 05:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

✨ Dto로 SuccessResponse 응답 포맷 맞추기
2 participants