Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
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
5 changes: 4 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,14 @@ RUN ./gradlew clean build --no-daemon
FROM --platform=linux/amd64 openjdk:17-jdk-slim
WORKDIR /app

# 로그 디렉토리 미리 생성
RUN mkdir -p /app/logs
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 로그 쌓는거 너무 좋은데요! 근데 로그가 너무 많이 쌓이면 ec2자체가 터져버릴 수도 있는 상황도 생각해본다면! 혹시 cron으로 주기적으로 로그를 청소해보는건 어떨까 하는 생각을 해봤어요.! 근데 나중에 결정적일때 로그가 없어져버리는 상황도 생각해야겠네요 ㅋㅎㅋㅎ

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

헛 이 부분은 로그를 출력하는 방식을 변경해서 함께 삭제를 해야하는데 반영을 못했네욥! 삭제하겠습니다!

로그 청소에 대해서 조금 알아봤는데요,
지금 처럼 따로 로그에 대한 설정을 하지 않는 경우 도커 데몬의 json-file 드라이버 의해 관리됩니다.

  • (모든 컨테이너의 로그에 대한 json을 도커 엔진이 관리하게 됨.)

보통은 docker run을 할 때 롤링 정책을 설정할 수 있는 것 같아서 그 방법으로 용량을 관리해도 좋아 보입니다.

스크린샷 2025-09-30 오후 5 45 34 https://docs.docker.com/engine/logging/drivers/local/
  • Cloud Front/Promtail 같은 외부 수집기를 사용할 경우는 로컬에 많은 용량을 저장하고 있을 필요는 없어보이고 로컬 엔진에서 20M* 5로테이션 = 100 MB 정도만 저장하고 있어서 저렇게 최근 로그만 가지고 있어도 괜찮아 보입니다! ( 20GB 정도의 용량이 남아있어서 사용하면서 불편한 점이 있다면 수정해도 좋을 것 같습니다.)
--log-driver=json-file \
--log-opt max-size=20m \
--log-opt max-file=5 \       

이 부분을 Docker Run에 추가해 두었습니다 !

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 좋아요!!


# 빌드 단계에서 생성된 JAR 파일 복사 (파일명이 프로젝트에 따라 달라질 수 있으므로 와일드카드 사용)
COPY --from=builder /home/gradle/project/build/libs/*.jar app.jar

# 컨테이너에서 사용할 포트 (필요 시 변경)
EXPOSE 9000

# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "app.jar"]
ENTRYPOINT ["java", "-jar", "app.jar"]
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ def generated = 'src/main/generated'

tasks.withType(JavaCompile) {
options.getGeneratedSourceOutputDirectory().set(file(generated))
options.compilerArgs += ['-parameters']
}

sourceSets {
Expand All @@ -88,4 +89,4 @@ sourceSets {

clean {
delete file('src/main/generated')
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package ssu.eatssu.domain.auth.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import ssu.eatssu.global.log.annotation.LogMask;

@Schema(title = "애플 로그인 및 회원가입")
public record AppleLoginRequest(
@LogMask
@Schema(description = "identityToken", example = "eyJraWQiOiJXNldjT0tCIiwiYWxnIjoi...")
String identityToken
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import ssu.eatssu.global.log.annotation.LogMask;

@Schema(title = "카카오 로그인 및 회원가입")
public record KakaoLoginRequest(
@LogMask
@NotBlank(message = "이메일을 입력해주세요.")
@Email(message = "올바른 이메일 주소를 입력해주세요.")
@Schema(description = "이메일", example = "test@email.com")
String email,

@LogMask
@Schema(description = "providerId", example = "10378247832195")
String providerId
) {
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/ssu/eatssu/domain/auth/dto/ValidRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import ssu.eatssu.global.log.annotation.LogMask;

@Schema(title = "유효한 토큰 확인")
public record ValidRequest(
@LogMask
@NotBlank(message = "토큰을 입력해주세요")
@Schema(description = "토큰", example = "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ7XCJpZFwiOjcsXCJlbWFpbFwiOlwidGVzdEBlbWFpbC5jb21cIixcInJvbGVcIjpcIlJPTEVfVVNFUlwifSIsImF1dGgiOiJST0xFX1VTRVIiLCJleHAiOjE3NDQzNzQ0MjB9.mhIWYX_Vj3xW1eXuVflbzpH6vLTcC9b1twbIcqovVjDVnS7tjegu3nQHGXUsUa_WG2DIAtJMFZT_Q1XcVq1jPw")
String token
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.NoArgsConstructor;
import ssu.eatssu.global.log.annotation.LogMask;

@Schema(title = "문의 남기기")
@NoArgsConstructor
@Getter
public class CreateInquiryRequest {

@Schema(description = "답장 받을 이메일", example = "sandy1017@gmail.com")
@LogMask
private String email;

@Schema(description = "문의 내용", example = "어쩌고 저쩌고 문의 남깁니다")
@LogMask
private String content;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ssu.eatssu.domain.inquiry.service;

import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ssu.eatssu.domain.auth.security.CustomUserDetails;
Expand All @@ -10,6 +11,7 @@
import ssu.eatssu.domain.user.entity.User;
import ssu.eatssu.domain.user.repository.UserRepository;
import ssu.eatssu.global.handler.response.BaseException;
import ssu.eatssu.global.log.event.LogEvent;

import static ssu.eatssu.global.handler.response.BaseResponseStatus.NOT_FOUND_USER;

Expand All @@ -20,14 +22,23 @@ public class InquiryService {

private final UserRepository userRepository;
private final InquiryRepository inquiryRepository;
private final ApplicationEventPublisher eventPublisher;

public Inquiry createUserInquiry(CustomUserDetails userDetails, CreateInquiryRequest request) {
User user = userRepository.findById(userDetails.getId())
.orElseThrow(() -> new BaseException(NOT_FOUND_USER));
.orElseThrow(() -> new BaseException(NOT_FOUND_USER));

Inquiry inquiry = new Inquiry(request.getContent(), user, request.getEmail());
Inquiry saved = inquiryRepository.save(inquiry);

return inquiryRepository.save(inquiry);
eventPublisher.publishEvent(LogEvent.of(String.format(
"Inquiry created: id=%d, userId=%d, status=%s",
saved.getId(),
user.getId(),
saved.getStatus()
)));

return saved;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import lombok.NoArgsConstructor;
import ssu.eatssu.domain.menu.entity.Meal;
import ssu.eatssu.domain.menu.entity.MealMenu;
import ssu.eatssu.domain.menu.entity.Menu;

import java.util.List;

Expand All @@ -18,9 +19,8 @@ public class MenusInMealResponse {
@Schema(description = "식단 속 메뉴 목록", example = "[]")
private List<BriefMenuResponse> briefMenus;

public static MenusInMealResponse from(Meal meal) {
List<BriefMenuResponse> menusInformation = meal.getMealMenus().stream()
.map(MealMenu::getMenu)
public static MenusInMealResponse from(List<Menu> menus) {
List<BriefMenuResponse> menusInformation = menus.stream()
.map(BriefMenuResponse::new)
.toList();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,15 @@ public class MealService {
public MenusInMealResponse getMenusInMealByMealId(Long mealId) {
Meal meal = mealRepository.findById(mealId)
.orElseThrow(() -> new BaseException(BaseResponseStatus.NOT_FOUND_MEAL));
List<Menu> menus = meal.getMealMenus().stream()
.map(MealMenu::getMenu)
.toList();

if (menus.isEmpty()) {
log.warn("Meal[{}] has no menus.", mealId);
}

return MenusInMealResponse.from(meal);
return MenusInMealResponse.from(menus);
}

public List<MealDetailResponse> getMealDetailsByDateAndRestaurantAndTimePart(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package ssu.eatssu.domain.partnership.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ssu.eatssu.domain.auth.security.CustomUserDetails;
Expand All @@ -19,6 +21,7 @@
import ssu.eatssu.domain.user.entity.User;
import ssu.eatssu.domain.user.repository.UserRepository;
import ssu.eatssu.global.handler.response.BaseException;
import ssu.eatssu.global.log.event.LogEvent;

import java.util.List;
import java.util.Optional;
Expand All @@ -40,6 +43,7 @@ public class PartnershipService {
private final UserRepository userRepository;
private final PartnershipLikeRepository partnershipLikeRepository;
private final PartnershipRestaurantRepository partnerShipRestaurantRepository;
private final ApplicationEventPublisher eventPublisher;

@Transactional
public void createPartnership(CreatePartnershipRequest request) {
Expand Down Expand Up @@ -68,22 +72,30 @@ public List<PartnershipResponse> getAllPartnerships(CustomUserDetails customUser
@Transactional
public void togglePartnershipLike(Long partnershipId, CustomUserDetails userDetails) {
Partnership partnership = partnershipRepository.findById(partnershipId)
.orElseThrow(() -> new BaseException(NOT_FOUND_PARTNERSHIP));
.orElseThrow(() -> new BaseException(NOT_FOUND_PARTNERSHIP));
User user = userRepository.findById(userDetails.getId())
.orElseThrow(() -> new BaseException(NOT_FOUND_USER));
.orElseThrow(() -> new BaseException(NOT_FOUND_USER));
PartnershipRestaurant partnershipRestaurant = partnership.getPartnershipRestaurant();

Optional<PartnershipLike> optionalPartnershipLike = partnershipLikeRepository.findByUserAndPartnershipRestaurant(
user,
partnershipRestaurant);
Optional<PartnershipLike> optionalPartnershipLike =
partnershipLikeRepository.findByUserAndPartnershipRestaurant(user, partnershipRestaurant);

if (optionalPartnershipLike.isPresent()) {
PartnershipLike partnershipLike = optionalPartnershipLike.get();
partnershipRestaurant.getLikes().remove(partnershipLike);
partnershipLikeRepository.delete(partnershipLike);

eventPublisher.publishEvent(LogEvent.of(
String.format("User[%d] canceled like on PartnershipRestaurant[%d]",
user.getId(), partnershipRestaurant.getId())));
} else {
PartnershipLike partnershipLike = new PartnershipLike(user, partnershipRestaurant);
partnershipRestaurant.getLikes().add(partnershipLike);
partnershipLikeRepository.save(partnershipLike);

eventPublisher.publishEvent(LogEvent.of(
String.format("User[%d] liked PartnershipRestaurant[%d]",
user.getId(), partnershipRestaurant.getId())));
}
}

Expand Down
23 changes: 20 additions & 3 deletions src/main/java/ssu/eatssu/domain/report/service/ReportService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ssu.eatssu.domain.report.service;

import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ssu.eatssu.domain.auth.security.CustomUserDetails;
Expand All @@ -14,6 +15,7 @@
import ssu.eatssu.domain.user.entity.User;
import ssu.eatssu.domain.user.repository.UserRepository;
import ssu.eatssu.global.handler.response.BaseException;
import ssu.eatssu.global.log.event.LogEvent;

import static ssu.eatssu.global.handler.response.BaseResponseStatus.NOT_FOUND_REVIEW;
import static ssu.eatssu.global.handler.response.BaseResponseStatus.NOT_FOUND_USER;
Expand All @@ -26,18 +28,33 @@ public class ReportService {
private final ReviewRepository reviewRepository;
private final UserRepository userRepository;
private final ReportRepository reportRepository;
private final ApplicationEventPublisher eventPublisher;

public Report reportReview(CustomUserDetails userDetails, ReportCreateRequest request) {
User user = userRepository.findById(userDetails.getId())
.orElseThrow(() -> new BaseException(NOT_FOUND_USER));
.orElseThrow(() -> new BaseException(NOT_FOUND_USER));

Review review = reviewRepository.findById(request.reviewId())
.orElseThrow(() -> new BaseException(NOT_FOUND_REVIEW));
.orElseThrow(() -> new BaseException(NOT_FOUND_REVIEW));

Report report = Report.create(user, review, request, ReportStatus.PENDING);
return reportRepository.save(report);
reportRepository.save(report);

eventPublisher.publishEvent(LogEvent.of(
String.format(
"Report created: reportId=%d, reviewId=%d, userId=%d, reportType=%s, status=%s",
report.getId(),
report.getReview().getId(),
report.getUser().getId(),
report.getReportType(),
report.getStatus()
)
));

return report;
}


public ReportTypeList getReportType() {
return ReportTypeList.get();
}
Expand Down
Loading