[Spring boot] ๋‚˜๋งŒ์˜ ํ™˜๊ฒฝ ์„ค์ • ๋งŒ๋“ค๊ธฐ

๋ฐ˜์‘ํ˜•

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ์ž๋™ ํ™˜๊ฒฝ ์„ค์ •๊ณผ ๊ฐœ๋ฐœ, ํ”„๋กœ๋•์…˜, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํฌ์ŠคํŒ…ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ๋Š” ๊ทธ๊ฑฐ์— ์ด์–ด์„œ, ๋‚˜๋งŒ์˜ ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

@Value

์šฐ๋ฆฌ๋Š” ํ™˜๊ฒฝ์„ค์ •์—์„œ Property์˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ •ํ•œ ๊ฐ’์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด Key๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ, ์ผ๋‹จ ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ๋ฆฌ๋Š” ์ด ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด @Value ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.

# application.yml

server:
  port: 8080
spring:
  profiles:
    active: dev
    
property:
  app:
    hello: hello world

๋จผ์ € ์šฐ๋ฆฌ๋Š” ์„œ๋ฒ„์˜ ๋ฉ”์ธ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ Property๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ณธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ , ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ YAML ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ ธ์™€์•ผ ํ•  ๊ฐ’์€ 'hello world'์ด๊ณ , MainController์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

๊ทธ๋Ÿฐ ๋‹ค์Œ, ๋ฐ”๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์„ค์ •๋œ ํ™˜๊ฒฝ ํฌํŠธ ์ฃผ์†Œ๋กœ ์ ‘์†ํ•˜๋ฉด....

์ด๋ ‡๊ฒŒ Property์˜ ๊ฐ’์„ ์ฝ์–ด์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

YAML๊ณผ @Value

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” Property๋ณด๋‹ค ๊ฐ€๊ธ‰์  YAML์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” YAML์ด ๋” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์‹ค์ œ๋กœ Property๋Š” Key-value๋ผ๋Š” ๋‹จ์ˆœ ๊ฐ’์˜ ํ˜•ํƒœ๋ผ๋ฉด, YAML์€ ๋ฆฌ์ŠคํŠธ ๋“ฑ ํ•œ Key์˜ ๋ณต์ˆ˜๊ฐ’์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋“ฑ์˜ ํ˜•ํƒœ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋˜, @Value์—์„œ๋Š” ๊ธฐ๋ณธ๊ฐ’ ์ง€์ • ์˜ต์…˜, ์ด๋ฅผํ…Œ๋ฉด ๋งŒ์•ฝ, ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด Required์ธ๋ฐ, ๋งŒ์•ฝ ๊ฐ’์ด ์—†๋‹ค๋ฉด? ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋งค๊พธ๋Š” ๊ฒŒ ํ˜„๋ช…ํ•˜๊ฒ ์ฃ ? ์ด๋Ÿฐ ๋ฐฉ๋ฒ•๋„ ์žˆ์œผ๋‹ˆ, ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜์ฃ .

# application.yml

server:
  port: 8080
spring:
  profiles:
    active: dev

property:
  app:
    name: Neon K.I.D Blog Example
propertyList: Java,Kotlin,Python

Property ์ฝ”๋“œ๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ๋ฆฌ์ŠคํŠธ๋„ ํฌํ•จ๋˜์–ด ์žˆ์ฃ ?

์ด๋ฒˆ์—๋Š” Tests ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ํ…Œ์ŠคํŠธํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ์— ์ž‘์„ฑํ•œ ๋’ค, ๋นŒ๋“œ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์ด ์ง€์ •ํ•œ ์ฝ”๋“œ๋Œ€๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๋‹ค๋ฉด, True ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด False๋ฅผ ์ถœ๋ ฅ์‹œ์ผœ์ค๋‹ˆ๋‹ค.

 

 

์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ผ๊ณ  ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ํฌ์ŠคํŠธ์—์„œ ์ž์„ธํžˆ ํ•œ ๋ฒˆ ๋” ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ์„ค๋ช…์„ ๋“œ๋ฆฌ์ž๋ฉด, assert ํ•จ์ˆ˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์— ์žˆ๋Š” ์ธ์ž์˜ ์กฐ๊ฑด์ด True์ด๋ฉด ํ†ต๊ณผ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ…Œ์ŠคํŠธ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ฐฐ์—ด ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ArrayEquals, ๊ทธ ์™ธ์˜ Collections์—์„œ๋Š” assertEquals๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , Property Value๋ฅผ ์ค„ ๋–„๋Š” $๋ผ๋Š” ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ, ์ค‘๊ฐ„์— ๋ณด๋ฉด #์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” SpEL์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

 

What is SpEL?

SpEL์€ Spring Expression Language์˜ ์•ฝ์ž๋กœ ์Šคํ”„๋ง ํ‘œํ˜„ ์–ธ์–ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ๊ฐ์ฒด ์ฐธ์กฐ์— ๋Œ€ํ•ด ์งˆ์˜ํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ์งฐ๋˜ YAML ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ฆฌ์ŠคํŠธ๋‚˜ String์ด ์ฃผ์–ด์ง€๊ฒŒ ๋˜๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋Ÿฐํƒ€์ž„์‹œ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ ๋“ฑ์„ ํ˜ธ์ถœํ•˜๊ณ , ๊ธฐ๋ณธ ๋ฌธ์ž์—ด ํ…œํ”Œ๋ฆฟ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•จ์œผ๋กœ์จ, ๋‹ค์–‘ํ•œ ์ปฌ๋ ‰์…˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ตฌํ˜„์— ๋‹ค์–‘์„ฑ์„ ํฌํ•จ์‹œํ‚จ ๊ฒƒ์ด์ฃ .

์ด๋Š” @Value ์–ด๋…ธํ…Œ์ด์…˜์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์„ฑ๊ณต์ ์œผ๋กœ ๋ชจ๋“  ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค๋ฉด, exit code 0์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‹คํŒจํ•œ๋‹ค๋ฉด, exit code๊ฐ€ 0์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, ๋นจ๊ฐ„ ํ™”๋ฉด์ด ํ‘œ์‹œ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ YAML ํŒŒ์ผ์—์„œ Array๋‚˜ List๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ, ๊ฐ ์š”์†Œ๋“ค์— ๊ณต๋ฐฑ์„ ์ฃผ์ง€๋งˆ์„ธ์š”. ๊ณต๋ฐฑ์„ ์ฃผ๊ฒŒ ๋  ๊ฒฝ์šฐ, Java ์ฝ”๋“œ์—์„œ๋Š” ๊ทธ๋Œ€๋กœ ๋ณ€์ˆ˜ ๊ฐ’์— ๋ฐ˜์˜๋˜์–ด, ํ…Œ์ŠคํŠธ ์ค‘์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ @Value ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ SpEL์„ ์‚ฌ์šฉํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ์š”์•ฝํ•˜์ž๋ฉด, YAML ํŒŒ์ผ์—์„œ ์„ค์ •ํ•œ ํ‚ค๊ฐ’์„ @Value์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์œผ๋กœ ์ฃผ๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๊ฐ’์ด ํ•„๋“œ๊ฐ’์— ํ• ๋‹น๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์šด์˜์ž๊ฐ€ ํ•œ ๊ฐœ์˜ ์„ค์ • ํŒŒ์ผ์„ ๊ฑด๋“œ๋ ค์„œ ๋‚˜๋งŒ์˜ ์„œ๋ฒ„ ์ปค์Šคํ…€ ํ™˜๊ฒฝ ์„ค์ •์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํ‚คํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ , ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ชฉ์ ์„ ์ง€๋‹ˆ๊ณ  ์žˆ์ฃ .

 

@ConfigurationProperties

์ข€ ๋” ๊ณ ๊ธ‰์ ์ธ ์‚ฌ์šฉ๋ฒ•์œผ๋กœ๋Š” ConfigurationProperties ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ๋‹ค์–‘ํ•œ ์ž๋ฃŒํ˜•์˜ Property ๊ฐ’์„ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋…€์„์ธ๋ฐ, ์ด ๋…€์„์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ œ์•ฝ์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ConfigurationProperties๋Š” Root Prefix๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ (Root Prefix ํ•„์ˆ˜)
  • List, Map๊ณผ ๊ฐ™์€ ๋‹ค์ˆ˜์˜ ์ž๋ฃŒ๋ฅผ ๋‹ด๋Š” ์‚ฌ์šฉ์ž ์ •์˜ Property์ด๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค๋ฅผ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•จ.
  • ํ•ด๋‹น Property ์‚ฌ์šฉ์„ ์œ„ํ•ด DI(์˜์กด์„ฑ ์ฃผ์ž…)์€ ํ•„์ˆ˜, ๋”ฐ๋ผ์„œ @Component or @ConstructorBinding ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ ์–ธํ•ด์•ผ ํ•จ.
  • ConfigurationProperties๋ฅผ ํ™œ์šฉํ•ด ํด๋ž˜์Šค์˜ List or Map ํ•„๋“œ๋กœ ๋ฐ”์ธ๋”ฉ ๋˜๋ฏ€๋กœ, data class ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ์•ผ ํ•จ.
  • Application ํด๋ž˜์Šค์—์„œ @EnableConfigurationProperties ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ Property ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•จ.

์ œ์•ฝ ์‚ฌํ•ญ์ด ์กฐ๊ธˆ ๋งŽ์€ ํŽธ์ด์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์€ Spring์—์„œ ํ•œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด์•ผํ•˜๋Š” ์ผ์„ ๋ช…์‹œํ•œ ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ๋งˆ์ง€๋ง‰ ์ œ์•ฝ ์‚ฌํ•ญ์˜ ๊ฒฝ์šฐ, Java์—์„œ๋Š” Lombok์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ , Kotlin์—์„œ๋Š” ์–ธ์–ด์—์„œ ์ž์ฒด์ ์œผ๋กœ data class๋ฅผ ์ง€์›ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ต์ง€ ์•Š๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4๋ฒˆ ์ œ์•ฝ ์‚ฌํ•ญ์˜ ๊ฒฝ์šฐ๋Š” ์ตœ๊ทผ์— ๊ฐœ์„ ๋œ ์‚ฌํ•ญ์ธ๋ฐ, ๊ธฐ์กด Property๋Š” Mutableํ•œ ๊ฐ’์ด์–ด์„œ, ์ค‘๊ฐ„์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์˜ํ•ด ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์–ด, ์œ„ํ—˜์„ฑ์ด ์ปธ๋Š”๋ฐ, ํŠนํžˆ Java ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” Lombok ์ด๋‚˜ setter๋ฅผ ์ด์šฉํ•œ ๋ฐ”์ธ๋”ฉ์€ ๊ฐ€๋ณ€์„ฑ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ๋ฐ์ดํ„ฐ ๋ณ€์กฐ์˜ ์œ„ํ—˜์ด ์žˆ์—ˆ์ฃ .

ํ•˜์ง€๋งŒ Kotlin์—์„œ๋Š” ์ ‘๊ทผ ์ง€์ •์ž ๋“ฑ์œผ๋กœ ๊ฐ€๋ณ€์„ฑ, ๋ถˆ๋ณ€์„ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์„ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธฐ์กด Spring/Spring boot์—์„œ๋Š” ๊ฐ€๋ณ€์„ฑ๋งŒ ์ œ๊ณตํ•˜์˜€์—ˆ์ฃ . ๊ทธ๊ฑธ ๊ฐœ์„ ํ•œ ๊ฒƒ์ด @ConstructorBinding ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜๋ฉด, ๋ถˆ๋ณ€์„ฑ์ธ Property๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5๋ฒˆ ์ œ์•ฝ ์‚ฌํ•ญ์˜ ๊ฒฝ์šฐ, ๊ณผ๊ฑฐ์—๋Š” @ConfigurationPropertiesScan ์ด๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ Property๋ฅผ ์ž๋™์œผ๋กœ Scan ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์ง€๋งŒ Spring boot 2.2.1 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ์ผ๋ถ€ ์‹ ๊ทœ ์–ด๋…ธํ…Œ์ด์…˜๊ณผ์˜ ๋ฌธ์ œ๋กœ ์ธํ•˜์—ฌ disabled ๋˜์–ด ์ง€๊ธˆ์€ ์ˆ˜๋™์œผ๋กœ Property ํด๋ž˜์Šค๋ฅผ ๋ช…์‹œํ•ด ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๊ตฌํ˜„์„ ํ•œ ๋ฒˆ ํ•ด๋ณด๋„๋ก ํ•˜์ฃ .

# application.yml

server:
  port: 8080
spring:
  profiles:
    active: dev

language:
  list:
    - name: C++
      type: Object-Oriented
    - name: F#
      type: Functional
    - name: PowerShell
      type: script

๊ธฐ์กด์˜ property๋ฅผ ์ง€์šฐ๊ณ , ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๊ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋งต ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•œ ๊ฐœ ๋งŒ๋“ค์–ด๋ดค์Šต๋‹ˆ๋‹ค.

LangProperty ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ์ •์˜ํ•œ Property์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

data class๋ฅผ ์ด์šฉํ•˜์—ฌ ์œ„์™€ ๊ฐ™์ด ๋ถˆ๋ณ€์„ฑ Property๋ฅผ ๋ฐ”์ธ๋”ฉํ•  ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์–ด๋–ค Property์ธ์ง€ Prefix๋ฅผ ๋ช…์‹œํ•ด์ค์‹œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Application ํด๋ž˜์Šค์— Property์˜ ์‚ฌ์šฉ์„ ์„ ์–ธํ•ด์ค๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด...

์ด๋ ‡๊ฒŒ ์„ฑ๊ณตํ•˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ฉ ๋ณด๊ธฐ ์ข‹์ง„ ์•Š์ฃ . ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ๋Š” Map์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๋ฌด๋ฅด๋Š” ๊ฒŒ ํŽธํ•˜์ง€๋งŒ, ์ถœ๋ ฅํ•  ๋•Œ๋Š” ๊ทธ๋ ‡๊ฒŒ ์ข‹์€ ๋ชจ์Šต์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋„ค์š”. 

์ด๋Ÿด ๋•Œ๋Š” POJO ํƒ€์ž…์ด ์ข‹์Šต๋‹ˆ๋‹ค. POJO ํƒ€์ž…์€ List<Map>๋ณด๋‹ค ๋” ์ง๊ด€์ ์ด๊ณ , ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด, ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ Spring boot์—์„œ REST API๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

POJO

POJO๋Š” Plain Old Java Object์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค. ์Œ Old๊ฐ€ ๋ถ™์–ด ์žˆ์œผ๋ฉด ์ข€ ์˜ค๋ž˜๋˜๊ณ  ์•ˆ์จ์•ผ ๋˜๋Š” ๊ฒŒ ๋งž์ง€ ์•Š์„๊นŒ์š”? ๋ผ๋Š” ๋ถ„๋“ค๋„ ๊ณ„์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

ํ•˜์ง€๋งŒ POJO๋Š” ํŠน์ • ํ™˜๊ฒฝ์— ์ข…์†๋˜์ง€๋„ ์•Š๊ณ , ํŠนํžˆ ๋‹จ์ผ ์ฑ…์ž„์˜ ์›์น™์ด๋ผ๋Š” ๊ฒƒ์ด ์ž˜ ๋˜์–ด ์žˆ์–ด, ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ด๊ณ  ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์ฑ…์ž„์˜ ์›์น™์ด๋ž€ ๊ฒƒ์€ ํ•œ ํด๋ž˜์Šค์—์„œ ๊ฐ๊ธฐ ์ฑ…์ž„๊ณผ ์—ญํ• ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์ •ํ•ด์ ธ ์žˆ๋Š” ์›์น™์ด์ฃ . ์‹ค์ œ๋กœ ์ €๋Š” ์ด ์›์น™ ๋•Œ๋ฌธ์— OOP๋ฅผ ์„ ํ˜ธํ•˜๋Š” ํŽธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. 

DB๋ž‘ ์—ฐ๋™ํ•  ๋•Œ๋„ ๋งŽ์€ ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ฐฉํ•œ ๋…€์„์ด๋‹ˆ, ์กฐ๊ธˆ์”ฉ ๋‹ค๋ค„๋ณด์‹œ๋ฉด์„œ ์ตํ˜€ ๋‚˜๊ฐ€์‹œ๋ฉด ๊ทธ ์žฅ์ ์ด ๋”์šฑ ์ž˜ ๋ณด์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

์ž ๊ทธ๋Ÿผ POJO ํ˜•ํƒœ๋กœ ํ•œ ๋ฒˆ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์‹ค์ œ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์งค ๋•Œ๋„, Map์„ ์“ฐ๊ธฐ ์‹ซ์œผ๋ฉด ์ €๋Š” ๋ณดํ†ต ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, data class๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ์ด๋ ‡๊ฒŒ ์‹ฌํ”Œํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ Map ๋Œ€์‹ , POJO ํƒ€์ž…์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜๊ฒ ์ฃ ? 

์ด ๋‹ค์Œ ๊ณผ์ œ๋Š” ์œ„์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์งœ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Map ๋Œ€์‹  ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๊ฒƒ์ด๋‹ˆ, ์‰ฝ๊ฒŒ ์งœ๋ณด์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments