본문 바로가기

Slack 채널 정리

InfluxDB 에 POJO 이용해서 insert 하는 코드 예(Mapstruct 사용)

bean mapping 위해 Spring 의 BeanUtils.copyProperties 를 썼다가 예전에 모님이 리플렉션 사용하기 때문에 성능이 많이 떨어진다며 Mapstruct 란 매핑 프레임워크를 추천한 것이 기억나서 적용해보기로 함. 적용 후 실행해보니

1. 롬복 사용한 곳에서 symbol 못 찾는다는 에러 발생.

Mapstruct 는 매핑될 구조를 interface 로 선언해주면 setter 포함된 POJO 를 컴파일 시점에 자동 생성해주는데 이 부분 때문에 롬복이 제대로 동작하지 않는 듯. 구글링해보니 역시나 동일한 문제 올라와 있다. 

https://stackoverflow.com/questions/47676369/mapstruct-and-lombok-not-working-together 

요는 annotationProcessorPaths 에 롬복 프로세서를 추가해주면 된다는건데 이렇게 하고 제대로 소스 제너레이트 되는지 확인해보기 위해 maven 에서 clean 하고 다시 컴파일해보니

2. 이번에는 QueryDsl 사용한 곳에서 동일한 에러 발생.
롬복 해결한 방법으로 시도했는데 해결 안되어 다시 구글링. 

https://stackoverflow.com/questions/29447728/spring-data-jpa-query-dsl-q-entityclasses-not-generating 

QueryDsl 소스 제너레이트 정의한 곳에 MappingProcessor 를 추가해주고 다시 컴파일.

이제 정상적으로 잘 작동하네요. 정리하면 Mapstruct 처럼 소스 제너레이트 해주어야하는 녀석을 쓰는 경우 이 동작 담당하는 프로세스의 충돌로 문제 발생할 수 있으니 주의해야 함(Thrift 나 gRPC 경우도 IDL 기준으로 소스 제너레이트 해주는데 이건 제대로 될지 걱정되네)

이어서 ...

kafka 에서 json 형태로 가져온 메시지를 mariaDB 용 entity로 매핑해줬던 것을 넘겨 받아  Mapstruct 를 이용하여 influxDB 용 POJO 로 매핑한 후 measurementByPOJO 로 point 에 값 set 해줘서 influxDB 에 insert. 어제인가 적었었는데 measurementByPOJO 사용 시 @TimeColumn  애노테이션 구현체가 influxDB java client 현 배포본에는 빠져 있어서 LocalDateTime 타입인 evntDt 를  timestamp 형식으로 변환해주는 로직을 꽁수로 집어 넣어 일단 처리해놨습니다. 원래는 저장해야할 속성 중에 datetime 타입의 속성들이 몇 개 더 있기 때문에 이 코드만으로는 완전 처리는 어렵고 그냥 참고만 하시라고 ...

@Autowired
private InfluxDBTemplate<Point> influxDBTemplate;

public void saveEvtAlrt(EvtAlrt evtAlrt) {
//        EvtAlrtIx evtAlrtIx = new EvtAlrtIx();
//        BeanUtils.copyProperties(evtAlrt, evtAlrtIx, Util.getNullPropertyNames(evtAlrt));

    EvtAlrtIx evtAlrtIx = EvtAlrtMapper.INSTANCE.evtAlrtToIx(evtAlrt);

    long timeStamp = evtAlrt.getEvntDt().toInstant(ZoneOffset.UTC).toEpochMilli();
    writeDb(evtAlrtIx, timeStamp);
}

private void writeDb(Object dto, long timeStamp) {
    Point point = Point.measurementByPOJO(dto.getClass())
            .addFieldsFromPOJO(dto)
            .time(timeStamp, TimeUnit.MILLISECONDS)
            .build();
    influxDBTemplate.write(point);
}