Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
54966c0
feat: setting log
uhyunglee Apr 2, 2025
4b873af
feat: checkstyle test
uhyunglee Apr 2, 2025
7e8afe3
feat: checkstyle test
uhyunglee Apr 2, 2025
edc96c5
feat: checkstyle test
uhyunglee Apr 2, 2025
7f265e0
feat: request & response log
uhyunglee Apr 2, 2025
8b0213c
feat: add colored at log
uhyunglee Apr 3, 2025
68da173
feat: change log path in ec2
uhyunglee Apr 3, 2025
4d9fed8
feat: logging http level & method level
uhyunglee Apr 3, 2025
ab54e0c
fix: unused log
uhyunglee Apr 3, 2025
b11b29e
chore: docker file
uhyunglee Apr 3, 2025
a7c9b80
fix : totalCost - 최소값 Validation 검증 Dto에서 처리 #150
JiwonHwang01 Apr 4, 2025
b13a100
fix: 불필요한 로직 및 주석 제거 #150
JiwonHwang01 Apr 4, 2025
0bd9043
fix: 불필요한 주석 제거 #150
JiwonHwang01 Apr 4, 2025
e6f4339
fix: totalCost 최소값 유효성 검증
JiwonHwang01 Apr 4, 2025
04d98db
chore: logback xml file
uhyunglee Apr 4, 2025
7f9709e
chore: set swagger multi server
uhyunglee Apr 4, 2025
7b95f00
chore: off show sql option and hikari pool connection
uhyunglee Apr 7, 2025
9e01f57
chore: delete useless code
uhyunglee Apr 7, 2025
c2fe710
feat: add logging filter at http layer and aop logging in service layers
uhyunglee Apr 7, 2025
4d5c99a
feat: log저장폴더 생성 로직 추가 및 버전 명시
happy-yeachan Apr 7, 2025
992f4ef
Merge pull request #158 from 100-hours-a-week/feature-CICD
happy-yeachan Apr 7, 2025
381439e
fix: unify log path
uhyunglee Apr 7, 2025
d2f98cb
fix: unify log path
uhyunglee Apr 7, 2025
3a1b73d
feat: self-hosted runner 등록
happy-yeachan Apr 8, 2025
e48f1d0
fix: Error Handling for meetId NOT FOUND #164
JiwonHwang01 Apr 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .github/workflows/cicd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ on:
jobs:
build-and-deploy:
name: Build, Push to ECR, Deploy on EC2
runs-on: ubuntu-22.04
runs-on: self-hosted

env:
ECR_REGISTRY: 418272768555.dkr.ecr.ap-northeast-2.amazonaws.com
Expand Down Expand Up @@ -59,6 +59,12 @@ jobs:
COMMIT_HASH=$(aws ecr describe-images --repository-name modie/modie-be \
--region ap-northeast-2 --query 'sort_by(imageDetails,& imagePushedAt)[-1].imageTags[0]' --output text)
echo "🚀 사용할 Docker 태그: $COMMIT_HASH"

# 로그 디렉토리 생성 및 권한 설정
sudo mkdir -p /var/log/modie/dev
sudo chown $(id -u):$(id -g) /var/log/modie/dev
sudo chmod 755 /var/log/modie/dev

# aws 로그인
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 418272768555.dkr.ecr.ap-northeast-2.amazonaws.com/modie/modie-be

Expand Down Expand Up @@ -97,6 +103,8 @@ jobs:
-e FIREBASE_PRIVATE_KEY=${{ secrets.FIREBASE_PRIVATE_KEY }} \
-e FIREBASE_CLIENT_X509_CERT_URL=${{ secrets.FIREBASE_CLIENT_X509_CERT_URL }} \
-e HASH_KEY=${{ secrets.HASH_KEY }} \
-e SPRING_PROFILES_ACTIVE=dev \
-v /var/log/modie/dev:/var/log/modie/dev \
--restart always \
418272768555.dkr.ecr.ap-northeast-2.amazonaws.com/modie/modie-be:$COMMIT_HASH || {
echo "❌ Docker 컨테이너 실행 실패!"
Expand Down
1 change: 0 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ COPY . .

RUN ./gradlew clean build -x test


# Run stage

FROM bellsoft/liberica-openjdk-alpine:17
Expand Down
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ dependencies {
// guava cache - API throttling 관련
implementation 'com.google.guava:guava:32.1.2-jre'

// logging
implementation 'net.logstash.logback:logstash-logback-encoder:7.3'
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'

}

tasks.named('test') {
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/org/ktb/modie/ModieApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,21 @@

import java.util.TimeZone;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import jakarta.annotation.PostConstruct;

@SpringBootApplication
public class ModieApplication {
private static final Logger log = LoggerFactory.getLogger(ModieApplication.class);

public static void main(String[] args) {
SpringApplication.run(ModieApplication.class, args);

log.info("Current Directory: {}", System.getProperty("user.dir"));
}

@PostConstruct
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/org/ktb/modie/config/SwaggerConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ public OpenAPI openApi() {
.version("v1")
.description("API 명세서");

Server localServer = new Server()
.url("http://localhost:8080")
.description("개발용 서버");

Server devServer = new Server()
.url("https://dev-api.modie.site")
.description("개발용 서버");
Expand All @@ -44,6 +48,7 @@ public OpenAPI openApi() {
)
.addSecurityItem(new SecurityRequirement()
.addList("bearerAuth"))
.addServersItem(localServer)
.addServersItem(devServer);
}

Expand Down
64 changes: 64 additions & 0 deletions src/main/java/org/ktb/modie/core/interceptor/LoggingFilter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package org.ktb.modie.core.interceptor;

import java.io.IOException;
import java.util.UUID;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class LoggingFilter extends OncePerRequestFilter {
private static final Logger log = LoggerFactory.getLogger(LoggingFilter.class);
private static final String REQUEST_ID = "requestId";

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
long startTime = System.currentTimeMillis();

String requestId = request.getHeader("X-Request-ID");
if (requestId == null || requestId.isEmpty()) {
requestId = UUID.randomUUID().toString();
}

MDC.put(REQUEST_ID, requestId);

try {
response.addHeader("X-Request-ID", requestId);

logRequest(request, requestId);

filterChain.doFilter(request, response);

logResponse(response, requestId, System.currentTimeMillis() - startTime);

} finally {
MDC.remove(REQUEST_ID);
}
}

private void logRequest(HttpServletRequest request, String requestId) {
String method = request.getMethod();
String uri = request.getRequestURI();
String queryString = request.getQueryString();
String fullUrl = uri + (queryString != null ? "?" + queryString : "");

log.info("[{}] Request: {} {}", requestId, method, fullUrl);
}

private void logResponse(HttpServletResponse response, String requestId, long duration) {
int status = response.getStatus();
log.info("[{}] Response: {} ({}ms)", requestId, status, duration);
}
}
4 changes: 3 additions & 1 deletion src/main/java/org/ktb/modie/core/util/HashIdUtil.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.ktb.modie.core.util;

import org.hashids.Hashids;
import org.ktb.modie.core.exception.BusinessException;
import org.ktb.modie.core.exception.CustomErrorCode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

Expand All @@ -20,7 +22,7 @@ public String encode(Long id) {
public Long decode(String hash) {
long[] decoded = hashids.decode(hash);
if (decoded.length == 0) {
throw new IllegalArgumentException("Invalid hash id");
throw new BusinessException(CustomErrorCode.MEETING_NOT_FOUND);
}
return decoded[0];
}
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/org/ktb/modie/core/util/LoggingAspect.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.ktb.modie.core.util;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

@Pointcut("execution(* org.ktb.modie.service..*(..))")
private void serviceMethods() {
}

@Around("serviceMethods()")
public Object logServiceMethodExecution(ProceedingJoinPoint joinPoint) throws Throwable {
Logger log = LoggerFactory.getLogger(joinPoint.getTarget().getClass());
String methodName = joinPoint.getSignature().getName();

log.debug("[{}] Start: {} - Parameter: {}", MDC.get("requestId"), methodName,
joinPoint.getArgs());

long startTime = System.currentTimeMillis();
try {
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();

log.debug("[{}] Completed: {} - time: {}ms", MDC.get("requestId"), methodName, (endTime - startTime));
return result;
} catch (Exception e) {
log.error("[{}] Error: {} - Method: {} - Cause: {}", MDC.get("requestId"), e.getClass().getSimpleName(),
methodName, e.getMessage(),
e);
throw e;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@
import org.ktb.modie.presentation.v1.dto.UserResponse;
import org.ktb.modie.service.FcmService;
import org.ktb.modie.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RestController
public class UserController implements UserApi {
private static final Logger log = LoggerFactory.getLogger(UserController.class);
private final UserService userService;
private final FcmService fcmService;

Expand Down
132 changes: 66 additions & 66 deletions src/main/java/org/ktb/modie/presentation/v1/dto/MeetDto.java
Original file line number Diff line number Diff line change
@@ -1,80 +1,80 @@
package org.ktb.modie.presentation.v1.dto;

import java.time.LocalDateTime;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonFormat;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Builder;

import java.time.LocalDateTime;
import java.util.List;

@Builder
public record MeetDto(
@Schema(description = "모임 ID", example = "1")
// Long meetId,
String meetId,

@Schema(description = "모임 생성자", example = "김박박즐")
String ownerName,

@Schema(description = "모임 소개", example = "제주 해안 드라이브")
@NotNull
@Size(max = 30)
String meetIntro,

@Schema(description = "모임 유형 ('이동', '운동', '빨래' 등)", example = "여행")
@NotNull
@Size(max = 10)
String meetType,

@Schema(description = "주소", example = "제주특별자치도 제주시 월성로 4길 19")
@NotNull
@Size(max = 40)
String address,

@Schema(description = "주소 상세 설명", example = "애월 해안도로")
@Size(max = 20)
String addressDescription,

@Schema(description = "모임 시작 시간 (ISO 형식)", example = "2025-02-20T18:00:00")
@NotNull
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime meetAt,

@Schema(description = "총 발생 비용 (0~10,000,000)", example = "10000")
@Min(0)
@Max(10_000_000)
int totalCost,

@Schema(description = "최대 인원 수 (1~30)", example = "5")
@Min(1)
@Max(30)
int memberLimit,

@Schema(description = "생성시각", example = "2025-03-18T18:00:00")
@NotNull
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime createdAt,

@Schema(description = "수정시각", example = "2025-03-18T18:00:00")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime updatedAt,

@Schema(description = "삭제시각", example = "2025-03-18T18:00:00")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime deletedAt,

@Schema(description = "완료시각", example = "2025-03-18T18:00:00")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime completedAt,

@Schema(description = "유저의 상태", example = "owner")
String meetRule,

@Schema(description = "참여 인원")
List<UserDto> members
@Schema(description = "모임 ID", example = "1")
String meetId,

@Schema(description = "모임 생성자", example = "김박박즐")
String ownerName,

@Schema(description = "모임 소개", example = "제주 해안 드라이브")
@NotNull
@Size(max = 30)
String meetIntro,

@Schema(description = "모임 유형 ('이동', '운동', '빨래' 등)", example = "여행")
@NotNull
@Size(max = 10)
String meetType,

@Schema(description = "주소", example = "제주특별자치도 제주시 월성로 4길 19")
@NotNull
@Size(max = 40)
String address,

@Schema(description = "주소 상세 설명", example = "애월 해안도로")
@Size(max = 20)
String addressDescription,

@Schema(description = "모임 시작 시간 (ISO 형식)", example = "2025-02-20T18:00:00")
@NotNull
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime meetAt,

@Schema(description = "총 발생 비용 (0~10,000,000)", example = "10000")
@Min(0)
@Max(10_000_000)
int totalCost,

@Schema(description = "최대 인원 수 (1~30)", example = "5")
@Min(1)
@Max(30)
int memberLimit,

@Schema(description = "생성시각", example = "2025-03-18T18:00:00")
@NotNull
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime createdAt,

@Schema(description = "수정시각", example = "2025-03-18T18:00:00")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime updatedAt,

@Schema(description = "삭제시각", example = "2025-03-18T18:00:00")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime deletedAt,

@Schema(description = "완료시각", example = "2025-03-18T18:00:00")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime completedAt,

@Schema(description = "유저의 상태", example = "owner")
String meetRule,

@Schema(description = "참여 인원")
List<UserDto> members
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@ public record UpdateMeetRequest(
@FutureOrPresent(message = "출발 시간은 현재 시간보다 이후여야 합니다.")
LocalDateTime meetAt,

@Schema(description = "총 비용 (0~10,000,000)", example = "10000")
@Schema(description = "총 비용 (1000~10,000,000)", example = "10000")
@NotNull
@Min(0)
@Min(1000)
@Max(10_000_000)
int totalCost,

@Schema(description = "최대 인원 수 (1~30)", example = "5")
@NotNull
@Min(1)
@Min(2)
@Max(30)
int memberLimit

Expand Down
Loading