NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    Java Java Spring boot & InfluxDB에서 데이타를 가져오는 방법.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 장비(Equipment)로부터 올라오는 센서(Sensor) 데이터가 인플럭스디비(InfluxDB)에 자동으로 적재되는 환경입니다. Backend는 스프링부트를 사용하고, Frontend는 리액트를 사용합니다. 아무튼, 백엔드와 프론트엔드의 기본적인 구조를 아래와 같이 구성했습니다.

    Cv7Sjhq.png

     

     

    모델은 아래와 같습니다. 스프링의 POJO를 이용해서 DTO를 맵핑하기 때문에 Measurment 어노테이션의 이름이 중요합니다. 이 이름은 InfluxDB 테이블 이름과 같아야 합니다. MVC 디자인 패턴을 사용하시거나 프레임워크를 사용하셨던 분들은 스캐폴딩(Scaffolding)에 대해 들어보셨을겁니다. 프레임워크마다 약간씩 다르긴하지만, 일반적으로 모델을 정의하면 자동으로 보일러플레이트(Boilerplate)가 만들어진다는건 거의 공통적으로 사용됩니다. MVC 디자인 패턴을 사용하거나 MVC를 지원하는 프레임워크에서 자주 사용되는 기술이니 알아두면 좋습니다.

    @Measurement(name = "soccer")
    public class PumpModel {
        @Column(name = "age")
    	private String age;
    	@Column(name = "city")
    	private String city;
    	@Column(name = "name")
    	private String name;
        @Column(name = "team")
    	private String team;
    	@Column(name = "time")
    	private Instant time;
    }

     

    스프링 서비스쪽 코드를 보면 인플럭스 디비에서 쿼리해온 데이타를 POJO(Plan Old Java Object)로 매핑합니다. queryResult에는 데이타가 있지만, 인플럭스 디비 매퍼의 toPOJO를 거치면 결과가 아이템 갯수가 0이 됩니다. 즉, 뭔가 내부적으로 제대로 매핑이 안되었다는 뜻입니다.

    uIiLC5A.png

     

    뭐가 문제일까~ 구글링을 해봐도 딱히 정답이 나와있지 않더라고요. 그래서, toPOJO안에서 어떤 일들을 하는지 직접 까봤습니다. measurementName은 모델에서 soccer로 설정했었습니다. 사실, 이 문제가 발생하기 전에는 pump였었습니다.

      public <T> List<T> toPOJO(final QueryResult queryResult, final Class<T> clazz,
                                final TimeUnit precision) throws InfluxDBMapperException {
        throwExceptionIfMissingAnnotation(clazz);
        String measurementName = getMeasurementName(clazz);
        return this.toPOJO(queryResult, clazz, measurementName, precision);
      }

     

    핵심코드는 아래와 같습니다. 처음에 measurementName을 pump로 설정한게 문제였습니다. 인플럭스디비의 result의 series 이름이 테이블명으로 넘어오더라고요. 그래서, 위에의 쿼리에서 테이블명이 soccer이므로, measurementName도 soccer로 변경해야 합니다. 인플럭스디비 공식 사이트의 Documentation을 천천히 다시 보면 이런 내용이 있을거 같긴한데... 저는 못찾았습니다-_-;

        queryResult.getResults().stream()
          .filter(internalResult -> Objects.nonNull(internalResult) && Objects.nonNull(internalResult.getSeries()))
          .forEach(internalResult -> {
            internalResult.getSeries().stream()
              .filter(series -> series.getName().equals(measurementName))
              .forEachOrdered(series -> {
                parseSeriesAs(series, clazz, result, precision);
              });
            });

     

    원인을 찾았기 때문에 다시 실행 해보니 정상적으로 데이타를 가져옵니다. 마지막으로 콘트롤러(Controller)에서 List를 Json으로 변환해서 Frontend로 내려줘야 합니다.

    JSONObject obj = new JSONObject(); // json object 생성
    obj.put("item", results);
    return obj.toString();

     

    프로젝트를 진행하기에 앞서 간단하게 Postgres와 InfluxDB 그리고, Oauth를 테스트 해봤습니다. 앞서 작성한 글들을 보면 대부분 쉽게 스프링 프레임워크를 이용한 서비스를 게시할 수 있을겁니다. 몇몇 사소한 문제들이 있었긴 하지만, 프로젝트를 진행하지 못할정도로 큰 이슈들은 아니었습니다. 대부분, 패키지 버전이나 디펜던시 관련된 것들이었습니다. 구글에 물어보면 대부분 답이 나옵니다. 글을 천천히 잘 읽어보면서 했으면~ 크게 시간이 걸리진 않았을거 같네요^^;

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.