1. 개요

이 빠른 사용방법(예제)에서는 Spring 속성 파일에서 배열 또는 List 에 값을 주입하는 방법을 배웁니다 .

2. 기본 동작

간단한 application.properties 파일 로 시작하겠습니다 .

arrayOfStrings=Baeldung,dot,com

변수 유형을 String[] 으로 설정할 때 Spring이 어떻게 작동하는지 살펴보겠습니다 .

@Value("${arrayOfStrings}")
private String[] arrayOfStrings;
@Test
void whenContextIsInitialized_thenInjectedArrayContainsExpectedValues() {
    assertArrayEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings);
}

Spring이 우리의 구분자가 쉼표라고 올바르게 가정하고 그에 따라 배열을 초기화한다는 것을 알 수 있습니다.

또한 기본적으로 배열 주입은 쉼표로 구분된 값이 있는 경우에만 올바르게 작동한다는 점에 유의해야 합니다.

3. List 주입

같은 방식으로 List을 주입하려고 하면  놀라운 결과를 얻게 됩니다.

@Value("${arrayOfStrings}")
private List<String> unexpectedListOfStrings;
@Test
void whenContextIsInitialized_thenInjectedListContainsUnexpectedValues() {
    assertEquals(Collections.singletonList("Baeldung,dot,com"), unexpectedListOfStrings);
}

List 에는 속성 파일에 설정한 값과 동일한 단일 요소가 포함되어 있습니다.

List 를 제대로 주입하려면 SpEL( Spring Expression Language ) 이라는 특수 구문을 사용해야 합니다 .

@Value("#{'${arrayOfStrings}'.split(',')}")
private List<String> listOfStrings;
@Test
void whenContextIsInitialized_thenInjectedListContainsExpectedValues() {
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings);
}

@Value 에서 사용하던  $  대신 표현식이 # 로 시작하는 것을 볼 수 있습니다 .

우리는 또한 일반적인 인젝션보다 식을 좀 더 복잡하게 만드는 split 메서드를 호출하고 있음을 주목해야 합니다.

표현식을 좀 더 단순하게 유지하려면 속성을 특별한 형식으로 선언할 수 있습니다.

listOfStrings={'Baeldung','dot','com'}

Spring은 이 형식을 인식하고 다소 간단한 표현을 사용하여 List를 주입할 수 있습니다 .

@Value("#{${listOfStrings}}")
private List<String> listOfStringsV2;
@Test
void whenContextIsInitialized_thenInjectedListV2ContainsExpectedValues() {
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsV2);
}

4. Custom 구분 기호 사용

비슷한 속성을 만들어 보겠습니다. 이번에는 다른 구분 기호를 사용하겠습니다.

listOfStringsWithCustomDelimiter=Baeldung;dot;com

List 를 주입할 때 본 것처럼 원하는 구분 기호를 지정할 수 있는 특수 표현식을 사용할 수 있습니다 .

@Value("#{'${listOfStringsWithCustomDelimiter}'.split(';')}")
private List<String> listOfStringsWithCustomDelimiter;
@Test
void whenContextIsInitialized_thenInjectedListWithCustomDelimiterContainsExpectedValues() {
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStringsWithCustomDelimiter);
}

5. 다른 유형 주입

다음 속성을 살펴보겠습니다.

listOfBooleans=false,false,true
listOfIntegers=1,2,3,4
listOfCharacters=a,b,c

Spring이 즉시 사용 가능한 기본 유형을 지원하므로 특별한 구문 분석을 수행할 필요가 없음을 알 수 있습니다 .

@Value("#{'${listOfBooleans}'.split(',')}")
private List<Boolean> listOfBooleans;

@Value("#{'${listOfIntegers}'.split(',')}")
private List<Integer> listOfIntegers;

@Value("#{'${listOfCharacters}'.split(',')}")
private List<Character> listOfCharacters;
@Test
void whenContextIsInitialized_thenInjectedListOfBasicTypesContainsExpectedValues() {
    assertEquals(Arrays.asList(false, false, true), listOfBooleans);
    assertEquals(Arrays.asList(1, 2, 3, 4), listOfIntegers);
    assertEquals(Arrays.asList('a', 'b', 'c'), listOfCharacters);
}

이것은 SpEL을 통해서만 지원되므로 동일한 방식으로 배열을 주입할 수 없습니다.

6. 프로그래밍 방식으로 속성 읽기

프로그래밍 방식으로 속성을 읽으려면 먼저 Environment 개체의 인스턴스를 가져와야 합니다.

@Autowired
private Environment environment;

그런 다음 getProperty  메서드를 사용하여 키와 예상 유형을 지정하여 모든 속성을 읽을 수 있습니다 .

@Test
void whenReadingFromSpringEnvironment_thenPropertiesHaveExpectedValues() {
    String[] arrayOfStrings = environment.getProperty("arrayOfStrings", String[].class);
    List<String> listOfStrings = (List<String>)environment.getProperty("arrayOfStrings", List.class);

    assertArrayEquals(new String[] {"Baeldung", "dot", "com"}, arrayOfStrings);
    assertEquals(Arrays.asList("Baeldung", "dot", "com"), listOfStrings);
}

7. 결론

이 기사에서는 빠르고 실용적인 예제를 통해 배열과 List 를 쉽게 주입하는 방법을 배웠습니다 .

항상 그렇듯이 코드는 GitHub에서 사용할 수 있습니다 .

res – REST with Spring (eBook) (everywhere)