강좌 ch3. 5강 요약
Java Beans
재사용 가능한 컴포넌트, 상태, getter&setter, no-args constructor
원래 beans는 클라이언트 GUI 측면에서 개발자들이 손쉽게 가져다 쓸 수 있게 만들려 한 기술이지만, 잘 풀리지 않아서 서버쪽에서 쓰이게 되었다. GUI를 구현할 필요가 없으므로 서버측에서 사용하는 beans는 훨씬 간단하다.
beans는 MVC 패턴의 model에서 데이터를 전달할 때 사용하는 객체가 되었다. EL, scope, JSP container가 관리하며, 꼭 데이터 전달 뿐만 아니라 JSP 컨테이너에 담아 관리하는 객체는 전부 빈이다.
간단했던 beans는 Enterprise Java Beans가 나오면서 복잡한 규칙을 가지게 되고, EJB container가 관리하는 것으로 바뀌었다.
복잡한 규칙에 반발한 개발자들이 만든 것이 Plain Old Java Object의 Spring bean으로, EJB의 복잡한 규칙을 단순화하였다. POJO는 단순하고 독립적이며, Spring container가 관리한다.
이런 변천사를 거쳐 bean은 Spring Container가 관리하는 객체가 되었다. Spring container는 bean 저장소로, bean을 저장하고 생성, 소멸, 연결 등을 관리한다. 라이프사이클 뿐만 아니라 객체들 간의 관계까지 관리해주는 것이다. xml 파일을 만들어 그 안에 bean을 여러 개 입력하는 것이 bean 정의이고, 이것을 spring container가 읽어서 빈에 정의된 클래스 객체를 생성한다.
- BeanFactory : (인터페이스) Bean 생성, 연결, 기본 기능을 정의
- ApplicationContext : (인터페이스) BeanFactory를 확장한 것으로 여러 기능을 추가 정의
참고 Spring 문서
BeanFactory는 생성과 연결의 기능만 가지고 있지만, ApplicationContext는 그 외 모든 추가기능들을 가지고 있다.
Application Context는 스프링으로 애플리케이션을 개발할 때, 작성한 프로젝트의 전체 환경을 관리하며, Spring Container는 그 일부이다. Application Context도 인터페이스로, 스프링은 다양한 종류의 애플리케이션 컨텍스트 구현체를 제공한다. 이 중 4개는 기억해두는 것이 좋다.
AC의 종류 | XML | Java config |
---|---|---|
non-Web | GenericXmlApplicationContext | AnnotationConfigApplicationContext |
Web | XmlWebApplicationContext | AnnotationConfigWebApplicationContext |
설정 파일이 xml인지 Java 코드로 되어있는지, Web 프로젝트인지 아닌지에 따라 Application Context의 인터페이스가 달라진다.
요즘은 xml보다는 자바코드를 더 많이 쓰는 추세라고 한다. 자바 코드는 컴파일러가 체크를 해줘서 관리가 더 용이하기 때문이다. 하지만 xml 태그들이 애너테이션으로 들어가는 형태기 때문에 크게 다르지 않다고 한다.
(노란색으로 칠해둔 부분을 보면 된다.)
Spring에서는 톰캣이 시작할 때 xml 파일의 이벤트를 체크하며 contextConfigLocation에 주어진 위치로 root 웹 어플리케이션 컨텍스트를 생성한다. 동시에 dispatcher-servlet을 servlet으로 등록하며 애플리케이션 컨텍스트를 하나 더 만드는데, 이 때 사용하는 설정파일은 servlet-context.xml이다. 서블릿을 등록하며 생성된 Application Context는 제일 먼저 만들어진 Application Context의 자식이다.
하여 어떤 bean을 찾을 때 자식에게서 먼저 찾고, 없으면 부모 컨텍스트로 가서 찾게 되어 있다. 그래서 부모에는 web과 상관없는 DB bean 등 공통으로 쓰이는 bean을, 자식들에게는 개별 모듈에서 사용하는 bean을 넣어둔다.
ApplicationContext는 JSP의 기본 객체 application으로, 전체 애플리케이션에서 접근할 수 있는 그 애플리케이션 객체를 이야기한다. 이 객체 안에는 attribute라는 맵이 있어, root 웹 애플리케이션 컨텍스트를 저장할 수 있다.
Servlet 컨텍스트는 children 맵에 appServlet으로 저장되며, DispatcherServlet을 거쳐 XmlWebApplicationContext에 parent로 등록된 root 컨텍스트를 참조할 수 있다.
용어 | 뜻 |
---|---|
Servlet Context (ApplicationContextFacade) | Facade 패턴으로 만듦(복잡한 구조를 단순하게 외부에 노출할 때 씀). ApplicationContext를 한 번 감싸고 있음, 캐시까지 포함 |
Context(ApplicationContext) | 안에 StandardContext와 attributes 같은 환경을 함께 묶어둔 것 |
StandardContext | 실제로 서블릿을 맵으로 관리하는 Context |
children | Context 안에 서블릿들이 등록되어 있는 맵, 그 중 하나가 appServlet |