-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* 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
Showing
8 changed files
with
154 additions
and
9 deletions.
There are no files selected for viewing
7 changes: 4 additions & 3 deletions
7
...main/java/info/logbat/log/domain/Log.java → ...va/info/logbat/domain/log/domain/Log.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
...a/info/logbat/log/domain/enums/Level.java → ...logbat/domain/log/domain/enums/Level.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, | ||
|
2 changes: 1 addition & 1 deletion
2
...nfo/logbat/log/domain/values/LogData.java → ...bat/domain/log/domain/values/LogData.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
|
||
|
63 changes: 63 additions & 0 deletions
63
logbat/src/main/java/info/logbat/domain/log/repository/LogRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | ||
); | ||
} |
76 changes: 76 additions & 0 deletions
76
logbat/src/test/java/info/logbat/domain/log/repository/LogRepositoryTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
} |
5 changes: 3 additions & 2 deletions
5
.../java/info/logbat/log/domain/LogTest.java → ...in/project/domain/log/domain/LogTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 3 additions & 1 deletion
4
...logbat/log/domain/values/LogDataTest.java → ...domain/log/domain/values/LogDataTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters