DatabaseConfiguration 적용


PropertiesConfiguration을 사용하여 서비스에 사용되는 설정 값들을 실시간으로 변경할 수 있다.
서버가 적을 경우에는 각 서버마다 설정을 변경하는 것이 크게 번거롭지 않지만
서버가 많을 경우에는 모든 서버의 설정을 변경하는 것은 곤혹스럽다.
물론 서버마다 설정을 다르게 지정해야 하는 경우라면 어쩔 수 없는 것 같다.
모든 서버의 설정값을 동일하게 가져간다면 DB편히 관리할 수 있다.

그 뿐만이 아니다. AWS Auto Scaling 같은 것을 사용하고 있다면 서버 사용량에 따라 미리 만들어 놓은 서버 이미지로 서버가 늘고 줄게된다.
해당 서버 이미지의 설정값은 변경되지 않은 기존 이미지의 설정값을 따르기 때문에 스케일링 서버들은 다르게 동작하게 된다.
그렇기 때문에 설정값을 각각 수정하더라도 이미지를 다시 만들어야하기에 번거롭다.
그러므로 DatabaseConfiguration을 적용하면 스케일링에 상관없이 DML 수행만으로 서버에 구애 받지 않고 실시간으로 설정값을 변경할 수 있다. 

#DatabaseConfiguration 빈 등록
@Configuration
public class DatabaseConfig {

  @Bean
  public DataSource dataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost/test");
    dataSource.setUsername("root");
    dataSource.setPassword("root");
    return dataSource;
  }

  @Bean
  public DatabaseConfiguration databaseConfig() {
    return new DatabaseConfiguration(dataSource(), "config", "key", "value"); // table명, key/value명
  }

}

#config 테이블 정의 (JPA)
@Entity
@Table(name = "config")
@Getter
@Setter
@EqualsAndHashCode(callSuper = false, of = { "key" })
@NoArgsConstructor
public class Config {

  @Id
  @Column
  private String key;

  @Column
  private String value;

}

#프로퍼티 값 설정
@Component
public class ConfigUtil {

  @Autowired
  private DatabaseConfiguration dbConfig;

  // key, default value

  public int getRetryCount() {
    return dbConfig.getInteger("retry.count", 3);
  }

  public boolean isSendAsync() {
    return dbConfig.getBoolean("send.async", false);
  }

  public String getPaymentServerAddress() {
    return dbConfig.getString("payment.server.address", "www.pay.com");
  }

}

동작 방식 예시
1. config 테이블에서 retry.count 라는 key로 DB를 읽는다.
2. DB에서 해당 key의 value 값을 반환한다.
3. DB에 해당 key가 존재하지 않으면 default 값으로 지정된 3을 반환한다.

추가적으로 해당 설정값들의 변경될 가능성을 감안하여 캐시를 적용하면 DB를 읽는 수고를 덜 수 있다.


+ Recent posts