@Scheduled에서 Thread관리하기

@Scheduled에서 외부 서비스에 데이터를 처리요청할때 데이터를 중복으로 처리하는 문제가 발생할수 있다.

Scheduled는 매번 실행할때마다 빠른 처리를 위해 fixedDelayString=”1000″ 으로 설정하였고, 한번에 실행되는 thread의 수는 5개로 제한하였다. 또한 Scheduled 한번실행에 처리되지 않은 데이터 1000건을 외부 API를통해 가져와 처리하도록 설계하였다.

이때 발생할수 있는 문제는 1000개의 데이터를 처리(Thread가 종료) 하기전에 Scheduled가 실행되면서 1000개의 데이터를 외부API에 다시 요청하게 되고 1000개의 데이터에는 첫번째 가져온 아직 처리되지 않은 데이터가 포함되어 중복 처리되면서 오류가 발생한다.
한번의 Scheduled의 실행으로 1000개의 데이터를 5개의 Thread가 모두 처리(종료)될때까지 대시 시켜 해당 문제를 해결할수 있는데 방법은 아래와 같다.

// Thread로 실행할 Class
public class Job implements Callable<Void> {
  
  @Override
  public Void call() throws Exception {
    // 외부 API 호출
    // 외부 API를 사용한 데이터 처리요청
    return null;
  }
}

// Scheduled Class
public class MyScheduler {
  
  @Scheduled(fixedDelay = 1000)
  public void executeJob() {
  

    // Thread 개수
    int threadSize = 5;
  
    // 외부에서 처리 데이터 가져오기
    int totalTasks = 1000;
  
    ExecutorService executor = Executors.newFixedThreadPool(threadSize);
    List<Callable<Void>> tasks = new ArrayList<>();
    
    // 모든 작업이 완료될때까지 대기
    for (int i=0; i < totalTasks; i++) {
      Callable<Void> task = new Job();
      tasks.add(task);
    }
    
    try {
      List<Future<Void>> results = executor.invokeAll(tasks);
      
      for (Future<Void> result : results) {
        // 작업 결과 처리
        result.get();
      }
    } catch (InterruptedException | ExcutionException e) {
      // 예외처리
    } finally {
      // ExecutorService 종료
      executor.shutdown();
    }
  }
}

위 코드처럼 ExecutorService를 사용하여 Callable에 작업요청하고 결과를 기다린다.
invokeAll을 사용하여 작업이 완료될때까지 대기하고, 작업결과를 얻어 처리할수 있다. 이렇게 하면 모든 스레드가 종료될때까지 대기한 다음 스케줄링을 실행할수 있다.

invokeAll(Collection> tasks)
여러개의 Callable 타입 작업을 동시에 스레드풀에서 실행하고, 모든 작업이 완료될때까지 기다린다.

invokeAny(Collection> tasks)
여러개의 Callable 타입 작업중 하나라도 완료되면 결과를 반환하고, 다른작업들은 취소한다.

shutdown()
스레드 풀을 종료하고 스레드 풀에 할당된 리소스를 해제한다. 작업이 완료되지 않은 경우에도 스레드 풀을 종료한다.

shutdownNow()
스레드 풀을 즉시 종료하고 아직 시작되지 않은 작업을 취소한다. 작업이 이미 실행중인경우에는 종료되지 않을수 있다.

MAC에서 PPK파일을 PEM파일로 변환하는 방법

.ppk 키파일과 .pem 키파일을 둘다 SSH 개인키를 저장하는데 사용되는 파일 형식이다.

만약 키파일이 .ppk형식이라면 MAC사용자의 경우 .pem형식으로 변경하여 사용해야 하는데 방법은 아래와 같다.

PUTTY 설치

> brew install putty

키파일 변환

> puttygen private.ppk -O private-openssh -o private.pem

puttygen : PuTTY Key Generator도구를 실행하는 명령어

private.ppk : 변환할 .ppk 개인 키 파일

-O private-openssh : 변환된 개인 키 파일의 형식을 지정하는 옵션으로 OpenSSH형식으로 변환

-o private.pem : 변환된 개인 키를 저장할 파일의 이름과 경로 지정

로그인 없이 github 사용하기

원격 저장소에 pull 또는 push를 하기 위해 매번 로그인하는 절차를 거치지 않고 공개키를 사용하여 로그인 없이 원격 저장소를 사용하는 방법입니다.

순서는 아래와 같습니다.

  1. 개인키와 공개키를 생성한다.
  2. github에 공개키를 등록한다.
  3. git clone한다.

먼저 ssh-keygen으로 개인키와 공개키를 생성해야합니다.

> ssh-keygen -t rsa -C "your_email@example.com"

개인키는 외부로 노출하지 않으며 공개키만 사용하면 됩니다.

cat ~/.ssh/id_rsa.pub

위 명령어로 공개키를 확인할수 있습니다.

그다음 공개키를 github에 등록합니다.

로그인후 오른쪽 상단 프로필 사진을 클릭하여 Settings 메뉴를 선택합니다.

왼쪽 메뉴에 SSH and GPG keys를 선택합니다.

New SSH key 버튼을 클락하여 공개키를 등록합니다.

title에는 공개키를 식별할수 있는 제목을 입력해주시고, key필드에 위에서 확인한 공개키를 입력후 Add SSH key 버튼을 눌러 등록해줍니다.

다음으로 git clone을 진행하면 됩니다.

공개키를 사용하여 로그인없이 원격저장소를 사용하기 위해서는 SSH 주소를 사용해야합니다.

CloudFlare 적용시 /wp-admin 접근 문제

무료 SSL을 사용하고자 찾아보던중 CloudFlare를 알게 되었고, 별 문제 없이 설정을 완료할수 있었다.

cafe24.com의 호스팅을 사용하고 있으며 현재 이 도메인에 wordpress를 설치하여 사용하고 있다.

  • 회원 가입후 서비스 site의 도메인을 등록한다.
  • 등록후 DNS 에서 네임서버를 확인할수 있는데 도메인의 네임서버를 CloudFlare로 변경한다.
  • SSL/TLS 의 설정을 Flexible 또는 Full로 변경한다. 나의 경우 Full로 변경했음.
  • 위 설정후 도메인에 접속해보면 SSL이 적용된것을 확인할수 있다.

일반 페이지는 정상적으로 작동하였지만 관리자 화면으로 들어가기 위해 로그인부터 style이 깨지고 로그인 시도시 forbidden 오류가 발생하였다.

CloudFlare의 설정을 이것저것 찾아보고 변경해봤지만 해결되지 않았고, 해답은 cafe24 설정에서 찾을수 있었다.

cafe24 > 호스팅관리 > 보안관리 > 디렉토리 접속설정 페이지로 들어가 보면 디렉토리 설정 현황 목록에 /wp-admin 폴더가 있었고 설정된 폴더를 제거후 관리자 페이지가 접근할수 있었다.

본인이 설정한 부분은 아니고 cafe24를 통해 wordpress를 설치했고, 어떤 보안상의 이유로 해당 폴더가 설정되어 있던게 아닌가 하는 생각을 한다.

Cafe24 호스팅, 가비아 도메인 연결

타사의 도메인을 사용할경우 cafe24에서 대표 도메인을 변경이 필요하며 도메인을 구입한 서비스의 네임서버를 변경해야한다.

Cafe24 대표 도메인 변경

나의서비스관리 > 호스팅관리 > 기본관리 > 도메인 연결관리

Cafe24 네임서버

  • 1차 ns1.cafe24.com 175.125.93.134
  • 2차 ns1.cafe24.co.kr 112.175.246.232
  • 3차 ns2.cafe24.com 175.125.93.144
  • 4차 ns2.cafe24.co.kr 112.175.247.232

도메인 구매처의 네임서버 변경

도메인 통합 관리툴 > 도메인 정보 변경 > 네임서버

네임서버를 변경하면 적용되는데 시간이 걸릴수도 있으므로 차분히 기다린다.

Cafe24 무료 SSL 인증서 등록

무료 SSL 인증서 발급

ZeroSSL에서 무료로 사용할수 있는 인증서 발급 절차입니다.

가입이 필요합니다. 가입시 많은 정보를 요구하지 않고 이메일과 비밀번호만 입력하면 가입 가능합니다.

가입을 하고나면 Dashboard에서 New Certificate 버튼을 눌러 인증서를 생성할수 있습니다.

Step에 따라 정보를 입력하여 진행하면 되는데 domain에 대한 소유 확인을 진행하게 되는데, 저는 이메일 인증으로 진행하였습니다.

다음 step으로 넘어가면 인증서를 다운로드 받을수 있습니다.

사용할 파일은 cerificate.crt, private.key 두개의 파일입니다.


Cafe24에 인증서 등록

나의서비스관리 > 인증서관리 > 외부인증서 관리 로 이동합니다.

인증서 (SSL CRT), cerificate.crt 파일의 내용을 입력합니다.

인증서 확인을 눌러 인증서에 대한 확인작업을 진행합니다. (확인이 되면 SSL 인증서 정보란에 표시됩니다.)

개인티 (Private Key), private.key 파일의 내용을 입력합니다.

비밀번호는 입력하지 않아도 됩니다.

신청을 하면 1~3일정도 소요됩니다. (1시간 후에 확인했을때 적용된걸 확인했습니다.)

다시 ZeroSSL로 돌아와서 인증서 등록 확인을 완료합니다.

SSL 적용 완료!