setter 주입을 private으로 선언해도 의존 주입이 되는 이유
438
작성한 질문수 33
수정자 주입과 관련된 질문이 생겨서 글을 쓰게 되었습니다.
강의에서 setter를 이용한 의존 주입을 할 때는, setter 함수를 public으로 열어놔야한다고 하셨습니다.
만약에 private으로 막아놓으면 어떻게 될지 궁금해서 private으로 막아 놓고 테스트를 돌려보았는데, 여전히 올바르게 의존주입이 되는 결과가 나왔습니다.
아무리 생각해봐도 스프링이 private으로 막혀있는 setter 함수를 호출할 수 없을 것 같은데, 어떻게 올바른 의존 주입이 되는 결과가 나온건지 궁금합니다.
테스트에 사용한 코드는 아래와 같습니다.
// OrderServiceImpl.java
package hello.core.order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.Member;
import hello.core.repository.MemberRepository;
import hello.core.repository.MemoryMemberRepository;
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
// ! setter 주입(setter 주입을 사용하려면 final 키워드를 사용할수 없음)
@Autowired
private void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
private void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
// 테스트 용도
public MemberRepository getMemberRepository() {
return this.memberRepository;
}
}
// AutoAppConfigTest.java
package hello.core.scan;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import hello.core.AutoAppConfig;
import hello.core.member.MemberService;
import hello.core.order.OrderServiceImpl;
import hello.core.repository.MemoryMemberRepository;
public class AutoAppConfigTest {
@Test
void basicScan() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
OrderServiceImpl orderServiceImpl = ac.getBean(OrderServiceImpl.class);
System.out.println(orderServiceImpl.getMemberRepository());
}
}
// AutoAppConfig.java
package hello.core;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
@Configuration
@ComponentScan(basePackages = "hello.core", basePackageClasses = AutoAppConfig.class, excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class))
public class AutoAppConfig {
}
답변 1
0
안녕하세요, 세승 님! 공식 서포터즈 codesweaver 입니다.
이 부분은 자바의 리플렉션 기능을 이용합니다!
private 필드, 메서드 등을 강제로 접근 가능하도록 변경하여 값을 주입하게 됩니다.
아래의 링크를 참조해주세요.
섹션3. 11 회원객체 다이어그램
0
13
1
OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.
0
18
1
코드 자료
0
53
2
구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?
0
60
2
MemberService의 인터페이스를 왜 사용하는지 궁금합니다.
0
82
1
롬복 @Setter를 써야 하는 상황이 있는건가요?
0
94
1
빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?
0
81
1
테스트 속도가 나중에 영향이 있을까요?
0
79
1
gradle 설정 안떠서 질문 남깁니다!
0
125
2
build.gradle로 프로젝트를 여는 이유
0
88
1
provider 사용하는 이유
0
93
1
다음 강의 뭘 들어야 할까요
0
128
2
프로토타입 빈, 직접 destroy 호출 안 할 경우
0
66
1
beanB
0
82
2
퀴즈다시풀기
0
69
1
Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ
0
92
2
"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.
0
67
3
run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>
0
106
2
도메인의 정의?
0
59
1
ApplicationContext 질문입니다.
0
63
1
@Scope의 proxyMode를 사용할때 단위 테스트 방법
0
92
2
ai api 선정하기 관련 질문
0
119
2
생성자 자동주입 관련해서
0
67
1
생성자 직접 호출 vs 팩토리 메서드 패턴
0
97
2





