Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
5b371ec
fix: statistics valid 데이터 동기화 (#242)
JjungminLee Sep 23, 2025
1e9ab03
chore: CI/CD 수정 및 테스트 구조 구축
yongjun0511 Sep 24, 2025
f613207
feat: logback 세팅 및 Controller AOP 로깅 구현
yongjun0511 Sep 24, 2025
ae55113
feat: Dockerfile에 로그 디렉토리 생성
yongjun0511 Sep 24, 2025
07d60a8
feat: 로깅 구현 완료
yongjun0511 Sep 24, 2025
b93a7ae
fix: 로그 삭제
yongjun0511 Sep 24, 2025
82dbce3
fix: dev 오타 정정
yongjun0511 Sep 24, 2025
08a8c2f
fix: docker-compose 복사 조건 주석
yongjun0511 Sep 24, 2025
81c791b
refactor: docker compose 버전 변경
yongjun0511 Sep 24, 2025
b1ef828
refactor: 기존 배포 방식 유지 및 logback-spring.xml stdout 방식으로 콘솔 출력
yongjun0511 Sep 25, 2025
51dd849
feat: 테스트 완료
yongjun0511 Sep 25, 2025
412577b
fix: reqId값이 나오도록 수정
yongjun0511 Sep 25, 2025
8825414
fix: 민감 정보 관련 사항 수정
yongjun0511 Sep 25, 2025
fe945b7
chore: 임시 배포
yongjun0511 Sep 25, 2025
8b5ab25
chore: PR 마무리
yongjun0511 Sep 25, 2025
4cda70d
feat: 민감 정보 마스킹
yongjun0511 Sep 25, 2025
58aeebd
refactor: 로그 롤링 정책 추가
yongjun0511 Sep 30, 2025
507108c
Merge pull request #244 from EAT-SSU/feature/#243-plg-logging-stack
yongjun0511 Sep 30, 2025
00d1409
fix: 250930 수정요청사항 (#248)
JjungminLee Sep 30, 2025
9c25193
fix: 제휴 지도 & 신고 기능 수정 사항 (20250930) (#249)
yongjun0511 Sep 30, 2025
dd558bc
fix: 충돌 해결
yongjun0511 Sep 30, 2025
6b381ce
fix: 어노테이션 추가 (#252)
yongjun0511 Sep 30, 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
6 changes: 6 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ jobs:
sudo docker rm -f $(docker ps -qa)
sudo docker pull ${{ secrets.DOCKER_REPO }}/eatssu-prod
sudo docker run -d -p 9000:9000 \
--log-driver=json-file \
--log-opt max-size=20m \
--log-opt max-file=5 \
-e EATSSU_DB_URL_PROD="${{ secrets.EATSSU_DB_URL_PROD }}" \
-e EATSSU_DB_USERNAME="${{ secrets.EATSSU_DB_USERNAME }}" \
-e EATSSU_DB_PASSWORD="${{ secrets.EATSSU_DB_PASSWORD }}" \
Expand All @@ -107,6 +110,9 @@ jobs:
sudo docker rm -f $(docker ps -qa)
sudo docker pull ${{ secrets.DOCKER_REPO }}/eatssu-dev
sudo docker run -d -p 9000:9000 \
--log-driver=json-file \
--log-opt max-size=20m \
--log-opt max-file=5 \
-e EATSSU_DB_URL_DEV="${{ secrets.EATSSU_DB_URL_DEV }}" \
-e EATSSU_DB_USERNAME="${{ secrets.EATSSU_DB_USERNAME }}" \
-e EATSSU_DB_PASSWORD="${{ secrets.EATSSU_DB_PASSWORD }}" \
Expand Down
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,8 @@ out/
### env file ###
.env

/src/main/resources/application-local.yml
/src/main/resources/application-local.yml

### DS File ###
.DS_Store
*/.DS_Store
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@ 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 = "[email protected]")
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 @@ -14,7 +14,6 @@
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import ssu.eatssu.domain.auth.security.JwtAuthenticationFilter;
import ssu.eatssu.domain.auth.security.JwtTokenProvider;
import ssu.eatssu.domain.slack.service.SlackErrorNotifier;
import ssu.eatssu.global.handler.JwtAccessDeniedHandler;
import ssu.eatssu.global.handler.JwtAuthenticationEntryPoint;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
import org.springframework.util.StringUtils;
import org.springframework.web.filter.GenericFilterBean;



import java.io.IOException;
import java.util.List;

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 = "[email protected]")
@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;
}

}
6 changes: 6 additions & 0 deletions src/main/java/ssu/eatssu/domain/menu/entity/Meal.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,10 @@ public List<String> getMenuNames() {
public void addMealMenu(MealMenu mealMenu) {
mealMenus.add(mealMenu);
}

public List<Menu> getMenus() {
return mealMenus.stream()
.map(MealMenu::getMenu)
.toList();
}
}
7 changes: 2 additions & 5 deletions src/main/java/ssu/eatssu/domain/menu/entity/Menu.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ public class Menu {
private final Reviews reviews = new Reviews();
@OneToMany(mappedBy = "menu", cascade = CascadeType.ALL)
private final List<MealMenu> mealMenus = new ArrayList<>();
@Column(name = "unlike_count")
private Integer unlikeCount = 0;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "menu_id")
Expand All @@ -44,15 +46,10 @@ public class Menu {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "menu_category_id")
private MenuCategory category;

private boolean isDiscontinued = false;

@Column(name = "like_count")
private Integer likeCount = 0;

@Column(name = "unlike_count")
private final Integer unlikeCount = 0;

private Menu(String name, Restaurant restaurant, Integer price, MenuCategory category) {
this.name = name;
this.restaurant = restaurant;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ public Double getMainRatingAverage(Long menuId) {
}



private BooleanExpression menuIdEq(Long menuId) {
return menu.id.eq(menuId);
}
Expand Down
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();
Comment on lines +42 to +44

Choose a reason for hiding this comment

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

medium

Meal 엔티티에 이번 PR에서 getMenus() 메소드가 추가되었습니다. 이 메소드를 활용하여 코드를 더 간결하게 만들 수 있습니다. 스트림을 직접 사용하여 메뉴 목록을 가져오는 대신 meal.getMenus()를 호출하면 캡슐화가 개선되고 코드의 가독성이 높아집니다.

        List<Menu> menus = meal.getMenus();


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
Expand Up @@ -28,9 +28,11 @@ public static PartnershipInfo fromEntity(Partnership partnership,
.startDate(partnership.getStartDate())
.endDate(partnership.getEndDate())
.collegeName(partnership.getPartnershipCollege() == null && partnership.getPartnershipDepartment() == null
? "총학생회"
: (partnership.getPartnershipCollege() != null ? partnership.getPartnershipCollege().getName() : null))
.departmentName(partnership.getPartnershipDepartment() != null ? partnership.getPartnershipDepartment().getName() : null)
? "총학생회"
: (partnership.getPartnershipCollege() != null ? partnership.getPartnershipCollege()
.getName() : null))
.departmentName(partnership.getPartnershipDepartment() != null ? partnership.getPartnershipDepartment()
.getName() : null)
.likeCount(restaurant.getLikes() != null ? restaurant.getLikes().size() : 0)
.isLiked(isLiked)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
Expand Down Expand Up @@ -32,7 +30,7 @@ public class Partnership {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "partnership_id")
private Long id;

@Column(name = "description", nullable = false)
private String description;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,19 @@

public interface PartnershipRepository extends JpaRepository<Partnership, Long> {
@Query("""
select distinct pr
from PartnershipRestaurant pr
join fetch pr.partnerships p
left join fetch p.partnershipCollege pc
left join fetch p.partnershipDepartment pd
where
(
pc = :college
or pd = :department
or (pc is null and pd is null)
)
and (p.endDate is null or p.endDate >= current_date)
""")
select distinct pr
from PartnershipRestaurant pr
join fetch pr.partnerships p
left join fetch p.partnershipCollege pc
left join fetch p.partnershipDepartment pd
where
(
pc = :college
or pd = :department
or (pc is null and pd is null)
)
and (p.endDate is null or p.endDate >= current_date)
""")
List<PartnershipRestaurant> findRestaurantsWithMyPartnerships(
@Param("college") College college,
@Param("department") Department department
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@

public interface PartnershipRestaurantRepository extends JpaRepository<PartnershipRestaurant, Long> {
@Query("""
SELECT DISTINCT pr FROM PartnershipRestaurant pr
LEFT JOIN FETCH pr.partnerships p
LEFT JOIN FETCH p.partnershipCollege
LEFT JOIN FETCH p.partnershipDepartment
WHERE p.endDate is null or p.endDate >= CURRENT_DATE""")
SELECT DISTINCT pr FROM PartnershipRestaurant pr
JOIN FETCH pr.partnerships p
LEFT JOIN FETCH p.partnershipCollege
LEFT JOIN FETCH p.partnershipDepartment
WHERE p.endDate IS NULL OR p.endDate >= CURRENT_DATE
""")
List<PartnershipRestaurant> findAllWithDetails();
}
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
Loading