Back-end/SpringBoot

[Spring Boot] YAML ํŒŒ์ผ ๋งคํ•‘ํ•˜๊ธฐ (Feat. @ConfigurationProperties)

๐Ÿ’ก YAML ํŒŒ์ผ์ด๋ž€?

 

์œ„ํ‚ค ์ฐธ์กฐ

๋”๋ณด๊ธฐ

YAML์€ XMLCํŒŒ์ด์ฌํŽ„RFC2822์—์„œ ์ •์˜๋œ e-mail ์–‘์‹์—์„œ ๊ฐœ๋…์„ ์–ป์–ด ๋งŒ๋“ค์–ด์ง„ '์‚ฌ๋žŒ์ด ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”' ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ์–‘์‹์ด๋‹ค. 2001๋…„์— ํด๋ผํฌ ์—๋ฐ˜์Šค๊ฐ€ ๊ณ ์•ˆํ–ˆ๊ณ , Ingy dot Net ๋ฐ Oren Ben-Kiki์™€ ํ•จ๊ป˜ ๋””์ž์ธํ–ˆ๋‹ค.

YAML์ด๋ผ๋Š” ์ด๋ฆ„์€ "YAML์€ ๋งˆํฌ์—… ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๋‹ค (YAML Ain't Markup Language)” ๋ผ๋Š” ์žฌ๊ท€์ ์ธ ์ด๋ฆ„์—์„œ ์œ ๋ž˜๋˜์—ˆ๋‹ค. ์›๋ž˜ YAML์˜ ๋œป์€ “๋˜ ๋‹ค๋ฅธ ๋งˆํฌ์—… ์–ธ์–ด (Yet Another Markup Language)”์˜€์œผ๋‚˜, YAML์˜ ํ•ต์‹ฌ์€ ๋ฌธ์„œ ๋งˆํฌ์—…์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ด๋ฆ„์„ ๋ฐ”๊พธ์—ˆ๋‹ค. ์˜ค๋Š˜๋‚  XML๊ณผ JSON์ด ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”์— ์ฃผ๋กœ ์“ฐ์ด๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ, ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด YAML์„ '๊ฐ€๋ฒผ์šด ๋งˆํฌ์—… ์–ธ์–ด'๋กœ ์‚ฌ์šฉํ•˜๋ ค ํ•˜๊ณ  ์žˆ๋‹ค.

 

  • ์‚ฌ๋žŒ์ด ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ์–‘์‹
  • ๋งˆํฌ์—… ์–ธ์–ด๊ฐ€ ์•„๋‹˜์„ ์ง€ํ–ฅํ•œ ์–ธ์–ด
  • ๋‹ค๋ฅธ ์–ธ์–ด๋ณด๋‹ค ์ƒ๋Œ€์ ์œผ๋กœ ๋ฌธ๋ฒ•์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ , ๊ฐ€๋…์„ฑ์ด ์ข‹์œผ๋ฉฐ, ๊ณ ๊ธ‰ ์ปดํ“จํ„ฐ์— ์ ํ•ฉ
  • XML๊ณผ ๊ฑฐ์˜ ๋น„์Šทํ•œ ์–ธ์–ด

โš”๏ธ ํ˜•์‹ ๋น„๊ต (properties vs yml)

 

โœ๏ธ application.properties

server.port : 8080

โœ๏ธ application.yml

server:
	port: 8080

 

๐Ÿ”Ž application.yml ๋งคํ•‘ ํ•˜๊ธฐ

 

๋งคํ•‘ ๋ฐฉ์‹์€ ๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ application.properties์™€ ๋™์ผํ•˜๋‹ค.

@Value์™€ @ConfigurationProperties์„ ์‚ฌ์šฉํ•ด ๋งคํ•‘์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋•Œ @Value๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ง€์›๊ณผ ์œ ์—ฐํ•œ ๋ฐ”์ธ๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐ˜๋ฉด

@ConfigurationProperties๋Š” ๊ฐ€๋Šฅํ•ด ์ด ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์‰ฝ๊ฒŒ ๋งคํ•‘์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ€์žฅ ๋ฌด๋‚œํ•œ List, Map ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋งคํ•‘

 

1. application.yml์— fruit๋ฅผ ํ‚ค ๊ฐ’์œผ๋กœ ํ•˜๋Š” ๋ฆฌ์ŠคํŠธํ˜•์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ €์žฅ

fruit:
  list:
    - name : banana
      color : yellow
    - name : apple
      color : red
    - name : water melon
      color : green

 

2. @ConfigurationProperties์— fruit ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉ

@Data
@Component
@ConfigurationProperties("fruit")
public class FruitProperty {
    private List<Fruit> list;

}

@Data : Lombok์ด ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ, Getter, Setter ๋ฉ”์†Œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑ์‹œ์ผœ ์ค€๋‹ค.

@Component : @ConfigurationProperties๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ์„ ์–ธํ•ด์ค˜์•ผ ์˜์กด์„ฑ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

3. Test๋ฅผ ํ•ด๋ณด์ž

@RunWith(SpringRunner.class)
@SpringBootTest
class DemoApplicationTests {

    @Autowired
    FruitProperty fruitProperty;

    @Test
    public void test() {
        List<Fruit> fruitData = fruitProperty.getList();

        assertThat(fruitData.get(0).getName(), is("banana"));
    }

}

@Autowired : ์ฐธ๊ณ  -> https://withseungryu.tistory.com/65

 

[Spring] @Autowired vs @Resource vs @Inject

๐Ÿง @Autowired, @Resource, @Inject์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์˜์กด ์ฃผ์ž…์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ํŠน์ • Bean ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ํŠน์ •ํ•œ Bean์„ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋•Œ ํŠน์ • Bean์— ์ž๋™ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ์œ„ ์–ด๏ฟฝ

withseungryu.tistory.com

๐Ÿ”Ž ๊ฒฐ๊ณผ 

ํ…Œ์ŠคํŠธ ์„ฑ๊ณต ํ–ˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ” @ConfigurationProperties - ์œ ์—ฐํ•œ ๋ฐ”์ธ๋”ฉ

 

ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉํ•  ๊ฒฝ์šฐ์— Camel Case๋กœ ์„ ์–ธํ•˜์—ฌ๋„, ํ”„๋กœํผํ‹ฐ์˜ ํ‚ค๋Š” ๋‹ค์–‘ํ•œ ํ˜•์‹(๋‚™ํƒ€, ์ผ€๋ฐฅ, ์–ธ๋”๋ฐ”)์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

(์˜ˆ์‹œ)

public class FruitProperties{
	private String colorName;
}

fruit.colorname ( x )fruit.color-name ( ์ผ€๋ฐฅ )fruit.color_name ( ์–ธ๋”, ์Šค๋„ค์ดํฌ )fruit.colorName ( ๋‚™ํƒ€, ์นด๋ฉœ )

 

 

๋ฐ˜์‘ํ˜•