TIL

TIL - 스프링의 DIP

yolang 2025. 1. 9. 20:51
728x90

📚 Today's TODO

스프링 핵심 원리 - 싱글톤까지

📡 새로 알게 된 내용

  • Intellij를 사용하면 의존성을 표현하는 그래프를 그려준다..! 이런식의 그래프도 그려준다. 정말 신기하군.

  • [Intellij] iter 하면 for문 작성해주고, sout 하면 System.out.println을 작성해준다.
  • 스프링 빈을 조회할 때 상속이 되어 있는 경우, 부보 타입으로 조회하면 자식 타입도 함께 조회된다.
    • 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회한다.
  • BeanFactory와 ApplicationContext
    • 지금까지 DI를 직접 해주는 스프링 컨테이너에 대해서 배웠다. 그 중 BeanFactory는 스프링 컨테이너의 최상위 인터페이스다.
    • ApplicationContext는 BeanFactory 의 기능을 모두 상속받아서 제공하면서 더 많은 기능을 제공한다. - 주로 이것을 씀
  • BeanDefinition
    • 역할과 구현을 개념적으로 나누기
    • Bean의 메타정보 라는 추성화
  • 싱글톤(Singleton)
    • flask으로 개발하면서 처음 봤던 개념인데 강의에서 공부했다.
    • 어떤 클래스에 대해서 딱 1개의 인스턴스만 생성하는 것이다.
    • 불필요한 메모리 사용을 피할 수 있다. 
    • 하지만 싱글톤 패턴을 구현하는 데 코드가 많이 들어가고 테스트하기 어렵고 여러 문제점이 있으나
    • 스프링 컨테이너는 이런 문제점을 해결하면서 스프링 빈을 바로 싱글톤으로 관리한다.
    • 싱글톤이 DIP를 위반한다는 말이 이해가 안돼서 지피티한테 물어봤다. 
      • 싱글톤 패턴은 주로 정적 메서드(getInstance())를 통해 객체에 접근합니다.
      • 이로 인해 클라이언트 코드가 구체 클래스(Concrete Class)에 강하게 의존하게 되어 DIP(Dependency Inversion Principle)를 위반합니다.
class MyService {
    private static final MySingleton singleton = MySingleton.getInstance();
    
    public void doSomething() {
        singleton.performAction();
    }
}
  • 이렇게 되면서 이전에 DI가 잘 되지 않았던 버전으로 돌아가게 된다. 생성자를 통해 주입하는 것이 아니라 MySingleton에 의존한다.

👻 오늘 하루 복기

오늘은 정말정말정말 추웠다. -12도까지 찍었던거 같다. 스프링을 중점적으로 공부했다. 풀스택 챌린지가 2일짜리 과제인지 모르고 미리 해둔 덕분에 시간이 좀 생겼다. 내일까지 스프링 강의 듣고 플라스크로 만들었던 서버 프로젝트 옮겨야겠다!

728x90