본문 바로가기

개발중/Spring

[API 설계] 서비스단에서 유효성 검사 분리하기

728x90
반응형

 

현재 프로젝트에서 유효성 검사는 잘 이루어지지 않고 있었다.

하나의 속성 데이터에 대한 유효성 검사를 마음먹고 하려니 서비스단이 너무 길어졌다.

 

중복되는 코드들도 너무 많고 이거 참 난감한 상황이 발생했다.

 

애초에 유효성 검사 로직을 수행하는 공통 로직을 만들면 어땠을까 생각도 해봤는데

이미 늦은 듯하다.

 

그래서 고민을 하다가 서비스 폴더에 하나의 검증 클래스를 생성했다.

 

 

기존 보완

contoller
    ㄴ dataContoller.java
service
    ㄴ dataService.java
dao
    ㄴ dataDao.java
vo
    ㄴ dataVo.java


contoller
    ㄴ dataContoller.java
service
    ㄴ dataService.java
    ㄴ dataValidate.java
dao
    ㄴ dataDao.java
vo
    ㄴ dataVo.java

 

 

여기서는 검증만 진행한다.

서비스단에 있는 모든 메소드 명과 일치시킨 메소드 명을 검증 클래스에 생성하고

해당 서비스 메소드마다 요구하는 검증이 다르므로 그에 맞는 유효성 검사를 실행한다.

 

 

public void getDataList(DataVo vo) {
		
		// 언어 코드 유효성
		if(!vo.getLan().trim().equals("")) {
			if(lanCodeList.stream().filter( code -> vo.getLan().toUpperCase().equals(code.getCode_value())).findAny().orElse(null) == null) {
				throw new CustomException(ApiResultErrorCode.FieldValueException, "언어 코드를 확인해주세요.");
			}
			 
		}
		 
		// 채널 코드 유효성
		if(!vo.getSourceType().trim().equals("")) {
			for(String type : vo.getSourceType().split(",")) {
				if(channeleCodeList.stream().filter( code -> type.equals(code.getCode_value())).findAny().orElse(null) == null) {
					throw new CustomException(ApiResultErrorCode.FieldValueException, "채널 코드를 확인해주세요.");
				}
			}
		}
		 
		// 사용 여부 유효성
		if(!vo.getUseYn().trim().equals("") && !(vo.getUseYn().equals("Y") ||  vo.getUseYn().equals("N"))) {
			 throw new CustomException(ApiResultErrorCode.FieldValueException, "사용 여부 값을 확인해주세요. ('Y' or 'N' or '')");
		 }
		 
		// orderByValue 유효성
		if(!vo.getOrderByValue().trim().equals("") && !(vo.getOrderByValue().equals("ASC") ||  vo.getOrderByValue().equals("DESC"))) {
			 throw new CustomException(ApiResultErrorCode.FieldValueException, "orderByValue 값을 확인해주세요. (ASC : 오름차순, DESC : 내림차순)");
		}
		 
		// OrderByField 유효성
		if( !vo.getOrderByField().trim().equals("") && !Enums.getIfPresent(notSentenceEnum.class, vo.getOrderByField()).isPresent() ) {
			 vo.setOrderByField(notSentenceEnum.of(vo.getOrderByField()));
		}

	}

 

 

하나하나 검사하다보면 코드는 길어지고 복잡해지지만 그래도 개발된 API 를 사용하는 입장에서 명확하고 꼼꼼하게 이용할 수 있을 생각하면 이게 맞는 것 같다.

 

근데 아직도 드는 고민이 몇 개 있다.

  • 공통으로 유효성 검사를 실행하고 싶은데 공통점을 찾아내기가 힘들다. 처음부터 구조를 세웠으면 나았을까 ?
  • 서비스 단이 길다는 이유로 유효성 로직을 분리하는게 맞을까 ?
  • Vo 의 setter 에서 유효성 검사를 하는 것도 생각해봤지만 해당 속성값에 들어가는 값이 항상 일치하는 것이 아닌 경우에 따라 값이 달라지는 경우는 어떻게 처리해야 할까 싶어 포기했다. 예를들어 아래처럼 있을 때 참 매개변수를 받아서 화이트 스페이스 값을 허용 해줄지 말지 받는 것도 애매하고 ..
    • 검색 조건에서 쓰이는 사용여부 속성  
      • 'Y'
      • 'N'
      • ''
        • 'Y' 도 'N' 도 검색하지 않겠다.
    • 등록시 쓰이는 사용여부 속성
      • 'Y'
      • 'N'
  • @Valid 로 속성을 지정해 사용하자니 위에와 같은 상황에서는 어떻게 대처를 하지 싶었다.

 

아무튼 어떤 로직이 최선일지 잘 모르겠어서 아직도 헤메는 중 ,,, 😥

 

728x90
반응형