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를 읽는 수고를 덜 수 있다.


IntelliJ PMD Plugin 

PMD
: 자바 컴파일러가 잡아내지 않는 버그나 잘못된 코드 패턴을 찾아주는 정적 코드 분석 도구

IntelliJ 에서 먼저 PMD Plugin을 아래와 같이 설치한다.
Preference > Plugins > Browse repositories... > pmd 검색 > PMD Plugin Install > Restart

설치하면 Other Settings에 PMD 항목이 추가된 것을 확인할 수 있다.
기본적으로 정의되어 있는 ruleset을 사용할 수 있지만 커스텀하여 사용할 수 있다.
어떤 코드를 잘못된 오류로 볼 것인지 결정하여 ruleset을 작성하여 아래오 같이 설정 파일을 등록하면 된다.
잘못된 ruleset 파일을 import 하게되면 파일을 점검하라는 알림창이 뜨게 된다.
그러나 문제는 이미 import한 파일을 수정하다가 오타가 생긴 경우이다. PMD 실행시 파일을 스캔하다가 종료되는듯 해보인다. 
그런데 파일이 잘못 되었다는 알림 같은 것이 없어 당황했다. 뒤늦게 오타가 있음을 발견하여 수정 후 정상 실행을 확인했다.

실행방법은 아래와 같다. 검사하고 싶은 패키지나 파일들을 우클릭해 Run PMD 에서 적용할 ruleset을 선택한다.
Pre Defined 는 기본적으로 지원하는 것이고, 커스텀 파일을 등록했다면 Custom Rules 에서 선택한다.
Custom Rules 비활성화 혹은 설정한 커스텀 파일명아 보이지 않는 경우에는 지체없이 재시작한다. IDE Restart!

실행하면 아래와 같이 검출된 항목이 타입별로 분류된다. 
그러나 정렬 기준이 뭔지는 모르겠다.. 검색도 되지 않아 내가 찾고자하는 타입을 찾기가 어려운게 단점이다.
Rerun > 최근 적용한 ruleset 으로 현재 오픈된 클래스 기준으로 재검출. 클래스 단위로 검사시 편함!
Export to Text File > PMD Results 를 html 파일로 export 파일 및 라인별로 위반한 룰을 안내. 보기 불편함..
Details > 위반한 룰에 대한 가이드 링크로 이동. 원인과 해결방안 제공. 이드 링크
가이드 링크의 내용을 번역하여 정리해 놓은 링크 공유합니다. PMD 한글번역

PMD를 통해 검출된 항목들을 검토하다 보면 코드 패턴 및 작성 요령을 깨달을 수 있다. 뿐만 아니라 JVM 내부 동작 같은 것도 알 수 있어 큰 도움이 된다!


'Development > Tool' 카테고리의 다른 글

VirtualBox 해상도 조절  (0) 2017.07.28
IntelliJ 단축키 정리  (0) 2017.03.21

ssh 접속 불가 현상 해결

ssh 명령을 통해 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행할 수 있다.

최초 아래와 같이 명령을 실행하면 해당 서버에 연결되며 인증키를 발급 받는다.
이후 연결시에는 발급된 인증키를 통해 연결된다.

$ ssh root@11.222.33.4

그러나 다음과 같은 오류가 발생하며 접속되지 않는 경우도 있다.
WARNING : REMOTE HOST IDENTIFICATION HAS CHANGED!

원인은 
11.222.33.4 이라는 IP로 기존에 접속한 적이 있는 서버와 이미 공유키를 교환한 상태에서 
11.222.33.4 이라는 서버가 변경되었기 때문이다.

문제가 되는 키를 초기화 해주는 명령이 필요하다.
$ ssh-keygen -R 11.222.33.4

명령을 실행하면 .ssh/known_hosts 파일이 업데이트된다.

그리고 나서 다시 접속 명령을 수행하면 새로운 키가 생성되어 접속할 수 있게 된다.
The authenticity of host '11.222.33.4 (11.222.33.4)' can't be established.
ECDSA key fingerprint is SHA256:sakjfhsdjfhweasfasdffiwfksfasfjksfhdk
Are you sure you want to continue connecting (yes/no)? yes


'Development > Etc' 카테고리의 다른 글

GeoIP 자동 업데이트 구성  (0) 2019.01.16

+ Recent posts