Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
12 changes: 3 additions & 9 deletions api-owner/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,15 @@ plugins {
}

dependencies {
implementation project(':domain-common')
implementation project(':domain-reservation')
implementation project(':domain-member')
implementation project(':domain-owner')
implementation project(':domain-restaurant')
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
Comment on lines +6 to +7
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

도메인 모듈에서 Feign 클라이언트로의 마이그레이션 확인 필요

Spring Cloud OpenFeign과 Eureka 클라이언트가 추가되고 도메인 모듈 의존성이 제거되었습니다. 이는 BFF 아키텍처로의 중요한 전환입니다. 모든 도메인 모듈 사용처가 Feign 클라이언트로 제대로 마이그레이션되었는지 확인이 필요합니다.

다음 스크립트를 실행하여 제거된 도메인 모듈의 import 문이 남아있는지 확인하세요:


🏁 Script executed:

#!/bin/bash
# Description: 도메인 모듈 import가 남아있는지 확인

# 제거된 도메인 모듈 패키지의 import 확인
rg -n --type=java "import com\.wellmeet\.(reservation|member|owner|restaurant)\.(?!dto)" api-owner/src/

Length of output: 332


🏁 Script executed:

#!/bin/bash
# Description: 제거된 도메인 모듈의 import 문 확인

# --pcre2 플래그를 사용하여 음의 전방탐색을 지원하도록 수정
rg -n --type=java --pcre2 "import com\.wellmeet\.(reservation|member|owner|restaurant)\.(?!dto)" api-owner/src/

Length of output: 293


🏁 Script executed:

#!/bin/bash
# Description: 도메인 모듈 import 확인 (대체 방법 - 더 간단한 패턴)

# 각 도메인 모듈별로 검색 (dto 제외)
echo "=== reservation 모듈 import 확인 ==="
rg -n --type=java "import com\.wellmeet\.reservation\." api-owner/src/ | grep -v "\.dto\."

echo "=== member 모듈 import 확인 ==="
rg -n --type=java "import com\.wellmeet\.member\." api-owner/src/ | grep -v "\.dto\."

echo "=== owner 모듈 import 확인 ==="
rg -n --type=java "import com\.wellmeet\.owner\." api-owner/src/ | grep -v "\.dto\."

echo "=== restaurant 모듈 import 확인 ==="
rg -n --type=java "import com\.wellmeet\.restaurant\." api-owner/src/ | grep -v "\.dto\."

Length of output: 413


🏁 Script executed:

#!/bin/bash
# Description: RestaurantRedisService 사용 현황 확인

# RestaurantRedisService 사용 위치 확인
echo "=== RestaurantRedisService 사용 확인 ==="
rg -n --type=java "RestaurantRedisService" api-owner/src/

# RestaurantEventListener.java 파일 내용 확인
echo ""
echo "=== RestaurantEventListener.java 전체 내용 ==="
cat api-owner/src/main/java/com/wellmeet/global/event/listener/RestaurantEventListener.java

Length of output: 1450


도메인 모듈 의존성 제거 후 RestaurantRedisService import 미정리

도메인 모듈 의존성이 build.gradle에서 제거되었지만, 여전히 도메인 모듈의 RestaurantRedisService를 직접 import하고 있습니다. 이는 런타임 에러를 야기할 수 있습니다.

  • api-owner/src/main/java/com/wellmeet/global/event/listener/RestaurantEventListener.java:4 - import com.wellmeet.restaurant.RestaurantRedisService;
  • api-owner/src/test/java/com/wellmeet/global/event/listener/RestaurantEventListenerTest.java:6 - 테스트 코드도 동일

Feign 클라이언트로 마이그레이션하거나 도메인 모듈 의존성을 유지해야 합니다.

🤖 Prompt for AI Agents
In api-owner/build.gradle around lines 6-7 and in the Java files
api-owner/src/main/java/com/wellmeet/global/event/listener/RestaurantEventListener.java
(line 4) and
api-owner/src/test/java/com/wellmeet/global/event/listener/RestaurantEventListenerTest.java
(line 6), the project removed the domain module dependency but the code still
imports com.wellmeet.restaurant.RestaurantRedisService; remove that direct
domain import and either (a) re-add the domain module dependency to build.gradle
if you intend to keep using RestaurantRedisService directly, or (b) refactor to
a Feign client or an interface provided by api-owner: define a
RestaurantRedisService client interface, implement/annotate it as a Feign client
or adapter, update the production and test code to inject the client/interface
instead of the domain class, and remove the stale imports from both the listener
and its test.


implementation project(':infra-redis')
implementation project(':infra-kafka')

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'

testImplementation(testFixtures(project(':domain-reservation')))
testImplementation(testFixtures(project(':domain-member')))
testImplementation(testFixtures(project(':domain-owner')))
testImplementation(testFixtures(project(':domain-restaurant')))
testImplementation 'io.rest-assured:rest-assured'
}
2 changes: 2 additions & 0 deletions api-owner/src/main/java/com/wellmeet/ApiOwnerApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class ApiOwnerApplication {
public static void main(String[] args) {
SpringApplication.run(ApiOwnerApplication.class, args);
Expand Down
20 changes: 20 additions & 0 deletions api-owner/src/main/java/com/wellmeet/client/MemberClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.wellmeet.client;

import com.wellmeet.client.dto.MemberDTO;
import com.wellmeet.client.dto.request.MemberIdsRequest;
import java.util.List;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(name = "domain-member-service")
public interface MemberClient {

@GetMapping("/api/members/{id}")
MemberDTO getMember(@PathVariable("id") String id);

@PostMapping("/api/members/batch")
List<MemberDTO> getMembersByIds(@RequestBody MemberIdsRequest request);
}
13 changes: 13 additions & 0 deletions api-owner/src/main/java/com/wellmeet/client/OwnerClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.wellmeet.client;

import com.wellmeet.client.dto.OwnerDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = "domain-owner-service")
public interface OwnerClient {

@GetMapping("/api/owners/{id}")
OwnerDTO getOwner(@PathVariable("id") String id);
}
21 changes: 21 additions & 0 deletions api-owner/src/main/java/com/wellmeet/client/ReservationClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.wellmeet.client;

import com.wellmeet.client.dto.ReservationDTO;
import java.util.List;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;

@FeignClient(name = "domain-reservation-service")
public interface ReservationClient {

@GetMapping("/api/reservations/{id}")
ReservationDTO getReservation(@PathVariable("id") Long id);

@GetMapping("/api/reservations/restaurant/{restaurantId}")
List<ReservationDTO> getReservationsByRestaurant(@PathVariable("restaurantId") String restaurantId);

@PutMapping("/api/reservations/{id}/confirm")
void confirmReservation(@PathVariable("id") Long id);
}
41 changes: 41 additions & 0 deletions api-owner/src/main/java/com/wellmeet/client/RestaurantClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.wellmeet.client;

import com.wellmeet.client.dto.AvailableDateDTO;
import com.wellmeet.client.dto.BusinessHourDTO;
import com.wellmeet.client.dto.RestaurantDTO;
import com.wellmeet.client.dto.request.UpdateOperatingHoursDTO;
import com.wellmeet.client.dto.request.UpdateRestaurantDTO;
import java.util.List;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(name = "domain-restaurant-service")
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

서비스 이름이 Eureka에 등록된 이름과 일치하는지 확인하세요.

domain-restaurant-service가 실제 Eureka 서비스 레지스트리에 등록된 서비스 이름과 정확히 일치하는지 검증이 필요합니다.

다음 스크립트로 서비스 이름 사용을 확인할 수 있습니다:


🏁 Script executed:

#!/bin/bash
# Description: Verify service name consistency across Feign clients

# Find all FeignClient annotations and their service names
rg -n '@FeignClient\s*\(\s*name\s*=\s*"[^"]+"\s*\)' -A 1

# Check application properties for service discovery configuration
fd -e yml -e yaml -e properties | xargs rg -n "spring\.application\.name|eureka"

Length of output: 3991


🏁 Script executed:

#!/bin/bash
# Extract spring.application.name from each domain service configuration

echo "=== domain-restaurant ==="
rg -n "spring:\s*application:\s*name" -A 1 domain-restaurant/src/main/resources/application.yml

echo "=== domain-reservation ==="
rg -n "spring:\s*application:\s*name" -A 1 domain-reservation/src/main/resources/application.yml

echo "=== domain-owner ==="
rg -n "spring:\s*application:\s*name" -A 1 domain-owner/src/main/resources/application.yml

echo "=== domain-member ==="
rg -n "spring:\s*application:\s*name" -A 1 domain-member/src/main/resources/application.yml

Length of output: 95


🏁 Script executed:

#!/bin/bash
# Extract application names from YAML files using simpler pattern

echo "=== domain-restaurant application.yml ==="
rg -n "application:" -A 5 domain-restaurant/src/main/resources/application.yml | head -20

echo ""
echo "=== domain-reservation application.yml ==="
rg -n "application:" -A 5 domain-reservation/src/main/resources/application.yml | head -20

echo ""
echo "=== domain-owner application.yml ==="
rg -n "application:" -A 5 domain-owner/src/main/resources/application.yml | head -20

echo ""
echo "=== domain-member application.yml ==="
rg -n "application:" -A 5 domain-member/src/main/resources/application.yml | head -20

Length of output: 914


RestaurantClient의 @FeignClient 이름이 Eureka 등록명과 일치하지 않습니다.

api-owner/src/main/java/com/wellmeet/client/RestaurantClient.java:15@FeignClient(name = "domain-restaurant-service")는 실제 Eureka에 등록된 restaurant-service와 불일치합니다. 이는 서비스 디스커버리 실패를 야기합니다.

수정 필요:

  • @FeignClient(name = "domain-restaurant-service")@FeignClient(name = "restaurant-service")

(다른 클라이언트들은 올바르게 구성됨: ReservationClient, OwnerClient, MemberClient)

🤖 Prompt for AI Agents
In api-owner/src/main/java/com/wellmeet/client/RestaurantClient.java around line
15, the @FeignClient name is set to "domain-restaurant-service" which doesn't
match the Eureka registration "restaurant-service"; update the annotation to use
name = "restaurant-service" so service discovery succeeds, ensuring the rest of
the class and imports remain unchanged.

public interface RestaurantClient {

@GetMapping("/api/restaurants/{id}")
RestaurantDTO getRestaurant(@PathVariable("id") String id);

@GetMapping("/api/restaurants/{restaurantId}/available-dates/{availableDateId}")
AvailableDateDTO getAvailableDate(
@PathVariable("restaurantId") String restaurantId,
@PathVariable("availableDateId") Long availableDateId
);

@PutMapping("/api/restaurants/{id}")
RestaurantDTO updateRestaurant(
@PathVariable("id") String id,
@RequestBody UpdateRestaurantDTO request
);

@GetMapping("/api/restaurants/{restaurantId}/operating-hours")
List<BusinessHourDTO> getOperatingHours(@PathVariable("restaurantId") String restaurantId);

@PutMapping("/api/restaurants/{restaurantId}/operating-hours")
List<BusinessHourDTO> updateOperatingHours(
@PathVariable("restaurantId") String restaurantId,
@RequestBody UpdateOperatingHoursDTO request
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.wellmeet.client.dto;

import java.time.LocalDate;
import java.time.LocalTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AvailableDateDTO {

private Long id;
private LocalDate date;
private LocalTime time;
private int maxCapacity;
private boolean isAvailable;
private String restaurantId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.wellmeet.client.dto;

import java.time.LocalTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BusinessHourDTO {

private Long id;
private String dayOfWeek;
private boolean isOperating;
private LocalTime open;
private LocalTime close;
private LocalTime breakStart;
private LocalTime breakEnd;
}
23 changes: 23 additions & 0 deletions api-owner/src/main/java/com/wellmeet/client/dto/MemberDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.wellmeet.client.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberDTO {

private String id;
private String name;
private String nickname;
private String email;
private String phone;
private boolean reservationEnabled;
private boolean remindEnabled;
private boolean reviewEnabled;
private boolean isVip;
}
19 changes: 19 additions & 0 deletions api-owner/src/main/java/com/wellmeet/client/dto/OwnerDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.wellmeet.client.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OwnerDTO {

private String id;
private String name;
private String email;
private boolean reservationEnabled;
private boolean reviewEnabled;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.wellmeet.client.dto;

import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ReservationDTO {

private Long id;
private String status;
private String restaurantId;
private Long availableDateId;
private String memberId;
private int partySize;
private String specialRequest;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
21 changes: 21 additions & 0 deletions api-owner/src/main/java/com/wellmeet/client/dto/RestaurantDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.wellmeet.client.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RestaurantDTO {

private String id;
private String name;
private String address;
private double latitude;
private double longitude;
private String thumbnail;
private String ownerId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.wellmeet.client.dto.request;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CreateReservationDTO {

private String restaurantId;
private Long availableDateId;
private String memberId;
private int partySize;
private String specialRequest;
}
Comment on lines +1 to +19

Choose a reason for hiding this comment

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

medium

CreateReservationDTO 파일이 api-owner 모듈에 추가되었지만, 현재 모듈 내의 어떤 코드에서도 사용되지 않는 것으로 보입니다. 만약 다른 모듈(예: api-user)에서 사용될 예정이라면, 해당 모듈로 이동하거나 공통 client 모듈로 분리하는 것을 고려해 보세요. 사용되지 않는 코드는 혼란을 야기하고 유지보수 비용을 증가시킬 수 있으므로, api-owner 모듈에 필요하지 않다면 제거하는 것이 좋습니다.

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.wellmeet.client.dto.request;

import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberIdsRequest {

private List<String> memberIds;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.wellmeet.client.dto.request;

import java.time.LocalTime;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UpdateOperatingHoursDTO {

private List<DayHoursDTO> operatingHours;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class DayHoursDTO {
private String dayOfWeek;
private boolean isOperating;
private LocalTime open;
private LocalTime close;
private LocalTime breakStart;
private LocalTime breakEnd;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.wellmeet.client.dto.request;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UpdateRestaurantDTO {

private String name;
private String address;
private double latitude;
private double longitude;
private String thumbnail;
}
Loading