AWS Auto Scaling
을 사용하고 있다면 서버 사용량에 따라 미리 만들어 놓은 이미지로 서버가 늘고 줄게된다.
해당 서버 이미지의 설정값은 변경되지 않은 기존 이미지의 설정값을 따르기 때문에 스케일링 서버들은 다르게 동작하게 된다.
그렇기 때문에 설정값을 각각 수정하더라도 이미지를 다시 만들어야하는 단점이 있다.AWS Auto Scaling
에 상관없이 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() {
// table명, key/value명
return new DatabaseConfiguration(dataSource(), "config", "key", "value");
}
}
@Entity
@Table(name = "config")
@Getter
@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");
}
}
동작 방식 예시 getRetryCount()
UPDATE config
SET value = 5
WHERE key = 'retry.count';
추가적으로 해당 설정값들의 변경될 가능성을 감안하여 캐시를 적용하면 DB를 조회하는 행위를 생략할 수 있다.