hara

Spring Boot 2.0 - 8장: 자바 엔터프라이즈 서비스 본문

공부/스프링 부트 2 레시피

Spring Boot 2.0 - 8장: 자바 엔터프라이즈 서비스

하랄라 2020. 9. 16. 19:20

#스프링 비동기 처리

- 비동기 처리의 장점

요청에 따른 결과가 반환되는 시간 동안 다른 작업을 수행할 수 있다.(데이터 처리 효율적)

 

- Spring Boot에서 지원하는 비동기 처리 기능   

   - @Async: 비동기 메소드 실행 기능 제공

@EnableAsync
@SpringBootApplication
public class Application {
    ...
}

   - @EnableAsync: 스프링 부터가 비동기 실행 메소드를 자동으로 판단 할 수 있게 지원

public class testService {

    @Async
    public void test(String message) throws Exception {
        // do something
    }

}

 

 

- TaskExecutor

   - @EnableAsync 추가 시 스프링에서 자동으로 TaskExecutor 인스턴스를 발견해 비동기 메소드 실행에 사용

옵션 항목 설명
core-size 코어 스레드 개수, 기본 8개
max-size 스레드 최대 개수, 기본값 Integer.MAX_VALUE
queue-capacity 큐 용량, 기본값 제한없음. max-size설명 무시
keep-alive 스레드 사라지기 전까지 대기할 시간 설정
thread-name-prefix 새롭게 만들어지는 스레드 이름의 접두어 설정
allow-core-thread-timeout 스레드 타임아웃 여부 설정, 기본값 true

   - properties 설정

spring.task.execution.pool.core-size=4
spring.task.execution.pool.max-size=16
...

    - Bean 설정

       - properties 설정 대신 java파일 내에서 옵션 설정 가능

@Configuration
@EnableAsync
public class SpringAsyncConfig {

    @Bean(name = "threadPoolTaskExecutor")
    public Executor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(3);
        taskExecutor.setMaxPoolSize(30);
        taskExecutor.setQueueCapacity(10);
        taskExecutor.setThreadNamePrefix("Executor-");
        taskExecutor.initialize();
        return taskExecutor;
    }

}

 

 

#스프링 작업 스케줄링

- 주기적인 작업이 필요할 때 설정하면 유용한 기능

 

- Spring Boot에서 지원하는 스케줄링 기능   

   - @Scheduled: 주기적으로 수행 되어야할 메소드 실행 기능

@Scheduled(fixedRateString = "5", initialDelay = 3000) 
private void scheduleTest() { 
	logger.error("hello jeong-pro"); 
}

   - @EnableScheduling: 스프링 부터가 스케줄링 실행 메소드를 자동으로 판단 할 수 있게 지원

@EnableScheduling 
@SpringBootApplication 
public class SchedulerApplication { 
	public static void main(String[] args) { 
		SpringApplication.run(SchedulerApplication.class, args);
	} 
}

   - @Scheduled > CRON식 표현

@Scheduled(cron="0 30 0 1 * *")


 초    |   분   |   시   |   일   |   월   |  요일  |   연도
0~59   | 0~59   | 0~23   | 1~31   | 1~12   |   0~6  | 생략가능


요일 : 0 (일요일) ~ 6( 토요일)
? : 설정 값 없을 때 - 일과 요일 에서만 사용가능
* : 모든조건
시작시간/단위 : 시작시간부터 해당 단위 때
시작범위-끝범위 : 시작범위 부터 끝범위까지
L : 마지막 - 일, 요일 에서만 사용가능
W : 가장 가까운 평일 찾는다 - 일 에서만 사용가능
	ex) 10W
		- 10일이 평일 일 때 : 10일에 실행
		- 10일이 토요일 일 때 : 가장 가까운 평일인 금요일(9일)에 참
		- 10일이 일요일 일 때 : 가장 가까운 평일인 월요일(11일)에 참
# : 몇주 째인지 찾는다 - 요일 에서만 사용가능
	ex) 3#2 : 수요일#2째주 에 참

예제
1) 매월 10일 오전 11시
0  1  1  10  *  *

2) 매일 오후 2시 5분 0초
0  5  14  *  *  *

3) 10분마다 도는 스케줄러 : 10분 0초, 20분 0초...
0  0/10  *  *  *

4) 조건에서만 실행되는 스케줄러 : 10분 0초, 11분 0초 ~ 15분 0초까지 실행
0  10-15  *  *  *

 

 

#이메일 전송

- 좀 더 쉬운 방법으로 메일을 보내는 방법을 스프링 부트에서 지원

- javax.mail, thymeleaf 에서 지원하는 각각의 방법으로 개발 가능

- 프로젝트 생성부터 기능 설정까지 참고 url: rooted.tistory.com/2

 

 

#JMX MBean 등록

- JMX 란?

   - Java Management Extensions, 프로그래머들에게 자바 어플리케이션의 모니터링과 관리 기능을 제공

   -

배치 작업의 실행 결과나 메소드 실행, 설정 메타데이터 변경 시 사용 가능

 

- JConsole

   - 애플리케이션의 상태를 모니터링 할 수 있는 프로그램   - 실행과정 참고 url: java.ihoney.pe.kr/412

 

 

- Spring Boot에서 지원하는 JMX 기능

   - @ManagedResource: 스프링 부터가 JMX사용 가능하게 지원

   - @ManagedOperation: JMX 세부 실행 메소드

@Component
@ManagedResource(objectName = MyMBean.MBEAN_NAME)
public class HelloWorld {
    private static final Logger log = LoggerFactory.getLogger(CheckinController.class);

    @ManagedOperation
    public void printMessage() {
    	log.info("Hello World");
    }
}

 

 

#참고

- 책: Spring Boot2 Recipes 8장

- 동기, 비동기 장단점: juyeop.tistory.com/22

- @Async, @EnableAsync 설명: dveamer.github.io/java/SpringAsync.html

- @Scheduled, @EnableScheduling설명: dveamer.github.io/java/SpringAsync.htmljeong-pro.tistory.com/186

- CRON표현식 설명: sun-p.tistory.com/115

- JMX 설명: leeyongjin.tistory.com/entry/JMX-%EA%B8%B0%EC%88%A0%EC%9D%B4%ED%95%B4

Comments