์๋ก
์๋น์ค๋ฅผ ๋ง๋ค๋ค ๋ณด๋ฉด ๋ค์ํ ์ธ๋ถ ๋ชจ๋์ด๋ ์์คํ ์ ์ฐ๋ํด์ผ ํ๋ ์ํฉ์ด ์๊ธฐ๊ฒ ๋ฉ๋๋ค. ๋ํ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๋ค ์ ์์ต๋๋ค.
์ฝ๋๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class UserService {
private final MessageService messageService;
private final UserRepository userRepository;
@Transactional
public void signUp(String email) {
// ์ ์ ์ ์ฅ
userRepository.save(new User(email));
// ๋ฉ์ธ์ง ๋ฐ์ก(์๋ฆผ, ๋ฉ์ธ์ง ๋ฑ ์ธ๋ถ API ์ํ)
messageService.send(email);
}
}
@Service
@RequiredArgsConstructor
public class MessageService {
/**
* ๋ฉ์ผ ์ ์ก ๋ก์ง
* (์ค์ ๋ก๋ ์ธ๋ถ ๋ชจ๋์ด ๋ค์ด๊ฐ)
*/
@Async
public void send(String email) {
System.out.println(email + "์๊ฒ ์ ์ก ์๋ฃ");
}
}
์ ์ ๋ฅผ ์ ์ฅํ๊ณ , ํด๋น ์ ์ ์ ์ด๋ฉ์ผ๋ก ๊ฐ์ ์ถํ ๋ฉ์ผ์ ๋ณด๋ด๋ ์ฝ๋์ ๋๋ค.
๋ฌธ์
๋จผ์ ํ๋ฆ์ ๋ณด๋ฉด "ํ์๊ฐ์ ์์ฒญ -> ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ ์ ์ฅ -> ๊ฐ์ ์ถํ ๋ฉ์ผ ๋ฐ์ก"์ ๋๋ค. ํฌ๊ฒ ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ด์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง์ ๋ฌธ์ ์ ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ์ํํ๋ ๋ก์ง๊น์ง ํธ๋์ญ์ ์ ๋ฌถ์ธ๋ค.
- ๋ฌธ์ ๋ก ์ธํด ํธ๋์ญ์ ๋กค๋ฐฑ์ด ์ผ์ด๋ฌ์ ๋, ์ ์ ๋ ์ ์ฅ๋์ง ์์ง๋ง ๋ฉ์ผ์ ์ ์ก๋๋ค.
๋ฌธ์ ๋ฅผ ํ๋์ฉ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ๋ถํ์ํ ๋ก์ง๊น์ง ํธ๋์ญ์ ์ ๋ฌถ์ธ๋ค.
๋จผ์ ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ๊ธฐ ์ํ ์ปค๋ฅ์ ์ด ํ์ํฉ๋๋ค. ํ์ง๋ง ์ปค๋ฅ์ ์์ฑ์ ์ํด์๋ ๊ฝค ๋ง์ ๋น์ฉ์ด ์๋ชจ๋๋๋ฐ, ์ด๋ฌํ ๋น์ฉ์ ์ ์ฝํ๊ธฐ ์ํด WAS๊ฐ ์คํ๋ ๋ DB ์ฐ๊ฒฐ์ ์ํด ๋ฏธ๋ฆฌ ์ผ์ ์์ ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ํ์ ๋ด์๋๋ค๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ฐ์ํ๋ฉด ํ์์ ์์ฑ๋์ด ์๋ ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ด์ฉํฉ๋๋ค(์ปค๋ฅ์ ํ์ ๋ํ ๋ ์์ธํ ๋ด์ฉ์ ์ด์ ๊ธ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค).
์ปค๋ฅ์ ํ์ ๊ฐ์๋ ์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์, ๋์์ ์๋ง์ ์์ฒญ๋ค์ด ์ปค๋ฅ์ ํ์ ๊ฐ์ ์ด์์ผ๋ก ์ค๊ฒ ๋๋ค๋ฉด, ์ปค๋ฅ์ ์ ํ๋ํ์ง ๋ชปํ ์์ฒญ๋ค์ ๋ค๋ฅธ ์์ฒญ์ด ๋๋ ์ปค๋ฅ์ ์ด ๋ฐ๋ฉ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๊ณ , ์ด๋ก ์ธํด ๋ณ๋ชฉํ์ ์ฆ ์ง์ฐ์ด ์ผ์ด๋๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ ์ด์ ์ฝ๋์์ ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ์ ์ ์ ์์ต๋๋ค.
์ค์ง์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ์ด ํ์ํ ๊ฑด ๊ฒ์ ํ์ดํ์ด์ง๋ง, ์ธ๋ถ API์ธ ํ๋ ํ์ดํ๊น์ง ํธ๋์ญ์ ์ ๋ฌถ์ฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์ฌ์ฉํ์ง ์๋ ์๊ฐ๊น์ง ๋ถํ์ํ๊ฒ ๋ญ๋น๋๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ธ๋ถ ์๋น์ค์ ํธ์ถ์ด ์คํจํ๊ฑฐ๋ ์ง์ฐ๋ ๊ฒฝ์ฐ ํธ๋์ญ์ ์์ฒด๊ฐ ์คํจํ๊ฑฐ๋ ์ง์ฐ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
2. ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
๊ธฐ์กด์ ์์ ์ฝ๋์ ๋ก์ง์ด ์ถ๊ฐ๋๋ค๊ณ ์๊ฐํด ๋ด ์๋ค.
@Transactional
public void signUp(String email) {
// ์ ์ ์ ์ฅ
userRepository.save(new User(email));
// ๋ฉ์ธ์ง ๋ฐ์ก(์๋ฆผ, ๋ฉ์ธ์ง ๋ฑ ์ธ๋ถ API ์ํ)
messageService.send(email);
// ๋ ๋ค๋ฅธ ์ด๋ค ์๋น์ค ๋ก์ง์ ์ํ
xxxService.execute();
}
์ ์ฝ๋์์ ๋ ๋ค๋ฅธ ์ด๋ค ์๋น์ค ๋ก์ง์ ์ํํ๋ค๊ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด ํธ๋์ญ์ ๋กค๋ฐฑ์ด ์ผ์ด๋๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง ๋ฉ์์ง ๋ฐ์ก ๊ฐ์ ๊ฒฝ์ฐ๋ ์ธ๋ถ ๋ชจ๋์ด๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ๋กค๋ฐฑ๊ณผ๋ ๋ฌด๊ดํ๊ฒ ์ด๋ฉ์ผ์ ์ ์กํ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ฒฐ๊ณผ์ ์ผ๋ก ํ์๊ฐ์ ์ด ์คํจํ์ง๋ง ๊ฐ์ ์ถํ ์ด๋ฉ์ผ์ด ์ ์ก๋๊ฒ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํด๊ฒฐ
ํด๋น ๋ฌธ์ ๋ค์ ์คํ๋ง์์ ์ง์ํ๋ ApplicationEventPublisher๋ฅผ ์ฌ์ฉํด์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
ApplicationEventPublisher๋ Spring Framework์์ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค๋ก ๋์์ธ ํจํด ์ค ํ๋์ธ ์ต์ ๋ฒ ํจํด์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋์ด ์์ต๋๋ค. ApplicationEventPublisher๋ ์ด๋ฒคํธ ๋ฐํ์ ์ญํ ์ ํ๋๋ฐ, ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ฉด ์ด๋ฒคํธ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ ๋ชจ๋ ๋ฆฌ์ค๋์๊ฒ ํด๋น ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋๊ณ , ์ด๋ฒคํธ์ ๋ฐ๋ฅธ ์ ์ ํ ๋์์ ์คํํฉ๋๋ค.
ํ๋ฆ์ ์ดํด๋ณด๋ฉด "ํ์ ๊ฐ์ -> ํ์ ๊ฐ์ ์๋ฃ ์ด๋ฒคํธ ๋ฐํ -> ํ์ ๊ฐ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋์ -> ๋ฉ์ผ ์๋น์ค ์ํ"์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
์ฝ๋๋ฅผ ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
UserService
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class UserService {
private final ApplicationEventPublisher applicationEventPublisher;
private final UserRepository userRepository;
@Transactional
public void signUp(String email) {
userRepository.save(new User(email));
applicationEventPublisher.publishEvent(new MessageEvent(email));
}
}
๊ธฐ์กด์ UserService์์ MessageService๋ฅผ ์์กดํ๊ณ ์์๋ ์ฝ๋๋ฅผ ApplicationEventPublisher๋ฅผ ์ฃผ์ ๋ฐ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
ApplicationEventPublisher์ ๊ตฌํ์ฒด๋ ์คํ๋ง์ด ํด์ฃผ๋ฉฐ, ์ด๋ฒคํธ ๋ฐํ์๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๋ฆฌ์ค๋๊ฐ ๋๊ตฌ์ธ์ง, ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ์ ํ์๊ฐ ์์ต๋๋ค. ๋จ์ง ์ง๊ธ์ฒ๋ผ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๊ธฐ๋ง ํ๋ฉด ๋๋ฉฐ, ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ฆฌ์ค๋์ ์ฑ ์์ ๋๋ค.
MessageEvent
public class MessageEvent {
private String email;
public MessageEvent(String email) {
this.email = email;
}
}
Spring์์๋ ํน์ ํ์ ์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ฉด, ๊ทธ ํ์ ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ฉ์๋๊ฐ ์๋์ผ๋ก ํธ์ถ๋ฉ๋๋ค. ์ฆ, ์ด๋ฒคํธ์ ํ์ ์ด ๋ฆฌ์ค๋ ๋ฉ์๋๋ฅผ ๊ฒฐ์ ํ๋ ์ญํ ์ ํฉ๋๋ค. ๋ฐ๋ผ์ ํน์ ํ์ ์ ์ด๋ฒคํธ ํด๋์ค๋ฅผ ์ ์ํ๊ณ , ๊ทธ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ด๋ฒคํธ๋ก ์ ๋ฌํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ MessageEvent๊ฐ ํน์ ํ์ ์ ์ด๋ฒคํธ๊ฐ ๋ ๊ฒ์ ๋๋ค.
EventListener
@Component
@RequiredArgsConstructor
public class EventListener {
private final MessageService messageService;
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, fallbackExecution = true)
public void handleAfterCommitEmailSending(MessageEvent messageEvent) {
messageService.send(messageEvent.getEmail());
}
}
์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๋ฆฌ์ค๋์ ์ฝ๋์ ๋๋ค. ๋ฐํ๋ ์ด๋ฒคํธ๋ ApplicationContext์์ @EventListener ์ด๋ ธํ ์ด์ ์ด ๋ถ์ Listener handler๋ฅผ ์ฐพ์์ ์ธ์๋ก ๋ฐ์๋ค์ฌ์ง๊ณ ํน์ ๋ก์ง์ด ์ํ๋๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ @TransactionalEventListener๋ Spring Framework์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก, ํธ๋์ญ์ ๊ฒฝ๊ณ์์ ํน์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ ๋ฉ์๋์ ์ฌ์ฉ๋ฉ๋๋ค. ์ฆ, ์ด ์ด๋ ธํ ์ด์ ์ ํธ๋์ญ์ ์ ์๋ช ์ฃผ๊ธฐ(ex: ํธ๋์ญ์ ์ด ์ปค๋ฐ ๋๋ ๋กค๋ฐฑ๋ ํ)์ ๋ฐ๋ผ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
@TransactionalEventListener์ ๋ํ์ ์ธ ์์ฑ์๋ ๋ค์์ ๋ค๊ฐ์ง๊ฐ ์์ต๋๋ค.
- phase
- classes
- fallbackExecution
- condition
phase๋ ํธ๋์ญ์ ์ ์ด๋ ์์ ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋์ด์ผ ํ๋์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. TransactionPhase ์ด๊ฑฐํ ํ์ ์ ๊ฐ์ผ๋ก ์ค์ ๋๋ฉฐ, ๋ค์ ๊ฐ๋ค์ ๊ฐ์ง ์ ์์ต๋๋ค.
- AFTER_COMMIT : default ๊ฐ์ผ๋ก์จ, ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์ปค๋ฐ๋ ํ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์คํํฉ๋๋ค.
- AFTER_ROLLBACK: ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋ ํ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์คํํฉ๋๋ค.
- AFTER_COMPLETION: ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๊ฑฐ๋ ๋กค๋ฐฑ๋ ํ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์คํํฉ๋๋ค.
- BEFORE_COMMIT: ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๊ธฐ ์ ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์คํํฉ๋๋ค.
fallbackExecution๋ ํธ๋์ญ์ ์ปจํ ์คํธ๊ฐ ์์ ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์คํํ ์ง ๋ง์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. default๋ false๋ก ํธ๋์ญ์ ์ด ์กด์ฌํ์ง ์๋ ๊ณณ์์ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ์ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋์ง๊ฒ ๋ฉ๋๋ค. true๋ก ์ค์ ํ๋ฉด ํธ๋์ญ์ ์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ์๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์คํ๋๋๋ก ํ ์ ์์ง๋ง, ํธ๋์ญ์ ์ด ์์ ๊ฒฝ์ฐ์๋ phase์์ฑ์ด ๋ฌด์๋ฉ๋๋ค.
classes๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ฒ๋ฆฌํ ์ด๋ฒคํธ์ ํ์ ๋ค์ ์ง์ ํฉ๋๋ค. ์ด ์์ฑ์ ๋ช ์์ ์ผ๋ก ์ค์ ํ์ง ์์ผ๋ฉด, ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฉ์๋์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ํ์ ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
condition์ SpEL(Spring Expression Language) ํํ์์ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ํ ์กฐ๊ฑด์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด ์์ฑ์ ์ด์ฉํ๋ฉด ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ด๋ฒคํธ๋ง์ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ต๋๋ค.
@TransactionalEventListener ์ฌ์ฉ ์ ์ฃผ์์ ์ด ํฌ์คํ ๋ ๋์์ด ๋๋ ํ๋ฒ ์ฝ์ด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฒฐ๋ก
์ด๋ฒคํธ ํ๋ก๊ทธ๋๋ฐ์ ์ฃผ๋ ์ฅ์ ์ ๋ค์ํ ๋๋ฉ์ธ ๊ฐ ์์กด์ฑ์ ๋ถ๋ฆฌํ๊ณ , ๋์จํ ๊ฒฐํฉ์ ํตํด ๋ชจ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ์ฅ์ฑ์ ํฅ์์ํฌ ์ ์๋ค๋ ์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด A ์๋น์ค๋ B์๋น์ค์ ๋ํด ์ ํ ์์ง ๋ชปํด๋ B์๋น์ค์ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๊ฑฐ๋ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ์๋น์ค๋ ๋ ๋ฆฝ์ ์ผ๋ก ์ด์๋๊ณ ์์ ๋ ์ ์์ผ๋ฏ๋ก ์๋น์ค ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋๋ค.
์ด๋ฒคํธ ํ๋ก๊ทธ๋๋ฐ์ ๋จ์ ์ ์ด๋ฒคํธ๋ฅผ ์ ์ํ๊ณ , ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์์ฑํ๊ณ , ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ ๋ฑ์ ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํ๋ค๋ ์ ์ ๋๋ค. ๋ํ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์์คํ ์ ์ ๋ฐ์ ์ธ ํ๋ฆ์ ํ์ ํ๊ธฐ ์ด๋ ต๊ฒ ๋์ด ๋๋ฒ๊น ๊ณผ ํ ์คํธ๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์คํ ์์๋ ๋ณด์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์, ์ด๋ฒคํธ ์์์ ์์กดํ๋ ๋ก์ง์ ๊ตฌํํ๋ ๊ฒ์ ๋ณต์กํ๊ณ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด๋ฒคํธ ํ๋ก๊ทธ๋๋ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ์๋ก ํ๋ ์ํฉ์์ ์ ์ฉํฉ๋๋ค.(ex. ์๋ฆผ๋ ๋ฐ์กํ๊ณ ๋ฉ์ผ๋ ๋ฐ์กํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ ๊ฒฝ์ฐ) ๋ํ ์ฌ๋ฌ ์๋น์ค๊ฐ ๋์ผํ ์ด๋ฒคํธ์ ๋ํด ๋ค๋ฅด๊ฒ ๋ฐ์ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์ด๋ฒคํธ ํ๋ก๊ทธ๋๋ฐ์ด ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฃผ๋ฌธ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๊ฒฐ์ ์๋น์ค๋ ๊ฒฐ์ ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ฌ๊ณ ์๋น์ค๋ ์ฌ๊ณ ๋ฅผ ๊ฐ์์ํค๊ณ , ๋ฐฐ์ก ์๋น์ค๋ ๋ฐฐ์ก์ ์ค๋นํด์ผ ํ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ ๊ฐ ์๋น์ค๋ ๋์ผํ ์ด๋ฒคํธ์ ๋ํด ์์ ๋ง์ ๋ฆฌ์ค๋๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
์ฐธ๊ณ
'BackEnd๐ฑ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Batch๋? ๊ฐ๋จํ ๊ฐ๋ ๊ณผ ์ฝ๋ ์ดํด๋ณด๊ธฐ (0) | 2023.07.29 |
---|---|
์คํ๋ง์์ @Async๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์์ (4) | 2023.07.24 |
Kafka ๊ฐ๋ ๊ณผ Spring Boot + Kafka ๊ฐ๋จํ ์ฐ๋ (1) | 2023.07.19 |
SSE๋ก ์๋ฆผ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ with Spring (7) | 2023.06.18 |
Gradle๋ก ๋ฉํฐ๋ชจ๋ ํ๋ก์ ํธ ๊ตฌ์ฑํ๊ธฐ (4) | 2023.03.04 |
ํธ๋์ญ์ (Transaction)์ ์์ธ(Exception)์ ๋ฐ๋ฅธ ๋กค๋ฐฑ ์ฒ๋ฆฌ (1) | 2023.02.05 |
๋๊ธ