ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패스트캠퍼스 챌린지 8일차
    JAVA/Spring 2021. 11. 8. 20:48

    1. 비즈니스 Validation 적용

    dmaker.service.DMakerService

     @Transactional
        public void createDeveloper(CreateDeveloper.Request request) {
            // private 메소드를 생성하여 비즈니스 validation을 진행한다.
            validateCreateDeveloperRequest(request);
    
            // Builder를 통해 각각의 데이터들을 삽입해준다.
            Developer developer = Developer.builder()
                    .developerLevel(DeveloperLevel.JUNIOR)
                    .developerSkillType(DeveloperSkillType.FRONT_END)
                    .experienceYears(2)
                    .name("Harry")
                    .age(31)
                    .build();
    
            // 작성된 developer 객체를 developerRepository를 통해 DB에 저장한다.
            developerRepository.save(developer);
    
            //developerRepository.delete(developer1);
        }

    validateCreateDeveloperRequest 메소드를 생성하여 비즈니스 Validation을 진행해준다.

    아래는 validateCreateDeveloperRequest 메소드의 정의이다.

     

    dmaker.service.DMakerService

    private void validateCreateDeveloperRequest(CreateDeveloper.Request request) {
            // business validatioin
            if(developerLevel == DeveloperLevel.SENIOR
                    && experienceYears < 10) {
                // 회사에서 만드는 특정 비즈니스 앱에서는 Java에 내장된 RuntimeException을 쓰는 것보다는
                // 직접 Exception을 정의해주는 것이 좋다.
                throw new RuntimeException("SENIOR level needs 10 years of experience!");
            }
    }

    위와 같이 Java에 이미 내장된 RuntimeException을 통해 Validation을 할 수도 있으나 회사에서 만드는 특정 비즈니스 앱에 맞도록 직접 Exception을 정의해주는게 좋다.

     

    dmaker.exception.DMakerException

    // 앱 전용의 에러 코드와 에러 메시지를 정의하고 사용할 수 있다.
    @Getter
    public class DMakerException extends RuntimeException {
        private DMakerErrorCode dMakerErrorCode;
        private String detailMessage;
    
        public DMakerException(DMakerErrorCode errorCode) {
            super(errorCode.getMessage());
            this.dMakerErrorCode = errorCode;
            this.detailMessage = errorCode.getMessage();
        }
    
        public DMakerException(DMakerErrorCode errorCode, String detailMessage) {
            super(errorCode.getMessage());
            this.dMakerErrorCode = errorCode;
            this.detailMessage = detailMessage;
        }
    }

    dmaker.esception.DMakerErrorCode

    @Getter
    @AllArgsConstructor
    public enum DMakerErrorCode {
        // 아래와 같이 각 에러코드를 정의해주고 각 에러 코드에 해당하는 메시지를 같이 매칭해준다.
        NO_DEVELOPER("해당되는 개발자가 없습니다."),
        DUPLICATED_MEMBER_ID("Member Id가 중복되는 개발자가 있습니다."),
        LEVEL_EXPERIEND_YEARS_NOT_MATCHED("개발자 레벨과 연차가 맞지 않습니다"),
    
        INTERNAL_SEREVER_ERROR("서버에 오류가 발생했습니다."),
        INVALID_REQUEST("잘못된 요청입니다.")
        ;
    
        private final String message;
    }

    위와 같이 DMakerException에 대한 정의를 해주면서 에러코드로 사용할 enum Class인 DMakerErrorCode도 함께 생성해준다. 에러코드를 정의할 때는 에러코드에 해당하는 메시지도 같이 정의해준다.

    DMakerException에는 기본적으로 정의된 에러 메시지를 출력하는 상황과 사용자가 직접 에러 메시지를 정의하여 넣는 상황을 고려하여 메소드를 생성해준다.

     

    dmaker.service.DMakerSerivce 

    private void validateCreateDeveloperRequest(CreateDeveloper.Request request) {
            // business validatioin
            DeveloperLevel developerLevel = request.getDeveloperLevel();
            Integer experienceYears = request.getExperienceYears();
            if(developerLevel == DeveloperLevel.SENIOR
                    && experienceYears < 10) {
                //throw new RuntimeException("SENIOR level needs 10 years of experience!");
                throw new DMakerException(LEVEL_EXPERIEND_YEARS_NOT_MATCHED);
            }
            if(request.getDeveloperLevel() == DeveloperLevel.JUNIOR
            && ( request.getExperienceYears() < 3 || request.getExperienceYears() > 10 )) {
                throw new DMakerException(LEVEL_EXPERIEND_YEARS_NOT_MATCHED);
            }
            if(developerLevel == DeveloperLevel.JUNIOR && experienceYears > 4) {
                throw new DMakerException(LEVEL_EXPERIEND_YEARS_NOT_MATCHED);
            }
    
            Optional<Developer> developer = developerRepository.findByMemberId(request.getMemberId());
    
            if(developer.isPresent())
                throw new DMakerException(DUPLICATED_MEMBER_ID);
        }

    dmaker.repository.DeveloperRepository

    @Repository
    public interface DeveloperRepository
            extends JpaRepository<Developer, Long> {
        Optional<Developer> findByMemberId(String memberId);
    }

    생성된 DMakerException을 통해 구체적인 validation을 정의해준다. 중복해서 정의되는 부분들은 IntelliJ의 refactor -> Introduce Variable 기능을 통해 메서드 상단부에 선언하여 중복을 줄일 수 있다.

     

     

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

     

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

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

    fastcampus.co.kr

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

    패스트캠퍼스 챌린지 10일차  (0) 2021.11.10
    패스트캠퍼스 챌린지 9일차  (0) 2021.11.09
    패스트캠퍼스 챌린지 7일차  (0) 2021.11.07
    패스트캠퍼스 챌린지 6일차  (0) 2021.11.06
    패스트캠퍼스 챌린지 5일차  (0) 2021.11.05

    댓글

Designed by Tistory.