๐ŸŽฏSpringBoot ์™ธ๋ถ€์„ค์ •๊ณผ ํ”„๋กœํŒŒ์ผ ConfigurationProperties , Profile, ๊ทธ๋ฆฌ๊ณ  Dspring ์˜ต์…˜

devdoยท2023๋…„ 3์›” 6์ผ
0

SpringBoot

๋ชฉ๋ก ๋ณด๊ธฐ
2/41
post-thumbnail

์Šคํ”„๋ง๊ณผ ์„ค์ • ๋ฐ์ดํ„ฐ

๊ฐœ๋ฐœ์ž๊ฐ€ ํŒŒ์ผ์„ ์ฝ์–ด์„œ ์„ค์ •๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ์„ ํ•ด์•ผ๊ฒ ์ง€๋งŒ, ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ด๋ฏธ ์ด๋Ÿฐ ๋ถ€๋ถ„์„ ๋‹ค ๊ตฌํ˜„ํ•ด๋‘์—ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” application.properties ๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ์ž๋ฐ”๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์œ„์น˜์— ๋งŒ๋“ค์–ด ๋‘๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์Šคํ”„๋ง์ด ํ•ด๋‹น ํŒŒ์ผ์„ ์ฝ์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” PropertySource ์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์Šคํ”„๋ง์—์„œ๋Š” ์ด๋Ÿฌํ•œ application.properties ํŒŒ์ผ์„ ์„ค์ • ๋ฐ์ดํ„ฐ(Config data)๋ผ ํ•œ๋‹ค.

โญ ๋‹น์—ฐํžˆ ์„ค์ • ๋ฐ์ดํ„ฐ๋„ Environment๋ฅผ ํ†ตํ•ด์„œ ์ฝ์–ด ๋“ค์ผ ์ˆ˜ ์žˆ๋‹ค!

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ต์…˜์„ ์ค„์ˆ˜๋„ ์žˆ๋‹ค.

-Dspring.profiles.active=dev


command line arguments

์ปค๋งจ๋“œ๋ผ์ธ ์˜ต์…˜ ์ธ์ˆ˜
key=value ํ˜•์‹์œผ๋กœ ๊ตฌ๋ถ„

--key=value ํ˜•์‹
๋‹จ์  : ๋„ˆ๋ฌด ๊ธธ๋ฉด ์‚ฌ์šฉํ•˜๊ธฐ ๋ถˆํŽธํ•ด์ ธ..

์˜ˆ๋ฅผ ๋“ค์–ด์„œ OS ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋‘๋ฉด System.getenv(key) ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ , ์ž๋ฐ” ์‹œ์Šคํ…œ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด System.getProperty(key) ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ OS์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋‘์—ˆ๋Š”๋ฐ, ์ดํ›„์— ์ •์ฑ…์ด
๋ณ€๊ฒฝ๋˜์–ด์„œ ์ž๋ฐ” ์‹œ์Šคํ…œ ์†์„ฑ์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋‘๊ธฐ๋กœ ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ์ฝ”๋“œ๋“ค์„ ๋ชจ๋‘ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

์™ธ๋ถ€ ์„ค์ •๊ฐ’์ด ์–ด๋””์— ์œ„์น˜ํ•˜๋“  ์ƒ๊ด€์—†์ด ์ผ๊ด€์„ฑ ์žˆ๊ณ , ํŽธ๋ฆฌํ•˜๊ฒŒ key=value ํ˜•์‹์˜ ์™ธ๋ถ€ ์„ค์ •๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉด ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ๋” ํŽธ๋ฆฌํ•˜๊ณ  ๋˜ ์™ธ๋ถ€ ์„ค์ •๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋” ์œ ์—ฐํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

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

์Šคํ”„๋ง์€ ์ด ๋ฌธ์ œ๋ฅผ Environment ์™€ PropertySource ๋ผ๋Š” ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด์„œ ํ•ด๊ฒฐํ•œ๋‹ค.

์˜ˆ์‹œ

import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;


@Slf4j
@Component
public class EnvironmentCheck {
 private final Environment env;
 
 public EnvironmentCheck(Environment env) {
 	this.env = env;
 }
 
 @PostConstruct
 public void init() {
 
 	String url = env.getProperty("url");
 	String username = env.getProperty("username");
 	String password = env.getProperty("password");
 
 	log.info("env url={}", url);
 	log.info("env username={}", username);
 	log.info("env password={}", password);
 	}
}

์ปค๋งจ๋“œ ๋ผ์ธ ์˜ต์…˜ ์ธ์ˆ˜ ์‹คํ–‰
--url=devdb --username=dev_user --password=dev_pw

์ž๋ฐ” ์‹œ์Šคํ…œ ์†์„ฑ ์‹คํ–‰
-Durl=devdb -Dusername=dev_user -Dpassword=dev_pw

ExternalApplication.main ์„ ์‹คํ–‰ํ•˜์ž.

์‹คํ–‰ ๊ฒฐ๊ณผ

env username=dev_user
env password=dev_pw

์ •๋ฆฌ

์ปค๋งจ๋“œ ๋ผ์ธ ์˜ต์…˜ ์ธ์ˆ˜, ์ž๋ฐ” ์‹œ์Šคํ…œ ์†์„ฑ ๋ชจ๋‘ Environment ๋ฅผ ํ†ตํ•ด์„œ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.
์Šคํ”„๋ง์€ Environment ๋ฅผ ํ†ตํ•ด์„œ ์™ธ๋ถ€ ์„ค์ •์„ ์ฝ๋Š” ๋ฐฉ๋ฒ•์„ ์ถ”์ƒํ™”ํ–ˆ๋‹ค. ๋•๋ถ„์— ์ž๋ฐ” ์‹œ์Šคํ…œ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๋งŒ์•ฝ ์ปค๋งจ๋“œ ๋ผ์ธ ์˜ต์…˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ๋Š” ๋ฐฉ๋ฒ•์ด ๋ณ€๊ฒฝ๋˜์–ด๋„, ๊ฐœ๋ฐœ ์†Œ์Šค ์ฝ”๋“œ๋Š” ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.


์™ธ๋ถ€ํŒŒ์ผ

  • properties, yaml(yml) ํŒŒ์ผ์— ์ €์žฅ (์‹ค๋ฌด์—์„œ๋Š” ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ฝ๊ธฐ ํŽธํ•œ yml ํŒŒ์ผ์„ ๋” ์„ ํ˜ธ)

  • spring์ด ์ธ์‹ํ•˜๋Š” ์šฐ์„ ์ˆœ์œ„: java ์‹œ์Šคํ…œ ํ”„๋กœํผํ‹ฐ(-D ์˜ต์…˜) > properties > yml

  • properties ๊ฐ™์ด ์„ค์ •ํŒŒ์ผ๋“ค์€ ์ผ€๋ฐฅ์ผ€์ด์Šค-๋ฅผ ๊ถŒ์žฅ

  • profile ์„ค์ •
    1) ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ ex. application-dev.yml, application-prod.yml
    2) application.yml 1๊ฐœ์˜ ํŒŒ์ผ์—์„œ profile์„ ๋ถ„๋ฆฌ
    --- dash 3 ๋ณดํ†ต ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์“ฐ์ž„

  • ์ฝ๋Š” ์ˆœ์„œ!
    ์œ„ -> ์•„๋ž˜

application.yml(Profile ๋ถ„๋ฆฌ) ์˜ˆ์‹œ

1) application.yml , --- Profile ๋ถ„๋ฆฌ
2) Profile ๋ถ„๋ฆฌ ์„ค์ •

  • default profile ์„ค์ •
# default ์„ค์ •, profile์˜ต์…˜์„ ์•ˆํ•ด์ฃผ๋ฉด ์ด ์„ค์ • profile์„ ์„ ํƒ 
spring:
  profiles:
  	active: "profile"
   
  • active ์ผ์‹œ, profile ์ ์šฉ ์„ค์ •
spring:
  config:
    activate:
      on-profile: "profile"
  • ์‹ค์ œ application.yml ์˜ˆ์‹œ
server:
  port: 8080

spring:
  config:
    import: optional:file:.env[.properties] # .env ํŒŒ์ผ ๋กœ๋“œ

  profiles:
    active: local # ๊ธฐ๋ณธ ํ™œ์„ฑํ™” ํ”„๋กœํŒŒ์ผ๋กœ local ์„ค์ •

  jpa:
    hibernate:
      ddl-auto: update # ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ ์—…๋ฐ์ดํŠธ ์ „๋žต
    properties:
      hibernate:
        format_sql: true # SQL ํฌ๋งทํŒ…
        highlight_sql: true # ํ•˜์ด๋ผ์ดํŠธ SQL ์ถœ๋ ฅ
        use_sql_comments: true # ์‹ค์ œ JPQL SQL ์ฃผ์„ ์‚ฌ์šฉ

---
spring:
  config:
    activate:
      on-profile: local

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: root
    password: 1234

app:
  aws:
    ec2:
      instance-front-url: http://localhost:3000

logging:
  level:
    org.hibernate.SQL: debug # Hibernate์˜ SQL์„ ์ถœ๋ ฅ
    org.hibernate.orm.jdbc.bind: trace # Hibernate์˜ SQL ๋ฐ”์ธ๋”ฉ์„ ์ถœ๋ ฅ
    org.springframework.transaction.interceptor: trace # Hibernate์˜ SQL ๋ฐ”์ธ๋”ฉ์„ ์ถœ๋ ฅ

---
spring:
  config:
    activate:
      on-profile: prod

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://my-db:3306/test?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: root
    password: 1234
    hikari:
      max-lifetime: 600000 # ์ปค๋„ฅ์…˜ ์ตœ๋Œ€ ์ƒ์กด ์‹œ๊ฐ„
      idle-timeout: 300000 # ์ปค๋„ฅ์…˜ ์ตœ๋Œ€ ์œ ํœด ์‹œ๊ฐ„
      connection-timeout: 30000 # ์ปค๋„ฅ์…˜ ํƒ€์ž„์•„์›ƒ

app:
  aws:
    ec2:
      instance-front-url: http://43.203.42.37

logging:
  level:
    org.hibernate.SQL: error # Hibernate์˜ SQL์„ ์ถœ๋ ฅ

์™ธ๋ถ€์„ค์ • ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐฉ๋ฒ•

0) Environment

์œ„ Environment ๊ฐ์ฒด๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ


@Slf4j
@Component
public class EnvironmentCheck {
 private final Environment env;
 
 public EnvironmentCheck(Environment env) {
 	this.env = env;
 }
 
 @PostConstruct
 public void init() {
 
 	String url = env.getProperty("url");
 	String username = env.getProperty("username");
 	String password = env.getProperty("password");
 
 	log.info("env url={}", url);
 	log.info("env username={}", username);
 	log.info("env password={}", password);
 	}
}

์ปค๋งจ๋“œ ๋ผ์ธ ์˜ต์…˜ ์ธ์ˆ˜ ์‹คํ–‰
--url=devdb --username=dev_user --password=dev_pw

์ž๋ฐ” ์‹œ์Šคํ…œ ์†์„ฑ ์‹คํ–‰
-Durl=devdb -Dusername=dev_user -Dpassword=dev_pw

ExternalApplication.main ์„ ์‹คํ–‰ํ•˜์ž.

์‹คํ–‰ ๊ฒฐ๊ณผ

env username=dev_user
env password=dev_pw

1) @Value ๋ฐฉ๋ฒ•

application.yml

# Application Active Type(prod, dev)
spring:
  profiles:
    active: dev

@Value ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

@Component
public class EnvironmentProps {

    @Value("${spring.profiles.active}")
    private String activeProfile;

    public boolean isProdActiveProfile() {
        return Objects.equals(activeProfile, "prod");
    }

}
@Data
@Component
public class ElasticSearchProps {

    @Value("${app.props.elastic-search.product.enterprise-search-baseUrl}")
    private String productEngineUrl;

    @Value("${app.props.elastic-search.product.private-key}")
    private String productEnginePrivateKey;
}
@Slf4j
@Component
@RequiredArgsConstructor
public class ElasticSearchScheduler {

    private final ElasticSearchService elasticSearchService;
    private final EnvironmentProps environmentProps;

    @Scheduled(fixedRate = 30000)
    public void saveProductList() {
        // ์‹ค์„œ๋ฒ„์ธ ๊ฒฝ์šฐ์—๋งŒ ๋™์ž‘
        if (environmentProps.isProdActiveProfile()) {
            elasticSearchService.indexProductList();
        }
    }

}

2) โญ@ConfigurationProperties ๋ฐฉ๋ฒ•(๊ฐ€์žฅ ์ถ”์ฒœ)

์Šคํ”„๋ง๋ถ€ํŠธ๋Š” BeanPostProcessor(ํ”„๋กœํผํ‹ฐ ๋นˆํ›„์ฒ˜๋ฆฌ๊ธฐ)๋ฅผ ํ†ตํ•ด ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ํ›„์— ํŠน์ • ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค์— Environment์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ฃผ๋Š”(๋ฐ”์ธ๋”ฉ) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜ @ConfigurationProperties ์ž…๋‹ˆ๋‹ค.

application.yml

...

# Properties
app:
  props:
    type: dev
    url: https://XXXXXXXX.com
    host: https://XXXXXXXX.com/
    ai:
      resnet50Url: http://api-XXXXXXXX/api/v1/classify
    allowOrigins: http://localhost:3001
    sms:
      smsTellNumber: "010-XXXX-XXX"
      client-key: "NCSQGSYTWQSHNXDR@@"
      secret-key: "ZTHWIUBEM2IKME8W044EU2WTX0EMNZQP@@"

yaml ํŒŒ์ผ์˜ app.props.sms @ConfigurationProperties ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โ˜‘๏ธ ์–ด๋…ธํ…Œ์ด์…˜ ์•ˆ์— application.yml ํŒŒ์ผ ์•ˆ์— app.props.sms ๊ฐ™์€ ๊ณตํ†ต๋œ ์ ‘๋‘์‚ฌ๋ฅผ ๋„ฃ์–ด, ํ”„๋กœํผํ‹ฐ๋“ค์„ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค!

โ˜‘๏ธ ๊ทธ๋‹ค์Œ ํ”„๋กœํผํ‹ฐ ์†์„ฑ์„ Java ์ฝ”๋“œ๋กœ Java๋Š” ์นด๋ฉœ์ผ€์ด์Šค ํ˜•ํƒœ๋กœ ํ•„๋“œ ์ •๋ณด๋กœ ์ •๋ฆฌํ•ด, ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

@Data
@Component  // ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•จ
@ConfigurationProperties("app.props.sms")
public class SmsProps {
    private String smsTellNumber;
    private String clientKey;
    private String secretKey;
}

application.yml

cors:
  allowed-origins:
    - https://dsgpost.link
    - https://www.dsgpost.link

ConfigurationProperties ํŒŒ์ผ

@Data
@Component
@ConfigurationProperties("cors")
public class CorsAllowedOriginsProps {

    private List<String> allowedOrigins;

}

ConfigurationProperties ์ ์šฉ

@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {

    private final CorsAllowedOriginsProps props;

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins(props.getAllowedOrigins().toArray(new String[0])) // ํ”„๋ก ํŠธ ํ—ˆ์šฉ ์ฃผ์†Œ ์„ค์ •
                .allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS")
                .allowedHeaders("*")
                .exposedHeaders("Access-Control-Allow-Origin", "Access-Control-Allow-Credentials")
                .maxAge(3600) // 1์‹œ๊ฐ„ ๋™์•ˆ preflight ์š”์ฒญ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ
                .allowCredentials(true);
    }
}

ConfigurationProperties ์žฅ์ 

  • ์™ธ๋ถ€ ์„ค์ •์„ ๊ฐ์ฒด๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์™ธ๋ถ€ ์„ค์ •์˜ ๊ณ„์ธต์„ ๊ฐ์ฒด๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์™ธ๋ถ€ ์„ค์ •์„ ํƒ€์ž… ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฒ€์ฆ๊ธฐ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

3) @Profile

@Slf4j
@Configuration
public class PayConfig {

	@Bean
	@Profile("default")
	public LocalPayClient localPayClient() {
		log.info("LocalPayClient ๋นˆ ๋“ฑ๋ก");
		return new LocalPayClient();
	}

	@Bean
	@Profile("prod")
	public ProdPayClient prodPayClient() {
		log.info("ProdPayClient ๋นˆ ๋“ฑ๋ก");
		return new ProdPayClient();
	}
}
  • @Profile์˜ ์ •์ฒด
package org.springframework.context.annotation;
...
@Conditional(ProfileCondition.class)
public @interface Profile {
	String[] value();
}

@Profile ์€ ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๋นˆ์„ ๋“ฑ๋กํ• ์ง€ ๋ง์ง€ ์„ ํƒํ•œ๋‹ค. ์–ด๋””์„œ ๋งŽ์ด ๋ณธ ๊ฒƒ ๊ฐ™์ง€ ์•Š์€๊ฐ€? ๋ฐ”๋กœ @Conditional ์ด๋‹ค.
์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด @Conditional(ProfileCondition.class) ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
์Šคํ”„๋ง์€ @Conditional ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” @Profile ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@Profile ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํ™˜๊ฒฝ ๋ณ„๋กœ ์™ธ๋ถ€ ์„ค์ • ๊ฐ’์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ, ๋“ฑ๋ก๋˜๋Š” ์Šคํ”„๋ง ๋นˆ๋„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โญ jar ํŒŒ์ผ ์‹คํ–‰์‹œ profiles ์˜ต์…˜์„ค์ •

-Dspring.profiles.active=prod

or
--spring.profiles.active=prod

์˜ˆ์‹œ)

java -Dspring.profiles.active=prod -jar *-SNAPSHOT.jar

java -jar *-SNAPSHOT.jar --spring.profiles.active=prod

SpringBoot ์™ธ๋ถ€์„ค์ • ๋ฐ ๋นˆ ๊ตฌ์กฐ

์Šคํ”„๋ง๋ถ€ํŠธ๋Š” ์ž๋™๊ตฌ์„ฑ + ์™ธ๋ถ€์„ค์ •๊ตฌ์„ฑ + ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž(๊ฐœ๋ฐœ์ž)๊ฐ€ ์ง์ ‘ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ ๊ฐ์ฒด๋“ค๋กœ

Containerless ์–ดํ”Œ๋ ˆ์ผ€์ด์…˜ ๊ตฌ์กฐ์˜ ๊ฐœ๋ฐœ์„ ์™„๋ฃŒ์ผ€ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. - ํ† ๋น„



์ฐธ๊ณ 

  • ๊น€์˜ํ•œ <์Šคํ”„๋ง๋ถ€ํŠธ ํ•ต์‹ฌ์›๋ฆฌ์™€ ํ™œ์šฉ> ๊ฐ•์˜
profile
๋ฐฐ์šด ๊ฒƒ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

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