스프링의 핵심은 무엇인가?

GoldenDusk·2023년 12월 2일
0

CS지식

목록 보기
19/26

스프링이란?

🔗 출처 : https://dev-coco.tistory.com/80
🔗 강의 출처 :https://www.inflearn.com/course/스프링부트-개념정리

🍒 스프링은 프레임워크이다.

Framework : 틀안에서 동작하다.

구슬은 틀안에서 움직임과 같은 것이다. 틀 안에서 벗어나지 말라는 뜻으로 틀을 제공해줄 테니 이 틀에 맞춰서 개발을 해라 그렇게 하면 좋은 프로그램을 만들 수 있다.

🍒 스프링은 오픈 소스이다.

  • 스프링이 어떻게 만들어졌는 지 내부를 볼 수 있고 내부를 뜯어고칠 수 있다.
  • 소스 코드가 공개! 오픈 소스이기 때문에 불편한 부분을 고쳐서 기여 가능하다.

🍒 스프링은 IoC 컨테이너를 가진다.(Inversion Of Control)

class는 설계도이며, object는 실체화가 가능한 것이며(롤 캐릭터 중 누누는 class이나 캐릭터는 추상적인 의미의 추상 클래스), instance는 실체화 된 것이다.

object를 의자 s = new 의자();로 heap에 올리면 이 s는 만든 메서드가 관리함 단점은 이렇게 되면 나중에 공유할 때 힘들어진다.

⭐ IoC(역전의 제어) ⇒ 주로 주도권 스프링

객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미

컴포넌트 의존관계 설정(Component dependency resoulution), 설정(Configuration) 및 생명주기(LifeCycle)을 해결하기 위한 디자인 패턴(Design Pattern)이다.

  • 스프링이 직접 만든다. 스캔하여 heap 메모리에 올려주고 스프링이 직접 관리

⭐ IoC 컨테이너

컨테이너?란 컨테이너는 보통 객체의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것

스프링 프레임워크도 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너가 있는데,그것이 바로 IoC 컨테이너(=스프링 컨테이너)

인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해주기 때문에 객체 관리 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있다는 장점이 있다.

  • IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.
  • POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.
  • 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.
  • 개발자는 비즈니스 로직에 집중할 수 있다.
  • 객체 생성 코드가 없으므로 TDD가 용이하다.

POJO(Plain Old Java Object)란?
주로 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object를 지칭한다.
Java Bean 객체가 대표적이다.
간단하게 getter / setter를 생각하면 될 것 같다.

🍒 스프링은 DI를 지원한다.

⭐ IoC의 분류 : DL(Dependency Lookup) 과 DI (Dependency Injection)

  • DL : 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lockup하는 것
  • DI : 각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것
    • Setter Injection (수정자 주입)
    • Constructor Injection (생성자 주입)
    • Method Injection (필드 주입)
  • DL 사용시 컨테이너 종속이 증가하기 때문에 주로 DI를 사용한다. DI로 인해 스프링이 만든 것들을 다른 곳에서 사용이 가능하다. 즉, 공유가 가능하다.

🔗 출처 : https://dog-developers.tistory.com/12

⭐ DI(Dependency Injection)란?

스프링 빈을 등록하는 두 가지 방법(@Component, @Bean)

의존성 주입 3가지 방법 - (생성자 주입, Field 주입, Setter 주입)

⭐ 스프링 컨테이너 (= IoC 컨테이너)의 종류

  • 스프링 컨테이너가 관리하는 객체를 빈(Bean)이라고 하고,이 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리(BeanFactory) 라고 부른다.
  • 객체의 생성과 객체 사이의 런타임 관계를 DI 관점에서 볼 때 컨테이너를 BeanFactory라고 한다.
  • BeanFactory에 여러가지 컨테이너 기능을 추가어플리케이션컨텍스트(ApplicationContext)가 있다.

⭐ BeanFactory와 ApplicationContext

1.  BeanFactory

  • BeanFactory 계열의 인터페이스만 구현한 클래스는 단순히 컨테이너에서 객체를 생성하고 DI를 처리하는 기능만 제공한다.
  • Bean을 등록, 생성, 조회, 반환 관리를 한다.
  • 팩토리 디자인 패턴을 구현한 것으로 BeanFactory는 빈을 생성하고 분배하는 책임을 지는 클래스이다.
  • Bean을 조회할 수 있는 getBean() 메소드가 정의되어 있다.
  • 보통은 BeanFactory를 바로 사용하지 않고, 이를 확장한 ApplicationContext를 사용한다.

2.  ApplicationContext

  • Bean을 등록, 생성, 조회, 반환 관리하는 기능은 BeanFactory와 같다.
  • 스프링의 각종 부가 기능을 추가로 제공한다.
  • BeanFactory 보다 더 추가적으로 제공하는 기능
    • 국제화가 지원되는 텍스트 메시지를 관리 해준다.
    • 이미지같은 파일 자원을 로드할 수 있는 포괄적인 방법을 제공해준다.
    • 리스너로 등록된 빈에게 이벤트 발생을 알려준다.

🔗 출처 : https://dog-developers.tistory.com/12

따라서 대부분의 어플리케이션에서는 빈팩토리 보다는 어플리케이션콘텍스트를 사용하는 것이 더 좋다.

🍒 스프링은 엄청나게 많은 필터를 가지고 있다.

필터란?

문지기와 같음.. 임무를 준다. 예를 들어 권한이 없다면 못들어 오게 막는 것과 같은 것을 말한다.

A나라의 성을 tomcat이라고 보고 왕의 집을 스프링 컨테이너라고 생각하면 됨

톰켓 쪽으로 들어오는 필터는 실제 filter라고 불리며, web.xml을 가진다. 두 번째로 스프링 컨테이너로 들어가는 필터Interceptor(AOP)로 권한체크를 해줌

🍒 스프링은 엄청나게 많은 어노테이션을 가지고 있다(리플렉션, 컴파일체킹)

리플렉션(Reflection)

https://velog.io/@prettylee620/Reflection

컴파일체킹

  1. 어노테이션 (주석 + hint) : 컴파일러가 무시하지 않음 ⇒ 마치 @Override

  • 스프링은 어노테이션을 통해 객체를 생성
  • @Compont : 클래스 메모리에 로딩, 즉 IoC가 스캔 읽어서 heap에 자동으로 올려줌

  • @Autowired : 로딩된 객체 해당 변수에 집어 넣기, 동일한 타입의 객체가 있는지 확인 후 있다면 타입(A)을 통해 찾음 있다면 연결 즉, DI 해주게 된다. 없다면 null이 들어감
    class B{
    A a = new A();
    }
    라면, 새로 객체를 만들어서 또 다른 A 객체가 다른 공간에 생성되게 됨
    class B{
    @Autowired
    A a 
    }
    라면, B 클래스 스캔 시 분석하는 기법으로 런타임 시 분석하며, 이를 리플렉션이라고 하는데 분석 시 메서드, 필드, 어노테이션이 어떤 것이 있는지와 무엇인가 해라고 설정할 수 있다.

  1. // 주석 : 컴파일러가 무시
profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

0개의 댓글