IT 공부/KH 정보교육원

Spring 사용방법 (개념)

Zinisang 2021. 6. 15. 18:17

처리영역

presentation 처리영역 : Spring(MVC)
MVC 아키텍처를 제공하는 UI Layer 프레임워크 / Spring프레임워크 포함.

Business 처리영역 : Spring(IoC, AOP)
Spring은 컨테이너 성격을 갖는 프레임워크
Spring의 IoC, AOP모듈을 이용하여 Spring컨테이너에서 동작하는 엔터프라이즈 비지니스 컴포넌트를 개발할 수 있다.

Persistence 처리영역 : mybatis
개발자가 작성한 SQL 명령어와 자바 객체(VO, DTO)를 매핑해주는 기능을 제공. 기존에 사용하던 SQL 명령어를 재사용하여 개발하는 차세대 프로젝트에 유용하게 적용할 수 있다.


개념

IoC 적용

  • 필요한 객체 생성부터 처리까지를 컨테이너가 처리.
  • 결합도가 느슨하게끔 만들어져있기 때문에 유지보수가 편리.

 

관점지향 프로그래밍 (AOP)

  • 비지니스 메소드를 개발할 때, 핵심 지브니스 로직과 각 비지니스 메서드마다 반복해서 등장하는 공통로직을 분리함으로써 응집도가 높게 개발할 수 있게 해주는 자원


컨테이너(Container)

  • 특정 객체의 생성과 관리를 담당하고, 객체의 운용에 필요한 다양한 기능을 제공. 
    일반적으로 서버 안에 포함되어 배포 및 구동된다.
  • 대표적인 컨테이너:
    • Servlet 컨테이너: Servlet 객체를 생성하고 관리. / Tomcat 서버에 포함.
    • EJB 컨테이너 : EJB 객체를 생성하고 관리.
    • 스프링 : 애플리케이션 운용에 필요한 객체를 생성, 객체간의 의존관계를 관리.

 

IoC 컨테이너 (Inversion of Control)

  • 스프링 프레임워크를 이해하는데 가장 중요한 개념!!!
  • 익숙한 서블릿 컨테이너를 통해 스프링 컨테이너의 동작 방식에 대하여 학습.

Servlet 컨테이너 동작 순서

  1. WEB-INF/web.xml 파일을 로딩하여 구동.
  2. 브라우저로부터 요청된 /hello.do 수신
  3. com.lsj.biz.HelloServlet 클래스를 찾아
  4. 객체를 생성하고, doGet() 메서드를 호출
  5. doGet() 메서드의 실행 결과를 클라이언트 브라우저로 전송


스프링 컨테이너 역시 Servlet 컨테이너와 유사하게 동작하므로 위와 비슷한 요소들이 존재한다.

 

제어의 역행(IoC)

제어의 역행(IoC)은 결합도와 관련된 개념으로 이해!!

기존 자바기반 방식으로 애플리케이션을 개발할 경우,
개발자가 객체들을 생성하고 객체들 사이의 의존관계를 처리.
즉, 개발자가 어떤 객체를 생성할지 판단하고,
객체 간의 의존관계 역시 자바 소스 코드로 표현!!

제어의 역행(IoC)
이런 작업들을 컨테이너로 처리하는것을 의미!!!
따라서 제어의 역행을 이용하면 소스에서 객체 생성과 의존관계에 대한 코드가 사라져서 결과적으로 낮은 결합도의 컴포넌트를 구현할 수 있다.


기본 사용 설정

<beans~~~>
     <bean id="자바변수명형식"    class="풀네임"    init-method="메서드명"    destroy-method="메서드명">
     </bean>

     <bean name="특수기호가능"    class="풀네임"    init-method="메서드명"    destroy-method="메서드명">
     </bean>

     <bean name="특수기호가능"    class="풀네임"    init-method="메서드명"    destroy-method="메서드명"
               lazy-init="true" > 
     </bean>
     // lazy-init="true" : 빈 요청(getBean("id")) 시, 객체 생성

     <bean name="특수기호가능"    class="풀네임"    init-method="메서드명"    destroy-method="메서드명"
               lazy-init="true"  scope="singleton">
     </bean>
     // scope="singleton" : 기본값 컨테이너내에 하나의 객체만 생성하여 사용 가능

     <bean name="특수기호가능"    class="풀네임"    init-method="메서드명"    destroy-method="메서드명"
               lazy-init="true"  scope="prototype">
     </bean>
     // scope="prototype" : 빈 요청(getBean("id")) 를 요청할 때마다 새로운 객체 생성

</beans


init-method의 정확한 시점

=> 클래스를 이용하여 객체가 만들어지고 해당 객체가 getBean()에 의해 반환되기 직전.. 즉, 초기화 직전..

  1. id : 생성
  2. init-method : 초기화 직전
  3. ~~~실행내용
  4. destroy-method : 소멸 직전..(확인하는 방법 : 해당 객체를 관리하는 컨테이너를 자원해제(close()))
  5. 소멸