[Spring] 스프링부트에서 InfluxDB 사용하기

InfluxDB

NoSQL중에 오픈소스 시계열 데이터베이스로 Go언어로 개발이 됐다. 시계열 데이터의 저장 및 검색 기능에 최적화 돼있다.

스프링에서는?

InfluxDB 자체에서 따로 API를 제공하지만 일일이 다 찾아 사용하기 어려우므로 현재 제대로 제공하고 있는 오픈 라이브러리를 적용하면 사용하기 쉽다.

influxdb-java(or influxdb-client-java)

influxdb-javainfluxdb 1.x일 때 사용가능하며 influxdb-client-java2.x부터 사용가능하다.
influxdata에서 공식적으로 제공하는 라이브러리로 Connector, POJO등 다양한 기능들을 제공한다.

1
2
implementation 'org.influxdb:influxdb-java:2.17'
implementation 'org.influxdb:influxdb-client-java:1.6.0'

spring-data-influxdb

스프링에서 쉽게 사용할 수 있도록 만들어진 라이브러리. (github)
개인이 만들었으며 application.yml에 influxdb관련 설정을 할 수 있도록 도와준다.
spring-data-influxdb는 기본적으로 influxdb-java를 내포하고 있으므로 그냥 사용해도 되나 버전업이 조금 늦으므로 최신 버전을 사용하려면 따로 추가해줘야 한다.

사용법

라이브러리 추가

1
2
3
4
5
6
// application.yml
dependencies {
implementation 'com.fasterxml.jackson.core:jackson-databind:2.10.2'
implementation 'com.github.miwurster:spring-data-influxdb:1.8'
implementation 'org.influxdb:influxdb-java:2.17'
}

influxdb 설정

1
2
3
4
5
6
7
spring:
influxdb:
url: http://localhost:8086
username: user
password: ~
database: test
retention-policy: autogen

spring-data-influxdb 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Configuration
@EnableConfigurationProperties(InfluxDBProperties.class)
public class InfluxDBConfiguration {
@Bean
public InfluxDBConnectionFactory connectionFactory(@Qualifier("spring.influxdb-org.springframework.data.influxdb.InfluxDBProperties") final InfluxDBProperties properties) {
return new InfluxDBConnectionFactory(properties);
}

@Bean
public InfluxDBTemplate<Point> influxDBTemplate(final InfluxDBConnectionFactory connectionFactory) {
/*
* You can use your own 'PointCollectionConverter' implementation, e.g. in case
* you want to use your own custom measurement object.
*/
return new InfluxDBTemplate<>(connectionFactory, new PointConverter());
}

@Bean
public DefaultInfluxDBTemplate defaultTemplate(final InfluxDBConnectionFactory connectionFactory) {
/*
* If you are just dealing with Point objects from 'influxdb-java' you could
* also use an instance of class DefaultInfluxDBTemplate.
*/
return new DefaultInfluxDBTemplate(connectionFactory);
}
}

InfluxDBTemplate 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Service
public class InfluxServiceImpl implements InfluxService {
private final InfluxDBTemplate<Point> influxDBTemplate;

public InfluxServiceImpl(InfluxDBTemplate<Point> influxDBTemplate) {
this.influxDBTemplate = influxDBTemplate;
}

@PostConstruct
public void init() {
influxDBTemplate.createDatabase();
}

@Override
public void write(CPU cpu) {
influxDBTemplate.write(Point.measurementByPOJO(CPU.class).addFieldsFromPOJO(cpu).build());
}
}

influxdb-javaPOJO를 지원하므로 필요한 데이터를 클래스로 구현하여 사용하면 편리하다.

Measurement 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Data
@Measurement(name = "cpu")
public class CPU {
@TimeColumn
@Column(name = "tiem")
private Instant time;

@Column(name = "version")
private String version;

@Column(name = "use")
private String use;

@Column(name = "idle")
private String idle;
}

influxdb는 시계열 데이터베이스이므로 시간이 중요한 포인트이므로 @TimeColumn, Instant로 시간을 제공할 수 있다.

댓글

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×