2018-8-6 스프링 라이프사이클과 컨테이너
포비강의
오늘의 할 주제
- DI와 Spring DI
- Suvelet Container / Spring(DI or Bean) Container
Servelet은 HTTP를 좀 더 사용하기 편하도록 만든것이다. 이것을 좀 더 추상화를 한 것이 Srping MVC이다.
- 스프링은 servelet Container위에서 동작을 하고 있다.
- SpringMVC는 기본적으로
컨테이너란 무엇일까?
- 서블릿은 SUN사에서 제안한 웹서비스를 위한 인터페이스로, 원칙적으로는 javax.servlet.Servlet 인터페이스의 구현체입니다. 일반적인 자바 독립 실행프로그램과 달리 main 메서드가 없으며, 서블릿 컨테이너에 등록된 후 서블릿 컨테이너에 의해 생성, 호출, 소멸이 이루어집니다.
- 서블릿 컨테이너는 이러한 서블릿을 관리하며 네크워크 통신, 서블릿의 생명주기 관리, 스레드 기반의 병렬처리를 대행합니다. 즉, 웹 클라이언트로 부터 HTTP 요청이 전달되면 해당 HTTP 요청을 해석하여 적정한 서블릿의 service 메서드를 ServletRequet, ServletResponse 매개변수와 함께 호출합니다.
- 핵심은 라이프사이클이다.
- 라이프사이클을 관리를 하는것이 핵심이다.
- SpringBean의 라이프사이클을 관리를 하는것이, Spring Container의 역할이다.
라이프사이클이란?
- 객체의 생성부터 소멸까지 생명주기를 관리를 해준다.
- 컨테이너가 없었을때는, 개발자들이 직접 코딩을 통해 객체들을 관리를 다 했다. 컨테이너기반으로 개발을 하면 라이프사이클의 주체가 컨테이너가 된다.
@Resource(name = "userService")
private UserService userService;
- 위의 경우 직접 인스턴스를 생성을 한적이 없다. 컨테이너가 관리를 하나?
컨테이너의 장단점
- 우선 객체를 봤을때, 상태값을 가지는지 안가지는지를 확인을 해야한다. 인스턴스변수를 가지고 있으면 상태를 가지고 있다고 주로 판단을 한다.
- 상태를 가지지 않는 객체와 의존관계를 가지면, 그 해당객체 역시 상태가 없다고 볼 수 있다.
- 상태를 가지지 않는 객체는 싱글턴패턴으로 인스턴스를 만들어서 사용을 하는게, 성능상 좋다.
- 의존관계에 있는 객체들을 서로 연결을 해주는 것이 Dependancy Injection이라고 한다.
- 하나라도 상태가 있으면 엄청난 장애가 발생을 한다.
- 의존관계에 있는 모든 객체에 대해서 꼬리에 꼬리를 물어서 상태의 유무를 확인해야한다.
- 상태값을 가지고 있는 객체를 상속을 받으면, 상위 클래스에 있는 상태를 함께 가지게 된다.
서브릿의 인스턴스는 몇 개 인가?
- 컨테이너가 기본적으로 관리를 하는 인스턴스는 1개이다.
- 서브릿도 상태를 가지는 객체를 인스턴스로 만들면 안된다.
- @Bean이라는 어노테이션을 설정하고, 객체를 만들면 이것은 SpringContainer에 Bean으로 등록을 한다는 의미이다.
- @Service 어노티이션을 사용을 하면, @Bean처럼 객체에 인스턴스를 만들고 자동으로 컨테이너에 생성을 해준다.
어떤경우에 Bean어노테이션을 써야되는가?
- 우리가 직접 코드를 수정할 수 없는 코드들은 @Bean을 직접 입력을 해서 구현을 해야한다.
- 우리가 직접 코드를 수정할 수 있는 부분들은 그냥 어노테이션을 사용을 하는 것이 편하다. 다만 수정할 수 없는 부분에 대해서만 @Bean어노테이션을 사용을 하자.
스프링을 사용하면 DI를 통해서 개발을 하는데, 왜 DI를 사용을 하느냐? 필요성은?
그램발표
리플랙션
- 구체적인 클래스 타입을 알지 못해도 컴파일된 바이트 코드를 가지고 클래스의 정보를 알아내고 사용할 수 있는 자바 API
- 동적로딩을 지원하는 자바의 특징을 이용.
- 자바는 실행시 모든 클래스가 로딩되지않고, 필요할 때 로딩이 된다.
클래스로드
- 클래스파일의 내부를 분석(링크같은처리) 후, 런타임데이터영역(메모리영역)에 배치한다.
Written on August 6, 2018