숭어 개발 블로그

[Spring] Spring 이란? & 동작 흐름 본문

Spring

[Spring] Spring 이란? & 동작 흐름

숭어싸만코 2022. 9. 26. 21:08

Spring Framework란?

자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션입니다.

엔터프라이즈급 개발이란 뜻대로만 풀이하면 기업을 대상으로 하는 개발이라는 말입니다. 즉, 대규모 데이터 처리와 트랜잭션이 동시에 여러 사용자로 부터 행해지는 매우 큰 규모의 환경을 엔터프라이즈 환경이라 일컫습니다.

Spirng Framework는 경량 컨테이너로 자바 객체를 담고 직접 관리합니다. 객체의 생성 및 소멸 그리고 라이프 사이클을관리하며 언제든 Spring 컨테이너로 부터 필요한 객체를 가져와 사용할 수 있습니다. 

이는 Spirng이 IOC 기반의 Framework임을 의미합니다.

 

 

Spring Framework는 IOC기반이다. IOC란?

 

IOC는 Inversion of Control의 약자로 말 그대로 제어의 역전입니다. 그럼 제어의 역전이란 무엇일까요?     

 

일반적으로 지금까지 프로그램은

객체 결정 및 생성 -> 의존성 객체 생성 -> 객채 내의 메소드 호출 하는 작업을 반복했습니다. 

이는 각 객체들이 프로그램의 흐름을 결정하고 각 객체를 구성하는 작업에 직접적으로 참여한 것입니다.

즉, 모든 작업을 사용자가 제어하는 구조인 것입니다.

 

하지만 IOC에서는 이 흐름의 구조를 바꿉니다. IOC에서의 객체는 자기가 사용할 객체를 선택하거나 생성하지 않는다. 또한 자신이 어디서 만들어지고 어떻게 사용되는지 또한 모릅니다. 자신의 모든 권한을 다른 대상에 위임함으로 써 제어권한을 위임받은 특별한 객체에 의해 결정되고 만들어집니다.

즉, 제어의 흐름을 사용자가 컨트롤 하지 않고 위임한 특별한 객체에 모든 것을 맡기는 것입니다.

 

IOC란 기존 사용자가 모든 작업을 제어하던 것을 특별한 객체에 모든 것을 위임하여 객체의 생성부터 생명주기 등 모든 객체에 대한 제어권이 넘어 간 것을 IOC, 제어의 역전 이라고 합니다.

 

 

IOC의 구성요소 DI와 DL

 

IOC는 DI와 DL의 의해 구현됩니다.

 

DL(Dependency Lookup) - 의존성 검색

컨테이너에서는 객체들을 관리하기 위해 별도의 저장소에 빈을 저장하는데 저장소에 저장되어 있는 개발자들이 컨테이너에서 제공하는 API 를 이용하여 사용하고자 하는 빈 을 검색하는 방법입니다.

 

DI(Dependency Injection) - 의존성 주입 

의존성 주입이란 객체가 서로 의존하는 관계가 되게 의존성을 주입하는 것입니다. 객체지향 프로그램에서 의존성 이란 하나의 객체가 어떠한 다른 객체를 사용하고 있음을 의미합니다. 그렇다면 IOC에서의 DI는 무엇일까요?

바로 각 클래스 사이에 필요로 하는 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 주는 것입니다.

 

 

Spring Framework의 특징 POJO

 
POJO(Plain Old Java Object) 란 말 그대로 평범한 자바 오브젝트입니다. 
이전 EJB(Enterprise JavaBeans)는 확장 가능한 재사용이 가능한 로직을 개발하기 위해 사용 되었었는데 EJB는 한가지 기능을 위해 불필요한 복잡한 로직이 과도하게 들어가는 단점이 있었습니다. 그래서 다시 조명을 받은게 POJO입니다. POJO는 gettet/setter를 가진 단순 자바 오브젝트로 정의를 하고 있습니다. 이러한 단순 오브젝트는 의존성이 없고 추후 테스트 및 유지보수가 편리한 유연성의 장점을 가집니다. 이러한 장점들로 인해 객체지향적인 다양한 설계와 구현이 가능해지고 POJO의 기반의 Framework가 조명을 받고 있습니다.
"POJO를 사용함으로써, 당신의 코드는 더욱 심플해졌고, 그로인해 테스트 하기에 더 좋으며, 유연하고, 요구사항에 따라 기술적 선택을 바꿀수 있도록 바뀌었다."
 

Spring Framework의 특징 AOP

 
AOP(Aspect Oriented Programming)란 말 그대로 관점 지향 프로그래밍입니다.
대부분 소프트웨어 개발 프로세스에서 사용하는 방법은 OOP(Object Oriented Programming) 입니다. 
OOP는 객체지향 원칙에 따라 관심사가 같은 데이터를 한곳에 모아 분리하고 낮은 결합도를 갖게하여 독립적이고 유연한 모듈로 캡슐화를 하는 것을 일컫습니다. 하지만 이러한 과정 중 중복된 코드들이 많아지고 가독성, 확장성, 유지보수성을 떨어 뜨립니다. 이러한 문제를 보완하기 위해 나온 것이 AOP입니다.
AOP에서는 핵심기능과 공통기능을 분리시켜 핵심 로직에 영향을 끼치지 않게 공통기능을 끼워 넣는 개발 형태 이며 이렇게 개발함에 따라 무분별하게 중복되는 코드를 한 곳에 모아 중복 되는 코드를 제거 할 수 있어지고 공통기능을 한 곳에 보관함으로써 공통 기능 하나의 수정으로 모든 핵심기능들의 공통기능을 수정 할 수 있어 효율적인 유지보수가 가능하며 재활용성이 극대됩니다. 
물론 AOP로 만들 수 있는 기능은 OOP로 구현 할 수 있는 기능이지만 Spring에서는 AOP를 편리하게 사용 할 수 있도록 이를 지원하고 있습니다.

 

※ Spring Framework의 흐름

 

 

1. URL을 통해서 사용자의 Request(요청)이 가장 먼저 일어난다.  ex> 로그인, 회원가입, 글쓰기 등등...


2. Dispatcher Servlet에서 모든 요청을 받아들인다.( JSP&Servlet의 FrontController 역할 :   .do 를 통해 받아들인다. )

- Dispatcher Servlet은  web.xml안의 <servlet> 태그안에 있으며 스프링 특정영역 안에서 객체화되어 올라간다.


3.  Dispatcher Servlet은 요청과 응답만 해준다.

- 실질적인 일을 하는곳은 Controller ( POJO : Plain Old Java Object <자바의 오래된 객체> )

- Controller 는 class로 되어있다.


4. Dispatcher Servlet에서 일을 시키는 Controller(POJO)를 찾아가야하는데

    Handler Mapping이  urlMapping 값을 통해 찾아준다.

 

        - urlMapping값을 통해 찾는 3가지 조건

   

 

 

첫번째 조건

- 여러 Package에서 Controller를 찾으려면 scan을 해야한다.

 

 

 

 

 

servlet-context.xml안의

< context:component-scan base-package = "컨트롤러가 있는 패키지이름 "  / > 

 ==> "컨트롤러가 있는 패키지 " 에 모든 컨트롤러가 있으니 여기서 @(annotation)이 있는 객체들을 모두 scan 해라

 

 

 

두번째  

  @Controller :

- 여기가POJO (일을 하는곳임을 명시) 이다.

 

  세번째

@RequestMapping :

- 이 기능을 실행 시켜라

 


 

5. Handler Mapping 은 단순히 찾는 역할뿐 ,

    - Controller(POJO)를 실행 시키려면  Handler Adapter가필요하다.


6.  Handler Adapter통해 요청한 Controller 를 실행(ex>로그인, 회원가입, 글쓰기 등)  시키면,

  - 사용자의 요청(ex>게시글조회, 작성 등) 을 수행하기위해 DataBase에 접근이 필요하다.


7. ======================== DB 접근 및 작업========================

 


< pom.xml에(필요한 API 등록) >

 

- DB에 접근을 쉽게 도와주는 프레임 워크  MyBatis !!

       (기존 자바의 서블릿에서는 dao통해 커넥션, SQL문 작성 등등 을 실행 했었음)

 

     # MyBatis 안의 DBCP의 종류 중 대표인 HikariCP가 커넥션을 만든다.

     # HikariCP 안에는 JDBC가 숨어있다.

 

         DBCP : Data Base Connection Pool 

  • ==> 미리 Connection 생성 후 대여와 반납 ( 사용자가 몰렸을때를 방지 )
  • DB와 미리 connection(연결)을 해놓은 객체들을 pool에 저장해두었다가,
  • 클라이언트 요청이 오면 connection을 빌려주고, 처리가 끝나면 다시 connection을 반납받아 pool에 저장하는 방식

 

root-context.xml 내 DB연결과정


1.config (커넥션)객체 생성

- 드라이버 잡아주기 

- url주소

- ID 설정

- PW 설정

 

2.  dataSource객체를 만들때 config(커넥션)를 생성

 

3.DAO역할인 SessionFactory  : sql 처리 기능

 

4.  SQL문 실행

 

 POJO(일을하는곳)와    .XML(SQL문 작성하는곳)을 연결(Mapping) 하는   >> Mapper(Interface)

 

< POJO  < === >  Mapper < === > .xml >

 

# POJO ==>  Mapper.java(인터페이스) ==> Mapper.xml 흐름 #

 

myBatis와 Mapper.xml의 연결과정

 - root.xml의  <mybatis : scan>  : 이패키지에서  .xml을 찾아라 ==> 그러면 myBatis의 HikariCP가 연결

====================== 여기까지 DB처리 끝 =======================

 


 

8. 인터페이스 내 메소드를 사용하기 위해선 객체를 생성해야 하지만 인터페이스는 객체를 생성 할 수 없다.

그래서 필드만 만들어 놓고 스프링 어느 메모리 영역에 인터페이스 객체를 만들어 주입 받아서 사용한다.

 

이걸 주입 받기 위해서 @Autowired(어노테이션) 또는 @Inject를 사용한다.

이걸 의존성 주입 (DI : Dependencyt Inject) 라고 한다.

=============기능 (일) 처리끝=============


 

9. 일처리가 끝난 Controller는 이동해야할 페이지 이름 ==> view name만 넘겨준다


 

10. 이동해야할 정보(ex>게시글정보) 가 있다면 Model에 저장하여 가져온다.

이때 해당 메소드의 매개변수에 정의해두면 Model을 쓸 수있다.


11. 최종적으로 jsp로 이동하기 위해서는 / WEB-INF / views / 페이지명.jsp  과 같은 완전한 경로가 필요한데

이 작업을 servlet-context.xml의 View Resolver가 자동으로 해준다.

 

View Resolver는

- prefix (접두사)로  / WEB-INF / views / 

- suffix(접미사)로  . jsp 를 완성 시켜준다.

 


12. Response(응답)

- View Resolver에서 완성된 jsp주소

- Model에 저장된 정보 

이렇게 만들어진 최종 View ( jsp페이지) 는 Dispatcher Servlet을 통해 사용자에게 Respons(응답) 해주게 된다.

 


마지막으로

 

파란색 영역 : 스프링에서 제공된 영역 ( 개발자들이 못건들인다>> 프레임워크 )

보라색 영역 : 개발자 컨트롤 부분 ( 일정영역 안에서 개발해라 >> 중구난방 개발을 막는다. )

연두색 영역 : 수정 할 수도있고 안 할 수도 있고~

 

 

 

일부 출처 :
https://khj93.tistory.com/entry/Spring-Spring-Framework%EB%9E%80-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC

 

 

Comments