Skip to content

Commit

Permalink
Feat/#23 Log를 저장할 수 있는 기능 추가 (#30)
Browse files Browse the repository at this point in the history
* refactor: Log 패키지 위치 변경

- 도메인 코드와 test코드를 domain/log 하위로 이동했습니다.

* feat: LogRepository 추가

- Log를 저장하는 save 메서드 추가
- LogId를 기준으로 Log를 찾는 findById 메서드 추가

* feat: LogRepository 테스트 추가

- Log를 저장하는 save 메서드를 테스트
- LogId를 기준으로 Log를 찾는 findById를 테스트

* refactor: rowMapper 상수화

- 매번 메서드로 생성되는 rowMapper를 상수로 변경했습니다.

* refactor: key에 null이 오는 경우를 Optional chaining으로 변경

* test: Repository Test 시 Test Profile을 사용하도록 변경

* fix: findById에서 데이터가 없는 경우 에외처리 추가

- EmptyResultDataAccessException 발생 시 Optional empty 반환

* test: 없는 Log에 대한 테스트 추가

- findNonexistentLog 테스트 추가
  • Loading branch information
miiiinju1 committed Aug 13, 2024
1 parent 2706f18 commit 1e0715c
Show file tree
Hide file tree
Showing 8 changed files with 154 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package info.logbat.log.domain;
package info.logbat.domain.log.domain;

import info.logbat.domain.log.domain.values.LogData;
import info.logbat.domain.log.domain.enums.Level;

import info.logbat.log.domain.enums.Level;
import info.logbat.log.domain.values.LogData;
import java.time.LocalDateTime;
import lombok.Getter;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package info.logbat.log.domain.enums;
package info.logbat.domain.log.domain.enums;

public enum Level {
ERROR,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package info.logbat.log.domain.values;
package info.logbat.domain.log.domain.values;

import lombok.Getter;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package info.logbat.domain.log.repository;

import info.logbat.domain.log.domain.Log;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Optional;
import lombok.AllArgsConstructor;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;

@Repository
@AllArgsConstructor
public class LogRepository {

private final JdbcTemplate jdbcTemplate;

public long save(Log log) {
String sql = "INSERT INTO logs (application_id, level, log_data, timestamp) VALUES (?, ?, ?, ?)";

KeyHolder keyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setLong(1, log.getApplicationId());
ps.setString(2, log.getLevel().name());
ps.setString(3, log.getLogData().getValue());
ps.setTimestamp(4, Timestamp.valueOf(log.getTimestamp()));
return ps;
}, keyHolder);

return Optional.ofNullable(keyHolder.getKey())
.map(Number::longValue)
.orElseThrow(() -> new IllegalStateException("로그 저장에 실패했습니다."));
}

public Optional<Log> findById(Long logId) {
String sql = "SELECT * FROM logs WHERE log_id = ?";

try {
return Optional.ofNullable(
jdbcTemplate.queryForObject(
sql,
LOG_ROW_MAPPER,
logId
));
} catch (EmptyResultDataAccessException e) {
return Optional.empty();
}
}

private static final RowMapper<Log> LOG_ROW_MAPPER = (rs, rowNum) -> new Log(
rs.getLong("log_id"),
rs.getLong("application_id"),
rs.getString("level"),
rs.getString("log_data"),
rs.getTimestamp("timestamp").toLocalDateTime()
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package info.logbat.domain.log.repository;

import static org.assertj.core.api.Assertions.assertThat;

import info.logbat.domain.log.domain.Log;
import info.logbat.domain.log.domain.enums.Level;
import jakarta.transaction.Transactional;
import java.time.LocalDateTime;
import java.util.Optional;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

@SpringBootTest
@Transactional
@ActiveProfiles("test")
@DisplayName("LogRepository 테스트")
class LogRepositoryTest {

@Autowired
private LogRepository logRepository;

@DisplayName("Log를 저장할 수 있다.")
@Test
void saveLog() {
// given
String 로그_레벨 = "INFO";
String 로그_데이터 = "테스트_로그_데이터";
LocalDateTime 타임스탬프 = LocalDateTime.of(2021, 1, 1, 0, 0, 0);

Log 로그 = new Log(1L, 로그_레벨, 로그_데이터, 타임스탬프);

// when
long 저장된_ID = logRepository.save(로그);

// then
assertThat(저장된_ID)
.isPositive();
}

@DisplayName("저장한 Log를 조회할 수 있다.")
@Test
void findLog() {
// given
String 로그_레벨 = "INFO";
String 로그_데이터 = "테스트_로그_데이터";
LocalDateTime 타임스탬프 = LocalDateTime.of(2021, 1, 1, 0, 0, 0);

long 로그_ID = logRepository.save(new Log(1L, 로그_레벨, 로그_데이터, 타임스탬프));

// when
Optional<Log> 저장된_로그 = logRepository.findById(로그_ID);

// then
assertThat(저장된_로그).isPresent()
.get()
.extracting("logId", "applicationId", "level", "logData.value", "timestamp")
.containsExactly(로그_ID, 1L, Level.INFO, "테스트_로그_데이터",
LocalDateTime.of(2021, 1, 1, 0, 0, 0));
}

@DisplayName("없는 Log를 조회하면 빈 Optional을 반환한다.")
@Test
void findNonexistentLog() {
// given
long 없는_로그_ID = 1L;

// when
Optional<Log> 저장된_로그 = logRepository.findById(없는_로그_ID);

// then
assertThat(저장된_로그).isEmpty();
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package info.logbat.log.domain;
package info.logbat.domain.project.domain.log.domain;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import info.logbat.log.domain.enums.Level;
import info.logbat.domain.log.domain.Log;
import info.logbat.domain.log.domain.enums.Level;
import java.time.LocalDateTime;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package info.logbat.log.domain.enums;
package info.logbat.domain.project.domain.log.domain.enums;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
Expand All @@ -10,6 +10,8 @@
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import info.logbat.domain.log.domain.enums.Level;

@DisplayName("로그 Level enum 테스트")
class LevelTest {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package info.logbat.log.domain.values;
package info.logbat.domain.project.domain.log.domain.values;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import info.logbat.domain.log.domain.values.LogData;

@DisplayName("LogData VO 테스트")
class LogDataTest {

Expand Down

0 comments on commit 1e0715c

Please sign in to comment.