Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 한번 해블로그

[Spring] Spring DI 활용하기 본문

Spring

[Spring] Spring DI 활용하기

hide on bush 2024. 1. 10. 17:20

Java는 끝내고 Spring으로 들어왔다.. 자바는 이해라도 갔다면 스프링은 정말 무슨 말인지 이해가 되지 않는다..
일단 Spring은 Java 기반의 프레임워크로 더 효과적으로 애플리케이션을 개발하고 유지보수할 수 있도록 도와주는 것이다.
쉽게 말하자면 집을 짓기 위해 필요한 공구들이 있다면, 프로그램을 만들 때도 특별한 도구들이 필요한데, 그 도구 중 하나가 Spring이다. Spring은 프로그램을 만들 때 더 편하게 만들 수 있도록 도와주고, 프로그램을 잘 정리하고 유지보수하기 쉽게 만들어줘서 더 효율적으로 업무할 수 있다.(GPT 선생님의 말씀)

내가 아는 스프링은,, 봄,, LCK 스프링 시즌,, 용수철,, 스프링필드 지역,,뿐,,,


1. 콩? 빈이란? 

JavaBeans : 재사용 가능한 컴포넌트, 상태(iv), getter&setter, no-args constructor

원래 beans는 클라이언트 GUI에서 쉽게 가져다 쓸 수 있게 만들려 한 기술이지만, GUI쪽에서 거의 실패를 해 서버에서 쓰이게 되었다. 서버쪽에서는 GUI(화면에 그려지는 것)가 필요없기 때문에 서버쪽에서 bean이라는게 훨씬 간단하다.

bean은 MVC 패턴의 model 역할이며 데이터를 전달할 때 사용하는 객체가 되었다. EL, scope, JSP container가 자바 객체를 관리. 꼭 데이터 전달 뿐만 아니라 JSP 컨테이너에 담아 관리하는 객체는 전부 bean이라고 한다.

EJB(Enterprise Java Beans)가 나오면서 복잡해졌고 EJB container가 관리하는 것으로 바뀌었다. 관리한다는 것은 bean을 생성하고 소멸하는 것. EJB가 너무 복잡해서 새로운 Spring Bean 생성. 즉, 스프링에서 bean은 EJB에서 복잡한 규칙을 가진 bean을 심플하게 만든 것. 이것이 POJO다. POJO(Plain Old Java Object)는 단순하고 독립적이며 Spring container가 관리한다.


2. BeanFactory와 ApplicationContext

즉, Bean은 Spring Container가 관리하는 객체를 의미. XML 문서를 만들고 bean 태그를 쓰면(bean 정의) spring container가 읽고 bean에 정의된 클래스 객체를 만드는 것. bean을 관리하는 방법은 key-value로 key에는 bean의 이름, value에는 빈 객체를 만들어 주소를 가지고 있는 것.

- Spring Container는 bean 저장소이고 bean을 저장, 관리(생성, 소멸, 연결)함

연결 : 객체가 있으면 객체 간의 관계까지 연결해주는 @Autowired 등이 있고 이런 걸 이용해서 라이프 사이클 관리만이 아니라 객체들 간의 관계까지 관리 -> 그럼 작성해야 할 코드, 변경사항이 생겼을 때도 수정할 코드가 줄어듬

- 1) BeanFactory : Bean을 생성, 연결 등의 기본 기능을 정의해놓은 인터페이스
- 2) ApplicationContext : BeanFactory를 확장해서 여러 기능을 추가 정의한 것

- beanfactory는 생성, 연결 기능만 있지만, Applicationcontext는 추가 기능들을 가지고 있음


3. ApplicationContext의 종류

- 스프링에서 다양한 종류의 ApplicationContext 구현체를 제공. 매우 많지만 4개정도만 알면 됨.

AC 종류 XML Java Config
non-Web GenericXmlApplicationContext AnnotationConfigApplicationContext
Web XmlWebApplicationContext AnnotionConfigWebApplicationContext

- 설정을 XML로 하느냐, Java 코드로 하느냐, 웹인지 웹이 아닌지에 따라 나뉨. 요즘은 XML보다 자바코드를 더 많이 사용한다고 추세라고 함. xml 태그 대신에 어노테이션으로 들어가는 것으로 비슷.

- XML : <bean>
- Java : @Bean
- 자바 코드가 유리한 이유는 컴파일러가 다 체크해주고 xml은 텍스트 문서로 xml 벨리데이터가 태그 유효성 검사를 해주지만 컴파일러보다는 못함.


4. Root AC와 Servlet AC

- Spring MVC <- web이고 xml 설정을 쓰면 XmlWebApplicationContext 사용

ContextLoaderListener가 이벤트 처리기인데 톰 캣이 시작할 때 이벤트를 체크해서 이 XmlWebApplicationContext 생성. 기본적으로 Root AC, Servlet AC 두 개의 context를 생성

-> 생성할 때 /WEB-INF/spring/root-context.xml 설정으로 사용, contextConfigLocation 설정 파일 위치를 알려줌. 이것을 이용해서 new XmlWebApplicationContext() 생성

<servlet>은 dispatcher-servlet을 servlet으로 등록한다. 등록하면서 초기화하면서 하나를 더 만듦
new XmlWebApplicationContext().

-> 이 때 servlet-context.xml을 설정 파일로 사용

 

이렇게 두 개의 설정 파일과 두 개의 ApplicationContext를 만들고 두 개를 서로 연결

root-context.xml이 부모가 되고 servlet-context.xml이 자식이 됨

그래서 어떤 bean을 찾을 때 자식에서 먼저 찾고 없으면 부모까지 찾음. 자식이 여러 개면 모듈별로 나눌 수 있는데 부모에는 공통으로 쓰이는 bean을 넣고 자식에는 개별적인 bean을 넣으면 됨

그래서 부모쪽에서는 웹하고 상관없는 non-Web bean들을 넣음(데이터 베이스 관련 bean 같은) 그 다음 자식에는 각 모듈을 해서 사용하는 bean들을 등록

ApplicationContext는 JSP의 기본 객체 application으로, 전체 application으로 접근할 수 있는 application 객체를 의미. 그 안에 attribute라는 맵이 있어 ContextLoaderListener가 WebApplicationContext를 만들고 attribute에 저장

servlet을 관리하는 children이라는 map에 app-servlet으로 저장, DispatcherServlet를 생성하면서 그 멤버로 contextClass(인스턴스 변수)가 있는데 여기의 ServletWebAC를 생성하고 가지고 있음

그럼 부모에 있는 root context 참조 가능


사실 내가 쓰고도 아직 무슨 말인지 모르겠음 .. 개발의 페이커가 되겠다는 나는.. 이렇게 무너지는 것인가..
패캠에서 공유해주는 강의말고 유튜브에서 찾아서 영상을 봤지만 아직 모르겠다. 어떻게 적용하고 뭘 만들어야할지,,
눈을 감고 있을때마다 눈 앞이 캄캄한게,, 이게 내 미래,,? ㅋㅋ...