π€ μ¬μ© μ΄μ
μ°λ¦¬ νμ¬ νλ‘κ·Έλ¨ λ‘μ§μ μλΉμ€κ° λμμ νκ³ νλ‘ν μ½μ 보λ΄λ μμ μ νκ² λλ€.
μ½κ² νλ‘μΈμ€μ νλ¦μ λν΄μ μ€λͺ μ νμλ©΄, μ¬μ©μκ° μμ°μ ꡬ맀λ₯Ό νκ³ λ±λ‘μ νλ€. μ΄νμ ν΄λΉ μμ°μ μ¬μ©μμκ² ν λΉ ν΄μ£Όκ³ νμλ₯Ό νλ μλΉμ€κ° μ‘΄μ¬νλ€. μ΄λ μμ°μ λν΄μ ν λΉ λ° νμλ₯Ό νκ² λλ κ²½μ° νλ‘ν μ½μ μλ²μͺ½μ 보λΈλ€.
μ¬κΈ°μ νλ‘ν μ½μ μλ²μ 보λΌλ νλ‘ν μ½μ λ΄μ©μ΄ λ³κ²½μ΄ λλ©΄μ Exception μ΄ λ°μνκ² λμκ³ , ν λΉ λ° νμλ κ°μ΄ λ‘€λ°±μ΄ λλ²λ¦¬λ μ΄μκ° λ°μνκ² λλ€. κ°μ νΈλμ μ μΌλ‘ λ¬Όλ €μκΈ° λλ¬Έμ λ°μν μ΄μλ‘ ν΄λΉ μ΄μλ₯Ό μμ νκΈ° μν΄μ Spring Event κΈ°λ₯μ μ¬μ©νκ² λμλ€.
νλ‘μΈμ€λ§λ€ λ€λ₯Όμλ μμ§λ§ λ©μΈ κΈ°λ₯μ μ±κ³΅κ³Ό μλΈ κΈ°λ₯μ μ±κ³΅μ λΆλ¦¬κ° λμ΄μΌ νλ€.
β‘ ApplicationEventPublisher μ λν΄μ μ 리
1. ApplicationContext (μ€νλ§ μ»¨ν μ΄λ)
ApplicationContext λ BeanFactory μΈν°νμ΄μ€λ₯Ό μμ λ°λλ° BeanFactoryλ Spring Containerμ μ΅μμ κ°λ μ΄λ€.
μ΄λ ApplicationContext λ BeanFactoryλ₯Ό μ§μ μμλ°λ κ²μ΄ μλλΌ, Bean Factoryλ₯Ό μμλ°μ λ€λ₯Έ μμκ°λ μ μμλ°λλ€.
1-1. ApplicationContext κΈ°λ₯
ApplicationEventPublisher μ λν΄μ μ 리λ₯Ό νκΈ° μν΄μ μ°κ³ μκΈ° λλ¬Έμ μ§§κ² λΆκ° κΈ°λ₯μ λν΄μ μ€λͺ νλλ‘ νλ€.
- EnvironmentCapable : νκ²½ μ€μ κ΄λ¦¬
- ListableBeanFactory : μ€νλ§ λΉ(Bean)μ λͺ©λ‘μ μ‘°ν
- HierarchicalBeanFactory : μ€νλ§ λΉ ν©ν 리μ κ³μΈ΅ ꡬ쑰λ₯Ό μ§μ
- MessageSource : λ€κ΅μ΄ μ§μκ³Ό λ©μμ§ μ²λ¦¬
- ApplicationEventPublisher : μ€νλ§ μ΄λ²€νΈ κΈ°λ° μν€ν
μ²λ₯Ό μ§μ
(μ΄λ²€νΈλ₯Ό λ°ννκ³ λ€λ₯Έ μ»΄ν¬λνΈμμ ν΄λΉ μ΄λ²€νΈλ₯Ό μμ ν μ μλλ‘ λμ μ€λ€. ) - ResourcePatternResolver : ν΄λμ€ν¨μ€ λ° νμΌ μμ€ν κ³Ό κ°μ 리μμ€ ν¨ν΄μ ν΄μνκ³ κ²μ
κ°λ¨νκ² μ£Όμ κΈ°λ₯μ λν΄μλ§ μ μ΄ λ¨μ§λ§, springμ ν΅μ¬ κΈ°λ₯μ΄κΈ°λλ¬Έμ λ€μ νλ² μ°Ύμμ λμ λ°©μκ³Ό 컀μ€ν ν΄μ μ¬μ©νλ λ°©λ²μ λν΄μ μΆκ°μ μΌλ‘ μ 리λ₯Ό ν΄μΌκ² λ€. :)
2. ApplicationEventPublisher
ApplicationEventPublisher μ μ¬μ©νκΈ° μ μ λ¨Όμ νλ‘μ νΈμ Spring FrameWork λ²μ μ νμΈ ν΄λ΄μΌ νλ€.
4.2 λ²μ μ κΈ°μ μΌλ‘ μ¬μ©μ νΈμμ±μ΄ λ¬λΌμ‘λ€ :)
λ΄μ©μ μ€λͺ ν λλ 4.2 λ²μ μ΄μμμ μ μ©λ λ΄μ©μ κΈ°μ€μΌλ‘ μ€λͺ νλλ‘ νκ² λ€.
π Spring Eventμ λμ λ°©μ λ° λ΄μ©
μ΄λ²€νΈ ν΄λμ€ μ μ -> μ΄λ²€νΈ λ°ν -> μ΄λ²€νΈ νΈλ€λ§ -> μ΄λ²€νΈ 리μ€λ λ±λ‘ -> μ΄λ²€νΈ λ°μ
π Event Class
μ΄λ²€νΈλ₯Ό μ²λ¦¬ νλλ° νμν κ°μ²΄μ΄λ€.
public class AssetStatusEvent {
private Long assetKey;
private String targetTypeCode;
}
π Event Listener
λ°μ μν€κ³ μΆμ μ΄λ²€νΈλ₯Ό ꡬν νλ€.
@Slf4j
@Component
public class OamAssetAllocationInfoChangeEventListener {
@EventListener
// λ©μλλͺ
μ΄ afterCommitμΈ μ΄μ λ λ°μμ μ€λͺ
νλλ‘ νκ² λ€.
public void afterCommit(AssetStatusEvent assetStatusEvent) {
log.info("test");
}
}
π Event Publisher
κΈ°μ‘΄ νλ‘ν μ½μ 보λ΄λ €κ³ μ£Όμ λ°μ Service λμ μ΄λ²€νΈλ₯Ό λ°ν νκΈ° μν μ½λλ₯Ό λ£μ΄μ€λ€.
@Service
@Slf4j
@RequiredArgsConstructor
public class AssetProcessService {
private final ApplicationEventPublisher eventPublisher;
@Transactional
public boolaen allocationAsset(AssetInfo assetInfo) {
// μμ° ν λΉ μμ€
...
// νλ‘ν μ½ μ λ¬ event
eventPublisher.publishEvent(new AssetStatusEvent(assetInfo.assetKey, assetInfo.assetType));
retrun true;
}
}
try - catch λΆν° , μμΈμ²λ¦¬ λ± ν κ² λ§μ§λ§ ν΅μ¬λ§ μ€λͺ νλλ‘ νκ² λ€. :)
μλ κΈ°μ‘΄ μμ€μλ€λ©΄ eventPublisher λμ νλ‘ν μ½μ μ λ¬ νλ Serviceλ₯Ό μ£Όμ λ°μμ ꡬνλ λ΄μ©μ΄ μ‘΄μ¬ νμκ²μ΄λ€. μ΄λΆλΆμ λν΄μ μ΄λ²€νΈλ‘ λ³κ²½μ νλ€λ©΄ κΈ°μ‘΄κ³Ό λμΌνκ² λμνλμ§ μ¬λΆλ₯Ό νμΈ ν΄λ³΄λ©΄ μ’μκ±° κ°λ€.
μμ λ΄μ©μ μ μ©μ νλ€λ©΄ κ²°ν©λλ₯Ό λμ¨νκ² λ§λλκ²μ μ±κ³΅νλ€. μ΄μ νλλ‘ λμ΄μλ νΈλμμ μ λΆλ¦¬ν΄μ λ©μΈ κΈ°λ₯κ³Ό μλΈ κΈ°λ₯μ λΆλ¦¬λ₯Ό ν΄μΌνλ€.
3. @TransactionalEventListener μ¬μ© λ° μ£Όμ μ¬ν
phase μ΅μ μ ν΅ν΄ μ΄λ²€νΈμ μ²λ¦¬λ₯Ό μ§μν΄μ£Όλ κΈ°λ₯μ νλ μ΄λ Έν μ΄μ μ΄λ€.
- TransactionPhase.AFTER_COMMIT
-> Commit λμ λ μ΄λ²€νΈλ₯Ό μ€ν - TransactionPhase.AFTER_ROLLBACK
-> Rollback λμ λ μ΄λ²€νΈλ₯Ό μ€ν - TransactionPhase.AFTER_COMPLETION
-> μμ λ΄μ©μ ν©μΉ κΈ°λ₯μ΄λ€. (AFTER_COMMIT λλ AFTER_ROLLBACK λ¬μλ λ°μνλ€.) - TransactionPhase.BEFORE_COMMIT
-> Commit λκΈ°μ μ μ΄λ²€νΈλ₯Ό μ€ν
νΈλμμ μ μ²λ¦¬νλ μ¬λ¬κ°μ§ λ°©λ²μ΄ μμ§λ§, λ΄κ° μ¬μ©ν΄μΌ νλ κΈ°λ₯μ AFTER_COMMITM μ΄λ€.
κΈ°μ‘΄ Event Listenerμ ꡬν ν΄λμ λΆλΆμ νΈλμμ μ μΆκ°νκ³ ν΄λΉ κΈ°λ₯μ μΆκ°νλ€.
@Slf4j
@Component
public class OamAssetAllocationInfoChangeEventListener {
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT
public void afterCommit(AssetStatusEvent assetStatusEvent) {
log.info("test");
}
}
μμ λ΄μ©μ μΆκ° νλ€λ©΄ eventPublisher μ μΆκ°ν Serviceμλ μΆκ°ν΄μΌλλ μ΄λ Έν μ΄μ μ΄ μ‘΄μ¬νλ€.
@Transactionalμ REQUIES_NEW μ΅μ μ μΆκ° ν΄μΌνλ€.
REQUIRES_NEW : Create a new transaction, and suspend the current transaction if one exists.
@Transactional(propagation = Propagation.REQUIRES_NEW)
public boolaen allocationAsset(AssetInfo assetInfo) {
...
}
REQUIRES_NEW μ΅μ μ κ²½μ° Transactionalμ μ ν λ 벨 μ΅μ μ€ νλ μ΄λ€.
ν΄λΉ μ΄λ Έν μ΄μ μ μ¬μ© ν¨μΌλ‘μ¨ κΈ°μ‘΄μ νΈλμμ μ μ¬μ©νλκ²μ΄ μλ λ³λμ μλ‘μ΄ νΈλμμ μ μμ±ν΄μ λμ νλλ‘ ν΄μ€λ€.
μ΄ μ΅μ μ μ¬μ©ν¨μΌλ‘μ¨ μλΈ κΈ°λ₯μ΄ μ€ν¨ν΄λ λ©μΈ κΈ°λ₯μ κΉμ§ μν₯μ λ―ΈμΉμ§ μλλ‘ μμ μ΄ κ°λ₯νλ€.
π« μ£Όμ μ¬ν
λ¬Όλ‘ ν΄λΉ μ΅μ λ§ μ¬μ©νλ€κ³ ν΄μ λ©μΈ κΈ°λ₯μ μν₯μ΄ μλκ²μ΄ μλλ€.
λμΌ μ€λ λ λ΄μμ λ©μΈ νΈλμμ κ³Ό λ³λμ νΈλμμ μ΄ μμ±λμ μ€νμ΄ λκ³ μμλ, λ³λμ νΈλμμ μμ Exceptionμ΄ λ°μνμλ λ©μΈ νΈλμμ μ΄ μμ§ λμ΄λκ² μλκΈ° λλ¬Έμ λ©μΈ νΈλμμ λν λ‘€λ°±μ΄ μΌμ΄λκ² λλ€.
μ΄ λ¬Έμ λ₯Ό ν΄κ²° νκΈ° μν΄μ μμμ μΆκ°ν AFTER_COMMIT κΈ°λ₯κ³Ό ApplicationEventPublisherμ μ¬μ©ν κ²μ΄λ€.
λ©μΈ κΈ°λ₯μ Exceptionμ΄ λ°μν΄μ λ‘€λ°±μ΄ μΌμ΄λλ©΄ νΈλμμ κΈ°λ₯μΌλ‘ μΈν΄μ μλΈ κΈ°λ₯μ λν΄μ μ€νμ΄ λμ§ μκ³ , λ©μΈ κΈ°λ₯μ΄ μ±κ³΅νκ³ , μλΈ κΈ°λ₯μμ λ¬Έμ κ° λ°μνλλΌλ μ΄λ―Έ λ©μΈ κΈ°λ₯μ 컀λ°μ΄ λμκΈ° λλ¬Έμ κ°μ΄ λ‘€λ°±μ΄ λμ§ μλλ€.
β‘ μκ°
κΈμ μ°λ€λ³΄λ λ΄μ©μ μμλ₯Ό λ°κΏμ μ€λͺ νμΌλ©΄ μ΄ν΄κ° λ μ¬μ μκ±°λΌκ³ μκ°νλ€... π
λ΄λΆμ μΌλ‘ κ°μ μμ μ νλ©΄μ λ°μνλ λ΄μ©μ λν΄μ μ°Ύμλ³΄κ³ μμ°¨μ μΌλ‘ μ μ©μ νλ κ³Όμ μ λν΄μ μ€λͺ μ νλ€λ³΄λ μ΄λ κ² λμλ€.
μμ λ°©λ² λ§κ³ λ λ©μΈμ§ νλ₯Ό μ΄μ©νλ λ°©λ²λ μκ³ , λ΄λΆμ μΌλ‘ μμ€μμμ μμΈμ²λ¦¬λ₯Ό νλ λ°©λ²λ μλ€.λ§μ½ λ΄λΆμ μΌλ‘ μλΈ κΈ°λ₯μ΄ μ€ν¨ νλλΌλ μ¬μλλ₯Ό ν΄μΌ νλ€κ±°λ, μΆκ°μ μΈ μμ μ΄ νμν κ²½μ°λΌλ©΄ λ©μμ§ν λμ μ΄ λ μ’μ λ°©ν₯μ±μ΄ λ μλ μλ€. κ°κ° νλ‘μ νΈμ μν©μ λ§κ² μ₯λ¨μ μ νμ νκ³ μ μ¬μ©νλ©΄ μ’μκ±° κ°λ€.
'Spring' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[QueryDsl] new CaseBuilder() λ΄μ© μ 리 (0) | 2023.10.07 |
---|---|
[Spring] Spring boot 3.0 + JPA κ΄λ ¨ gradle μ€μ μ 리 (0) | 2023.09.25 |
[JPA] Spring Boot μμ QueryDsl μ¬μ© λ°©λ² μ 리 (0) | 2023.06.24 |
[Linux] JAVAμμ SFTP μ μ κ΄λ ¨ μ΄μ μ¬ν λ΄μ© μ 리 (0) | 2023.06.10 |
[Spring Boot] QueryDsl Qclass μ λν λ΄μ© μ 리 (0) | 2023.04.23 |