20201109-MVCstudy (6) - 스프링 구조

스프링 컨테이너

Spring Component

자바 Reflection

  • Reflection : 클래스의 정보를 읽어와서 처리
    • 리플렉션이란 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법을 말한다.
    • 클래스의 구조를 개발자가 확인할 수 있고, 값을 가져오거나 메소드를 호출하는데 사용된다.
  • Reflection을 사용해서 스프링에서는 런타임 시에 개발자가 등록한 빈을 애플리케이션에서 가져와 사용할 수 있게 되는 것이다.

    • class : ClassForName() 메모리 할당
    • 멤버변수 : 필요시에 변수를 초기화
    • 생성자 : 멤버변수 초기화(매개변수)
    • 메소드 : setter/getter
    • 지역변수(X)
    • 기타 : 생성 시, 한번 혹은 소멸 시, 한 번
  • 스프링을 통해서 값을 넣어주는 것을 DI라고 한다.

스프링이 필요한 이유는?

  • 메소드가 20개면 스프링이 알아서 20개를 배치해주는 것이 아니다.
    • 맨 처음 생성 한번, 소멸할 떄 한 번만 스프링이 담당한다.
    • 나머지는 프로그래머가 직접 배치해야한다.
    • 90%는 프로그래머가 담당하고 10%만 스프링이 담당한다.
    • 스프링을 사용한다고 소스가 작아지는 것이 아니다
  • 스프링의 장점은 핵심코딩만 하게 해준다는 것이다.
    • 생성, 소멸은 스프링이 담당하기 때문이다.
  • 스프링의 좋은 점은 소멸의 관리를 스프링이 담당한다는 것이다.
    • 생성을 하지 않는 것이 장점이다.
      • 스프링을 사용하지 않고 new를 사용하면 메모리 할당이 커진다.
    • 스프링에서 값을 넣는 방법은 setter와 생성자 둘 뿐이다.
  • 스프링에는 MVC가 없었다.
    • 웹이 발전하면서 MVC가 라이브러리로 발전한 것이다.
    • DispatcherServlet이 잘 만들어져 있다.
  • 스프링에서는 DI와 AOP가 핵심이다.
    • 면접 TIP : OOP(객체지향 프로그램)답게 만든 것이 AOP이다?
    • OOP에는 자동호출 기능이 없다.
    • 콜백함수처럼 자동호출하게 만드는 것이 AOP이다.
    • 중복을 제거할 때, AOP는 호출을 안해도 자동으로 만들게 해주는 것이다.
    • OOP를 더 보완한 것이 AOP이다.

IoC 적용을 위한 기법

  • IoC(Inversion of Controll) : 제어의 역행
    • 기존의 제어방식은 필요로 하는 측에서 만들어서 썼다. 제어의 역행을 통해서 이루고자 하는 것은 낮은 결합도, 유지보수성 향상이다.
  • DL(Dependency Lookup) : getBean() , 클래스 관리자
  • DI(Dependency Injection) : 주입 , 필요한 데이터를 첨부
    • setter DI
      • 멤버변수 값 주입
        • p:name=""
    • 생성자 매개변수에 값 주입
      • c:name=""
    • 메소드 DI
      • init-method
      • destroy-method
  • 스프링은 결합성이 낮은 프로그램을 지향한다. (POJO방식)
    • 클라이언트 쪽에는 에러가 나지 않도록 만드는 것이 스프링이다.
    • 클라이언트에게 서버 정보가 새지 않는 이유는 스프링이 컨테이너를 통해 제작되었기 때문이다.

스프링 2.5 VS 5.0

  • 스프링 2.5~4.XX의 구성
    • 자바
    • XML(XML, Annotaion)
  • 스프링 5.0
    • 자바 전용(Annotation)

스프링 어노테이션 종류

순서

  • .do => DispatcherServlet => HandlerMapping => Model(@Controller) => DAO(Manager) => Model(@Controller) => DispatcherServlet => ViewResolver => View(JSP)

  • Model(RequestMapping) => DAO(Manager) => request.setAttribute() => model.addAttribute()

  • Tiles