Skip to content

Commit

Permalink
Feat/#58 View Server - DB Entity, Domain Entity 구현 (#59)
Browse files Browse the repository at this point in the history
* init: 의존성 추가

- Lombok 의존을 추가했습니다.
- MySQL R2DBC Driver를 추가했습니다.

* feat: Log DB Entity 구현

- Log DB Entity를 구현했습니다.
  - DB Entity는 post-fix로 Data를 붙입니다.

* feat: Log Domain Entity 구현

- Log Domain Entity를 구현했습니다.
  - DB 엔티티와 매핑으로만 생성되도록 정적 팩토리 메서드를 활용했습니다.

* feat: Log Domain Mapping Service 구현

- DB 엔티티와 도메인 엔티티를 매핑해주는 LogService를 구현했습니다.
- 이에 따른 테스트를 추가했습니다.
  • Loading branch information
tidavid1 authored Aug 15, 2024
1 parent fef2713 commit 40392bf
Show file tree
Hide file tree
Showing 7 changed files with 157 additions and 1 deletion.
13 changes: 12 additions & 1 deletion logbat_view/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,20 @@ repositories {
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'
// SpringBoot WebFlux
implementation 'org.springframework.boot:spring-boot-starter-webflux'
// SpringBoot R2DBC
implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'
// Lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// MySQL
runtimeOnly 'io.asyncer:r2dbc-mysql'
runtimeOnly 'com.mysql:mysql-connector-j'

// SpringBoot Test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// Reactor Test
testImplementation 'io.projectreactor:reactor-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package info.logbat_view.domain.log.domain;

import info.logbat_view.domain.log.domain.enums.LogLevel;
import java.time.LocalDateTime;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Log {

private final Long id;
private final String appKey;
private final LogLevel level;
private final String data;
private final LocalDateTime timestamp;

public static Log from(LogData logData) {
return new Log(logData.getLogId(),
logData.getAppKey(),
LogLevel.valueOf(logData.getLevel()),
logData.getData(),
logData.getTimestamp());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package info.logbat_view.domain.log.domain;

import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;

@Getter
@Table("logs")
@AllArgsConstructor
public class LogData {

@Id
private Long logId;
private String appKey;
private String level;
private String data;
private LocalDateTime timestamp;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package info.logbat_view.domain.log.domain.enums;

public enum LogLevel {
INFO, ERROR
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package info.logbat_view.domain.log.domain.service;

import info.logbat_view.domain.log.domain.Log;
import info.logbat_view.domain.log.repository.LogDataRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

@Service
@RequiredArgsConstructor
public class LogService {

private final LogDataRepository logDataRepository;

public Flux<Log> findLogsByAppKey(String appKey) {
return logDataRepository.findByAppKey(appKey).map(Log::from);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package info.logbat_view.domain.log.repository;

import info.logbat_view.domain.log.domain.LogData;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;

@Repository
public interface LogDataRepository extends ReactiveCrudRepository<LogData, Long> {

Flux<LogData> findByAppKey(@NonNull String appKey);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package info.logbat_view.domain.log.domain.service;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;

import info.logbat_view.domain.log.domain.LogData;
import info.logbat_view.domain.log.domain.enums.LogLevel;
import info.logbat_view.domain.log.repository.LogDataRepository;
import java.time.LocalDateTime;
import java.util.UUID;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import reactor.core.publisher.Flux;
import reactor.test.StepVerifier;

@ExtendWith(MockitoExtension.class)
@DisplayName("LogService는")
class LogServiceTest {

@InjectMocks
private LogService logService;

@Mock
private LogDataRepository logDataRepository;

private final Long expectedLogDataId = 1L;
private final String expectedAppKey = UUID.randomUUID().toString();
private final LogLevel expectedLogLevel = LogLevel.ERROR;
private final String expectedData = "data";
private final LocalDateTime expectedTimestamp = LocalDateTime.of(2024, 8, 15, 12, 0, 0, 0);
private final LogData expectedLogData = new LogData(expectedLogDataId, expectedAppKey,
expectedLogLevel.name(), expectedData, expectedTimestamp);

@Nested
@DisplayName("AppKey로 Log들을 조회할 때")
class whenGetAppsByAppKey {

@Test
@DisplayName("조회된 LogData들을 Log로 매핑해서 반환한다.")
void shouldReturnApps() {
// Arrange
given(logDataRepository.findByAppKey(any(String.class))).willReturn(
Flux.just(expectedLogData));
// Act & Assert
StepVerifier.create(logService.findLogsByAppKey(expectedAppKey))
.expectNextMatches(log -> {
assertThat(log).extracting("id", "appKey", "level", "data", "timestamp")
.containsExactly(expectedLogDataId, expectedAppKey, expectedLogLevel,
expectedData, expectedTimestamp);
return true;
})
.verifyComplete();
}

}
}

0 comments on commit 40392bf

Please sign in to comment.