55import com .fund .stockProject .stock .domain .DomesticSector ;
66import com .fund .stockProject .stock .domain .OverseasSector ;
77import com .fund .stockProject .stock .dto .response .*;
8- import com .fund .stockProject .stock .entity .Stock ;
98import com .fund .stockProject .stock .service .StockService ;
10- import com .fund .stockProject .stock .service .SecurityService ;
119import com .fund .stockProject .shortview .dto .ShortViewResponse ;
1210import com .fund .stockProject .common .dto .PageResponse ;
1311
3937public class StockController {
4038
4139 private final StockService stockService ;
42- private final SecurityService securityService ;
4340
4441 @ GetMapping ("/search/{searchKeyword}/{country}" )
4542 @ Operation (summary = "주식 종목 검색 API" , description = "주식 종목 및 인간지표 데이터 검색" )
@@ -116,10 +113,12 @@ ResponseEntity<Mono<List<String>>> getSummarys(@PathVariable("symbol") String sy
116113 }
117114
118115 @ GetMapping ("/sector/domestic/{sector}/recommend" )
119- @ Operation (summary = "국내 섹터별 주식 추천" , description = "특정 국내 섹터의 주식을 점수 기반으로 추천합니다. 실시간 시세 조회 실패 시 가격 필드는 null로 반환됩니다." )
120- public ResponseEntity <ShortViewResponse > getRecommendationByDomesticSector (
116+ @ Operation (summary = "국내 섹터별 주식 추천 (페이징) " , description = "특정 국내 섹터의 주식을 점수 기반으로 추천합니다. 기본 정렬은 인간지표(score) 내림차순이며, 각 항목의 가격은 가능하면 실시간으로 조회해 포함하고 실패 시 null로 반환됩니다." )
117+ public ResponseEntity <PageResponse < ShortViewResponse > > getRecommendationByDomesticSector (
121118 @ io .swagger .v3 .oas .annotations .Parameter (description = "추천할 국내 섹터" , example = "RETAIL" , required = true )
122- @ PathVariable String sector
119+ @ PathVariable String sector ,
120+ @ RequestParam (required = false , defaultValue = "0" ) int page ,
121+ @ RequestParam (required = false , defaultValue = "20" ) int size
123122 ) {
124123 try {
125124 // DomesticSector enum으로 변환
@@ -131,25 +130,13 @@ public ResponseEntity<ShortViewResponse> getRecommendationByDomesticSector(
131130 return ResponseEntity .badRequest ().build ();
132131 }
133132
134- log .info ("DomesticSector({})별 추천을 요청했습니다." , sectorEnum );
135-
136- Stock recommendedStock = stockService .getRecommendedStockByDomesticSector (sectorEnum );
137- if (recommendedStock != null ) {
138- log .info ("DomesticSector({})에서 주식({})을 추천했습니다." , sectorEnum , recommendedStock .getSymbolName ());
139-
140- // 실시간 가격 정보를 동기적으로 가져오기
141- try {
142- var stockInfo = securityService .getRealTimeStockPrice (recommendedStock ).block ();
143- return ResponseEntity .ok (ShortViewResponse .fromEntityWithPrice (recommendedStock , stockInfo ));
144- } catch (Exception e ) {
145- log .warn ("실시간 가격 조회 실패, 기본 정보로 응답합니다. stock_id: {}, error: {}" ,
146- recommendedStock .getId (), e .getMessage ());
147- return ResponseEntity .ok (ShortViewResponse .fromEntity (recommendedStock ));
148- }
149- } else {
150- log .warn ("DomesticSector({})에 대한 추천 주식을 찾을 수 없습니다. (유효한 주식이 없거나 점수가 없음)" , sectorEnum );
151- return ResponseEntity .noContent ().build ();
152- }
133+ log .info ("DomesticSector({})별 추천(paged) 요청: page={}, size={}" , sectorEnum , page , size );
134+
135+ int safeSize = Math .max (1 , Math .min (size , 100 ));
136+ int safePage = Math .max (0 , page );
137+
138+ var pageResp = stockService .getRecommendedStocksByDomesticSectorPaged (sectorEnum , safePage , safeSize );
139+ return ResponseEntity .ok (pageResp );
153140 } catch (Exception e ) {
154141 log .error ("DomesticSector별 추천 중 오류 발생: {}" , sector , e );
155142 return ResponseEntity .status (HttpStatus .INTERNAL_SERVER_ERROR ).build ();
0 commit comments