From 88f50fc2facfe8f7f6dcf260fb55b9e3b64bc2f4 Mon Sep 17 00:00:00 2001 From: JaeYong Date: Wed, 20 Sep 2023 09:47:47 +0900 Subject: [PATCH 1/8] =?UTF-8?q?[Fix]=20reserveStock=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 예약 매도 신청 할 때 reserveStock이 제대로 설정 되지 않는 오류 수정 --- .../stockholm/main_project/stock/service/StockOrderService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/StockOrderService.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/StockOrderService.java index 9b8e9c7..f612b92 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/StockOrderService.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/StockOrderService.java @@ -123,7 +123,7 @@ public StockOrder reserveStock(Member member, long price, int stockCount, long c // 보유 주식 설정 StockHold stockHold = stockHoldService.findStockHold(companyId, member.getMemberId()); stockHold.setStockCount(stockHold.getStockCount() - stockCount); - stockHold.setReserveStockCount(stockCount); + stockHold.setReserveStockCount(stockHold.getReserveStockCount() + stockCount); } StockOrder stockOrder = new StockOrder(); From 5e752819481ab057294d500c886ecd08169964b4 Mon Sep 17 00:00:00 2001 From: JaeYong Date: Tue, 3 Oct 2023 21:14:19 +0900 Subject: [PATCH 2/8] =?UTF-8?q?[Feat]=20=ED=9A=8C=EC=82=AC=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=ED=98=B8=EC=B6=9C=20api,=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=ED=8B=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 회사 정보 호출 api 추가 및 스케쥴러에 로직 추가 - 테스트 코드 틀 만들기 --- .../main_project/config/SwaggerConfig.java | 5 +- .../scheduler/StockScheduler.java | 13 ++-- .../stock/controller/CompanyController.java | 10 ++- .../main_project/stock/dto/CompanyInfDto.java | 25 +++++++ .../main_project/stock/entity/Company.java | 6 ++ .../main_project/stock/entity/CompanyInf.java | 71 +++++++++++++++++++ .../main_project/stock/entity/Star.java | 2 + .../stock/mapper/StockMapper.java | 2 + .../repository/CompanyInfRepository.java | 7 ++ .../stock/repository/CompanyRepository.java | 6 +- .../stock/service/ApiCallService.java | 32 +++++++++ .../stock/service/CompanyService.java | 28 +++++++- .../src/main/resources/application.yml | 1 + .../main_project/stock/StockOrderService.java | 28 ++++++++ 14 files changed, 222 insertions(+), 14 deletions(-) create mode 100644 server/008main_project/src/main/java/com/stockholm/main_project/stock/dto/CompanyInfDto.java create mode 100644 server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/CompanyInf.java create mode 100644 server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/CompanyInfRepository.java create mode 100644 server/008main_project/src/test/java/com/stockholm/main_project/stock/StockOrderService.java diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/config/SwaggerConfig.java b/server/008main_project/src/main/java/com/stockholm/main_project/config/SwaggerConfig.java index cc3252e..3f557b6 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/config/SwaggerConfig.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/config/SwaggerConfig.java @@ -2,6 +2,7 @@ import io.swagger.v3.oas.annotations.OpenAPIDefinition; import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.servers.Server; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.security.SecurityRequirement; @@ -23,12 +24,8 @@ public class SwaggerConfig { @Bean public OpenAPI openAPI() { - - // SecuritySecheme명 String jwtSchemeName = "jwtAuth"; - // API 요청헤더에 인증정보 포함 SecurityRequirement securityRequirement = new SecurityRequirement().addList(jwtSchemeName); - // SecuritySchemes 등록 Components components = new Components() .addSecuritySchemes(jwtSchemeName, new SecurityScheme() .name(jwtSchemeName) diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/scheduler/StockScheduler.java b/server/008main_project/src/main/java/com/stockholm/main_project/scheduler/StockScheduler.java index b080e51..5415b29 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/scheduler/StockScheduler.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/scheduler/StockScheduler.java @@ -79,10 +79,15 @@ public void myScheduledStockMinMethod2() throws InterruptedException { } -// @Scheduled(fixedRate = 1000) -// public void run() throws InterruptedException { -// webSocketController.check(); -// } + // 회사 정보 호출 + @Scheduled(cron = "0 0 8 * * MON-FRI") + public void myScheduledUpdateCompanyInfMethod() throws InterruptedException { + LocalDateTime start = LocalDateTime.now(); + companyService.updateCompanyInf(); + LocalDateTime end = LocalDateTime.now(); + Duration duration = Duration.between(start, end); + System.out.println(duration.getSeconds()); + } // @Scheduled(fixedRate = 10000000) // public void secondSchedule() throws InterruptedException { diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/controller/CompanyController.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/controller/CompanyController.java index a76e6eb..6312790 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/stock/controller/CompanyController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/controller/CompanyController.java @@ -1,9 +1,12 @@ package com.stockholm.main_project.stock.controller; +import com.stockholm.main_project.stock.dto.CompanyInfDto; import com.stockholm.main_project.stock.dto.CompanyResponseDto; import com.stockholm.main_project.stock.dto.StockMinResponseDto; import com.stockholm.main_project.stock.entity.Company; +import com.stockholm.main_project.stock.entity.CompanyInf; import com.stockholm.main_project.stock.mapper.StockMapper; +import com.stockholm.main_project.stock.service.ApiCallService; import com.stockholm.main_project.stock.service.CompanyService; import com.stockholm.main_project.stock.service.StockMinService; import io.swagger.v3.oas.annotations.Operation; @@ -31,12 +34,14 @@ public class CompanyController { private final CompanyService companyService; private final StockMapper stockMapper; - private StockMinService stockMinService; + private final StockMinService stockMinService; + private final ApiCallService apiCallService; - public CompanyController(CompanyService companyService, StockMapper stockMapper, StockMinService stockMinService) { + public CompanyController(CompanyService companyService, StockMapper stockMapper, StockMinService stockMinService, ApiCallService apiCallService) { this.companyService = companyService; this.stockMapper = stockMapper; this.stockMinService = stockMinService; + this.apiCallService = apiCallService; } // swagger 추가 @Operation(summary = "CompanyList 가져오기", description = "CompanyList를 Get해 옵니다", tags = { "Company" }) @@ -89,4 +94,5 @@ public ResponseEntity getCompanyChart(@PathVariable("companyId") long companyId) return new ResponseEntity(stockMinList, HttpStatus.OK); } + } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/dto/CompanyInfDto.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/dto/CompanyInfDto.java new file mode 100644 index 0000000..c61d861 --- /dev/null +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/dto/CompanyInfDto.java @@ -0,0 +1,25 @@ +package com.stockholm.main_project.stock.dto; + +import lombok.*; + +@Setter +@Getter +@NoArgsConstructor +public class CompanyInfDto { + private CompanyInfOutput output; + + @Getter + @Setter + @NoArgsConstructor + public class CompanyInfOutput { + // 상장 주수 + private String lstn_stcn; + // 시가 총액 + private String hts_avls; + // 52주 최고가 + private String w52_hgpr; + // 52주 최저가 + private String w52_lwpr; + } + +} diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/Company.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/Company.java index 68d9a4d..84de7a5 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/Company.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/Company.java @@ -22,10 +22,16 @@ public class Company extends Auditable { @Column private String korName; + @Column + private String imageUrl; + @OneToOne(mappedBy = "company", cascade = CascadeType.ALL) private StockAsBi stockAsBi; @OneToOne(mappedBy = "company", cascade = CascadeType.ALL) private StockInf stockInf; + @OneToOne(mappedBy ="company", cascade = CascadeType.ALL) + private CompanyInf companyInf; + } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/CompanyInf.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/CompanyInf.java new file mode 100644 index 0000000..ef3c63f --- /dev/null +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/CompanyInf.java @@ -0,0 +1,71 @@ +package com.stockholm.main_project.stock.entity; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class CompanyInf { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long companyInfId; + + @Column + // 상장 주수 + private String lstn_stcn; + + @Column + // 시가 총액 + private String hts_avls; + + @Column + // 52주 최고가 + private String w52_hgpr; + + @Column + // 52주 최저가 + private String w52_lwpr; + + @Column + // 산업군 + private String industry; + + @Column + // 세부 산업군 + private String detailed_Industry; + + @Column + // 기업 개요 + private String company_Overview; + + @OneToOne + @JoinColumn(name = "COMPANY_ID") + private Company company; + + @Builder + public CompanyInf(long companyInfId, String lstn_stcn, String hts_avls, String w52_hgpr, String w52_lwpr, String industry, String detailed_Industry, String company_Overview, Company company) { + this.companyInfId = companyInfId; + this.lstn_stcn = lstn_stcn; + this.hts_avls = hts_avls; + this.w52_hgpr = w52_hgpr; + this.w52_lwpr = w52_lwpr; + this.industry = industry; + this.detailed_Industry = detailed_Industry; + this.company_Overview = company_Overview; + this.company = company; + } + + public CompanyInfBuilder updateCompanyInf() { + return builder() + .companyInfId(this.companyInfId) + .company(this.company) + .company_Overview(this.company_Overview) + .industry(this.industry) + .detailed_Industry(this.detailed_Industry); + } +} \ No newline at end of file diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/Star.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/Star.java index 12ea542..8ed2858 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/Star.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/entity/Star.java @@ -27,4 +27,6 @@ public class Star extends Auditable { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "COMPANY_ID") private Company company; + + } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/mapper/StockMapper.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/mapper/StockMapper.java index 804b37d..930358e 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/stock/mapper/StockMapper.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/mapper/StockMapper.java @@ -88,4 +88,6 @@ default List starsToStarResponseDtos(List stars) { } return starResponseDtos; } + + CompanyInf companyInfDtoToCompanyInf(CompanyInfDto companyInfDto); } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/CompanyInfRepository.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/CompanyInfRepository.java new file mode 100644 index 0000000..5702166 --- /dev/null +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/CompanyInfRepository.java @@ -0,0 +1,7 @@ +package com.stockholm.main_project.stock.repository; + +import com.stockholm.main_project.stock.entity.CompanyInf; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CompanyInfRepository extends JpaRepository { +} diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/CompanyRepository.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/CompanyRepository.java index ace6e97..1d0ac8b 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/CompanyRepository.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/CompanyRepository.java @@ -9,11 +9,11 @@ public interface CompanyRepository extends JpaRepository { - @Query("SELECT c FROM Company c JOIN FETCH c.stockAsBi JOIN FETCH c.stockInf WHERE c.code = :code") + @Query("SELECT c FROM Company c JOIN FETCH c.stockAsBi JOIN FETCH c.stockInf JOIN FETCH c.companyInf WHERE c.code = :code") Company findByCode(@Param("code") String code); - @Query("SELECT c FROM Company c JOIN FETCH c.stockAsBi JOIN FETCH c.stockInf WHERE c.companyId = :companyId") + @Query("SELECT c FROM Company c JOIN FETCH c.stockAsBi JOIN FETCH c.stockInf JOIN FETCH c.companyInf WHERE c.companyId = :companyId") Company findByCompanyId(@Param("companyId") long companyId); - @Query("SELECT c from Company c join fetch c.stockAsBi JOIN FETCH c.stockInf") + @Query("SELECT c from Company c join fetch c.stockAsBi JOIN FETCH c.stockInf JOIN FETCH c.companyInf") List findAll(); } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/ApiCallService.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/ApiCallService.java index 5e16581..f2cb7f1 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/ApiCallService.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/ApiCallService.java @@ -1,7 +1,9 @@ package com.stockholm.main_project.stock.service; +import com.stockholm.main_project.stock.dto.CompanyInfDto; import com.stockholm.main_project.stock.dto.StockasbiDataDto; import com.stockholm.main_project.stock.dto.StockMinDto; +import com.stockholm.main_project.stock.entity.CompanyInf; import com.stockholm.main_project.stock.repository.CompanyRepository; import com.stockholm.main_project.utils.Time; import lombok.Getter; @@ -44,6 +46,10 @@ public class ApiCallService { @Value("${stock-url.kospi}") private String KOSPI_URL; + @Getter + @Value("${stock-url.companyInf}") + private String COMPANY_URL; + private final String FID_ETC_CLS_CODE = ""; private final String FID_COND_MRKT_DIV_CODE = "J"; @@ -142,4 +148,30 @@ public String getKospiMonthFromApi(){ } + public CompanyInfDto getCompayInfFromApi(String stockCode){ + String token = tokenService.getAccessToken(); + + HttpHeaders headers = new HttpHeaders(); + headers.add("Authorization", "Bearer " + token); + headers.add("appkey", APP_KEY); + headers.add("appsecret", APP_SECRET); + headers.add("tr_id", "FHKST01010100"); + + String uri = COMPANY_URL + "?FID_COND_MRKT_DIV_CODE=J&FID_INPUT_ISCD=" + stockCode; + + HttpEntity entity = new HttpEntity<>("parameters", headers); + + ResponseEntity response = restTemplate.exchange(uri, HttpMethod.GET, entity, new ParameterizedTypeReference() {}); + + if (response.getStatusCode().is2xxSuccessful()) { + CompanyInfDto companyInfDto = response.getBody(); + log.info("실행"); + return companyInfDto; + } else { + log.info("error"); + return null; + } + + } + } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/CompanyService.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/CompanyService.java index f506e91..fb93af7 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/CompanyService.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/CompanyService.java @@ -1,24 +1,32 @@ package com.stockholm.main_project.stock.service; +import com.stockholm.main_project.stock.dto.CompanyInfDto; import com.stockholm.main_project.stock.dto.StockasbiDataDto; import com.stockholm.main_project.stock.entity.Company; +import com.stockholm.main_project.stock.entity.CompanyInf; import com.stockholm.main_project.stock.entity.StockAsBi; import com.stockholm.main_project.stock.mapper.ApiMapper; +import com.stockholm.main_project.stock.repository.CompanyInfRepository; import com.stockholm.main_project.stock.repository.CompanyRepository; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.List; +@Slf4j @Service @Transactional public class CompanyService { private final CompanyRepository companyRepository; + private final CompanyInfRepository companyInfRepository; private final ApiCallService apiCallService; private final ApiMapper apiMapper; - public CompanyService(CompanyRepository companyRepository, ApiCallService apiCallService, ApiMapper apiMapper) { + + public CompanyService(CompanyRepository companyRepository, CompanyInfRepository companyInfRepository, ApiCallService apiCallService, ApiMapper apiMapper) { this.companyRepository = companyRepository; + this.companyInfRepository = companyInfRepository; this.apiCallService = apiCallService; this.apiMapper = apiMapper; } @@ -80,6 +88,24 @@ public void fillCompaines() throws InterruptedException { } } + public void updateCompanyInf() throws InterruptedException { + List companies = companyRepository.findAll(); + log.info(String.valueOf(companies.size())); + for(Company company : companies) { + CompanyInfDto companyInfDto = apiCallService.getCompayInfFromApi(company.getCode()); + CompanyInf companyInf = company.getCompanyInf(); + companyInf = companyInf.updateCompanyInf() + .lstn_stcn(companyInfDto.getOutput().getLstn_stcn()) + .hts_avls(companyInfDto.getOutput().getHts_avls()) + .w52_hgpr(companyInfDto.getOutput().getW52_hgpr()) + .w52_lwpr(companyInfDto.getOutput().getW52_lwpr()) + .build(); + company.setCompanyInf(companyInf); + companyRepository.save(company); + Thread.sleep(500); + } + } + } diff --git a/server/008main_project/src/main/resources/application.yml b/server/008main_project/src/main/resources/application.yml index 0e1f8de..aa9fb1f 100644 --- a/server/008main_project/src/main/resources/application.yml +++ b/server/008main_project/src/main/resources/application.yml @@ -106,6 +106,7 @@ stock-url: stockasbi: "https://openapivts.koreainvestment.com:29443/uapi/domestic-stock/v1/quotations/inquire-asking-price-exp-ccn" stockhour: "https://openapivts.koreainvestment.com:29443/uapi/domestic-stock/v1/quotations/inquire-time-itemchartprice" kospi: "https://openapivts.koreainvestment.com:29443/uapi/domestic-stock/v1/quotations/inquire-daily-indexchartprice" + companyInf: "https://openapivts.koreainvestment.com:29443/uapi/domestic-stock/v1/quotations/inquire-price" jwt: key: ${JWT_SECRET_KEY} diff --git a/server/008main_project/src/test/java/com/stockholm/main_project/stock/StockOrderService.java b/server/008main_project/src/test/java/com/stockholm/main_project/stock/StockOrderService.java new file mode 100644 index 0000000..fc80eec --- /dev/null +++ b/server/008main_project/src/test/java/com/stockholm/main_project/stock/StockOrderService.java @@ -0,0 +1,28 @@ +package com.stockholm.main_project.stock; + +import com.stockholm.main_project.member.entity.Member; +import com.stockholm.main_project.member.repository.MemberRepository; +import com.stockholm.main_project.stock.dto.CompanyResponseDto; +import com.stockholm.main_project.stock.repository.CompanyRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +@DataJpaTest +public class StockOrderService { + private MemberRepository memberRepository; + private StockOrderService stockOrderService; + + public StockOrderService(StockOrderService stockOrderService) { + this.stockOrderService = stockOrderService; + } + + + @Test + public void buyStock() { + //given + //when + + //then + } +} From 4c2cd59f65800f5e99ad858c954b23f5509c8e5d Mon Sep 17 00:00:00 2001 From: rkddnr Date: Wed, 4 Oct 2023 18:42:39 +0900 Subject: [PATCH 3/8] =?UTF-8?q?"FEAT:=20=EC=9E=90=EC=B2=B4=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/modules.xml | 1 - .../auth/filter/JwtAuthenticationFilter.java | 7 ++- .../auth/filter/JwtVerificationFilter.java | 21 +++++++++ .../OAuth2AuthenticationSuccessHandler.java | 5 +- .../main_project/auth/jwt/JwtTokenizer.java | 3 +- .../auth/jwt/RefreshTokenService.java | 46 +++++++++++++++++++ .../auth/jwt/TokenController.java | 28 +++++++++++ .../auth/jwt/TokenRefreshRequest.java | 14 ++++++ 8 files changed, 119 insertions(+), 6 deletions(-) create mode 100644 server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/RefreshTokenService.java create mode 100644 server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenController.java create mode 100644 server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenRefreshRequest.java diff --git a/.idea/modules.xml b/.idea/modules.xml index 7f32e8d..94f9a64 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,7 +3,6 @@ - diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/filter/JwtAuthenticationFilter.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/filter/JwtAuthenticationFilter.java index 0837423..4dcf75d 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/filter/JwtAuthenticationFilter.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/filter/JwtAuthenticationFilter.java @@ -61,7 +61,6 @@ protected void successfulAuthentication(HttpServletRequest request, private String delegateAccessToken(Member member) { Map claims = new HashMap<>(); claims.put("memberId", member.getMemberId()); //Context에 member객체를 올려두기 위해 추가 - claims.put("email", member.getEmail()); claims.put("roles", member.getRoles()); String subject = member.getEmail(); @@ -75,11 +74,15 @@ private String delegateAccessToken(Member member) { } private String delegateRefreshToken(Member member) { + Map claims = new HashMap<>(); + claims.put("memberId", member.getMemberId()); + claims.put("roles", member.getRoles()); + String subject = member.getEmail(); Date expiration = jwtTokenizer.getTokenExpiration(jwtTokenizer.getRefreshTokenExpirationMinutes()); String base64EncodedSecretKey = jwtTokenizer.encodeBase64SecretKey(jwtTokenizer.getSecretKey()); - String refreshToken = jwtTokenizer.generateRefreshToken(subject, expiration, base64EncodedSecretKey); + String refreshToken = jwtTokenizer.generateRefreshToken(claims, subject, expiration, base64EncodedSecretKey); return refreshToken; } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/filter/JwtVerificationFilter.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/filter/JwtVerificationFilter.java index 6a4a788..24ac505 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/filter/JwtVerificationFilter.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/filter/JwtVerificationFilter.java @@ -5,6 +5,7 @@ import com.stockholm.main_project.member.entity.Member; import com.stockholm.main_project.member.service.MemberService; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -16,10 +17,13 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j +@Configuration public class JwtVerificationFilter extends OncePerRequestFilter { private final JwtTokenizer jwtTokenizer; private final CustomAuthorityUtils authorityUtils; @@ -36,6 +40,7 @@ public JwtVerificationFilter(JwtTokenizer jwtTokenizer, @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { Map claims = verifyJws(request); + setAuthenticationToContext(claims); filterChain.doFilter(request, response); } @@ -63,4 +68,20 @@ private void setAuthenticationToContext(Map claims) { Authentication authentication = new UsernamePasswordAuthenticationToken(member, null, authorities); SecurityContextHolder.getContext().setAuthentication(authentication); } + + public String generateAccessTokenFromRefreshToken(Map claims) { + String subject = (String) claims.get("email"); + + Date expiration = jwtTokenizer.getTokenExpiration(jwtTokenizer.getAccessTokenExpirationMinutes()); + String base64EncodedSecretKey = jwtTokenizer.encodeBase64SecretKey(jwtTokenizer.getSecretKey()); + + Map accessTokenClaims = new HashMap<>(); + accessTokenClaims.put("email", subject); + accessTokenClaims.put("memberId", claims.get("memberId")); + accessTokenClaims.put("roles", claims.get("roles")); + + String newAccessToken = jwtTokenizer.generateAccessToken(accessTokenClaims, subject, expiration, base64EncodedSecretKey); + + return newAccessToken; + } } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/handler/OAuth2AuthenticationSuccessHandler.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/handler/OAuth2AuthenticationSuccessHandler.java index ae42c29..96745e3 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/handler/OAuth2AuthenticationSuccessHandler.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/handler/OAuth2AuthenticationSuccessHandler.java @@ -86,13 +86,14 @@ private String delegateAccessToken(String username, List authorities) { } private String delegateRefreshToken(String username) { - + Map claims = new HashMap<>(); + claims.put("email", username); String subject = username; Date expiration = jwtTokenizer.getTokenExpiration(jwtTokenizer.getRefreshTokenExpirationMinutes()); String base64EncodedSecretKey = jwtTokenizer.encodeBase64SecretKey(jwtTokenizer.getSecretKey()); - String refreshToken = jwtTokenizer.generateRefreshToken(subject, expiration, base64EncodedSecretKey); + String refreshToken = jwtTokenizer.generateRefreshToken(claims, subject, expiration, base64EncodedSecretKey); return refreshToken; } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/JwtTokenizer.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/JwtTokenizer.java index 8049e97..0db27e6 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/JwtTokenizer.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/JwtTokenizer.java @@ -53,10 +53,11 @@ public String generateAccessToken(Map claims, .compact(); } - public String generateRefreshToken(String subject, Date expiration, String base64EncodedSecretKey){ + public String generateRefreshToken(Map claims, String subject, Date expiration, String base64EncodedSecretKey){ Key key = getKeyFromBase64EncodedKey(base64EncodedSecretKey); return Jwts.builder() + .setClaims(claims) .setSubject(subject) .setIssuedAt(Calendar.getInstance().getTime()) .setExpiration(expiration) diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/RefreshTokenService.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/RefreshTokenService.java new file mode 100644 index 0000000..b22b24d --- /dev/null +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/RefreshTokenService.java @@ -0,0 +1,46 @@ +package com.stockholm.main_project.auth.jwt; + +import com.stockholm.main_project.auth.filter.JwtVerificationFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +@Service +public class RefreshTokenService { + + @Autowired + private JwtTokenizer jwtTokenizer; + + private final JwtVerificationFilter jwtVerificationFilter; + + public RefreshTokenService(JwtVerificationFilter jwtVerificationFilter) { + this.jwtVerificationFilter = jwtVerificationFilter; + } + + public String requestNewAccessToken(String refreshToken) throws Exception { + // 리프레시 토큰을 검증하고, 필요한 클레임을 추출합니다. + Map refreshTokenClaims = validateRefreshToken(refreshToken); + + // 새로운 액세스 토큰을 생성합니다. + String newAccessToken = jwtVerificationFilter.generateAccessTokenFromRefreshToken(refreshTokenClaims); + + return newAccessToken; + } + + private Map validateRefreshToken(String refreshToken) throws Exception { + try { + String base64EncodedSecretKey = jwtTokenizer.encodeBase64SecretKey(jwtTokenizer.getSecretKey()); + + // 리프레시 토큰을 검증하고 클레임을 추출합니다. + Map refreshTokenClaims = jwtTokenizer.getClaims(refreshToken, base64EncodedSecretKey).getBody(); + + // 여기에서 리프레시 토큰의 유효성을 추가적으로 검증하거나 필요한 클레임을 확인할 수 있습니다. + + return refreshTokenClaims; + } catch (Exception e) { + throw new Exception("Invalid refresh token", e); + } + } + +} diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenController.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenController.java new file mode 100644 index 0000000..e153275 --- /dev/null +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenController.java @@ -0,0 +1,28 @@ +package com.stockholm.main_project.auth.jwt; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/tokens") +public class TokenController { + + @Autowired + private RefreshTokenService refreshTokenService; + + @PostMapping("/refresh") + public ResponseEntity refreshAccessToken(@RequestBody TokenRefreshRequest tokenRefreshRequest) { + try { + String newAccessToken = refreshTokenService.requestNewAccessToken(tokenRefreshRequest.getRefreshToken()); + return ResponseEntity.ok(newAccessToken); + } catch (Exception e) { + // 실패한 경우 401 Unauthorized 상태 코드 반환 + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } + } +} diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenRefreshRequest.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenRefreshRequest.java new file mode 100644 index 0000000..b23068f --- /dev/null +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenRefreshRequest.java @@ -0,0 +1,14 @@ +package com.stockholm.main_project.auth.jwt; + +public class TokenRefreshRequest { + + private String refreshToken; + + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } +} \ No newline at end of file From 946f486a8d3ffb77e6a2afd1e71f9577075236c1 Mon Sep 17 00:00:00 2001 From: rkddnr Date: Mon, 9 Oct 2023 15:24:03 +0900 Subject: [PATCH 4/8] =?UTF-8?q?"FEAT:=20=EC=9E=90=EC=B2=B4=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main_project/auth/dto/TokenDto.java | 16 ---------------- .../OAuth2AuthenticationSuccessHandler.java | 10 +++++++--- .../auth/jwt/TokenRefreshRequest.java | 14 -------------- .../{ => refreshToken}/RefreshTokenService.java | 7 +++++-- .../jwt/{ => refreshToken}/TokenController.java | 6 +++--- .../jwt/refreshToken/TokenRefreshRequestDto.java | 12 ++++++++++++ .../main_project/exception/ExceptionCode.java | 4 +++- 7 files changed, 30 insertions(+), 39 deletions(-) delete mode 100644 server/008main_project/src/main/java/com/stockholm/main_project/auth/dto/TokenDto.java delete mode 100644 server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenRefreshRequest.java rename server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/{ => refreshToken}/RefreshTokenService.java (83%) rename server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/{ => refreshToken}/TokenController.java (85%) create mode 100644 server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenRefreshRequestDto.java diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/dto/TokenDto.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/dto/TokenDto.java deleted file mode 100644 index 52008e9..0000000 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/dto/TokenDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.stockholm.main_project.auth.dto; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -public class TokenDto { - - @AllArgsConstructor - @Getter - public static class Response { - private String accessToken; - private String refreshToken; - } -} \ No newline at end of file diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/handler/OAuth2AuthenticationSuccessHandler.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/handler/OAuth2AuthenticationSuccessHandler.java index 96745e3..4d23d18 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/handler/OAuth2AuthenticationSuccessHandler.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/handler/OAuth2AuthenticationSuccessHandler.java @@ -48,7 +48,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // 액세스 토큰 및 리프레시 토큰 생성 String accessToken = delegateAccessToken(email, authorities); - String refreshToken = delegateRefreshToken(email); + String refreshToken = delegateRefreshToken(email, authorities); // 헤더에 토큰 추가 response.addHeader("Authorization", "Bearer " + accessToken); @@ -60,7 +60,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo private void redirect(HttpServletRequest request, HttpServletResponse response, String username, List authorities) throws IOException { String accessToken = delegateAccessToken(username, authorities); - String refreshToken = delegateRefreshToken(username); + String refreshToken = delegateRefreshToken(username, authorities); String uri = createURI(accessToken, refreshToken).toString(); getRedirectStrategy().sendRedirect(request, response, uri); @@ -85,9 +85,13 @@ private String delegateAccessToken(String username, List authorities) { return accessToken; } - private String delegateRefreshToken(String username) { + private String delegateRefreshToken(String username, List authorities) { + int memberId = memberService.findMemberIdByEmail(username); + Map claims = new HashMap<>(); claims.put("email", username); + claims.put("roles", authorities); + claims.put("memberId", memberId); String subject = username; Date expiration = jwtTokenizer.getTokenExpiration(jwtTokenizer.getRefreshTokenExpirationMinutes()); diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenRefreshRequest.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenRefreshRequest.java deleted file mode 100644 index b23068f..0000000 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenRefreshRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.stockholm.main_project.auth.jwt; - -public class TokenRefreshRequest { - - private String refreshToken; - - public String getRefreshToken() { - return refreshToken; - } - - public void setRefreshToken(String refreshToken) { - this.refreshToken = refreshToken; - } -} \ No newline at end of file diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/RefreshTokenService.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/RefreshTokenService.java similarity index 83% rename from server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/RefreshTokenService.java rename to server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/RefreshTokenService.java index b22b24d..19b4720 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/RefreshTokenService.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/RefreshTokenService.java @@ -1,6 +1,9 @@ -package com.stockholm.main_project.auth.jwt; +package com.stockholm.main_project.auth.jwt.refreshToken; import com.stockholm.main_project.auth.filter.JwtVerificationFilter; +import com.stockholm.main_project.auth.jwt.JwtTokenizer; +import com.stockholm.main_project.exception.BusinessLogicException; +import com.stockholm.main_project.exception.ExceptionCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -39,7 +42,7 @@ private Map validateRefreshToken(String refreshToken) throws Exc return refreshTokenClaims; } catch (Exception e) { - throw new Exception("Invalid refresh token", e); + throw new BusinessLogicException(ExceptionCode.INVALID_REFRESH_TOKEN); } } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenController.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenController.java similarity index 85% rename from server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenController.java rename to server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenController.java index e153275..12e6fcc 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/TokenController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenController.java @@ -1,4 +1,4 @@ -package com.stockholm.main_project.auth.jwt; +package com.stockholm.main_project.auth.jwt.refreshToken; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -16,9 +16,9 @@ public class TokenController { private RefreshTokenService refreshTokenService; @PostMapping("/refresh") - public ResponseEntity refreshAccessToken(@RequestBody TokenRefreshRequest tokenRefreshRequest) { + public ResponseEntity refreshAccessToken(@RequestBody TokenRefreshRequestDto tokenRefreshRequestDto) { try { - String newAccessToken = refreshTokenService.requestNewAccessToken(tokenRefreshRequest.getRefreshToken()); + String newAccessToken = refreshTokenService.requestNewAccessToken(tokenRefreshRequestDto.getRefreshToken()); return ResponseEntity.ok(newAccessToken); } catch (Exception e) { // 실패한 경우 401 Unauthorized 상태 코드 반환 diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenRefreshRequestDto.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenRefreshRequestDto.java new file mode 100644 index 0000000..a8b73a9 --- /dev/null +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenRefreshRequestDto.java @@ -0,0 +1,12 @@ +package com.stockholm.main_project.auth.jwt.refreshToken; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class TokenRefreshRequestDto { + + private String refreshToken; + +} \ No newline at end of file diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java b/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java index 90f2c84..ae7b1ad 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java @@ -24,7 +24,9 @@ public enum ExceptionCode { AWS_CREDENTIALS_ERROR(401, "AWS 인증 오류"), S3_UPLOAD_ERROR(500, "S3 파일 업로드 중 오류 발생"), S3_DELETE_ERROR(500, "S3 파일 삭제 중 오류 발생"), - S3_URL_RETRIEVE_ERROR(500, "S3에서 파일 URL 검색 중 오류 발생"); + S3_URL_RETRIEVE_ERROR(500, "S3에서 파일 URL 검색 중 오류 발생"), + INVALID_REFRESH_TOKEN(401, "리플레쉬 토큰이 유효하지 않습니다."); + @Getter From 7c659a557f2d02a4aa5a71c89efcf11f5ff5d7ec Mon Sep 17 00:00:00 2001 From: rkddnr Date: Tue, 10 Oct 2023 20:24:41 +0900 Subject: [PATCH 5/8] =?UTF-8?q?FIX:=20"API=20=EB=AC=B8=EC=84=9C=ED=99=94?= =?UTF-8?q?=20=EC=9E=91=EC=97=85"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jwt/refreshToken/TokenController.java | 19 +++++++--- .../refreshToken/TokenRefreshRequestDto.java | 3 +- .../commnet/controller/CommentController.java | 30 +++++++++++++-- .../board/commnet/dto/CommentRequestDto.java | 2 + .../board/commnet/dto/CommentResponseDto.java | 6 +++ .../board/controller/BoardController.java | 37 ++++++++++--------- .../dto/responseDto/AllBoardResponseDto.java | 9 +++++ .../dto/responseDto/BoardCommentDto.java | 6 +++ .../responseDto/SingleBoardResponseDto.java | 8 ++++ .../cash/controller/CashController.java | 7 ++-- .../member/controller/MemberController.java | 9 +++-- .../swaggersample/HelloController.java | 4 +- 12 files changed, 103 insertions(+), 37 deletions(-) diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenController.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenController.java index 12e6fcc..110c901 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenController.java @@ -1,5 +1,10 @@ package com.stockholm.main_project.auth.jwt.refreshToken; +import com.stockholm.main_project.member.dto.MemberResponseDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -15,14 +20,16 @@ public class TokenController { @Autowired private RefreshTokenService refreshTokenService; + @Operation(summary = "엑세스 토큰 재 발급", description = "엑세스 토큰을 재 발급합니다.", tags = { "Token" }) + @ApiResponse(responseCode = "200", description = "OK", + content = @Content(schema = @Schema(implementation = TokenRefreshRequestDto.class))) + @ApiResponse(responseCode = "401", description = "INVALID REFRESH TOKEN") + @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @PostMapping("/refresh") - public ResponseEntity refreshAccessToken(@RequestBody TokenRefreshRequestDto tokenRefreshRequestDto) { - try { + public ResponseEntity refreshAccessToken(@RequestBody TokenRefreshRequestDto tokenRefreshRequestDto) throws Exception { + String newAccessToken = refreshTokenService.requestNewAccessToken(tokenRefreshRequestDto.getRefreshToken()); return ResponseEntity.ok(newAccessToken); - } catch (Exception e) { - // 실패한 경우 401 Unauthorized 상태 코드 반환 - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - } + } } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenRefreshRequestDto.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenRefreshRequestDto.java index a8b73a9..12c8a4f 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenRefreshRequestDto.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenRefreshRequestDto.java @@ -1,12 +1,13 @@ package com.stockholm.main_project.auth.jwt.refreshToken; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @Getter @Setter public class TokenRefreshRequestDto { - + @Schema(description = "refreshToken", defaultValue = "eyJhbGciOiJIUzI1NiJ9.eyJyb2xlcyI6WyJVU0VSIl0sIm1lbWJlcklkIjoxMDMsInN1YiI6InRlc3QwMTUxQG5hdmVyLmNvbSIsImlhdCI6MTY5NjkzNTA1NSwiZXhwIjoxNjk2OTYwMjU1fQ.F9IfWW_EKd7cFGYtd95B3_CcfSr2w1HLmIlEMK0fyN") private String refreshToken; } \ No newline at end of file diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/controller/CommentController.java b/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/controller/CommentController.java index 9e3f109..329d88a 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/controller/CommentController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/controller/CommentController.java @@ -9,7 +9,14 @@ import com.stockholm.main_project.board.entity.Board; import com.stockholm.main_project.board.service.BoardService; +import com.stockholm.main_project.member.dto.MemberPostDto; import com.stockholm.main_project.member.entity.Member; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -30,8 +37,14 @@ public CommentController(CommentService commentService, BoardService boardServic this.mapper = mapper; } + @Operation(summary = "댓글 생성", description = "새로운 댓글을 생성합니다.", tags = { "Comment" }) + @ApiResponse(responseCode = "201", description = "CREATED", + content = @Content(schema = @Schema(implementation = CommentResponseDto.class))) + @ApiResponse(responseCode = "400", description = "BAD REQUEST") + @ApiResponse(responseCode = "404", description = "NOT FOUND") + @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @PostMapping - public ResponseEntity postComment(@PathVariable long boardId, @RequestBody CommentRequestDto commentRequestDto, @AuthenticationPrincipal Member member){ + public ResponseEntity postComment(@Schema(implementation = CommentRequestDto.class)@PathVariable long boardId, @RequestBody CommentRequestDto commentRequestDto,@Parameter(hidden = true) @AuthenticationPrincipal Member member){ Comment comment = mapper.commentRequestDtoToComment(commentRequestDto); comment.setBoard(boardService.findBoard(boardId)); @@ -41,11 +54,17 @@ public ResponseEntity postComment(@PathVariable long boardId, @RequestBody Comme CommentResponseDto responseDto = mapper.commentToCommentResponseDto(createdComment); return new ResponseEntity<>(responseDto, HttpStatus.CREATED); } + @Operation(summary = "댓글 수정", description = "작성한 댓글을 수정합니다.", tags = { "Comment" }) + @ApiResponse(responseCode = "200", description = "OK", + content = @Content(schema = @Schema(implementation = CommentResponseDto.class))) + @ApiResponse(responseCode = "400", description = "BAD REQUEST") + @ApiResponse(responseCode = "404", description = "INVALID FAILED") + @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @PatchMapping("{commentId}") public ResponseEntity updateComment(@PathVariable long boardId, @PathVariable long commentId, @RequestBody CommentRequestDto commentRequestDto, - @AuthenticationPrincipal Member member){ + @Parameter(hidden = true) @AuthenticationPrincipal Member member){ Comment comment = mapper.commentRequestDtoToComment(commentRequestDto); comment.setCommentId(commentId); @@ -56,8 +75,13 @@ public ResponseEntity updateComment(@PathVariable long boardId, return new ResponseEntity<>(responseDto, HttpStatus.OK); } + @Operation(summary = "댓글 삭제", description = "작성한 댓글를 삭제합니다.", tags = { "Comment" }) + @ApiResponse(responseCode = "204", description = "NO CONTENT") + @ApiResponse(responseCode = "400", description = "BAD REQUEST") + @ApiResponse(responseCode = "404", description = "INVALID FAILED") + @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @DeleteMapping("{commentId}") - public ResponseEntity deleteComment(@PathVariable long boardId, @PathVariable long commentId, @AuthenticationPrincipal Member member) { + public ResponseEntity deleteComment(@PathVariable long boardId, @PathVariable long commentId,@Parameter(hidden = true) @AuthenticationPrincipal Member member) { commentService.deleteComment(commentId, member); diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/dto/CommentRequestDto.java b/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/dto/CommentRequestDto.java index 75f2a64..20e2faa 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/dto/CommentRequestDto.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/dto/CommentRequestDto.java @@ -1,10 +1,12 @@ package com.stockholm.main_project.board.commnet.dto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @Getter @Setter public class CommentRequestDto { + @Schema(description = "댓글 내용", defaultValue = "TestComments") private String content; } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/dto/CommentResponseDto.java b/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/dto/CommentResponseDto.java index d8a36a8..4d44b07 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/dto/CommentResponseDto.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/dto/CommentResponseDto.java @@ -1,14 +1,20 @@ package com.stockholm.main_project.board.commnet.dto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @Getter @Setter public class CommentResponseDto { + @Schema(description = "댓글 commentId", defaultValue = "1") private Long commentId; + @Schema(description = "댓글 작성자", defaultValue = "TestAccount") private String member; + @Schema(description = "댓글 내용", defaultValue = "TestComments") private String content; + @Schema(description = "댓글 생성 날짜", defaultValue = "2023-11-10T10:51:17.549Z") private String createdAt; + @Schema(description = "댓글 수정 날짜", defaultValue = "2023-12-10T10:51:17.549Z") private String ModifiedAt; } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/board/controller/BoardController.java b/server/008main_project/src/main/java/com/stockholm/main_project/board/controller/BoardController.java index 0de6d76..9bdbe8c 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/board/controller/BoardController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/board/controller/BoardController.java @@ -1,5 +1,6 @@ package com.stockholm.main_project.board.controller; +import com.stockholm.main_project.board.commnet.dto.CommentRequestDto; import com.stockholm.main_project.board.commnet.dto.CommentResponseDto; import com.stockholm.main_project.board.commnet.entity.Comment; import com.stockholm.main_project.board.commnet.service.CommentService; @@ -14,6 +15,7 @@ import com.stockholm.main_project.member.entity.Member; import com.stockholm.main_project.member.service.MemberService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -49,13 +51,12 @@ public BoardController(BoardService boardService, BoardMapper mapper, CommentSer // 게시물 생성 @PostMapping @Operation(summary = "게시물 생성", description = "새로운 게시물을 생성합니다.", tags = { "Board" }) - @ApiResponses({ - @ApiResponse(responseCode = "201", description = "Created", content = @Content(schema = @Schema(implementation = Board.class))), - @ApiResponse(responseCode = "400", description = "Bad Request"), - @ApiResponse(responseCode = "405", description = "Method Not Allowed"), - @ApiResponse(responseCode = "500", description = "Internal Server Error") - }) - public ResponseEntity createBoard(@Valid @RequestBody BoardRequestDto boardPostDto, @AuthenticationPrincipal Member member) throws Exception { + @ApiResponse(responseCode = "201", description = "CREATED", + content = @Content(schema = @Schema(implementation = SingleBoardResponseDto.class))) + @ApiResponse(responseCode = "400", description = "BAD REQUEST") + @ApiResponse(responseCode = "404", description = "NOT FOUND") + @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") + public ResponseEntity createBoard(@Schema(implementation = BoardRequestDto.class) @Valid @RequestBody BoardRequestDto boardPostDto, @Parameter(hidden = true) @AuthenticationPrincipal Member member) throws Exception { Board boardToCreate = mapper.boardRequestToBoard(boardPostDto); boardToCreate.setMember(member); @@ -67,13 +68,13 @@ public ResponseEntity createBoard(@Valid @RequestBody Bo @Operation(summary = "게시물 정보 변경", description = "게시물을 수정합니다.", tags = { "Board" }) @ApiResponse(responseCode = "200", description = "OK", - content = @Content(schema = @Schema(implementation = BoardRequestDto.class))) + content = @Content(schema = @Schema(implementation = SingleBoardResponseDto.class))) @ApiResponse(responseCode = "400", description = "BAD REQUEST") - @ApiResponse(responseCode = "404", description = "NOT FOUND") + @ApiResponse(responseCode = "404", description = "INVALID FAILED") @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @PatchMapping("{boardId}") - public ResponseEntity updateBoard(@Valid @PathVariable long boardId,@RequestBody BoardRequestDto boardRequestDto, - @AuthenticationPrincipal Member member) throws Exception { + public ResponseEntity updateBoard(@Schema(implementation = BoardRequestDto.class) @Valid @PathVariable long boardId,@RequestBody BoardRequestDto boardRequestDto, + @Parameter(hidden = true) @AuthenticationPrincipal Member member) throws Exception { Board boardToUpdate = mapper.boardRequestToBoard(boardRequestDto); Board board = boardService.updateBoard(boardId, boardToUpdate, member); @@ -87,7 +88,7 @@ public ResponseEntity updateBoard(@Valid @PathVariable l @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = SingleBoardResponseDto.class))) @ApiResponse(responseCode = "400", description = "BAD REQUEST") - @ApiResponse(responseCode = "404", description = "NOT FOUND") + @ApiResponse(responseCode = "404", description = "BOARD NOT FOUND") @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @GetMapping("{boardId}") public ResponseEntity getBoard(@PathVariable long boardId){ @@ -107,6 +108,7 @@ public ResponseEntity getBoard(@PathVariable long boardI @Operation(summary = "전체 게시물 조회", description = "모든 게시물을 조회합니다.", tags = { "Board" }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = AllBoardResponseDto.class))) + @ApiResponse(responseCode = "400", description = "BAD REQUEST") @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @GetMapping public ResponseEntity> getBoards(){ @@ -127,13 +129,12 @@ public ResponseEntity> getBoards(){ } @Operation(summary = "게시물 삭제", description = "게시물을 삭제합니다.", tags = { "Board" }) - @ApiResponses({ - @ApiResponse(responseCode = "204", description = "No Content"), - @ApiResponse(responseCode = "400", description = "Bad Request"), - @ApiResponse(responseCode = "404", description = "BOARD_NOT_FOUND"), - @ApiResponse(responseCode = "500", description = "Internal Server Error")}) + @ApiResponse(responseCode = "204", description = "NO CONTENT") + @ApiResponse(responseCode = "400", description = "BAD REQUEST") + @ApiResponse(responseCode = "404", description = "INVALID FAILED") + @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @DeleteMapping("{boardId}") - public ResponseEntity deleteBoard(@PathVariable long boardId, @AuthenticationPrincipal Member member){ + public ResponseEntity deleteBoard(@PathVariable long boardId,@Parameter(hidden = true) @AuthenticationPrincipal Member member){ boardService.deleteBoard(boardId, member); return new ResponseEntity<>(HttpStatus.NO_CONTENT); diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/AllBoardResponseDto.java b/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/AllBoardResponseDto.java index cbdb989..a7b27f7 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/AllBoardResponseDto.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/AllBoardResponseDto.java @@ -1,6 +1,7 @@ package com.stockholm.main_project.board.dto.responseDto; import com.stockholm.main_project.board.commnet.dto.CommentResponseDto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -10,12 +11,20 @@ @Getter @Setter public class AllBoardResponseDto { + @Schema(description = "BoardId", defaultValue = "1") private Long boardId; + @Schema(description = "게시글 제목", defaultValue = "1") private String title; + @Schema(description = "게시글 내용", defaultValue = "TestContent") private String content; + @Schema(description = "게시글 작석자", defaultValue = "TestAccount") private String member; + @Schema(description = "게시글에 포함된 댓글", defaultValue = "TestComments") private List comments; + @Schema(description = "게시글 생성 날짜", defaultValue = "2023-10-10T10:51:17.549Z") private String createdAt; + @Schema(description = "게시글 수정 날짜", defaultValue = "2023-11-10T10:51:17.549Z") private String modifiedAt; + } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/BoardCommentDto.java b/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/BoardCommentDto.java index 540b909..6ca6188 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/BoardCommentDto.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/BoardCommentDto.java @@ -1,14 +1,20 @@ package com.stockholm.main_project.board.dto.responseDto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @Getter @Setter public class BoardCommentDto { + @Schema(description = "commentId", defaultValue = "1") private long commentId; // 추가 + @Schema(description = "댓글 내용", defaultValue = "TestComment") private String content; + @Schema(description = "댓글 작성자", defaultValue = "TestAccount") private String member; + @Schema(description = "댓글 생성 날짜", defaultValue = "2023-11-10T10:51:17.549Z") private String createdAt; + @Schema(description = "댓글 수정 날짜", defaultValue = "2023-12-10T10:51:17.549Z") private String ModifiedAt; } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/SingleBoardResponseDto.java b/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/SingleBoardResponseDto.java index 26d9bd2..d1279aa 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/SingleBoardResponseDto.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/board/dto/responseDto/SingleBoardResponseDto.java @@ -3,6 +3,7 @@ import com.stockholm.main_project.board.commnet.dto.CommentResponseDto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -12,12 +13,19 @@ @Getter @Setter public class SingleBoardResponseDto { + @Schema(description = "BoardId", defaultValue = "1") private Long boardId; + @Schema(description = "게시글 제목", defaultValue = "TestBoard") private String title; + @Schema(description = "게시글 내용", defaultValue = "TestContent") private String content; + @Schema(description = "게시글 작석자", defaultValue = "TestAccount") private String member; + @Schema(description = "게시글 생성 날짜", defaultValue = "2023-10-10T10:51:17.549Z") private String createdAt; + @Schema(description = "게시글 수정 날짜", defaultValue = "2023-11-10T10:51:17.549Z") private String modifiedAt; + @Schema(description = "게시글에 포함된 댓글", defaultValue = "TestComments") private List comments; diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/cash/controller/CashController.java b/server/008main_project/src/main/java/com/stockholm/main_project/cash/controller/CashController.java index 73b46d5..d1fe5f8 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/cash/controller/CashController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/cash/controller/CashController.java @@ -11,6 +11,7 @@ import com.stockholm.main_project.stock.service.StockHoldService; import com.stockholm.main_project.stock.service.StockOrderService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -45,7 +46,7 @@ public CashController(CashMapper mapper, CashService cashService, MemberService @ApiResponse(responseCode = "400", description = "이미 보유한 현금이 있습니다.") @ApiResponse(responseCode = "401", description = "Not Enough Money") public ResponseEntity postCash(@Schema(implementation = CashPostDto.class)@Valid @RequestBody CashPostDto cashPostDto, - @AuthenticationPrincipal Member member){ + @Parameter(hidden = true) @AuthenticationPrincipal Member member){ Cash cashToCreate = mapper.cashPostToCash(cashPostDto); @@ -65,7 +66,7 @@ public ResponseEntity postCash(@Schema(implementation = CashPostDto.class)@Valid @ApiResponse(responseCode = "401", description = "Invalid Cash") @ApiResponse(responseCode = "404", description = "Not Found") public ResponseEntity patchCash(@Schema(implementation = CashPatchDto.class)@PathVariable long cashId, @Valid @RequestBody CashPatchDto requestBody, - @AuthenticationPrincipal Member member){ + @Parameter(hidden = true) @AuthenticationPrincipal Member member){ Cash cashToUpdate = mapper.cashPatchToCash(requestBody); @@ -86,7 +87,7 @@ public ResponseEntity patchCash(@Schema(implementation = CashPatchDto.class)@Pat @ApiResponse(responseCode = "401", description = "Invalid Cash") @ApiResponse(responseCode = "404", description = "Not Found") @GetMapping - private ResponseEntity getCash(@AuthenticationPrincipal Member member){ + private ResponseEntity getCash(@Parameter(hidden = true) @AuthenticationPrincipal Member member){ Cash response = cashService.findCash(member); return new ResponseEntity<>(mapper.cashToCashResponseDto(response), HttpStatus.OK); diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/member/controller/MemberController.java b/server/008main_project/src/main/java/com/stockholm/main_project/member/controller/MemberController.java index fc63c96..30ed372 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/member/controller/MemberController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/member/controller/MemberController.java @@ -8,6 +8,7 @@ import com.stockholm.main_project.member.service.MemberService; import com.stockholm.main_project.swaggersample.HelloResponse; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -55,7 +56,7 @@ public ResponseEntity postMember(@Schema(implementation = MemberPostDto.class)@V @ApiResponse(responseCode = "404", description = "MEMBER NOT FOUND") @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @PatchMapping - private ResponseEntity patchMember(@Schema(implementation = MemberPatchDto.class)@RequestBody MemberPatchDto memberPatchDto, @AuthenticationPrincipal Member member){ + private ResponseEntity patchMember(@Schema(implementation = MemberPatchDto.class)@Valid @RequestBody MemberPatchDto memberPatchDto,@Parameter(hidden = true) @AuthenticationPrincipal Member member){ memberPatchDto.setMemberId(member.getMemberId()); @@ -74,10 +75,10 @@ private ResponseEntity patchMember(@Schema(implementation = MemberPatchDto.class @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MemberResponseDto.class))) @ApiResponse(responseCode = "400", description = "BAD REQUEST") - @ApiResponse(responseCode = "404", description = "NOT FOUND") + @ApiResponse(responseCode = "404", description = "INVALID FAILED") @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @GetMapping - private ResponseEntity getMember(@AuthenticationPrincipal Member member){ + private ResponseEntity getMember(@Parameter(hidden = true) @AuthenticationPrincipal Member member){ Member response = memberService.findMember(member.getMemberId()); return new ResponseEntity<>(mapper.memberToMemberResponseDto(response), HttpStatus.OK); @@ -89,7 +90,7 @@ private ResponseEntity getMember(@AuthenticationPrincipal Member member){ @ApiResponse(responseCode = "400", description = "BAD REQUEST") @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @DeleteMapping - private ResponseEntity deleteMember(@AuthenticationPrincipal Member member){ + private ResponseEntity deleteMember(@Parameter(hidden = true) @AuthenticationPrincipal Member member){ memberService.deleteMember(member.getMemberId()); return new ResponseEntity(HttpStatus.NO_CONTENT); diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/swaggersample/HelloController.java b/server/008main_project/src/main/java/com/stockholm/main_project/swaggersample/HelloController.java index e478d32..eb9822a 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/swaggersample/HelloController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/swaggersample/HelloController.java @@ -14,7 +14,7 @@ @RequestMapping("/stockholm") public class HelloController { - @Operation(summary = "hello post 요청", description = "post됩니다.", tags = { "Member" }) + @Operation(summary = "hello post 요청", description = "post됩니다.", tags = { "Test" }) @ApiResponses({ @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = HelloResponse.class))), @@ -33,7 +33,7 @@ public ResponseEntity helloPost( return new ResponseEntity<>(helloResponse, HttpStatus.OK); } - @Operation(summary = "hello get 요청", description = "get됩니다.", tags = { "Member" }) + @Operation(summary = "hello get 요청", description = "get됩니다.", tags = { "Test" }) @ApiResponses({ @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = HelloResponse.class))), From e684dd27db5226b7c202f6bf7b8bfa1e2fa9d0b4 Mon Sep 17 00:00:00 2001 From: JaeYong Date: Wed, 11 Oct 2023 15:05:26 +0900 Subject: [PATCH 6/8] =?UTF-8?q?[Feat]=20=EC=A3=BC=EC=8B=9D=20=EC=A2=85?= =?UTF-8?q?=EB=AA=A9=EB=B3=84=20=EC=A0=95=EB=A0=AC=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80(=EB=AF=B8=EC=99=84=EC=84=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 종목 키워드 별 정렬 기능 추가 --- .../main_project/exception/ExceptionCode.java | 3 +- .../stock/controller/CompanyController.java | 14 +++++-- .../stock/mapper/StockMapper.java | 2 + .../stock/repository/StockInfRepository.java | 14 +++++++ .../stock/service/StockInfService.java | 41 +++++++++++++++++++ 5 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/StockInfRepository.java create mode 100644 server/008main_project/src/main/java/com/stockholm/main_project/stock/service/StockInfService.java diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java b/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java index 90f2c84..35723e8 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java @@ -24,7 +24,8 @@ public enum ExceptionCode { AWS_CREDENTIALS_ERROR(401, "AWS 인증 오류"), S3_UPLOAD_ERROR(500, "S3 파일 업로드 중 오류 발생"), S3_DELETE_ERROR(500, "S3 파일 삭제 중 오류 발생"), - S3_URL_RETRIEVE_ERROR(500, "S3에서 파일 URL 검색 중 오류 발생"); + S3_URL_RETRIEVE_ERROR(500, "S3에서 파일 URL 검색 중 오류 발생"), + CRITERION_NOT_FOUND(404, "옳바른 정렬 기준이 아닙니다."); @Getter diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/controller/CompanyController.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/controller/CompanyController.java index 6312790..98f1767 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/stock/controller/CompanyController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/controller/CompanyController.java @@ -1,13 +1,13 @@ package com.stockholm.main_project.stock.controller; -import com.stockholm.main_project.stock.dto.CompanyInfDto; import com.stockholm.main_project.stock.dto.CompanyResponseDto; +import com.stockholm.main_project.stock.dto.StockInfResponseDto; import com.stockholm.main_project.stock.dto.StockMinResponseDto; import com.stockholm.main_project.stock.entity.Company; -import com.stockholm.main_project.stock.entity.CompanyInf; import com.stockholm.main_project.stock.mapper.StockMapper; import com.stockholm.main_project.stock.service.ApiCallService; import com.stockholm.main_project.stock.service.CompanyService; +import com.stockholm.main_project.stock.service.StockInfService; import com.stockholm.main_project.stock.service.StockMinService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.ArraySchema; @@ -36,12 +36,14 @@ public class CompanyController { private final StockMapper stockMapper; private final StockMinService stockMinService; private final ApiCallService apiCallService; + private final StockInfService stockInfService; - public CompanyController(CompanyService companyService, StockMapper stockMapper, StockMinService stockMinService, ApiCallService apiCallService) { + public CompanyController(CompanyService companyService, StockMapper stockMapper, StockMinService stockMinService, ApiCallService apiCallService, StockInfService stockInfService) { this.companyService = companyService; this.stockMapper = stockMapper; this.stockMinService = stockMinService; this.apiCallService = apiCallService; + this.stockInfService = stockInfService; } // swagger 추가 @Operation(summary = "CompanyList 가져오기", description = "CompanyList를 Get해 옵니다", tags = { "Company" }) @@ -95,4 +97,10 @@ public ResponseEntity getCompanyChart(@PathVariable("companyId") long companyId) return new ResponseEntity(stockMinList, HttpStatus.OK); } + @GetMapping("/sort/{criterion}") + public ResponseEntity getStockInfSortByCriterion(@PathVariable("criterion") String criterion) { + List stockInfResponseDtos = stockInfService.stockInfSortByCriterion(criterion); + + return new ResponseEntity(stockInfResponseDtos, HttpStatus.OK); + } } diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/mapper/StockMapper.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/mapper/StockMapper.java index 930358e..5a65ae0 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/stock/mapper/StockMapper.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/mapper/StockMapper.java @@ -36,6 +36,8 @@ default CompanyResponseDto companyToCompanyResponseDto(Company company) { @Mapping(source = "company.companyId", target = "companyId") StockInfResponseDto stockInfToStockInfResponseDto(StockInf stockInf); @Mapping(source = "company.companyId", target = "companyId") + List stockInfsToStockInfResponseDtos(List stockInf); + @Mapping(source = "company.companyId", target = "companyId") StockAsBiResponseDto stockAsBiToStockAsBiResponseDto(StockAsBi stockAsBi); @Mapping(source = "company.companyId", target = "companyId") StockMinResponseDto stockMinToStockMinResponseDto(StockMin stockMin); diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/StockInfRepository.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/StockInfRepository.java new file mode 100644 index 0000000..60e1259 --- /dev/null +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/repository/StockInfRepository.java @@ -0,0 +1,14 @@ +package com.stockholm.main_project.stock.repository; + +import com.stockholm.main_project.stock.entity.StockInf; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +public interface StockInfRepository extends JpaRepository { + @Query("SELECT s FROM StockInf s JOIN FETCH s.company ORDER BY s.stck_prpr DESC ") + List findAllByOrderByStck_prpr(); + + +} diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/StockInfService.java b/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/StockInfService.java new file mode 100644 index 0000000..7be1bc4 --- /dev/null +++ b/server/008main_project/src/main/java/com/stockholm/main_project/stock/service/StockInfService.java @@ -0,0 +1,41 @@ +package com.stockholm.main_project.stock.service; + +import com.stockholm.main_project.exception.BusinessLogicException; +import com.stockholm.main_project.exception.ExceptionCode; +import com.stockholm.main_project.stock.dto.StockInfResponseDto; +import com.stockholm.main_project.stock.mapper.StockMapper; +import com.stockholm.main_project.stock.repository.StockInfRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional(readOnly = true) +public class StockInfService { + private final StockInfRepository stockInfRepository; + private final StockMapper stockMapper; + + public StockInfService(StockInfRepository stockInfRepository, StockMapper stockMapper) { + this.stockInfRepository = stockInfRepository; + this.stockMapper = stockMapper; + } + + // 스웨거에 criterion 알려주기 + public List stockInfSortByCriterion(String criterion) { + + // 종목명 별 +// if(criterion.equals("kor_Name")) +// return stockMapper.stockInfsToStockInfResponseDtos(stockInfRepository.findAllByOrderByCompany_Company_KorName()); +// // 현재가 별 +// else if(criterion.equals("stck_Prpr")) +// return stockMapper.stockInfsToStockInfResponseDtos(stockInfRepository.findAllByOrderByStck_prpr()); +// else if(criterion.equals("prdy_Ctrt")) +// return stockMapper.stockInfsToStockInfResponseDtos(stockInfRepository.findAllByOrderByPrdy_ctrt()); +// else if(criterion.equals("acml_tr_pbmn")) +// return stockMapper.stockInfsToStockInfResponseDtos(stockInfRepository.findAllByOrderByAcml_tr_pbmn()); +// else +// throw new BusinessLogicException(ExceptionCode.CRITERION_NOT_FOUND); + return null; + } +} From b8640dc020fd438253952c367102226f43aacdfd Mon Sep 17 00:00:00 2001 From: rkddnr05 <130031798+rkddnr05@users.noreply.github.com> Date: Thu, 12 Oct 2023 19:33:02 +0900 Subject: [PATCH 7/8] Update ExceptionCode.java --- .../com/stockholm/main_project/exception/ExceptionCode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java b/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java index ae7b1ad..c70376e 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/exception/ExceptionCode.java @@ -24,7 +24,7 @@ public enum ExceptionCode { AWS_CREDENTIALS_ERROR(401, "AWS 인증 오류"), S3_UPLOAD_ERROR(500, "S3 파일 업로드 중 오류 발생"), S3_DELETE_ERROR(500, "S3 파일 삭제 중 오류 발생"), - S3_URL_RETRIEVE_ERROR(500, "S3에서 파일 URL 검색 중 오류 발생"), + S3_URL_RETRIEVE_ERROR(500, "S3에서 파일 URL 검색 중 오류 발생"); INVALID_REFRESH_TOKEN(401, "리플레쉬 토큰이 유효하지 않습니다."); From fa8cb972a706d8e27fd63149838dbc562a4efa4c Mon Sep 17 00:00:00 2001 From: rkddnr Date: Fri, 13 Oct 2023 17:48:50 +0900 Subject: [PATCH 8/8] =?UTF-8?q?FIX:=20"API=20=EB=AC=B8=EC=84=9C=ED=99=94?= =?UTF-8?q?=20=EC=9E=91=EC=97=85"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/jwt/refreshToken/TokenController.java | 1 - .../board/commnet/controller/CommentController.java | 7 ------- .../board/controller/BoardController.java | 9 --------- .../main_project/cash/controller/CashController.java | 11 ++++------- .../member/controller/MemberController.java | 5 ----- .../src/main/resources/templates/my-page.html | 10 ---------- 6 files changed, 4 insertions(+), 39 deletions(-) delete mode 100644 server/008main_project/src/main/resources/templates/my-page.html diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenController.java b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenController.java index 110c901..6a26321 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/auth/jwt/refreshToken/TokenController.java @@ -24,7 +24,6 @@ public class TokenController { @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = TokenRefreshRequestDto.class))) @ApiResponse(responseCode = "401", description = "INVALID REFRESH TOKEN") - @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @PostMapping("/refresh") public ResponseEntity refreshAccessToken(@RequestBody TokenRefreshRequestDto tokenRefreshRequestDto) throws Exception { diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/controller/CommentController.java b/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/controller/CommentController.java index 329d88a..1e6168a 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/controller/CommentController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/board/commnet/controller/CommentController.java @@ -40,9 +40,6 @@ public CommentController(CommentService commentService, BoardService boardServic @Operation(summary = "댓글 생성", description = "새로운 댓글을 생성합니다.", tags = { "Comment" }) @ApiResponse(responseCode = "201", description = "CREATED", content = @Content(schema = @Schema(implementation = CommentResponseDto.class))) - @ApiResponse(responseCode = "400", description = "BAD REQUEST") - @ApiResponse(responseCode = "404", description = "NOT FOUND") - @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @PostMapping public ResponseEntity postComment(@Schema(implementation = CommentRequestDto.class)@PathVariable long boardId, @RequestBody CommentRequestDto commentRequestDto,@Parameter(hidden = true) @AuthenticationPrincipal Member member){ @@ -57,9 +54,7 @@ public ResponseEntity postComment(@Schema(implementation = CommentRequestDto.cla @Operation(summary = "댓글 수정", description = "작성한 댓글을 수정합니다.", tags = { "Comment" }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = CommentResponseDto.class))) - @ApiResponse(responseCode = "400", description = "BAD REQUEST") @ApiResponse(responseCode = "404", description = "INVALID FAILED") - @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @PatchMapping("{commentId}") public ResponseEntity updateComment(@PathVariable long boardId, @PathVariable long commentId, @@ -77,9 +72,7 @@ public ResponseEntity updateComment(@PathVariable long boardId, @Operation(summary = "댓글 삭제", description = "작성한 댓글를 삭제합니다.", tags = { "Comment" }) @ApiResponse(responseCode = "204", description = "NO CONTENT") - @ApiResponse(responseCode = "400", description = "BAD REQUEST") @ApiResponse(responseCode = "404", description = "INVALID FAILED") - @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @DeleteMapping("{commentId}") public ResponseEntity deleteComment(@PathVariable long boardId, @PathVariable long commentId,@Parameter(hidden = true) @AuthenticationPrincipal Member member) { diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/board/controller/BoardController.java b/server/008main_project/src/main/java/com/stockholm/main_project/board/controller/BoardController.java index 9bdbe8c..8180ac6 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/board/controller/BoardController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/board/controller/BoardController.java @@ -53,9 +53,6 @@ public BoardController(BoardService boardService, BoardMapper mapper, CommentSer @Operation(summary = "게시물 생성", description = "새로운 게시물을 생성합니다.", tags = { "Board" }) @ApiResponse(responseCode = "201", description = "CREATED", content = @Content(schema = @Schema(implementation = SingleBoardResponseDto.class))) - @ApiResponse(responseCode = "400", description = "BAD REQUEST") - @ApiResponse(responseCode = "404", description = "NOT FOUND") - @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") public ResponseEntity createBoard(@Schema(implementation = BoardRequestDto.class) @Valid @RequestBody BoardRequestDto boardPostDto, @Parameter(hidden = true) @AuthenticationPrincipal Member member) throws Exception { Board boardToCreate = mapper.boardRequestToBoard(boardPostDto); boardToCreate.setMember(member); @@ -69,9 +66,7 @@ public ResponseEntity createBoard(@Schema(implementation @Operation(summary = "게시물 정보 변경", description = "게시물을 수정합니다.", tags = { "Board" }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = SingleBoardResponseDto.class))) - @ApiResponse(responseCode = "400", description = "BAD REQUEST") @ApiResponse(responseCode = "404", description = "INVALID FAILED") - @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @PatchMapping("{boardId}") public ResponseEntity updateBoard(@Schema(implementation = BoardRequestDto.class) @Valid @PathVariable long boardId,@RequestBody BoardRequestDto boardRequestDto, @Parameter(hidden = true) @AuthenticationPrincipal Member member) throws Exception { @@ -87,9 +82,7 @@ public ResponseEntity updateBoard(@Schema(implementation @Operation(summary = "게시물 정보 조회", description = "게시물을 조회합니다.", tags = { "Board" }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = SingleBoardResponseDto.class))) - @ApiResponse(responseCode = "400", description = "BAD REQUEST") @ApiResponse(responseCode = "404", description = "BOARD NOT FOUND") - @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @GetMapping("{boardId}") public ResponseEntity getBoard(@PathVariable long boardId){ Board response = boardService.findBoard(boardId); @@ -108,8 +101,6 @@ public ResponseEntity getBoard(@PathVariable long boardI @Operation(summary = "전체 게시물 조회", description = "모든 게시물을 조회합니다.", tags = { "Board" }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = AllBoardResponseDto.class))) - @ApiResponse(responseCode = "400", description = "BAD REQUEST") - @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @GetMapping public ResponseEntity> getBoards(){ List foundBoards = boardService.getAllBoards(); diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/cash/controller/CashController.java b/server/008main_project/src/main/java/com/stockholm/main_project/cash/controller/CashController.java index d1fe5f8..aab65a3 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/cash/controller/CashController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/cash/controller/CashController.java @@ -41,10 +41,10 @@ public CashController(CashMapper mapper, CashService cashService, MemberService } @PostMapping @Operation(summary = "현금 정보 생성", description = "새로운 현금 정보를 생성합니다.", tags = { "Cash" }) - @ApiResponse(responseCode = "201", description = "Created", + @ApiResponse(responseCode = "201", description = "CREATED", content = @Content(mediaType = "application/json", schema = @Schema(implementation = CashResponseDto.class))) @ApiResponse(responseCode = "400", description = "이미 보유한 현금이 있습니다.") - @ApiResponse(responseCode = "401", description = "Not Enough Money") + @ApiResponse(responseCode = "401", description = "NOT ENOUGH MONEY") public ResponseEntity postCash(@Schema(implementation = CashPostDto.class)@Valid @RequestBody CashPostDto cashPostDto, @Parameter(hidden = true) @AuthenticationPrincipal Member member){ @@ -62,9 +62,7 @@ public ResponseEntity postCash(@Schema(implementation = CashPostDto.class)@Valid @Operation(summary = "현금 정보 업데이트", description = "현금 정보를 업데이트합니다.", tags = { "Cash" }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(mediaType = "application/json", schema = @Schema(implementation = CashResponseDto.class))) - @ApiResponse(responseCode = "400", description = "Bad Request") - @ApiResponse(responseCode = "401", description = "Invalid Cash") - @ApiResponse(responseCode = "404", description = "Not Found") + @ApiResponse(responseCode = "401", description = "INVALID CASH") public ResponseEntity patchCash(@Schema(implementation = CashPatchDto.class)@PathVariable long cashId, @Valid @RequestBody CashPatchDto requestBody, @Parameter(hidden = true) @AuthenticationPrincipal Member member){ @@ -84,8 +82,7 @@ public ResponseEntity patchCash(@Schema(implementation = CashPatchDto.class)@Pat @Operation(summary = "현금 정보 조회", description = "현금 정보를 조회합니다.", tags = { "Cash" }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(mediaType = "application/json", schema = @Schema(implementation = CashResponseDto.class))) - @ApiResponse(responseCode = "401", description = "Invalid Cash") - @ApiResponse(responseCode = "404", description = "Not Found") + @ApiResponse(responseCode = "401", description = "INVALID CASH") @GetMapping private ResponseEntity getCash(@Parameter(hidden = true) @AuthenticationPrincipal Member member){ Cash response = cashService.findCash(member); diff --git a/server/008main_project/src/main/java/com/stockholm/main_project/member/controller/MemberController.java b/server/008main_project/src/main/java/com/stockholm/main_project/member/controller/MemberController.java index 30ed372..30b7dc0 100644 --- a/server/008main_project/src/main/java/com/stockholm/main_project/member/controller/MemberController.java +++ b/server/008main_project/src/main/java/com/stockholm/main_project/member/controller/MemberController.java @@ -38,7 +38,6 @@ public MemberController(MemberService memberService, MemberMapper mapper) { content = @Content(schema = @Schema(implementation = MemberResponseDto.class))) @ApiResponse(responseCode = "400", description = "EMAIL_DUPLICATION") @ApiResponse(responseCode = "404", description = "INVALID_PASSWORD") - @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @PostMapping public ResponseEntity postMember(@Schema(implementation = MemberPostDto.class)@Valid @RequestBody MemberPostDto memberPostDto){ Member member = mapper.memberPostToMember(memberPostDto); @@ -52,9 +51,7 @@ public ResponseEntity postMember(@Schema(implementation = MemberPostDto.class)@V @Operation(summary = "회원 정보 변경", description = "가입한 계정의 이름을 PATCH합니다.", tags = { "Member" }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MemberResponseDto.class))) - @ApiResponse(responseCode = "400", description = "BAD REQUEST") @ApiResponse(responseCode = "404", description = "MEMBER NOT FOUND") - @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @PatchMapping private ResponseEntity patchMember(@Schema(implementation = MemberPatchDto.class)@Valid @RequestBody MemberPatchDto memberPatchDto,@Parameter(hidden = true) @AuthenticationPrincipal Member member){ @@ -74,9 +71,7 @@ private ResponseEntity patchMember(@Schema(implementation = MemberPatchDto.class @Operation(summary = "회원 조회", description = "가입한 계정 중 하나가 GET됩니다.", tags = { "Member" }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = MemberResponseDto.class))) - @ApiResponse(responseCode = "400", description = "BAD REQUEST") @ApiResponse(responseCode = "404", description = "INVALID FAILED") - @ApiResponse(responseCode = "500", description = "INTERNAL SERVER ERROR") @GetMapping private ResponseEntity getMember(@Parameter(hidden = true) @AuthenticationPrincipal Member member){ Member response = memberService.findMember(member.getMemberId()); diff --git a/server/008main_project/src/main/resources/templates/my-page.html b/server/008main_project/src/main/resources/templates/my-page.html deleted file mode 100644 index de155ea..0000000 --- a/server/008main_project/src/main/resources/templates/my-page.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Title - - - - - \ No newline at end of file