๐ŸƒSpring ์™ธ๋ถ€ ์„ค์ •ํŒŒ์ผ๊ณผ ์ •์  ๋ฆฌ์†Œ์Šค

1 minute read

์™ธ๋ถ€ ์„ค์ •ํŒŒ์ผ

application.properties

  • application.yml๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
  • Key-Value ํ˜•ํƒœ๋กœ ์„ค์ •์„ ์ €์žฅํ•œ๋‹ค.
human.name = develup4  
human.age = 35  
  • ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ Application์„ ์‹คํ–‰ํ•œ ๋•Œ ์ž๋™์œผ๋กœ loadํ•œ๋‹ค.

์ ์šฉ ์šฐ์„ ์ˆœ์œ„

  1. {ํ”„๋กœ์ ํŠธ Root}/config/application.yml
  2. {ํ”„๋กœ์ ํŠธ Root}/application.yml
  3. classpath:/config/application.yml
  4. classpath:/

์ฐธ์กฐ ๋ฐฉ๋ฒ•

  • @Value ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ฃผ์ž…๋ฐ›๋Š”๋‹ค.
@Component  
public class SimpleProperties implements ApplicationRunner {  
    @Value("${human.name}")  
    private String name;  
}  

Type-safeํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

  • property์— ๋Œ€์‘๋˜๋Š” Bean ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • spring-boot-starter-validation์„ ์ด์šฉํ•ด ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ(Not Null, Not Empty ๋“ฑ)๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
@Component  
@ConfigurationProperties("human")  
@Validated  
public class HumanProperties {  
	@NotEmpty  
	private String name;	// ํƒ€์ž…์ด ์ง€์ •๋˜์–ด ์„ธ์ดํ”„ํ•˜๋‹ค.  
	private int age;  
  
	// getter๋‚˜ ์–ด๋– ํ•œ ๋กœ์ง์ด ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๋‹ค.  
	public getAge() {  
		return age;  
	}  
}  
  
@Component  
public class PropertyTest {  
	@Autowired  
	HumanProperties humanProperties;	// ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•œ๋‹ค.  
}  

Profile

  • ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์„ค์ • ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด Production ํ™˜๊ฒฝ, Test ํ™˜๊ฒฝ๊ฐ™์ด ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
@Profile("production")  
@Configuration  
public class BaseConfiguration {  
	@Bean  
	public String hello() {  
		return "hello";  
	}  
}  
  
@Profile("test")  
@Configuration  
public class TestConfiguration {  
	@Bean  
	public String hello() {  
		return "hello test";  
	}  
}  
  • ์‚ฌ์šฉํ•  Profile์€ application.properties ํŒŒ์ผ์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.
spring.profiles.active = production  

Profile๋งˆ๋‹ค ๋ณ„๋„์˜ property ํŒŒ์ผ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • application-{Profile ์ด๋ฆ„}.properties๋กœ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ณ„๋„์˜ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด application.properties์—์„œ ๊ณตํ†ต์˜ ์„ค์ •์„ ์ •์˜ํ•˜๊ณ  application-prod.properties์—์„œ ๋ผ์ด๋ธŒ ํ™˜๊ฒฝ์˜ ์„ธํŒ…์„, application-test.properties์—์„œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ •์  ๋ฆฌ์†Œ์Šค

  • ์•„๋ž˜ ๊ฒฝ๋กœ์˜ ๋ฆฌ์†Œ์Šค ๋“ค์€ ์›น ์„œ๋ฒ„์—์„œ ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. classpath:๋Š” src/main/์„ ์˜๋ฏธํ•œ๋‹ค.
    1. classpath:/static
    2. classpath:/public
    3. classpath:/resources/
    4. classpath:/META-INF/resources
  • application.properties์— ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    • spring.mvc.static-path-pattern=/static/**
    • ๋‹ค๋งŒ ์œ„ 1, 2, 3, 4์˜ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” ๋ฌด์‹œ๋œ๋‹ค.
  • ๊ธฐ๋ณธ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€์ ์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ Configuration์„ ์ž‘์„ฑํ•œ๋‹ค.
@Configuration  
public class WebConfig implements WebMvcConfigurer {  
	@Override  
	public void addResourceHandler(ResourceHandlerRegistry registry) {  
		registry.addResourceHandler("/path/**")  
			.addResourceLocation("classpath:/m/")  
			.setCachePeriod(20)  
	}  
}  

index ํŽ˜์ด์ง€์™€ ํŒŒ๋น„์ฝ˜

  • ์œ„ ์ •์  ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ์— index.html์ด ์žˆ๋‹ค๋ฉด welcome ํŽ˜์ด์ง€๋กœ ์ด์šฉํ•œ๋‹ค.
  • ์œ„ ์ •์  ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ์— favicon.ico์ด ์žˆ๋‹ค๋ฉด ํŒŒ๋น„์ฝ˜์œผ๋กœ ์ด์šฉํ•œ๋‹ค.

Error ํŽ˜์ด์ง€

  • resources/static/error์— {Status Error ์ฝ”๋“œ}.html์„ ์ž‘์„ฑํ•˜๋ฉด ํ•ด๋‹น ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ•ด์ค€๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด 404.html, 5xx.html๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Web Jar

  • ์Šคํ”„๋ง ๋ถ€ํŠธ ๋‚ด์˜ ์ •์  ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉํ•  javascript๋‚˜ css ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋“ค์„ jar ํ˜•ํƒœ๋กœ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Maven Repository์—์„œ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด jQuery์™€ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ค๋„ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • <script src="/webjars/jquery/3.3.1/dist/jquery.min.js">์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

[1] ๋ฐฑ๊ธฐ์„ , ์Šคํ”„๋ง ๋ถ€ํŠธ ๊ฐœ๋…๊ณผ ํ™œ์šฉ, 4๋ถ€ ์Šคํ”„๋ง ๋ถ€ํŠธ ํ™œ์šฉ