카테고리 없음

[SPRING] param @NotEmpty 수동으로 확인하기

LKJaden 2025. 6. 19. 11:12

param @NotEmpty 어노테이션은 그대로도 빈 값을 잡아 에러로 띄워주지만, 에러를 원하는 item의 형태로 직접 처리하고 싶다던가 하는 이유로 수동으로 확인하고자 아래와 같은 코드를 짜보았다.

막상 짰지만 쓰진 않았다.. 결국 그냥 기본 에러(MethodArgumentNotValidException)를 사용했지만.. 기록겸 남겨둔다. 

 

 

Source Code for (Single) Param

전체 소스 코드이다. 

private PartnerCodeItem validateMandatoryFields(Object obj) { //obj에는 Param를 넘겨줌
Field[] fields = obj.getClass().getDeclaredFields(); //obj의 모든 필드를 가져옴

  for (Field field : fields) { //모든 필드를 하나씩 확인
      if (field.isAnnotationPresent(NotEmpty.class)) { //필드에 NotEmpty 어노테이션이 붙어 있는지 확인
       field.setAccessible(true); //해당 필드가 private나 protect일 수 있으므로 강제로 값에 접근할 수 있도록 함
          try {
              Object value = field.get(obj); //필드의 값을 읽어옴 
              if (value == null || (value instanceof String && ((String)value).isBlank()) || (value instanceof List && ((List<?>)value).isEmpty())) { //값이 Empty라면 
               throw new BizException("SD_0000000", new Object[]{field.getName()}); //예외로 throw함 예외는 원하는 대로 처리하면 됨
              }
          } catch (BizException e) {
           return setPartnerCodeItems(partnerCode, e); // catch에서 잡은 예외를 원하는 item형식으로 처리할 수 있도록 함
          } catch (IllegalAccessException e) {
              e.printStackTrace(); // 마찬가지로 처리하고 싶다면 원하는 대로 처리하면 됨
          }
      }
  }
  return null; 
}

 

 


Source Code for Multi Param

다중 파람 구조를 가진 경우의 전체 소스 코드이다. 

다중 파람 구조에 대한 설명은 소스 코드 아래에서 다루었다. 

private PartnerCodeItem validateMandatoryFields(Object obj) {
String partnerCode = null;
Field[] fields = obj.getClass().getDeclaredFields(); //all fields in obj

  for (Field field : fields) { 
      if (field.isAnnotationPresent(NotEmpty.class)) { //check if the @NotEmpty annotation is attached
       field.setAccessible(true); //forced access to a private/protect field
          try {
              Object value = field.get(obj); //get value
              if (value == null || (value instanceof String && ((String)value).isBlank()) || (value instanceof List && ((List<?>)value).isEmpty())) {
               throw new BizException("SD_0000000", new Object[]{field.getName()});
              }
              if ("partnerCode".equals(field.getName())) {
               partnerCode = value.toString();
              }
              if (value instanceof List<?>) { // recursive
                  List<?> subFields = (List<?>) value;
                  for (Object subField : subFields) {
                      if (subField != null) {
                          PartnerCodeItem subItem = validateMandatoryFields(subField); // 다중 파람 구조를 사용하여 재귀를 사용
                          if (subItem != null) return subItem;
                      }
                  }
              }
              
          } catch (BizException e) {
           return setPartnerCodeItems(partnerCode, e);
          } catch (IllegalAccessException e) {
              e.printStackTrace();
          }
      }
  }
  return null; 
}
Multi Param 다중 파람 
Param의 클래스를 여러개 가지고 각 클래스 내부의 특정 필드가 다른 클래스 파람의 값을 갖는 경우이다.
가장 상위 Param인 PartnerCodeParam 필드의 타입으로써 하위 Param의 타입을 가지도록 설계된 구조이다. 
// 최상위 Param
@Getter
@Setter
public class PartnerCodeParam {
	@NotEmpty
	@JsonProperty("function")	
	private String function;
	
	@NotEmpty
	@JsonProperty("staffCd")	
	private String staffCd;
	
	@NotEmpty
	@JsonProperty("partners")	
	private List<PartnerCodeDetailParam> partners; //PartnerCodeDetailParam라는 클래스의 파람 타입의 필드
}
//PartnerCodeParam의 partners의 타입인 하위 param
@Getter
@Setter
public class PartnerCodeDetailParam{
		@NotEmpty
		@JsonProperty("partnerType")	
		private String partnerType;
		
		@NotEmpty
		@JsonProperty("partnerCode")	
		private String partnerCode;
		
		@NotEmpty
		@JsonProperty("shortName")	
		private String shortName;
        
        ...
}