⚡ 생각대로 살지 않으면 사는대로 생각한다.
⚡ 나는 어차피 잘 될 놈이다. 이미 잘 되고 있고, 계속해서 잘 되고 있다.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
다음과 같이 Controller와 Service가 있다고 했을 때,
필드로 지정한 private final Member~~ member~~
코드가 있다.
final
키워드를 사용할 때, 코드를 작성하면서도 음..그냥, 그런갑다...
하고 넘겼었다.
그런데 영한님의 스프링 입문강의부터 쭉 보기 시작했고 지금 입문 강의를 듣고있다.
(내가 생각하는 스프링 2대 성인 중 한명.. 한 분 더는 토비님..ㅎㅎ..)
있는 와중에 DI(Dependency Injection : 의존성 주입)에 대해서 간략히 소개하는데,
@Autowired
혹은 @Component
를 통해서 Spring Bean(스프링(컨테이너)에서 관리하는 객체))이 되고, 주입을 시켜줄 때 스프링 컨테이너에 있는 객체(Bean
)과 연결된다.
그리고 보통 스프링 컨테이너에 등록된 Bean
은 싱글톤 객체로 사용되는데,
컨트롤러는 서비스를,
서비스는 레포지토리를 필요로 한다.
만약에 각 계층에서 필요로 하는 객체를 new
연산자로 새로 객체를 생성해서 쓰다보면, 다른 곳에서도 접근이 가능해지게 됨으로, 문제가 생길 수 있다.
그래서 보통 스프링 컨테이너에서 관리하는 객체인 Bean으로 생성해서 하나의 인스턴스를 재사용하는 싱글톤으로 객체를 사용하게 되는데, 싱글톤은 하나의 객체만을 가지고 사용하는 객체다...
만약 final
을 사용하지 않는다면,
Controller는 private MemberService memberService = new MemberService();
Service는 private MemberRepository memberRepsitory = new MemberRepository();
이렇게 하거나, 이런 코드 말고도 참조 변수에 다른 인스턴스를 계속 넣을 수 있다.
그렇게 되면 인스턴스가 재생성 가능해져서 하나의 객체만 사용하는 싱글톤과는 멀어진다.
그래서 스프링 컨테이너에서 관리하는 Service
혹은 Repository
와 같은 Bean을 DI(Dependency Injection : 의존성 주입)하여 참조변수에 값을 주고, 이후에
final
키워드를 사용한다.영한님 감사합니다!
-끝-