[Spring Boot - ๐ŸฑPetClinic๐Ÿถ] 2. application.properties ์‚ดํŽด๋ณด๊ธฐ๐Ÿ”

์‘ค๋ฐยท2023๋…„ 4์›” 10์ผ

[Spring Boot - ๐ŸฑPetClinic๐Ÿถ]

๋ชฉ๋ก ๋ณด๊ธฐ
2/11

๐Ÿ“˜ Pet Clinic์˜ application.properties

Spring Boot์˜ ์„ค์ •์‚ฌํ•ญ๋“ค์€ application.properties์— ๊ธฐ์ˆ ๋ผ์žˆ๋‹ค. Pet Clinic์˜ application.properties์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ •๋“ค์ด ์กด์žฌํ•œ๋‹ค. ์ฃผ์˜ํ•  ์ ์€ build.gradle์ด๋‚˜ pom.xml์— ๊ด€๋ จ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์˜์กด์„ ์„ค์ •ํ•ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

  • Database Init
  • Web
  • JPA
  • Internationalization
  • Acturator
  • Logging
  • Minimum time static resoureces should be cached

๐Ÿ—‚ Database init

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์‚ฌํ•ญ๋“ค์„ ์„ค์ •ํ•œ๋‹ค. ์ด์™€ ๊ด€๋ จ๋œ ๊ธ€์„ ๋”ฐ๋กœ ์ž‘์„ฑํ•  ์˜ˆ์ •์ด๋‹ค.

database=h2
spring.sql.init.schema-locations=classpath*:db/${database}/schema.sql
spring.sql.init.data-locations=classpath*:db/${database}/data.sql

๊ธฐ๋ณธ์ ์œผ๋กœ H2 DB๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐ๊ฐ schema.sql, data.sql์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ schema.sql, data.sql์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

๐ŸŒ Web

ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์„ค์ •ํ•œ๋‹ค. Pet Clinic์—์„œ๋Š” Thymeleaf๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

spring.thymeleaf.mode=HTML

๐Ÿ“‹ JPA

JPA ๊ด€๋ จ ์„ค์ •์ด๋‹ค.

spring.jpa.hibernate.ddl-auto=none
spring.jpa.open-in-view=true

spring.jpa.hibernate.ddl-auto ์˜ต์…˜

JPA๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ „๋žต์— ๊ด€ํ•œ ์„ค์ •๊ฐ’์ด๋‹ค. ์˜ต์…˜๊ฐ’์œผ๋กœ none, validate, update, create, create-drop ๋“ฑ์ด ์žˆ๋‹ค.

  • none - ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Œ
  • validate - ์—”ํ‹ฐํ‹ฐ์™€ ํ…Œ์ด๋ธ”์ด ์ •์ƒ์ ์œผ๋กœ ๋งคํ•‘์ด ๋๋Š”์ง€๋งŒ ํ™•์ธ
  • update - ๋ณ€๊ฒฝํ•œ ๋ถ€๋ถ„๋งŒ ๋ฐ˜์˜
  • create - ์Šคํ‚ค๋งˆ ์‚ญ์ œ ํ›„ ์ƒ์„ฑ
  • create-drop - ์Šคํ‚ค๋งˆ ์‚ญ์ œ ํ›„ ์ƒ์„ฑ, ์ข…๋ฃŒ ์‹œ ์‚ญ์ œ

์‹ค์ œ ์šด์˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” create/create-drop/update๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. create๋‚˜ update๋Š” ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์—, ํ…Œ์ŠคํŠธ ์„œ๋ฒ„์—์„œ๋Š” update๋‚˜ validate๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์‹ค์ œ ๋ฐฐํฌ ์‹œ์—” validate๋‚˜ none์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

spring.jpa.open-in-view ์˜ต์…˜

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์ง€์† ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ๊ด€๋ก€์ƒ OSIV๋ผ๊ณ  ํ•œ๋‹ค. ์˜ต์…˜๊ฐ’์œผ๋กœ true/false ๋‘ ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์ง€์† ๋ฒ”์œ„๋ฅผ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„๋กœ ํ•œ์ •ํ•  ๊ฒƒ์ธ์ง€(false ์˜ต์…˜) ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ๋„˜์–ด์„œ๊นŒ์ง€ ์ง€์†ํ•  ๊ฒƒ์ธ์ง€(true ์˜ต์…˜)๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. Pet Clinic์—์„  true ์˜ต์…˜์„ ์ฃผ๊ณ  ์žˆ๋‹ค.

โœ‰๏ธ Internationalization

์Šคํ”„๋ง์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •์ด๋‹ค.

spring.messages.basename=messages/messages

๋ฉ”์‹œ์ง€์— ์‚ฌ์šฉํ•  ํŒŒ์ผ์„ ์ง€์ •ํ•ด์ค€๋‹ค. Pet Clinic์˜ ๊ฒฝ์šฐ src/main/resources์˜ ํ•˜์œ„์— messages/messages.properties ํŒŒ์ผ์„ ์ด์šฉํ•œ๋‹ค.

Spring์ด๋ผ๋ฉด ResourceBundleMessageSource๋ฅผ ์ง์ ‘ ๋นˆ์— ๋“ฑ๋กํ•ด์ฃผ์–ด์•ผ ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ, Spring Boot์˜ ๊ฒฝ์šฐ ์ด๋ฏธ ๋“ฑ๋ก์ด ๋ผ ์žˆ์–ด application.properties์—์„œ ๋ฉ”์‹œ์ง€๋กœ ์‚ฌ์šฉํ•  ํŒŒ์ผ๋งŒ ์ง€์ •ํ•ด์ฃผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

messages-kr.properties ๋“ฑ์˜ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ์–ธ์–ด ์„ค์ •์— ๋”ฐ๋ผ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ˆ Acturator

Acturator๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด Spring Boot์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž์ฒด ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์ด๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ endpoint๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. endpoint๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ์š”์†Œ ์ •๋„๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด ๋ชจ๋“  endpoint์— ๋Œ€ํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

management.endpoints.web.exposure.include=*

ํ•˜์ง€๋งŒ ์ด์ฒ˜๋Ÿผ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋ฏผ๊ฐํ•œ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ๋ฐฐํฌํ™˜๊ฒฝ์—์„œ๋Š” ํ•„์š”ํ•œ ์ •๋ณด๋งŒ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ์ ์ ˆํ•œ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค. ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์กฐ์น˜๋„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ์‹ค์ œ ์šด์˜ ์ƒํ™ฉ์—์„œ ์ด๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” DB๋‚˜ ํŒŒ์ผ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๐Ÿ“ƒ Logging

์ฝ˜์†”์— ๋ณด์—ฌ์งˆ ๋กœ๊ทธ๋ฅผ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.

logging.level.org.springframework=INFO
#logging.level.org.springframework.web=DEBUG
#logging.level.org.springframework.context.annotation=TRACE

์ด์ฒ˜๋Ÿผ ์„ค์ •ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ INFO level์˜ ๋กœ๊ทธ๋งŒ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•˜๊ณ , ํ•„์š”์— ๋”ฐ๋ผ ์ฃผ์„์„ ํ•ด์ œํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค. ์ด๋Š” Spring Boot์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” Logback์„ ์ด์šฉํ•œ ์„ค์ •์ด๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Logback๋„ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋’ค์ง€์ง€ ์•Š์„ ๋งŒํผ ๊ดœ์ฐฎ์€ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๋กœ๊ทธ ๋ ˆ๋ฒจ์€ ERROR - WARN - INFO - DEBUG - TRACE์˜ ๋‹ค์„ฏ ๋‹จ๊ณ„๊ฐ€ ์žˆ๋‹ค.

  1. ERROR: ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธด ๊ฒฝ์šฐ
  2. WARN: ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ํ–ฅํ›„ ์‹œ์Šคํ…œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
  3. INFO: ์ƒํƒœ ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์€ ์ •๋ณด์„ฑ ๋กœ๊ทธ
  4. DEBUG: ํ”„๋กœ๊ทธ๋žจ ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๋กœ๊ทธ
  5. TRACE: DEBUG๋ณด๋‹ค ๋” ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋กœ๊ทธ
์ฒซ ๋ฒˆ์งธ ์ฃผ์„์„ ํ•ด์ œํ•˜๋ฉด springframework์˜ web ํŒจํ‚ค์ง€์˜ ํ•ญ๋ชฉ๋“ค์— DEBUG level์˜ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ณ , ๋‘ ๋ฒˆ์งธ ์ฃผ์„์„ ํ•ด์ œํ•˜๋ฉด springframework์˜ context ์ค‘ annotation ํ•ญ๋ชฉ๋“ค์— TRACE level์˜ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ•„์š”์— ๋”ฐ๋ผ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ๋„ ์ง€์›ํ•˜์ง€๋งŒ, Pet Clinic์—์„œ๋Š” ๋”ฐ๋กœ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋„๋ก ์„ค์ •ํ•˜์ง€ ์•Š์•˜๋‹ค.

๐Ÿ“„ Minimum time static resoureces should be cached

spring.web.resources.cache.cachecontrol.max-age=12h

์ •์  ์ž์›๋“ค์˜ ์บ์‹œ ์œ ํšจ๊ธฐ๊ฐ„์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ๊ธฐ๋ณธ ๋‹จ์œ„๋Š” ์ดˆ ๋‹จ์œ„์ง€๋งŒ ์œ„์˜ ์„ค์ •์€ 12h์ธ ๊ฑธ ๋ณด๋‹ˆ 12์‹œ๊ฐ„์ธ ๊ฒƒ ๊ฐ™๋‹ค. Http ์‘๋‹ต์— ํฌํ•จ๋˜๋Š” Cache-control ํ—ค๋”์— ๋”ฐ๋ผ ๋ฐ›์€ ๋ฆฌ์†Œ์Šค์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ์œ„์˜ ์„ค์ •์€ ๊ธฐ๋ณธ ์บ์‹œ ์ •์ฑ…์„ ๊ฒฐ์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ์บ์‹œ์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋„ˆ๋ฌด ์งง์œผ๋ฉด ์„œ๋ฒ„์— ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ๋„ˆ๋ฌด ์ž์ฃผ ํ•˜๊ฒŒ ๋˜์–ด ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ๊ณ , ์œ ํšจ๊ธฐ๊ฐ„์ด ๋„ˆ๋ฌด ๊ธธ๋ฉด ๋งŒ๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ๋ธŒ๋ผ์šฐ์ €์— ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‚จ์•„์žˆ๊ณ  ์ด๋ฅผ ์ง€์šฐ๋Š” ๊ฒŒ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•œ max-age์˜ ์„ค์ •์ด ์ค‘์š”ํ•˜๋‹ค.

๐Ÿงฉ ๋งˆ๋ฌด๋ฆฌ

Pet Clinic์˜ ์„ค์ • ํŒŒ์ผ์„ ์‚ดํŽด๋ดค๋‹ค. ์ด ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ํ•ด์„ํ•˜๋Š”๋ฐ๋„ ์ˆ˜์‹ญ๋ฒˆ์˜ ๊ฒ€์ƒ‰์ด ํ•„์š”ํ–ˆ๋‹ค. ๋ฌด์ง€์„ฑ์œผ๋กœ ํด๋ก  ์ฝ”๋”ฉํ•˜๋ฉด ๋ชจ๋ฅผ ๊ฒƒ๋“ค์ด๊ฒ ์ง€.. 'ํ•˜๋‚˜ํ•˜๋‚˜ ์•Œ์•„๊ฐ€๋‹ค ๋ณด๋ฉด ์–ธ์  ๊ฐ„ ๋„์›€์ด ๋˜๊ฒ ์ง€'๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๋งˆ์น˜๊ฒ ๋‹ค. ์–ด์ œ๋ณด๋‹ค ๋‚˜์€ ์˜ค๋Š˜, ๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜๋ณด๋‹ค ๋‚˜์€ ๋‚ด์ผ์ด ๋˜๊ธธ ๋ฐ”๋ผ๋ฉฐ...

** ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฐธ๊ณ  ๋งํฌ์— ์ ํ˜€์žˆ๋‹ค. ์ฐธ๊ณ  ๋งํฌ์˜ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋‚ด๊ฐ€ ๋˜ ์ •๋ฆฌํ•˜๋Š” ๊ฑด ์˜ˆ์˜๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋“ค๋งŒ ์กฐ๊ธˆ์”ฉ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋Œ€๋กœ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์ ์—ˆ๋‹ค. ์ฐธ๊ณ  ๋งํฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋” ๊นŠ๊ฒŒ ํ•™์Šตํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

** ์˜คํƒ€, ์ž˜๋ชป๋œ ๋‚ด์šฉ ์ง€์  ํ™˜์˜

[์ฐธ๊ณ ]

Spring Boot doc
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.spring-application

ํƒ€์ž„๋ฆฌํ”„ ์„ค๋ช…
https://jhhan009.tistory.com/12

JPA ์„ค๋ช…
[ hibernate.ddl-auto ]
https://haservi.github.io/posts/spring/hibernate-ddl-auto/
https://smpark1020.tistory.com/140
[ open-in-view ]
https://gracelove91.tistory.com/100

Acturator ์„ค๋ช…
https://sabarada.tistory.com/23
https://techblog.woowahan.com/9232/

Cache-Control ์„ค๋ช…
https://toss.tech/article/smart-web-service-cache
https://hudi.blog/http-cache/

profile
๊ฐœ๋ฐœ์ž์ง€๋ง์ƒ

0๊ฐœ์˜ ๋Œ“๊ธ€