ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 패스트캠퍼스 챌린지 15일차
    JAVA/Spring 2021. 11. 15. 23:32

    1. 예외처리를 활용한 서비스 로직 리팩토링

     비효율적으로 코드를 짤 경우 불필요하고도 연이은 유효성 검사가 나타나는 모습을 볼 수 있다. 물론 때에 따라서 try catch를 통한 예외 처리는 필수적이지만 더욱 간단하고 효율적으로 해결할 수 있는 방안이 있는 상황에서 굳이 가독성이 떨어지는 코딩을 할 필요는 없을 것이다. 

     

    오늘은 비효율적인 코딩의 예시를 함께 살펴본 뒤, 효율적인 코드로 리팩토링하는 방법을 알아본다.

     

    우선 Validation에 대한 결과로 뭔가를 return하려고 할 때 볼 수 있는 모습이다.

     

    dmaker.service.DMakerService

    public DeveloperVaildationDto validateCreateDeveloperRequest(CreateDeveloper.Reqeust request) {
    	DeveloperValidationDto developerValidationDto = null;
        
        // 에러를 담아준다는 명목으로 dto에 응답을 담기 시작하면 모든 validation을
        // 이런식으로 반환해야만 한다.
        developerValidationDto = validateDeveloperLevel(
        	request.getDeveloperLevel(),
            request.getExpereienceYears()
        );
        
        developerRepository.findByMemberId(request.getMemberId())
        		.ifPresent((developer =-> {
                	throw new DMakerException(DUPLICATED_MEMBER_ID);
                })));
                
        return developerValidationDto;
    }

     여기에 더해서 혹시나 어디서 발생할 지 모르는 알 수 없는 오류가 염려되어 try catch문을 이용해서 validation에 대한 결과 처리를 하기도 한다.

     

    dmaker.service.DMakerService

    public DeveloperVaildationDto validateCreateDeveloperRequest(CreateDeveloper.Reqeust request) {
        DeveloperValidationDto developerValidationDto = null;
        
        developerValidationDto = validateDeveloperLevel(
        	request.getDeveloperLevel(),
            request.getExpereienceYears()
        );
        
        // validation으로부터 어떤 에러가 날 지 모른다는 염려 때문에 
        // try catch를 이용해 예외 처리를 해준 모습이다.
        try{
        	if(developerRepository.findByMemberId(request.getMemberId()).isPresent()) {
    			developerValidationDto = new DeveloperValidationDto(
                		DUPLICATED_MEMBER_ID,
                        DUPLICATED_MEMBER_ID.getMessage()
                );
            }
        } catch(Exception e) {
        	log.error(e.getMessage(), e);
            developerValidationDto = new DeveloperValidationDto(
            	INTERNAL_SERVER_ERROR,
                INTERNAL_SERVER_ERROR.getMessage()
            );
        }
                
        return developerValidationDto;
    }

    물론 try catch를 이용하는 게 잘못됐다는 건 아니다. 외부 라이브러리나 API 사용 시 예상 범위를 벗어나거나 통제할 수 없는 오류가 간혹 발생할 수 있기 때문에 그러한 오류에 대한 예외 처리를 위해 try catch를 사용하는 건 적합하다. 그러나 위와 같은 사용은 잘못된 사용의 예시이다.

     

    위의 코드에서 return해주는 값을 처리하기 위해 Controller에서는 아래와 같은 동작을 수행한다.

     

    dmaker.controller.DMakerController

    if (developerValidationDto != null) {
    	return CreateDeveloper.Response.builder()
        		.errorCode(developerValidationDto.getErrorCode())
                .errorMessage(developerValidationDto.getErrorMessage())
                .build();
    }

    위와 같은 코드가 Controller 단에 포함되게 되면 Controller의 존재 의의를 해치게 된다. 로직에 대한 처리는 Service에서 하기 위해 Spring Framework를 사용하는 것인데 그걸 Controller에 담게 되니 오류가 발생하지는 않지만 기존에 짜여있던 구조가 엉키게 된다.  

     

    이렇게 코드 구조가 망가지는 것을 피하기 위해 앞서 학습했던 구조들을 코드에 적용해왔던 것이다.

     

     

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

     

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

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

    fastcampus.co.kr

    댓글

Designed by Tistory.