728x90

1. @EnableAsync란 무엇인가?

@EnableAsync는 Spring에서 비동기 메서드를 활성화하기 위한 애너테이션입니다. 이를 통해 특정 메서드를 별도의 스레드에서 실행하도록 지정할 수 있습니다. 기본적으로 Spring은 단일 스레드에서 동기적으로 요청을 처리하지만, @EnableAsync를 사용하면 Spring이 비동기 작업을 위한 스레드 풀을 생성하고 이를 통해 작업을 병렬 처리합니다.

 

2. 기본 설정 방법

2.1. AsyncConfig 클래스 작성

@EnableAsync는 구성 클래스에 선언하여 사용합니다. 아래는 비동기 처리를 활성화하기 위한 간단한 설정 예제입니다.

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@Configuration
@EnableAsync
public class AsyncConfig {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);  // 기본 스레드 수
        executor.setMaxPoolSize(10); // 최대 스레드 수
        executor.setQueueCapacity(25); // 대기 중인 작업 큐의 크기
        executor.setThreadNamePrefix("AsyncExecutor-");
        executor.initialize();
        return executor;
    }
}

2.2. @Async 사용하기

@Async 애너테이션은 비동기로 실행할 메서드에 선언합니다. 해당 메서드는 별도의 스레드에서 실행됩니다.

예를 들어, 이메일을 비동기로 발송하는 기능을 구현해보겠습니다.

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class EmailService {

    @Async
    public void sendEmail(String recipient, String message) {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

 

2.3. 비동기 메서드 호출 Controller 예제

@Async 애너테이션이 붙은 메서드는 호출 시 호출한 스레드와 별개의 스레드에서 실행됩니다. 이를 확인하기 위해 간단한 컨트롤러를 만들어보겠습니다.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmailController {

    private final EmailService emailService;

    public EmailController(EmailService emailService) {
        this.emailService = emailService;
    }

    @GetMapping("/send-email")
    public String sendEmail() {
        emailService.sendEmail("user@example.com", "메일내용");
        return "메일 전송 완료";
    }
}

 

해당 컨트롤러를 호출해보면 sendEmail에서 3초 슬립을 걸어뒀지만 바로 리턴값 응답 받는걸 보실 수 있습니다.

'자바 JAVA' 카테고리의 다른 글

2. 자바 JAVA - 스트림(stream)  (0) 2023.04.05
1. 자바 JAVA - 스트림(stream)  (0) 2023.01.17
자바 JAVA - 람다 표현식  (0) 2023.01.14
자바 csv 파일쓰기 (한글깨짐 처리)  (1) 2021.09.14
728x90

AWS Parameter Store란 ?

애플리케이션과 인프라스트럭처에서 사용되는 설정 데이터를 안전하게 저장하고 관리할 수 있는 서비스입니다.

AWS Systems Manager의 기능 중 하나로, 비밀 정보(예: API 키, 데이터베이스 자격 증명)와 같은 민감한 데이터를 암호화하여 저장하며, 다양한 AWS 서비스와 손쉽게 통합할 수 있습니다.

또한, 버전 관리, 접근 제어, 감사 기능을 제공하여 보안과 관리 측면에서 뛰어난 유연성을 제공합니다.

Parameter Store를 사용하면 코드에 민감한 정보를 직접 포함하지 않아도 되어 보안성을 높일 수 있으며, 중앙에서 설정을 관리하여 애플리케이션의 가용성과 효율성을 개선할 수 있습니다.

 

쉽게 말해 spring boot의 yml파일이나 node의 .env파일에 민감한 DB정보, 키 정보 등을 git에 올릴 필요도 없고 협업하는 사람들이 각자 로컬피시에 관리 할 필요 없이 Parameter Store를 통해서 빌드될때 자동으로 정보들을 읽어와서 사용할 수 있는 서비스입니다.

 

AWS Parameter store 설정방법

먼저 아래 이미지처럼 parameter store를 검색해서 들어갑니다.

 

들어가면 우측 상단에 파라미터 생성 버튼이 있는데 해당 버튼을 클릭하면 파라미터 세부정보를 입력하는 창이 나옵니다.
먼저 이름을 입력해아하는데, 형식은 자유로우나 저는 일반적으로 '서비스명_환경_env_var' 형식으로 만듭니다

예를들어 tistory에서 사용하는 Parameter Store를 만든다고 하면 

- tistory_local_env_var

- tistory_dev_env_var

- tistory_prod_env_var
이런식으로 만들 것 입니다.

 

설명은 자유롭게 작성해주시고 계층은 일반, 유형은 보안문자열을 선택해 줍니다.

보연문자열을 클릭하면 kms키소스가 하나 더 나오는데 내 현재 계정으로 하고 기본 aws관계형 키로 사용하시면 됩니다.

그 다음 데이터 형식은 text로 해주시고 값은 json형식으로 사용하면 됩니다.

// 값 예시
{
    "APP_ENV": "local",
    "APP_SERVICE_PORT": 8081,
    "APP_API_HOST": "http://localhost:8080"
}

 

아래는 파라미터 생성 직전에 모든 값을 입력해 놓은 화면이고, 보안 문자열로 선택했기 때문에 화면에서 마스킹처리가 되어 나오는걸 보실 수 있습니다.

파라미터 스토어 설정 화면

다음에는 이렇게 설정한 환경변수를 코드단에서 어떻게 가져와서 사용하는지 알아보겠습니다.

728x90

1. nest project생성

# nest.js cli 설치
npm i -g @nestjs/cli

#프로젝트 생성
# 패키지 매니저 설정: npm 선택
nest new [프로젝트 폴더명]

 

2. 도커이미지 생성프로젝트 루트경로에 Dockerfile, .dickerignore 생성

a. 프로젝트 루트경로에 Dockerfile, .dickerignore 생성

# Dockerfile
FROM node:lts-alpine
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
# .dockerignore
node_modules
dist
.git
Dockerfile

 

b. 빌드 & 실행

# 프로젝트 루트경로에서
# 도커 이미지 생성
# dockerhub에 올릴꺼면 docker hub repo명과 도커이미지명이 같아야함
docker build -t [도커이미지 명] .

# 이미지 확인
docker images

# 로컬에서 이미지 실행
docker run -it -p [접속port]:[도커port] [도커이미지 명]

 

c. docker hub push

docker login --username=[dockerhub Id]
docker push [도커이미지 명]:[image version]

 

3. minikube + kubectl로 service띄우기

a. minikube 설치

# macOS
brew install minikube

# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64

# Usages
minikube start

 

b. kubectl설치

  - mac : https://kubernetes.io/docs/tasks/tools/install-kubectl-macos/

  - window : https://kubernetes.io/docs/tasks/tools/install-kubectl-windows/

  - linux : https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/ 

c. deployment.yaml파일 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nest
  labels:
    app: nest
spec: # specification
  replicas: 2
  selector: 
    matchLabels:
      app: nest
  template:
    metadata:
      labels: 
        app: nest
    spec:
      containers:
      - name: nest
        image: [docker hub image명] # either from docker registries or other
        ports:
        - containerPort: 3000

 

 

b. service.yaml파일 생성

# depolyment.yaml파일 하나로 관리할거기 때문에 맨아래 --- 입력후 하단에 접속정보 추가
~~~
depolyment.yaml내용
~~~
---
apiVersion: v1
kind: Service
metadata:
  name: nest-service
spec:
  selector:
    app: nest
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000
      nodePort: 30000 # 30000~32000 포트범위 정해져 있음

 

e. eployment & service등록

# deplyment.yaml하나에 service 내용까지 작성했기 때문에 아래 명령어만 실행하면 service까지 등록됨
kubectl apply -f deployment.yaml

# deplyments 확인
kubectl get deplyments

# service 확인
minikube service list

# service 실행
minikube service [service명]

# minikube 대쉬보드 접속
minikube dashboard
728x90

DB replication이란?

DB replication 데이터베이스 시스템에서 사용되는 기술로, 마스터 데이터베이스(DB) 변경 내용을 하나 이상의 슬레이브(DB) 복제하는 과정을 말합니다.

이를 통해 데이터의 안정성, 가용성, 성능을 향상시킬 있습니다.

 

Master DB vs SlaveDB

1. Master DB

      • 마스터 디비는 데이터베이스 시스템에서 기본 데이터 저장소 역할을 합니다.
      • 읽기와 쓰기 작업에 대한 모든 데이터 변경 작업(INSERT, UPDATE, DELETE) 처리합니다.
      • 마스터 디비에 수행된 변경 작업은 슬레이브 디비에 자동으로 복제됩니다.
      • 데이터의 일관성과 무결성을 유지하는 중요한 역할을 수행합니다.

2. Slave DB

        • 슬레이브 디비는 마스터 디비의 복제본으로 작동합니다.
        • 주로 읽기 작업을 처리하는데 사용됩니다.
        • 마스터 디비에서 변경된 데이터를 주기적으로 가져와 슬레이브 디비를 업데이트합니다.
        • 슬레이브 디비는 읽기 작업을 처리하는 서버로 사용되어 응답 시간을 최적화하고 부하를 분산시킵니다.
        • 슬레이브 디비는 마스터 디비의 장애 발생 시에도 작동하여 데이터 손실을 최소화합니다.

mysql 설정

1. 마스터 디비 설정

# my.cnf 또는 my.ini 파일을 열어서 [mysqld] 섹션 아래 추가
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=database_name

여기서 database_name 복제할 데이터베이스의 이름입니다.

설정 후 mysql 재시작

2. 슬래이브 디비 설정

# my.cnf 또는 my.ini 파일을 열어서 [mysqld] 섹션 아래 추가
[mysqld]
server-id=2

3. 계정 생성 및 권한 부여

CREATE USER 'replication_user'@'slave_ip' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'slave_ip';
FLUSH PRIVILEGES;

마스터 디비에 접속하고, 아래 쿼리를 실행하여 복제에 사용할 계정을 생성합니다:

4. 슬레이브 디비에서 복제 설정

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='replication_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=XXX;
START SLAVE;

슬레이브 디비에 접속하고, 아래 쿼리를 실행하여 복제를 설정합니다

mysql-bin.XXXXXX XXX 마스터 디비의 SHOW MASTER STATUS; 결과에서 확인할 있는 파일 이름과 위치입니다.

5. 복제상태 확인

슬레이브 디비에서 SHOW SLAVE STATUS; 쿼리를 실행하여 복제 상태를 확인할 있습니다.

Slave_IO_Running Slave_SQL_Running Yes 표시되어야 합니다.

 

다음 글에서는 설정한 replication을 spring boot에 적용 해보는 방법에 대해서 작성하겠습니다.

+ Recent posts