728x90
반응형

맥북에서 crontab을 통해 주기적으로 실행을 시켜보고싶은게 생겨서

crontab을 등록하여 테스트를 해보았더니 잘 작동이 되지않아서 찾아보니

macOS에서는 crontab 보다는 LaunchAgents를 통해 crontab의 역할을 한다고 한다.

 

 

하고싶었던 작업은 매일 오전10시에 어떤 작업을 수행할 것

* crontab 이라면 아마 이렇게 crontab -e 로 등록해서 사용했을 것 같다. 

0 7 * * * cd 실행할위치 && 실행하고싶은 명령어

사용방법

앞서 말했든 macOS에서는 crontab 보다는 LaunchAgents를 권장하고 있고 해당 방법은 간단하다

 

1. .plist 파일 작성:
 ~/Library/LaunchAgents/${너가수행할이름}.plist라는 파일을 생성

2. plist 샘플
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>본인의프로젝트명</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>-c</string>
        <string>cd 실행할위치 && 실행할명령어</string>
    </array>
    
    <key>StartInterval</key>  //실행간격
    <integer>120</integer>    //120초 (2분)
</dict>
</plist>

3. 내가 만든 plist가 잘 작성되었는지 확인
plutil -lint ${너가수행할이름}.plist
정상적으로 잘 만들어졌으면 => ${너가수행할이름}.plist: OK

4. plist load 
launchctl load ~/Library/LaunchAgents/${너가수행할이름}.plist

5. 등록이 잘되었는지 확인
launchctl list | grep ${너가수행할이름}


6. 만약 등록을 취소하고싶다면
launchctl unload ~/Library/LaunchAgents/${너가수행할이름}.plist

 

테스트를 위해 2분마다 실행되도록 plist를 만들었다.

 

 

여기서 내가 했던 실수들

1. <string>cd 실행할위치 && 실행할명령어</string> 여기서 && 를 xml 문법에 맞게 &amp;로 바꿔줬어야 했다. 

2. 처음에는 yarn start라고 실행할 명령어를 썻는데 fail이 떨어졌다 그래서 Full Path 로 변경 :   /opt/homebrew/bin/yarn start 

 

실수들에 대해서 수정을 하니 테스트가 잘 돌아간다. 

그래서 처음 계획했던 매일 오전 10시에 돌아갈 수 있도록 

실행 부분을 변경해주었다. 

    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>10</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>

 

728x90
반응형
728x90
반응형

1. thread 를 병렬로 처리하는 방법

  1. 동기화
    1. 병렬로 실행되는 스레드가 공유 리소스에 동시에 접근하려고 할 때, 무결성을 보장하기 위해 동기화 기법을 사용합니다. 동기화는 뮤텍스, 세마포어, 모니터 등의 다양한 기법이 존재
  2. 뮤텍스
    1. 상호배제를 뜻하며, 한 번의 하나의 스레드만 공유 리소스에 접근할 수 있도록 제한합니다. 뮤텍스를 사용하여 공유 리소스에 접근하는 코드 영역을 임계 영역으로 지정하면, 동시에 여러 스레드가 해당 영역을 실행하지 못하게 됩니다.
  3. 세마포어
    1. 공유 리소스에 동시에 접근할 수 있는 스레드의 수를 제한하는 동기화 기법. 세마포어는 카운터를 사용하여 특정 시점에 동시에 실행할 수 있는 스레드 수를 제한합니다.
  4. 데드락
    1. 여러 스레드가 동시에 실행될 떄, 데드락이 발생. 데드락은 스레드들이 서로가 가진 리소스를 기다리며 진행이 멈추는 상황. 데드락을 처리하러며 아래와 같은 방법을 사용해야함
      1. 리스소 순서화 : 리소스를 사용하는 순서를 정하고 스레드들이 이 순서대로 리소스를 요청할수 있도록 한다.
      2. 타임아웃 설정 : 스레드가 특정 시간동안 리소스를 얻지 못하면 요청을 취소하고 다시 시도하도록 한다.
  5. 작업 분할 및 분산
    1. 병렬로 들어온 스레드를 효율적으로 처리하기 위해, 작업을 적절한 크기의 단위로 나누고, 스레드에 할당
  6. 최적화된 스레드풀 사용
    1. 과도한 스레드 생성 및 소멸로 인한 오버헤드를 줄이기 위해 스레드 풀을 사용할 수 있습니다.

 

2. thread 동시성 문제 

  1. 락(lock) 사용
    1. 공유 리소스에 동시접근을 막기위해 락을 사용하고, 락을 사용하면 한 번에 하나의 스레드만 해당 리소스에 접근이 가능, java 에서는 synchronized 키워드를 사용하거나 reentrantLock을 사용
  2. 원자적(Atomic) 연산
    1. 원자적 연산은 여러 스레드에서 동시에 실행되더라도 중간 결과를 공유하지 않으므로 동시성 문제가 발생하지 않습니다. 자바에서는 AtomicInteger 와 같은 원자적 클래스를 사용할 수 있습니다.
  3. 뮤텍스
    1. 공유리소스에 접근하는 코드영역을 임계 영역으로 지정하여 동시에 여러 스레드가 해당 영역을 실행하지 못하도록 합니다.
  4. 세마포어
    1. 동시에 접근할 수 있는 스레드 수를 제한하여 동시성 문제를 해결하는 기법
  5. 모니터
    1. 객체 내부에서 뮤텍스와 조건 변수를 사용하여 동시성 문제를 해결하는 기법
    import java.util.LinkedList;
    import java.util.Queue;
    
    public class ProducerConsumerMonitor {
        private final Queue<Integer> buffer;
        private final int maxSize;
    
        public ProducerConsumerMonitor(int maxSize) {
            this.maxSize = maxSize;
            this.buffer = new LinkedList<>();
        }
    
        public synchronized void produce(int item) throws InterruptedException {
            while (buffer.size() == maxSize) {
                wait();
            }
    
            buffer.add(item);
            System.out.println("Produced: " + item);
            notifyAll();
        }
    
        public synchronized int consume() throws InterruptedException {
            while (buffer.isEmpty()) {
                wait();
            }
    
            int item = buffer.remove();
            System.out.println("Consumed: " + item);
            notifyAll();
            return item;
        }
    
        public static void main(String[] args) {
            ProducerConsumerMonitor monitor = new ProducerConsumerMonitor(5);
    
            Thread producer = new Thread(() -> {
                for (int i = 0; i < 10; i++) {
                    try {
                        monitor.produce(i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
    
            Thread consumer = new Thread(() -> {
                for (int i = 0; i < 10; i++) {
                    try {
                        monitor.consume();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
    
            producer.start();
            consumer.start();
        }
    }
    
  6. 읽기-쓰기락 사용
    1. 읽기-쓰기 락은 여러 스레드가 동시에 읽기 작업을 수행하면서, 쓰기 작업은 독점적으로 수행하도록 제한하는 동기화 기법
728x90
반응형
728x90
반응형

새 창에서 열기

728x90
반응형
728x90
반응형

 

 

3. 결합인덱스 사용 시, 인덱스 구성의 첫인덱스가 where절의 첫 조건에 적용하지 않았을 경우

 

두 개 이상의 컬럼을 합쳐서 인덱스를 만들 때 결합인덱스라고 한다. 

결합인덱스 컬럼 선택의 기준점은

  1. where 절에서 and 조건으로 자주 사용되며, 각각 사용할때보다 두 개 이상의 컬럼이 결합될 때 분포도가 좋아지는 컬럼
    ※ 분포도(Cardinality) : 해당 컬럼의 중복도가 적을 경우 분포도가 높고, 중복도가 높을경우 분포도가 낮다
    흔히, 우리가 Table의 ID 는 중복되는 값이 없으므로 분포도가 높다고 할 수 있고, Name 같은 컬럼은 ID에 비해 중복되는 값이 많으므로 분포도가 높다고 할 수 있다. 
  2. 테이블 조인을 위한 연결고리로 사용되는게 빈번한 컬럼
  3. 자주 정렬되는 컬럼인지 고려
  4. 쿼리 작성시 '=' 으로 지정할 수 있는 컬럼이 선행되어야 한다. 
index를 구성할 때, A,B,C 로 구성한다고 했을 때

#첫번째 케이스
select *
  from test
 where A=99
   and B=99
   and C=99;
   
#두번째 케이스
select *
  from test
 where A=99
   and B between 10 and 99
   and C=99;
   
#세번째 케이스
select *
  from test
 where A between 10 and 99
   and B between 10 and 99
   and C=99;


첫번째, 두번째 케이스는 인덱스를 타지만, 세번째 케이스는 인덱스를 타지 않는다.

물론 두번째 케이스도 완벽하게 인덱스를 타는건 아니다. 실행계획을 떠보면 알겠지만 범위 조건은 해당 컬럼은 인덱스를 타지만, 그 뒤 인덱스 컬럼들은 인덱스를 타지 않고 filter access를 하게 된다. (https://khdscor.tistory.com/51)

쿼리 툴에서는  force index를 통해 강제로 힌트를 줄 수 있지만 ,JPA/Hibernate에서는 Query Hint 조정이 불가능
실제로 JPA/Hibernate에서의 힌트는 Hibernate의 작동 방식에 대한 Hint이지 Query Hint가 아니다.

728x90
반응형

'IT Diary > # SQL' 카테고리의 다른 글

[ SQL ] 003. INDEX가 동작을 제대로 안하는 경우 #1  (0) 2023.01.04
[ SQL ] 003. 실행계획 보는법  (0) 2022.04.18
[ SQL ] 001. INDEX 의 정의  (0) 2021.03.17
[ SQL ] 002. INDEX SCAN  (0) 2021.03.16

+ Recent posts