강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

김태형님의 프로필 이미지
김태형

작성한 질문수

토비의 스프링 6 - 이해와 원리

Payment 엔티티에 exRateProvider 주입

작성

·

71

0

강의 중간 PaymentService Payment 엔티티에 exRateProvider 도 주입해서 사용할 수 있다 라고 들었고, 이거는 한번 고민해보셨으면 좋겠다라고 강의 내용이 있어 질문드립니다.

예전에 제가 토비님께서 제작하신 토비의 스프링 공부했던 Rich Domain Model 에 관련된 사항 같습니다.

  • 해당 내용으로 적용 시켜볼때는 Spring AOP 가 아닌 AspectJ를 이용해서 엔티티 생성자 전후로 PointCut 으로 마치 Target(Payment 엔티티) 생성자에 exRateProvider 를 주입해주는걸로 방법이 생각나는데 정확하게 이 방법이 일단 맞을까요?

  • "몇가지 방법이 있다고" 저는 들었던거 같은데 이외의 적용 할수있는 스프링 원리가 있을까요?

     

  • 추가로 현재 exRateProvider 경우 환율 정보를 외부 API, 고정 환율 가져오는 구현체로 구성되어있는데 만약 DB Access 를 통해서 가져오는 구현체(exRateRepository)로 런타임에 의존 관계를 맺는 경우 에도 엔티티 생성자로 넣는 방법도 위처럼 생각한 방향대로 적용하면 되는걸까요?

즉 스프링에서 관리하는 Bean 을 POJO 로 주입 하는 방법에 대해서 궁금합니다!

 

 

답변 1

0

토비님의 프로필 이미지
토비
지식공유자

말씀하신 내용은 AspectJ를 이용해서 Payment 오브젝트가 생성되는 생성자 호출 시점을 가로채서 부가적인 빈을 주입하는 기법입니다.

그런데 여기선 그 방식을 사용할 필요는 없습니다.

PaymentService에서 Payment 오브젝트를 생성할 때 ExRateProvider 타입 빈을 파라미터로 넣어주면 되죠. 생성자 또는 정적 팩토리 메소드에 사용할 수 있습니다. 그냥 코드를 이용해서 직접 주입을 해주는 것이면 충분합니다.

왜냐하면 ExRateProvider가 사용이 되는 시점은 Payment가 처음 만들어지고 초기화되는 때로 명확하고 이후엔 필요하지 않습니다. 따라서 굳이 복잡한 난이도의 AOP 주입 방법을 사용할 필요는 없습니다.

ExRateProvider는 Payment 생성 시점에 환율을 한번 계산하면 이후에 사용할 필요가 없기 때문에 다른 DI처럼 내부에 저장해둘 이유도 없습니다. 이런 경우 환율 계산이 필요한 메소드 또는 생성자에 파라미터로 주입하는 메소드 호출 주입 방법을 사용하면 충분합니다.

환율을 적용해서 계산된 금액을 넣는 대신, 환율 제공자 오브젝트를 넘겨서 Payment 생성 시점에 내부에서 계산하도록 만들어보세요.

김태형님의 프로필 이미지
김태형
질문자

네 답변 감사합니다.

그럼 AspectJ 를 이용한 부가적인 DI를 넣는 방법은 어떤 케이스 경우에 사용하는것이 적합할까요? 실무에서는 리파지토리로 데이터를 가져온 후 도메인 또는 엔티티쪽에서 작업하는 경우도 많아서요

풍부한 도메인 모델을 설계하는 관점에서 어떻게 활용하면 좋을지 조언 부탁드리겠습니다

토비님의 프로필 이미지
토비
지식공유자

풍성한 도메인 모델을 위해서 꼭 AspectJ AOP를 사용할 필요는 없습니다. 한 때는 그 방식이 유행을 했고, 지금도 액티브 레코드 패턴을 따라서 DB 액세스 기능을 만든다면 리포지토리 등의 빈을 자동으로 주입해주는 방법을 적용할수도 있겠지만, 이미 스프링 개발자들 사이에서도 그 스타일 보다는 스프링 데이터 JPA를 이용해서 서비스 빈에서 리포지토리를 직접 사용하는 데이터 매퍼 방식이 표준으로 자리 잡았습니다. 그렇게 해도 충분히 풍성한 도메인 모델 스타일의 객체지향 적인 도메인 패턴이 가능합니다.

또, AspectJ를 위해서 JavaAgent를 사용하는 방법은 자바 언어 자체에서도 계속 제약을 걸고 있고, 테스트를 작성하기도 어렵다는 이유도 있어서 특별한 프레임워크 내부에서가 아니면 애플리케이션 개발에선 이제 거의 쓰지 않습니다.

 

김태형님의 프로필 이미지
김태형
질문자

답변 감사합니다!

김태형님의 프로필 이미지
김태형

작성한 질문수

질문하기