-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[36] 파트너 회원 생성 #38
[36] 파트너 회원 생성 #38
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,18 +12,30 @@ public class PartnerRequestDto { | |
@Builder | ||
@ToString | ||
public static class Create { | ||
private String name; | ||
private String firstName; | ||
private String lastName; | ||
private String email; | ||
private String shopName; | ||
private String password; | ||
private String businessNumber; | ||
Comment on lines
-15
to
20
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 서비스가 계속 운영되는 상황에서 request의 형태를 바꾸면 어떻게 될까요? |
||
} | ||
|
||
@Getter | ||
@Builder | ||
@ToString | ||
public static class CreateWebHook { | ||
private String id; | ||
private String name; | ||
private String email; | ||
private String bizId; | ||
|
||
public static Partner toEntity(PartnerRequestDto.Create dto) { | ||
public static Partner toEntity(PartnerRequestDto.CreateWebHook dto) { | ||
return Partner.builder() | ||
.name(dto.getName()) | ||
.authId(dto.getId()) | ||
.email(dto.getEmail()) | ||
.password(dto.getPassword()) | ||
.businessNumber(dto.getBizId()) | ||
.status(PartnerStatus.ACTIVE) | ||
.businessNumber(dto.getBusinessNumber()) | ||
.build(); | ||
} | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
package org.example.commerce_site.attribute; | ||
|
||
public enum UserRoles { | ||
ROLE_USER, | ||
ROLE_PARTNER | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package org.example.commerce_site.config; | ||
|
||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
import org.springframework.web.client.RestTemplate; | ||
|
||
@Configuration | ||
public class AppConfig { | ||
@Bean | ||
public RestTemplate restTemplate() { | ||
return new RestTemplate(); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,12 @@ | ||
package org.example.commerce_site.infrastructure.partner; | ||
|
||
import java.util.Optional; | ||
|
||
import org.example.commerce_site.domain.Partner; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
|
||
@Repository | ||
public interface PartnerRepository extends JpaRepository<Partner, Long> { | ||
Optional<Partner> findByEmail(String email); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,17 @@ | ||
package org.example.commerce_site.representation.partner; | ||
|
||
import org.example.commerce_site.application.auth.KeycloakAuthService; | ||
import org.example.commerce_site.application.partner.PartnerService; | ||
import org.example.commerce_site.common.response.ApiSuccessResponse; | ||
import org.example.commerce_site.representation.partner.request.PartnerRequest; | ||
import org.example.commerce_site.representation.partner.response.PartnerResponse; | ||
import org.example.commerce_site.config.KeycloakProperties; | ||
import org.example.commerce_site.representation.partner.dto.PartnerRequest; | ||
import org.springframework.http.HttpStatus; | ||
import org.springframework.web.bind.annotation.PostMapping; | ||
import org.springframework.web.bind.annotation.RequestBody; | ||
import org.springframework.web.bind.annotation.RequestHeader; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
import org.springframework.web.bind.annotation.RestController; | ||
import org.springframework.web.server.ResponseStatusException; | ||
|
||
import jakarta.validation.Valid; | ||
import lombok.RequiredArgsConstructor; | ||
|
@@ -19,11 +23,23 @@ | |
@RequestMapping("/partners") | ||
public class PartnerController { | ||
private final PartnerService partnerService; | ||
private final KeycloakAuthService keycloakAuthService; | ||
private final KeycloakProperties keycloakProperties; | ||
|
||
@PostMapping() | ||
public ApiSuccessResponse<PartnerResponse.Create> createPartner( | ||
public ApiSuccessResponse createPartner( | ||
@Valid @RequestBody PartnerRequest.Create request) { | ||
return ApiSuccessResponse.success( | ||
PartnerResponse.Create.of(partnerService.create(PartnerRequest.Create.toDTO(request)))); | ||
keycloakAuthService.createPartner(PartnerRequest.Create.toDTO(request)); | ||
return ApiSuccessResponse.success(); | ||
} | ||
|
||
@PostMapping("/keycloak/webhook") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. dl webhook이 한번 실패하면 그 이후 동작은 어떻게 되나요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이후에도 일반 회원과 마찬가지로 DB 등록에 실패하고 키클락 서버에서도 200 요청을 받지 못했으므로 저장된 회원을 삭제 하도록 되어있습니다..! |
||
public void createPartnerWebhook( | ||
@RequestHeader("X-API-KEY") String apiKey, | ||
@RequestBody PartnerRequest.CreateWebHook request) { | ||
if (!keycloakProperties.getApiKey().equals(apiKey)) { | ||
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Invalid API Key"); | ||
} | ||
partnerService.create(PartnerRequest.CreateWebHook.toDTO(request)); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
멤버 변수를 활용하다 지역 변수로 변경한 이유가 있나요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
getAccessToken 함수에서밖에 사용하지 않아 변경했습니다.. 그런데 이러면 저 함수를 요청할때마다 RestTemplate 객체를 새로 생성하겠네요 찾아보니 빈으로 등록하고 스프링이 관리하게 하고 주입받는게 더 좋을것 같아서 변경하도록 하겠습니다..!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
빈으로 등록해서 생성하면 스프링의 의존성 주입을 사용해 싱글톤으로 만들어지기 때문에 객체가 하나만 생성되고 재사용되어 메모리를 절약할 수 있습니다. 그리고 테스트에서 RestTemplate 을 Mock 으로 바꿀 수 있어 테스트가 용이해집니다..!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
connection pool 관점에서는 어떨까요? 그리고 다른 설정들에 대해서는 세팅할 부분이 없을까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
찾아보니 OkHttp나 HttpComponents 를 사용해 커넥션풀을 만들어 관리할 수 있을거같네요.
커넥션 풀을 만들지 않고 레스트 템플릿을 빈으로 등록한 방식은 매 요청마다 새로운 HTTP 연결을 생성하고 닫아서, 요청시마다 대기시간 발생, 연결 생성 비용이 발생하는 단점이 있고
커넥션 풀 설정을 사용하면 한번 생성한 연결을 여러 요청에서 재사용할 수 있어서 새로운 연결을 생성하는 비용을 피할 수 있어서 성능이 개선되고, 새로운 연결을 매번 생성하지 않아 속도가 빨라진다는 것을 알았습니다.
새로운 커넥션을 생성할때 더 느린 이유는 TCP 연결을 설정하고, DNS를 조회하는 등의 여러 과정이 필요하기 때문에 추가적인 시간이 소요 됩니다. 기존 커넥션을 재사용하면 이런 단계를 생략할 수 있습니다