Spring Boot - Async
· 3 min read
비동기 통신: 자료를 일정한 크기로 정하여 순서대로 전송하는 자료의 전송방식(참고 : 비동기 전송방식)
언제 사용하면 좋을까?
- 요청이 긴 경우
- 로그 처리
- 푸시 처리
Dependency
Spring 3.1 이후에 사용 가능 하다. (spring-context
에 포함되어 있다.)
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
Config
@EnableAsync
만 추가하면 기본적인 설정은 끝이다.
하지만, 기본값인 SimpleAsyncTaskExecutor
클래스는 매번 Thread를 만들어내는 객체이기 때문에 Thread Pool이 아니다. Thread Pool을 설정해기 위해 AsyncConfigurerSupport
를 상속받아 재구현하자.
@Configuration
@EnableAsync
public class AsyncConfig extends AsyncConfigurerSupport {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("heowc-async-");
executor.initialize();
return executor;
}
}
Service & Controller
Service
비동기 작업을 하기 위한 메소드에 @Async
를 추가하면 된다. 만약 callback이 필요하다면, Future
클래스 등의 객체로 감싸서 반환하면 된다.
@Service
public class BasicServiceImpl implements BasicService {
private static final Logger logger = Logger.getLogger(BasicServiceImpl.class);
@Async
@Override
public void onAsync() {
try {
Thread.sleep(1000);
logger.info("onAsync");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onSync() {
try {
Thread.sleep(1000);
logger.info("onSync");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Controller
Test Case로는 비동기를 확인할 수 없기 때문에(?) HTTP 요청으로 이를 확인해보자.
@RestController
public class BasicController {
@Autowired
private final BasicService service;
private static final Logger logger = Logger.getLogger(BasicController.class);
@GetMapping("/async")
public String goAsync() {
service.onAsync();
String str = "Hello Spring Boot Async!!";
logger.info(str);
logger.info("==================================");
return str;
}
@GetMapping("/sync")
public String goSync() {
service.onSync();
String str = "Hello Spring Boot Sync!!";
logger.info(str);
logger.info("==================================");
return str;
}
}
결과
http://localhost:8080/async
~ : Hello Spring Boot Async!!
~ : ==================================
~ : onAsync
http://localhost:8080/sync
~ : onSync
~ : Hello Spring Boot Sync!!
~ : ==================================