ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패스트캠퍼스 챌린지 10일차
    JAVA/Spring 2021. 11. 10. 21:13

    1. Developer Get(조회) 기능 개발

    지난번에 생성한 Developer를 조회하는 기능에 대해 알아본다.

    먼저, 전체 개발자 목록을 조회하는 방법이다.

    DMakerController에 정의된 getAllDevelopers에서 return값을 DeveloperDto가 담긴 List로 설정해준다.

     

    dmaker.controller.DMakerController

    @GetMapping("/developers")
    // return하는 값을 DeveloperDto가 들어가는 List로 설정해준다.
    public List<DeveloperDto> getAllDevelopers() {
        // GET /developers HTTP/1.1
    
        log.info("GET /developers HTTP/1.1");
    
        return dMakerService.getAllDevelopers();
    }

    다음으로 DeveloperDto를 정의해준다.

    GET을 통해 응답을 받을 때 entity를 그대로 쓰는 건 권장되지 않는데 이유는 불필요한 정보의 유출이 발생할 수 있고 트랜잭션이 제대로 설정되어 있지 않기 때문에 데이터에 손상이 발생할 수 있기 때문이다.

    Entity를 그대로 쓰지 않고 Dto로 분리하는 게 자료 구조의 유연성과 같은 부분에서도 유용하다.

     

    dmaker.dto.DeveloperDto

    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public class DeveloperDto {
        private DeveloperLevel developerLevel;
        private DeveloperSkillType developerSkillType;
        private String memberId;
    
        // DeveloperDto 또한 developer entity로부터 많이 생성될 것이므로 fromEntity 메서드를 만들어준다.
        public static DeveloperDto fromEntity(Developer developer) {
            return DeveloperDto.builder()
                    .developerLevel(developer.getDeveloperLevel())
                    .developerSkillType(developer.getDeveloperSkillType())
                    .memberId(developer.getMemberId())
                    .build();
        }
    }

     

    DeveloperDto를 정의해준 뒤 DMakerService에 getAllDeveloper를 정의해준다.

     

    dmaker.service.DMakerService

    public List<DeveloperDto> getAllDevelopers() {
            return developerRepository.findAll()
                    // fromEntity로부터 나온 결과값을 map에 해준다.
                    .stream().map(DeveloperDto::fromEntity)
                    // stream된 값을 List로 collect한다. (List<DeveloperDto>를 리턴해야하기 때문에)
                    .collect(Collectors.toList());
        }

    DeveloperDto의 fromEntity 메서드를 통해 나온 결과값을 map에 담아준다.

    그 후에 해당 값들을 List로 옮겨서 return해준다.

    POST 요청을 통해 developer를 생성하고 GET을 통해 조회하면 아래와 같은 결과를 얻을 수 있다.

    다음으로는 단일 개발자에 대한 정보 조회를 하는 방법이다.

    앞에서와 마찬가지로 Controller에 단일 정보 조회를 하는 메서드를 정의해준다.

     

    dmaker.dto.DMakerController

    @GetMapping("/developer/{memberId}")
        public DeveloperDetailDto getDeveloperDetail(
                @PathVariable String memberId
        ) {
            log.info("GET /developers HTTP/1.1");
    
            return dMakerService.getDeveloperDetail(memberId);
        }

    위의 코드를 살펴보면 @Getmapping의 URL 부분에 {memberId}를 통해 memberId를 전달받고 전달받은 memberId를 매개 변수에 담아 dMakerService의 getDeveloperDetail을 실행시킬 때 사용하는 모습을 볼 수 있다.

    이러한 방법으로 URL을 통해 전달된 값을 사용할 수 있다.

     

    다음으로 DeveloperDetailDto를 정의해준다.

     

    dmaker.dtoDeveloperDetailDto

    @Getter
    @Setter
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public class DeveloperDetailDto {
        private DeveloperLevel developerLevel;
        private DeveloperSkillType developerSkillType;
        private Integer experienceYears;
        private String memberId;
        private String name;
        private Integer age;
    
        // DeveloperDto 또한 developer entity로부터 많이 생성될 것이므로 fromEntity 메서드를 만들어준다.
        public static DeveloperDetailDto fromEntity(Developer developer) {
            return DeveloperDetailDto.builder()
                    .developerLevel(developer.getDeveloperLevel())
                    .developerSkillType(developer.getDeveloperSkillType())
                    .experienceYears(developer.getExperienceYears())
                    .memberId(developer.getMemberId())
                    .name(developer.getName())
                    .age(developer.getAge())
                    .build();
        }
    }

    모든 Developer 정보를 불러올 때보다 더 자세한 정보를 담아 전달해준다.

    다음으로 DMakerService에 getDeveloperDetail을 정의해준다.

     

    dmaker.service.DMakerService

    public DeveloperDetailDto getDeveloperDetail(String memberId) {
            // developer entity를 가져온다.
            return developerRepository.findByMemberId(memberId)
                    .map(DeveloperDetailDto::fromEntity)
                    // findByMemberId를 통해 가져온 developer entity가 존재하지 않으면 exception을 발생시킨다.
                    .orElseThrow(() -> new DMakerException(NO_DEVELOPER));
        }

    findByMemberId를 통해 entity를 가져온뒤 해당 entity에 담긴 정보들을 fromEntity를 통해 map으로 담아준다.

    .map() 뒤에 .get()을 통해 데이터를 그저 가져오는 방식으로만 진행할 수도 있으나 .orElseThrow를 통해 데이터가 존재하지 않는 경우의 Exception 처리 또한 해주는 것이 효율적이다.

     

    아래는 Post를 통해 생성된 단일 Developer에 대한 정보를 GET을 통해 가져오는데 성공한 모습니다.

     

     

    본 포스팅은 패스트 캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
    https://bit.ly/3FVdhDa

     

    수강료 100% 환급 챌린지 | 패스트캠퍼스

    딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!

    fastcampus.co.kr

    'JAVA > Spring' 카테고리의 다른 글

    패스트캠퍼스 챌린지 12일차  (0) 2021.11.12
    패스트캠퍼스 챌린지 11일차  (0) 2021.11.11
    패스트캠퍼스 챌린지 9일차  (0) 2021.11.09
    패스트캠퍼스 챌린지 8일차  (0) 2021.11.08
    패스트캠퍼스 챌린지 7일차  (0) 2021.11.07

    댓글

Designed by Tistory.