Spring에서의 DI (feat. 생성자 주입 & final & 영한님 짱)

김성수·2023년 4월 17일
0

스프링 및 부트

목록 보기
8/9

⚡ 생각대로 살지 않으면 사는대로 생각한다.

⚡ 나는 어차피 잘 될 놈이다. 이미 잘 되고 있고, 계속해서 잘 되고 있다.


별 내용은 아니다.

@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;
    }

다음과 같이 ControllerService가 있다고 했을 때,

필드로 지정한 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 와 같은 BeanDI(Dependency Injection : 의존성 주입)하여 참조변수에 값을 주고, 이후에

변경 되지 못 하도록 하기위해서 final 키워드를 사용한다.

영한님 감사합니다!


-끝-

profile
쌩수 Git >> https://github.com/SsangSoo?tab=repositories

0개의 댓글