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

2022. 5. 24. 09:52·개발중/Spring Boot
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
반응형
저작자표시 (새창열림)

'개발중 > Spring Boot' 카테고리의 다른 글

스프링 테스트 코드 작성하기  (1) 2022.09.06
Response headers 에 Content-Disposition 안보임 😥Cors 관련인가 ?  (0) 2022.07.19
좋은 객체 지향의 다섯가지 원칙 SOLID  (0) 2022.04.11
스프링과 스프링 부트에 대해 알아보기  (0) 2022.04.11
✨ STS 설치 가이드 ✨  (0) 2022.03.27
'개발중/Spring Boot' 카테고리의 다른 글
  • 스프링 테스트 코드 작성하기
  • Response headers 에 Content-Disposition 안보임 😥Cors 관련인가 ?
  • 좋은 객체 지향의 다섯가지 원칙 SOLID
  • 스프링과 스프링 부트에 대해 알아보기
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (932) N
      • 개발중 (634) N
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (87)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (18) N
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (17)
        • 기록 (1)
        • 캐글 스터디 (3)
        • R (12)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    쿠버네티스
    Spring
    알고리즘
    springboot
    BackendDevelopment
    redis
    리눅스 1급 요약
    파이썬
    docker
    네트워크 관리사 실기
    네트워크 관리사
    jpa
    Git 저장소
    파이썬 알고리즘
    리눅스 마스터 1급
    네트워크 관리사 자격증
    VUE
    쿠버네티스 스터디
    리눅스 마스터 요약
    네트워크 관리사 2급
    리눅스 마스터 1급 정리
    리눅스 마스터 1급 요약
    git
    REST API
    리눅스 마스터
    java
    스프링
    네트워크 관리사 2급 실기
    네트워크 관리사 요약
    네트워크 관리사 학점
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
[API 설계] 서비스단에서 유효성 검사 분리하기
상단으로

티스토리툴바