DIP구현 중, AOP과의 이슈가 발생하여 질문 드립니다
318
작성한 질문수 2
안녕하세요! 알려주신 내용을 바탕으로 제 개인프로젝트에 적용해서 리팩토링을 해보고있는데요!
DIP를 위배하지않기위해@Getter @Configuration public class IamportConfig {
@Value("${secret.sec.key}")
private String secretKey ;
@Value("${api.api.key}")
private String apiKey ;
@Bean public IamportClient iamportClient()
{ return new IamportClient(apiKey, secretKey); } }
이런식으로 IamportConfig를 선언해서 주입을 해주었고
실제 코드에는private final PurchaseService purchaseService;
private final ItemService itemService;
private final IamportClient iamportClient;
private final RedissonClient redissonClient;
private final JwtUtil jwtUtil;
private final IamportConfig iamportConfig;
이렇게 선언했습니다!
이후
@PostMapping("/api/payment/cancel")
private boolean cancelPayment(@RequestBody RefundRequestDto refundRequestDto) throws JsonProcessingException {
RestTemplate restTemplate = new RestTemplate();
String url = "https://api.iamport.kr/payments/cancel";
// 요청 파라미터 설정
MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
formData.add("impUid", refundRequestDto.imp_uid());
formData.add("checksum", String.valueOf(refundRequestDto.checksum()));
formData.add("reason", refundRequestDto.reason());
// 요청 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
String token = getAccessToken(new PaymentRequestDto.getToken(iamportConfig.getApiKey(), iamportConfig.getSecretKey()));
headers.set("Authorization", "Bearer " + token);
// 요청 객체 생성
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);
// 요청 보내기
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
// 응답 처리
if (response.getStatusCode() == HttpStatus.OK) {
// 각 아이템에 대해 수량 롤백 진행
purchaseService.rollbackItemsQuantity(refundRequestDto.imp_uid());
// 주문 상태 변경
purchaseService.ChangeStatusToCancelled(refundRequestDto.imp_uid());
return true;
} else {
return false;
}
}
이런 코드를 사용하는과정에서 String token = getAccessToken(new PaymentRequestDto.getToken(iamportConfig.getApiKey(), iamportConfig.getSecretKey()));
이부분의 iamportConfig 가 null로 나오는 문제가 발생했습니다.
다방면으로 답을 찾아보다가 AOP를 전부 주석처리하니까 해결되더라구요. 그래서 AOP의 적용범위에서 해당 컨트롤러를 제외시켰는데 해결이 되었습니다.
이를통해 좀 알아보니까
AOP가 실행되는 시점은 새로운 PaymentRequestDto 인스턴스가 생성되기 전 이므로
AOP 프록시 객체가 cancelPayment를 감쌀때 PaymentRequestDto는 null이게 된다.
(AOP 로직이 @Value로 주입된 프로퍼티 값에 접근하기 전에 실행되어 값을 정상적으로 참조할 수 없는 상황이 발생)
라는 결론에 다다르게 되었는데,
제가 잘 이해한게 맞을까요?...!
답변 1
1
안녕하세요. wodnrtkfka님
죄송하지만 질문 안내에서 말씀드린 것처럼 강의 학습에 관련된 질문을 올려주시길 부탁드립니다.
저도 마음으로는 도움을 드리고 싶지만, 하루에도 수많은 분들이 질문을 올려주십니다. 그래서 강의 학습과 관련된 질문에 초점을 맞추는 것이 맞다 생각합니다. 다시한번 이해를 부탁드립니다.
0
아, 그 영한님 강의에서 나온 AOP와 본 강의에서의 DIP를 적용하는과정에서
AOP가 새로운 객체가 만들어지는시점전에 프록시로 감싸버려서 발생하는원인같아서,,
AOP 로직이 @Value로 주입된 프로퍼티 값에 접근하기 전에 실행되어 값을 정상적으로 참조할 수 없는 상황이 발생하는게 맞는건지가 궁금했고 자세한 코드를 첨부했던건데 강의와는 관계없는내용일까요?
1
안녕하세요. wodnrtkfka님
죄송하지만 개인 프로젝트에서 발생한 이슈를 이곳에서 도움을 드리기는 어렵습니다.
저도 서포터즈 분들도 하루에 수 많은 분들의 질문에 답변을 드려야해서, 강의 학습 내용과 관련된 질문에 초점을 맞추고 있습니다. 이해를 부탁드려요.
감사합니다.
1
앗 네! 답변주셔서 감사합니다.
강의내용을 개인프로젝트에 적용하면서 공부해보고있었는데
적용과정에서 생긴 의문이어서 질문해도되는줄 알았습니다 ㅜㅜ 죄송합니다!
다음부터는 강의내용을 100%기반으로 질문토록 하겠습니다
감사합니다 :)
코드 자료
0
42
2
구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?
0
54
2
MemberService의 인터페이스를 왜 사용하는지 궁금합니다.
0
75
1
롬복 @Setter를 써야 하는 상황이 있는건가요?
0
90
1
빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?
0
81
1
테스트 속도가 나중에 영향이 있을까요?
0
77
1
gradle 설정 안떠서 질문 남깁니다!
0
121
2
build.gradle로 프로젝트를 여는 이유
0
86
1
provider 사용하는 이유
0
89
1
다음 강의 뭘 들어야 할까요
0
126
2
프로토타입 빈, 직접 destroy 호출 안 할 경우
0
65
1
beanB
0
82
2
퀴즈다시풀기
0
68
1
Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ
0
92
2
"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.
0
67
3
run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>
0
106
2
도메인의 정의?
0
59
1
ApplicationContext 질문입니다.
0
63
1
@Scope의 proxyMode를 사용할때 단위 테스트 방법
0
89
2
ai api 선정하기 관련 질문
0
118
2
생성자 자동주입 관련해서
0
65
1
생성자 직접 호출 vs 팩토리 메서드 패턴
0
97
2
Spring에서 SessionScope와 RequestScope는 함께 사용되나요?
1
65
1
12:25
0
78
2





