728x90
반응형
Log 수집기능 개발하기
- 로그 수집을 위한 기능을 구현할 것이다.
- 굳이 글로 적는 이유는 AOP 방식이 아닌 EventHandler 로 구현을 할 예정이기 때문이다.
Log 수집기능 개발 구조
- App 에서 카프카로 데이터를 보내주면
- 카프카에서 필요한 데이터 들을 다른 곳에서 sub 할수 있게 구현을 할것이다.
Log 수집기능 고려사항
- 기존 서비스 응답시간에 영향을 미치면 안된다.
- 기존 코드 수정을 최소화 한다.
- 다양한 로그 형태를 수집 할 수 있어야 한다.
- 서비스 마다 retun 값이 다르다.
- 트랜잭션이 있는경우 트랜잭션을 유지 해야 한다.
Log 수집기능 구현방식 선택
- AOP, EventListener 둘중 하나를 고민했다.
- 메소드마다 트랜잭션, 리턴값이 다르다는것, 메소드 마다 파라미터 값이 다르다는것을
고려 했을때 EventLisetner 로 구현 하는것을 선택했다.
EventListener
- 이벤트를 통해 다른 서비스와 연동
- 서비스간 결합을 줄일 수 있다.
- PUB, SUB 개념으로 이해하면 쉬울것 같다.
@Async + @TransactionalEventListener 선택
- 트랜잭션을 고려 하여 TransactionEventListener 를 선택했다.
- 기존 응답시간에 영향을 미치지 않기 위해 @Asnyc 를 사용한다.
TransactionalEventListener 동작 값
- AFTER_COMMIT (기본값) - 트랜잭션이 성공적으로 마무리(commit)된 경우 이벤트 실행
- 중간에 롤백이나 익셉션이 발생하면 이벤트 수행 안함.
- AFTER_ROLLBACK – 트랜잭션이 rollback 됬을 때 이벤트 실행
- AFTER_COMPLETION – 트랜잭션이 마무리 됐을때(commit or rollback 관련없이) 이벤트 실행
- 무조건 수행
- BEFORE_COMMIT - 트랜잭션의 커밋 전에 이벤트 실행
아래코드는 회사에서 사용자 행동 패턴 분석 하기위한 내가 만든 코드이다.
@Component
@sl4j
@RequiredArgsConstruct
public class UserLogEventHandler {
private final UserActionLogCollectService service;
@Async
@TranSactionEventListener
public void processTransactionEvent(UserLogTransactionEvent event) {
try {
UserLogRequestDTO userLogRequestDto = service.createUserActionLog(event.getCreator());
service.sendUserActionLogToKafka(userLogRequestDto);
} catch(ApiException) {
log.error("Fail to collecting log: {}", e.getMessage());
}
}
@Async
public void processEvent(UserLogEvent event) {
try {
UserLogRequestDTO userLogRequestDto = service.createUserActionLog(event.getCreator());
service.sendUserActionLogToKafka(userLogRequestDto);
} catch(ApiException) {
log.error("Fail to collecting log: {}, e.getMessage());
}
}
}
Log Creator class
- 다양한 로그를 쌓기 위해 아래처럼 클래스 를 설계를 했다.
- 공통 값들은 BaseLog에 넣고
- 각각 다양한 로그를 하나로 묶어 다형성을 가지게 하기 위함이다.
- 그렇게 하면 위에 이벤트를 처리 할때 BaseLog 로 선언해 주고
로그 DTO 를 생성하는 코드는 자식 클래스에서 담당하게 한다.
결론
이번 내용은 불친절하다고 생각한다 그이유는 일일이 코드를 올리는것이 불필요하다 생각이 들었다.
자세한 코드는 깃허브에 구현을 해둘 예정이다.
728x90
반응형
'개발관련지식 > 스터디한내용' 카테고리의 다른 글
[개발지식] SPF, DKIM (0) | 2022.01.15 |
---|
댓글