[Spring] injection 받은 list를 원하는 순서로 정렬하기

by 스뎅(thDeng) on

간혹 injection 받은 list가 내가 원하는 순서이길 바랄 때가 있다. validation을 할 때 A validation을 하면 그 결과가 확 줄어버리는 경우, 다른 validation 보다 A validation을 먼저 하고 싶을 것이다. 예를 들어, 아래 샘플에서 이름으로 validation을 하는 NameValidation이 그런 형태라 가장 먼저 실행하고 싶다면..

@Autowired
private List<Validator> validators;

public void validate(List<Person> people) {
   for(Validator validator : validators) {
       validator.validate(people);
   	}
}


@Component
private class AgeValidator implements Validator<Person> {
   	public void validate(List<Person> people) {
       	// 뽕짝뽕짝
   	}
}
@Component
private class NameValidator implements Validator<Person> {
    // ...
}
@Component
private class PhoneNumberValidator implements Validator<Person> {
    // ...
}

각 validator bean을 생성할 때 @org.springframework.stereotype.Order를 붙여주면 된다. value로 가장 먼저 실행하고 싶은걸 작은 숫자로 준다.

@Autowired
private List<Validator> validators;

public void validate(List<Person> people) {
   for(Validator validator : validators) {
       validator.validate(people);
   	}
}
@PostConstruct
public void init() {
    // Spring 4.x에는 자동으로 정렬되지만 3.x에서는 수동으로 해줘야 한다.
    Collections.sort(validators, AnnotationAwareOrderComparator.INSTANCE);
}


@Order(2)
@Component
private class AgeValidator implements Validator<Person> {
   	public void validate(List<Person> people) {
       	// 뽕짝뽕짝
   	}
}
@Order(1)
@Component
private class NameValidator implements Validator<Person> {
    // ...
}
@Component
private class PhoneNumberValidator implements Validator<Person> {
    // ...
}

이렇게 @Order를 붙여주면 validators 리스트에는 NameValidator, AgeValidator, PhoneNumberValidator 순서로 들어간다. @Order를 붙여주지 않으면 가장 뒤로 들어간다. 그리고 Spring 4.x부터는 @Order만 붙여주면 되지만, 3.x버전에서는 사용하는 부분에서 손으로 정렬해줘야 한다는 문제가 T_T

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License