SpringBoot 2 매개 변수 관리 실천 의 입력 이 검증 에 참여 하 는 방식

매개 변수 관리
프로 그래 밍 시스템 에서 좋 은 코드 를 쓰기 위해 각종 디자인 모델,원칙,제약 등에 따라 코드 를 규범화 시 켜 코드 의 가 독성,재 활용 성,수정 이 가능 하 다.실제로 개인 적 으로 쓴 코드 가 좋 으 면 다른 사람 이 수정 해도 원작 자의 사고 와 포장 을 파괴 할 수 없다 고 생각 하 는데 이것 은 매우 높 은 수준 이 어야 한다.
그러나 일상적인 개발 에서 많은 객관 적 인 요소 에 지장 을 주 고 코드 를 계속 생각 하고 최적화 할 시간 이 별로 없 기 때문에 실제 상황 의 측면 에서 시스템 코드 를 어떻게 구축 하 는 지 생각 할 수 밖 에 없다.앞으로 자신 이 자신의 코드 를 읽 을 수 있 도록 확보한다.자신의 몇 년 프로 그래 밍 에서 실제 적 으로 다음 과 같은 몇 가지 측면 을 고려 할 것 이다.코드 등급 관리,명명 과 주석 이 통일 되 고합 리 적 인 디자인 업무 데이터 베 이 스 는 매개 변수 스타일 을 명 확 히 한다.
여기 서 매개 변수 관 리 를 살 펴 보 겠 습 니 다.
코드 규범 이라는 개념 을 어떻게 이해 합 니까?즉,대부분의 개발 인정,지 키 고 싶 은 제약,예 를 들 어 Spring 프레임 워 크 와 Mvc 모델 이 공사 에 대한 관리,에서 업무 개발 에 대한 규정 은 그 근본 적 인 목적 은 업무 발전 에 따라 코드 가 유지 할 수 없 는 경지 로 발전 하 는 것 을 피 하 는 것 입 니 다.
2.수신 매개 변수
수신 매개 변수 방식 은 여러 가지 가 있 습 니 다.List,Map,Object 등 이 있 지만 매개 변수의 의 미 를 명 확 히 하기 위해 매개 변수 대상 의 구 조 를 설계 하고 일정한 규범 을 지 켜 야 합 니 다.예 를 들 어 Map 수신 매개 변 수 를 명 확 히 금지 합 니 다.
Rest 스타일 수신 단일 ID 인자:

@GetMapping("/param/single/{id}")
public String paramSingle (@PathVariable Integer id){
    return "Resp:"+id ;
}
지정 한 인자 여러 개 받 기:

@GetMapping("/param/multi")
public String paramMulti (@RequestParam("key") String key, @RequestParam("var") String var){
    return "Resp:"+key+var ;
}
자바 기반 패키지 대상 입력:

@PostMapping("/param/wrap")
public ParamIn paramWrap (@RequestBody ParamIn paramIn){
    return paramIn ;
}

--       
public class ParamIn {
    private Integer id ;
    private String key ;
    private String var ;
    private String name ;
}
이상 은 개발 에서 자주 사용 하 는 몇 가지 연결 방식 으로 여 기 는 보통 다음 과 같은 몇 가지 습관 을 지 킵 니 다.
  • 매개 변수 의미:매개 변 수 를 받 는 역할 을 명 확 히 한다.
  • 개 수 제한:매개 변수 가 세 개의 사용 포장 대상 을 초과 합 니 다.
  • 여러 개의 인터페이스 가 하나의 포장 대상 을 사용 하 는 것 을 피한다.
  • 포장 대상 의 주체 가 너무 복잡 하지 않도록 한다.
  • 매개 변수 수신 은 복잡 한 제약 이 없고 전체적으로 도 지 키 기 쉽다.일반적인 문 제 는 비교적 큰 주체 대상 을 처리 할 때 포장 대상 이 여러 군데 재 활용 되 기 쉬 워 서 대상 필드 의 속성 이 많다 는 것 이다.이런 상황 은 복잡 한 업무 에서 특히 나타 나 기 쉽다.이런 대상 은 웹 층 인터페이스 사용 에 불리 하 다.또는 업무 층 과 인터페이스 층 에서 대상 을 혼용 하 는 경우 가 많다.
    업무 층 에 복잡 한 BO 대상 을 밀봉 하여 업무 관리의 복잡 도 를 낮 추 는 것 은 합 리 적 이 고 흔히 볼 수 있 는 조작 으로 웹 인터페이스 차원 에서 인터페이스 기능 에 따라 각자 참여 주 체 를 관리 하고 업무 가 실현 되 는 과정 에서 BO 대상 에 전송 할 수 있다.
    복잡 한 업무 포장 대상 이 각 층 에서 흩 날 리 는 것 을 피하 고 여러 개의 인터페이스 가 같은 복잡 한 대상 이 라면 개발 자 들 을 헷 갈 리 게 하기 쉽다.
    3.응답 매개 변수
    매개 변수 수신 에 대응 하 는 것 은 바로 매개 변수 응답 이다.매개 변수 응답 은 보통 명확 한 제약 규범 을 가진다.응답 주체 데이터,응답 코드,설명 정 보 를 가진다.일반적으로 이런 세 가지 핵심 요소 다.
    응답 매개 변수 주체:
    이곳 의 일반적인 사용 은 일반적으로 주체 데이터 의 수신 에 쓰 인 다.
    
    public class Resp<T> {
    
        private int code ;
        private String msg ;
        private T data ;
    
        public static <T> Resp<T> ok (T data) {
            Resp<T> result = new Resp<>(HttpStatus.OK);
            result.setData(data);
            return result ;
        }
    
        public Resp (HttpStatus httpStatus) {
            this.code = httpStatus.value();
            this.msg = httpStatus.getReasonPhrase();
        }
    
        public Resp(int code, String msg, T data) {
            this.code = code;
            this.msg = msg;
            this.data = data;
        }
    }
    코드 상태 코드
    즉,인터페이스 상 태 는HttpStatus에서 상태 코드 에 대한 설명 을 참조 하고 지 키 는 것 을 권장 합 니 다.이것 은 보편적으로 지 키 는 규범 을 개발 하 는 것 입 니 다.업무 수 요 를 만족 시 키 지 않 으 면 적당 한 사용자 정의 부분 인 코딩 에서 응답 코드 를 완전히 사용자 정의 할 수 있 지만 필요 하지 않 습 니 다.
    Msg 설명
    인터페이스의 응답 을 설명 하 는 Msg 는 성공 하거나 실패 할 수 있 습 니 다.더 많은 경우 에 업무 이상 을 처리 해 야 하 는 알림 정보 입 니 다.예 를 들 어 단일 번호 가 존재 하지 않 고 계 정 이 동결 되 는 등 업무 이상 에서 알림 정 보 를 캡 처 하고 페이지 에 응답 하거나 검증 이 통과 되 지 않 는 설명 을 입력 해 야 합 니 다.
    데이터 데이터
    인터페이스 응답의 주체 데 이 터 는 서로 다른 업무 응답의 대상 이 틀림없이 다 르 기 때문에 여 기 는 일반적인 메커니즘 을 바탕 으로 수신 하면 되 고 JSON 형식 으로 페이지 에 응답 하면 된다.
    참고 사례
    인터페이스 리 셋:
    
    @PostMapping("/resp/wrap")
    public Resp<KeyValue> respWrap (@RequestBody KeyValue keyValue){
        return Resp.ok(keyValue) ;
    }
    응답 형식:
    
    {
       "code": 200,
       "msg": "OK",
       "data": {
           "key": "hello",
           "value": "world"
       }
    }
    4.매개 변수 검사
    매개 변수 수신 과 응답 은 상대 적 으로 복잡 하지 않 습 니 다.처리 하기 어 려 운 것 은 바로 매개 변수 검사 입 니 다.제약 검사,업무 합 법성 검사,응답 매개 변수 비 공 비 null 검사 등 각종 장면 입 니 다.
    시스템 운행 과정 에서 모든 매개 변 수 는 절대적 으로 신뢰 할 수 있 는 것 이 아니 기 때문에 매개 변수 검증 은 곳곳에서 볼 수 있다.서로 다른 장면 에서 의 매개 변수 검증 은 모두 필요 성 이 있 지만 근본 적 인 목적 은 요청 단 에 정 보 를 제시 하고 절 차 를 신속하게 중단 하 며 신속하게 응답 하 는 것 이다.
    1.참고
    많은 패 키 징 사상,디자인 모델,또는 여기 서 말 하 는 매개 변수 검증 은 기 존의 자바 소스 코드 나 우수한 구 조 를 참고 할 수 있 습 니 다.이것 은 반드시 갖 춰 야 할 기초 의식 입 니 다.
    자바 네 이 티 브 방법의java.lang.Thread스 레 드:
    
    public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();
        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();   
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }
    자바 소스 코드 에 서 는 대부분 원생 if 판단 방식 으로 매개 변 수 를 검증 합 니 다.
    Spring 프레임 워 크org.springframework.util.ClassUtils도구 류 부분 코드:
    
    public static Class<?> forName(String name, @Nullable ClassLoader classLoader)
    			throws ClassNotFoundException, LinkageError {
    		Assert.notNull(name, "Name must not be null");
    		Class<?> clazz = resolvePrimitiveClassName(name);
    		if (clazz == null) {
    			clazz = commonClassCache.get(name);
    		}
    		if (clazz != null) {
    			return clazz;
    		}
    }
    Spring 프레임 워 크 에 서 는 기본 적 인 if 판단 외 에 도 하나의org.springframework.util.Assert단언 도구 류 를 패키지 합 니 다.
    2.자주 사용 하 는 검사 방식
    판단 하 는 경우
    
    @GetMapping("/check/base")
    public String baseCheck (@RequestParam("var") String var){
        if (var == null) {
            return var+" is null" ;
        }
        if ("".equals(var)){
            return var+" is empty" ;
        }
        if ("hello".equals(var)){
            return var+" sensitive word " ;
        }
        return var + " through " ;
    }
    이러한 판단 은 코드 에서 흔히 볼 수 있 습 니 다.다만 검증 의 주체 대상 이 매우 크 고 분포 식 환경 에서 if 판단 을 반복 적 으로 써 야 한다 면 실 수 를 하기 쉬 운 것 은 한 가지 이 고 개발 자 에 대한 인내심 시험 은 다른 한 가지 입 니 다.
    유효한 구성 요소
    몇 년 전에 비교적 유 행 했 던 자주 사용 하 는 검사 구성 요소Hibernate-Validator가 나중에 유행 한Validation-Api는 전 자 를 참고 하여 실현 한 것 이 라 고 한다.그러나 이것 은 중요 하지 않다.두 사람 은 모두 자바 빈 에 대한 검사 체 제 를 간소화 했다.
    주 해 를 기반 으로 자바 대상 의 필드 속성 을 표시 하고 검증 에 실패 할 경우 알림 정 보 를 설정 합 니 다.
    
    public class JavaValid {
    
        @NotNull(message="ID    ")
        private Integer id ;
    
        @Email(message="      ")
        private String email ;
    
        @NotEmpty(message = "      ")
        @Size(min = 2,max = 10,message = "       ")
        private String data ;
    }
    검사 결과 인쇄:
    
    public class JavaValidTest {
    
        private static Validator validator ;
    
        @BeforeClass
        public static void beforeBuild (){
            validator = Validation.buildDefaultValidatorFactory().getValidator();
        }
    
        @Test
        public void checkValid (){
            JavaValid valid = new JavaValid(null,"email","data") ;
            Set<ConstraintViolation<JavaValid>> validateInfo = validator.validate(valid) ;
            //       
            validateInfo.stream().forEach(validObj -> {
                System.out.println("validateInfo:"+validObj.getMessage());
            });
        }
    }
    인터페이스 사용:
    
    @PostMapping("/java/valid")
    public JavaValid javaValid (@RequestBody @Valid JavaValid javaValid,BindingResult errorMsg){
        if (errorMsg.hasErrors()){
            List<ObjectError> objectErrors = errorMsg.getAllErrors() ;
            objectErrors.stream().forEach(objectError -> {
                logger.info("CheckRes:{}",objectError.getDefaultMessage());
            });
        }
        return javaValid ;
    }
    이러한 검사 체 제 는 주해 방식 을 바탕 으로 일반적인 입 참 검 사 를 대폭 간소화 할 수 있 으 나 업무 매개 변수 에 대한 합 법 적 인 검사 에 적응 하지 못 한다.예 를 들 어 흔히 볼 수 있 는 ID 가 존재 하지 않 고 상태 차단 등 이다.
    Assert 단언
    Assert 단언 방식 에 대해 처음에는 유닛 테스트 에서 흔히 볼 수 있 었 는데 나중에 각종 우수한 프레임 워 크 에서 흔히 볼 수 있 었 다.예 를 들 어 Spring,Mybatis 등 이다.그 다음 에 업무 코드 에 나타 나 기 시작 했다.
    
    public class AssertTest {
        private String varObject ;
        @Before
        public void before (){
            varObject = RandomUtil.randomString(6) ;
        }
    
        @Test
        public void testEquals (){
            Assert.assertEquals(varObject+"   ",varObject,RandomUtil.randomString(6));
        }
        @Test
        public void testEmpty (){
            Assert.assertTrue(StrUtil.isNotEmpty(varObject));
            Assert.assertFalse(varObject+" not empty",StrUtil.isNotEmpty(varObject));
        }
        @Test
        public void testArray (){
            /*
                       : arrays first differed at element [1];
                Expected :u08
                Actual   :mwm
             */
            String var = RandomUtil.randomString(5) ;
            String[] arrOne = new String[]{var,RandomUtil.randomString(3)} ;
            String[] arrTwo = new String[]{var,RandomUtil.randomString(3)} ;
            Assert.assertArrayEquals("       ",arrOne,arrTwo);
        }
    }
    Assert 는 전통 적 인 if 판단 을 바 꾸 고 매개 변수 검사 의 코드 줄 수 를 대량으로 줄 이 며 프로그램의 가 독성 을 높 일 수 있다 고 단언 한다.이런 스타일 은 현재 비교적 유행 하 는 방식 이다.
    5.소스 코드 주소GitHub・ https://github.com/cicadasmile/middle-ware-parentGitEE https://gitee.com/cicadasmile/middle-ware-parent이상 은 SpringBoot 2 매개 변수 관리 실천 입 니 다.검사 에 참여 하 는 상세 한 내용 을 참고 하 십시오.SpringBoot 2 매개 변수 검사 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기