클래스 레벨에 적용
: 클래스의 모든 메소드에 일괄 적용
메소드 레벨에 적용
: 각각 메소드의 어노테이션 설정 적용
❗️attribute
readOnly = true : 읽기 전용 트랜잭션
commit() 진행 시 영속성 컨텍스트에 flush()를 진행하지 않음
➡️ 스냅샷 x ➡️ 불필요한 추가 동작 x
➡️ 성능 최적화
propagation : 트랜잭션의 경계에서 진행중인 트랜잭션이 존재할 때 or 존재하지 않을 때, 어떻게 동작할 것인지 결정 ➡️ 트랜잭션 전파❗️
Propagation.REQUIRED
: 진행하고 있는 트랜잭션이 있으면 진행, 없으면 새로운 트랜잭션 생성Propagation.REQUIRED_NEW
: 진행중인 트랜잭션과 무관하게 새로운 트랜잭션 시작Propagation.MANDATORY
: 진행중인 트랜잭션이 없으면 예외 발생Propagation.*NOT_SUPPORTED*
: 트랜잭션 필요 없음, 진행하던 트랜잭션이 있으면 정지, 로직이 끝나면 트랜잭션 재시작Propagation.*NEVER*
: 트랜잭션 필요 없음, 진행 중인 트랜잭션이 있으면 예외 발생Isolation.DEFAULT
: 기본값Isolation.READ_UNCOMMITTED
: 다른 트랜잭션에서 커밋하지 않은 데이터 읽기 허용Isolation.READ_COMMITTED
: 다른 트랜잭션에서 커밋한 데이터 읽기 허용Isolation.REPEATABLE_READ
: 트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회되도록 함Isolation.SERIALIZABLE
: 동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행되지 못하게 함spring의 Bean과 Bean 사이의 데이터를 전달하는 방법 중 하나
이벤트를 ApplicationContext로 넘기고 Listener에서 받아서 처리
도메인 간 느슨한 결합을 하도록 해줌
Event extends ApplicationEvent
이벤트 모델, 이벤트의 대상
ApplicationEventPublisher bean으로 이벤트 생성
publisher() : 이벤트 생성 메소드
Publisher로부터 받아온 Event를 사용
리스너 메소드에 @EventListener 애너테이션 추가
생성 주체로부터 이벤트 발생 ➡️ 이벤트 디스패쳐에게 전달
이벤트 디스패쳐가 이벤트 핸들러 연결
이벤트 핸들러에서 이벤트 객체를 통해 원하는 기능 실행
@EnableAsync : 비동기로 처리할 수 있도록 해주는 애너테이션
Application or Config에 추가
@Async : 비동기로 처리할 메소드에 추가 (public 메소드여야 함)