1. YAML을 사용하는 이유
특징 | YAML | Properties | JSON |
가독성 | 높음 | 낮음 | 낮음 |
복잡한 구조 지원 | 매우 좋음 | 제한적 | 좋음 |
파싱 속도 | 느림 | 빠름 | 매우 빠름 |
주석 지원 | 지원 | 지원 | 지원 안함 |
데이터 타입 지원 | 다양함 | 제한 | 다양 |
2. Spring에서 YAML의 값을 가져오는 방법
application.yml
mail:
config:
val1: true
val2: true
val3: TRUE
val4: 1
val5: 1
val6: 1
arr: user1@example.com, user2@example.com, user3@example.com
listComma: user1@example.com, user2@example.com, user3@example.com
listDashes:
- user1@example.com
- user2@example.com
- user3@example.com
2-1. @Value
YmlConfig
@Getter
@Configuration
public class YmlConfig {
@Value("${mail.config.arr}")
private String[] arr;
@Value("${mail.config.listComma}")
private List<String> listComma;
}
YmlConfigTest
@Test
void testGetListCommaInYml() throws Exception {
//given
List<String> listComma = ymlConfig.getListComma();
//when
String email1 = "user1@example.com";
String email2 = "user2@example.com";
String email3 = "user3@example.com";
//then
assertEquals(3, listComma.size());
assertEquals(email1, listComma.get(0));
assertEquals(email2, listComma.get(1));
assertEquals(email3, listComma.get(2));
}
- 간단한 설정에 적합하지만, 복잡한 구조나 타입 변환에는 제한이 있음
YmlConfig
@Getter
@Configuration
public class YmlConfig {
@Value("${mail.config.val1}")
private String val1;
@Value("${mail.config.val2}")
private boolean val2;
@Value("${mail.config.val3}")
private boolean val3;
@Value("${mail.config.val4}")
private boolean val4;
@Value("${mail.config.val5}")
private String val5;
@Value("${mail.config.val6}")
private int val6;
YmlConfigTest
@Test
void testGetTrue() throws Exception {
//given
String val1 = ymlConfig.getVal1();
boolean val2 = ymlConfig.isVal2();
boolean val3 = ymlConfig.isVal3();
boolean val4 = ymlConfig.isVal4();
String val5 = ymlConfig.getVal5();
int val6 = ymlConfig.getVal6();
//when
//then
assertEquals("true", val1);
assertTrue(val2);
assertTrue(val3);
assertTrue(val4);
assertEquals("true", val5);
assertEquals(1, val6);
}
- 타입이 없기 때문에 안정성이 떨어짐
2-2. @ConfigurationProperties - 1 setter
YmlConfig2
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "mail.config")
public class YmlConfig2 {
private List<String> listDashes;
}
YmlConfigTest
@Test
void testGetListDashesInYmlWithSetter() throws Exception {
//given
List<String> listDashes = ymlConfig2.getListDashes();
//when
String email1 = "user1@example.com";
String email2 = "user2@example.com";
String email3 = "user3@example.com";
//then
assertEquals(3, listDashes.size());
assertEquals(email1, listDashes.get(0));
assertEquals(email2, listDashes.get(1));
assertEquals(email3, listDashes.get(2));
}
- @ConfigurationProperties 애노테이션을 통해서 복잡하고 유연한 구조도 쉽게 매핑이 가능해짐.
- 하지만 @Setter를 통한 주입이 필요로하며 불변 객체를 만들기 어려움
2-3. @ConfigurationProperties - 2 constructor
YmlConfig3
@Getter
@Component
@RequiredArgsConstructor
@ConfigurationProperties(prefix = "mail.config")
public class YmlConfig3 {
private final List<String> listDashes;
}
YmlConfigTest
@Test
void testGetListDashesInYmlWithNoSetter() throws Exception {
//given
List<String> listDashes = ymlConfig3.getListDashes();
//when
String email1 = "user1@example.com";
String email2 = "user2@example.com";
String email3 = "user3@example.com";
//then
assertEquals(3, listDashes.size());
assertEquals(email1, listDashes.get(0));
assertEquals(email2, listDashes.get(1));
assertEquals(email3, listDashes.get(2));
}
- 불변 객체를 만들 수 있고 복잡한 구조도 매핑 가능함
- 모든 프로퍼티를 생성자에 포함해야함
참고
- https://katastrophe.tistory.com/157
'Backend > Spring' 카테고리의 다른 글
API 요청 - RestTemplate, WebClient, RestClient (1) | 2024.11.07 |
---|---|
JDBC 이해 (0) | 2024.08.25 |
파일 업로드 (0) | 2024.08.23 |
[SpringBoot] JPA - PersistentBag (0) | 2024.03.27 |
[Spring Security 6] - 현재 인증된(로그인) 유저 정보 가져오기 (0) | 2024.01.19 |