작성
·
251
답변 1
1
안녕하세요. lsj59285님, 공식 서포터즈 OMG입니다.
자바에서 객체를 생성할 때 생성자를 이용하여 객체를 생성하게 되며 아래의 생성자를 보면 memberRepository를 파라미터로 받게 되어있습니다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
해당 파라미터를 스프링으로부터 주입을 받아야지만 객체를 생성할 수 있습니다.
(아래의 예시는 new 연산자로 직접 생성하는 과정을 보여드렸지만 스프링에서는 스프링이 생성해서 주입하도록 설계가 이뤄집니다.)
필드에 final 키워드가 붙게 되면 해당 객체는 한번 생성된 이후 변경될 수 없는 불변 객체의 상태가 됩니다.
예를 들어, 아래와 같은 코드가 있을 때 memberRepository는 생성될 시점에 값을 스프링으로부터 생성자 주입을 받게 되며, final 키워드가 선언되어 있어 이후로 memberRepository는 변경이 불가능합니다.
Cannot assign a value to final variable 'memberRepository'
반면 Setter의 경우 Setter의 쓰임새를 생각해보면 알 수 있듯 어떠한 값을 바꾸기 위해 사용됩니다. 값을 바꾸는 동작 구현은 개발자(혹은 프레임워크)가 하며 값을 바꾸기 원하지 않을 경우 Setter를 사용하지 않으면 됩니다. 그렇기 때문에 필수가 아닌 '선택'이며, 값을 바꾸기 위해 사용하는 Setter인 만큼 '변경 가능성'이란 표현을 쓰신 것으로 생각합니다.
추가로 참고하시면 도움 될만한 정리글 링크 첨부합니다.
스프링 - 생성자 주입을 사용해야 하는 이유, 필드인젝션이 좋지 않은 이유 (yaboong.github.io)
감사합니다.
다음과 같이 new로 할당한다면 매번 새로운 인스턴스가 생성되지만
MemberService memberService = new MemberService();
스프링으로부터 주입을 받는다면 같은 인스턴스를 주입받게 됩니다.
final이 안 붙어있을 경우, 생성자 호출을 여러번 해서 그 값이 변경될 수 있지 않나요?
그러니까 동적 컨텐츠일 경우 클라이언트의 요청에 따라 생성자도 setter처럼 값이 변경될 수 있지 않나요?