Skip to content

Commit 87e7f29

Browse files
authored
♻️ Refactor - 로깅 설정 파일을 개선한다
♻️ Refactor - 로깅 설정 파일을 개선한다
2 parents 0bcdbee + 7b5cd8a commit 87e7f29

7 files changed

Lines changed: 80 additions & 29 deletions

File tree

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ dependencies {
102102
//resilience4j
103103
implementation 'io.github.resilience4j:resilience4j-spring-boot3'
104104
implementation 'io.github.resilience4j:resilience4j-reactor'
105+
106+
//logging
107+
implementation "net.logstash.logback:logstash-logback-encoder:7.4"
105108
}
106109

107110
tasks.named('test') {

src/main/java/sopt/comfit/report/domain/AIReportJob.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ public class AIReportJob extends BaseTimeEntity {
2020
private Long userId;
2121

2222
@Column(nullable = false)
23-
private Long experienceId;
23+
private Long companyId;
2424

2525
@Column(nullable = false)
26-
private Long companyId;
26+
private Long experienceId;
2727

2828
@Column(nullable = false, columnDefinition = "TEXT")
2929
private String description;
@@ -35,8 +35,8 @@ public class AIReportJob extends BaseTimeEntity {
3535
@Builder(access = AccessLevel.PRIVATE)
3636
private AIReportJob(
3737
final Long userId,
38-
final Long experienceId,
3938
final Long companyId,
39+
final Long experienceId,
4040
final String description,
4141
final EJobStatus status
4242
){
@@ -48,13 +48,13 @@ private AIReportJob(
4848
}
4949

5050
public static AIReportJob create(final Long userId,
51-
final Long experienceId,
5251
final Long companyId,
52+
final Long experienceId,
5353
final String description) {
5454
return new AIReportJob(
5555
userId,
56-
experienceId,
5756
companyId,
57+
experienceId,
5858
description,
5959
EJobStatus.PENDING);
6060
}

src/main/java/sopt/comfit/report/job/AIReportJobService.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import sopt.comfit.global.exception.BaseException;
99
import sopt.comfit.report.domain.AIReportJob;
1010
import sopt.comfit.report.domain.AIReportJobRepository;
11+
import sopt.comfit.report.dto.command.MatchExperienceCommandDto;
1112
import sopt.comfit.report.exception.AIReportErrorCode;
1213

1314
@Service
@@ -18,14 +19,19 @@ public class AIReportJobService {
1819
private final StringRedisTemplate redisTemplate;
1920

2021
@Transactional
21-
public Long createJob(Long userId, Long experienceId, Long companyId, String jobDescription) {
22+
public Long createJob(MatchExperienceCommandDto command) {
2223

2324
Long queueSize = redisTemplate.opsForList().size(Constants.JOB_QUEUE_KEY);
2425

2526
if (queueSize != null && queueSize > 200) {
2627
throw BaseException.type(AIReportErrorCode.JOB_QUEUE_FULL);
2728
}
28-
AIReportJob job = AIReportJob.create(userId, experienceId, companyId, jobDescription);
29+
AIReportJob job = AIReportJob.create(
30+
command.userId(),
31+
command.companyId(),
32+
command.experienceId(),
33+
command.jobDescription());
34+
2935
reportJobRepository.save(job);
3036

3137
redisTemplate.opsForList().leftPush(Constants.JOB_QUEUE_KEY, String.valueOf(job.getId()));

src/main/java/sopt/comfit/report/job/AIReportJobWorker.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.springframework.data.redis.core.StringRedisTemplate;
88
import org.springframework.stereotype.Component;
99
import sopt.comfit.global.constants.Constants;
10+
import sopt.comfit.global.exception.BaseException;
1011
import sopt.comfit.global.logging.MdcUtils;
1112
import sopt.comfit.report.domain.AIReportJob;
1213
import sopt.comfit.report.dto.command.MatchExperienceCommandDto;
@@ -91,9 +92,15 @@ private void processJob(Long jobId) {
9192

9293
reportJobService.complete(jobId);
9394
log.info("Job 처리 완료 - jobId: {}", jobId);
95+
96+
} catch (BaseException e) {
97+
log.warn("Job 실패 - jobId={}, reason={}", jobId, e.getMessage());
98+
reportJobService.fail(jobId);
99+
94100
} catch (Exception e) {
95-
log.error("Job 처리 실패 - jobId: {}", jobId, e);
101+
log.error("Job 시스템 오류 - jobId={}", jobId, e);
96102
reportJobService.fail(jobId);
103+
97104
} finally {
98105
MdcUtils.clear();
99106
}

src/main/java/sopt/comfit/report/service/AIReportFacade.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,8 @@ public AIReportResponseDto matchExperienceVirtualThread(MatchExperienceCommandDt
122122

123123
public Long matchExperienceJob(MatchExperienceCommandDto command) {
124124

125-
return aiReportJobService.createJob(
126-
command.userId(),
127-
command.companyId(),
128-
command.experienceId(),
129-
command.jobDescription());
125+
aiReportQueryService.validateIds(command);
126+
127+
return aiReportJobService.createJob(command);
130128
}
131129
}

src/main/java/sopt/comfit/report/service/AIReportQueryService.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,15 @@ public PreparedDataDto prepareData(MatchExperienceCommandDto command) {
8787

8888
return PreparedDataDto.of(company, experience, command.jobDescription(), issues);
8989
}
90+
91+
@Transactional(readOnly = true)
92+
public void validateIds(MatchExperienceCommandDto command) {
93+
if(!companyRepository.existsById(command.companyId())){
94+
throw new BaseException(CompanyErrorCode.COMPANY_NOT_FOUND);
95+
}
96+
if(!experienceRepository.existsById(command.experienceId())){
97+
throw new BaseException(ExperienceErrorCode.NOT_FOUND_EXPERIENCE);
98+
}
99+
}
90100
}
91101

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,75 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<configuration>
3+
34
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
45

5-
<!-- 일반 콘솔 패턴 (로컬 개발용 - 읽기 쉬움) -->
6-
<property name="CONSOLE_LOG_PATTERN"
7-
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [traceId=%X{traceId:-}] [jobId=%X{jobId:-}] [userId=%X{userId:-}] %-5level %logger{36} - %msg%n"/>
6+
<!-- ================= LOCAL (가독성 로그) ================= -->
87

9-
<!-- JSON 패턴 (운영용 - Loki 파싱) -->
10-
<property name="JSON_LOG_PATTERN"
11-
value='{"timestamp":"%d{yyyy-MM-dd HH:mm:ss.SSS}","thread":"%thread","traceId":"%X{traceId:-}","jobId":"%X{jobId:-}","userId":"%X{userId:-}","level":"%level","logger":"%logger{36}","message":"%msg"}%n'/>
8+
<property name="CONSOLE_LOG_PATTERN"
9+
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [traceId=%X{traceId:-}] [jobId=%X{jobId:-}] [userId=%X{userId:-}] %-5level %logger{36} - %msg%n%ex"/>
1210

13-
<!-- 일반 콘솔 Appender (로컬용) -->
1411
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
1512
<encoder>
1613
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
1714
<charset>UTF-8</charset>
1815
</encoder>
1916
</appender>
2017

21-
<!-- JSON 콘솔 Appender (운영용) -->
22-
<appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender">
23-
<encoder>
24-
<pattern>${JSON_LOG_PATTERN}</pattern>
25-
<charset>UTF-8</charset>
18+
<!-- ================= JSON 로그 (운영용) ================= -->
19+
20+
<appender name="JSON_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
21+
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
22+
23+
<providers>
24+
25+
<!-- timestamp -->
26+
<timestamp>
27+
<fieldName>timestamp</fieldName>
28+
<pattern>yyyy-MM-dd HH:mm:ss.SSS</pattern>
29+
</timestamp>
30+
31+
<!-- 기본 필드 -->
32+
<threadName fieldName="thread"/>
33+
<logLevel fieldName="level"/>
34+
<loggerName fieldName="logger"/>
35+
36+
<!-- message -->
37+
<message/>
38+
39+
<!-- MDC -->
40+
<mdc/>
41+
42+
<!-- stacktrace -->
43+
<stackTrace>
44+
<fieldName>stacktrace</fieldName>
45+
</stackTrace>
46+
47+
</providers>
48+
2649
</encoder>
2750
</appender>
2851

29-
<!-- 로컬: 일반 포맷 (읽기 쉬움) -->
52+
<!-- ================= PROFILE ================= -->
53+
54+
<!-- 로컬 -->
3055
<springProfile name="local">
3156
<root level="INFO">
3257
<appender-ref ref="CONSOLE"/>
3358
</root>
3459
</springProfile>
3560

36-
<!-- 운영: JSON 포맷 (Loki 파싱용) -->
61+
<!-- dev / prod -->
3762
<springProfile name="dev,prod">
3863
<root level="INFO">
39-
<appender-ref ref="CONSOLE_JSON"/>
64+
<appender-ref ref="JSON_CONSOLE"/>
4065
</root>
4166
</springProfile>
4267

43-
<!-- 패키지별 로그 레벨 -->
68+
<!-- ================= LOGGER LEVEL ================= -->
69+
4470
<logger name="sopt.comfit" level="DEBUG"/>
4571
<logger name="sopt.comfit.report" level="DEBUG"/>
4672
<logger name="org.springframework" level="WARN"/>
4773
<logger name="org.hibernate" level="WARN"/>
74+
4875
</configuration>

0 commit comments

Comments
 (0)