[Spring] Spring 이란
spring boot를 사용하여 프로젝트를 진행하게 되었다. 개념이 잘 잡히지 않는 상태에서 spring boot tutorial을 보고 마구 잡이로 하다보니 한계가 있음을 느꼈다. 코드를 이해하고 더 효율적으로 짜기 위해 체계적으로 공부하려 한다. spring boot는 spring에 기반하여 만들어졌으므로 spring에 대한 이해는 필수라는 이야기를 많이 들었기에 Spring부터 학습하겠다.
Spring과 Spring boot의 차이점을 작성하면서 Spring 의 특징을 적긴 했지만 다시 정리해 보려 한다.
Spring Framework?
: 자바 웹 애플리케이션 개발을 위한 오픈소스 프레임워크
Spring의 특징
1. IOC (Inversion of Control) - 제어의 역전
기존에는 "객체 생성 -> 의존성 객체 생성 -> 객채 내의 메소드" 호출 과정을 거쳤다. 이 과정은 모두 사용자가 제어하는 구조이다.
IOC란 기존 사용자가 모든 작업을 제어하던 것을 외부에 위임하여 객체의 생성부터 생명주기 등 모든 객체에 대한 제어권이 넘어 간 것
이때, 위에서 말한 외부란 IoC컨테이너를 말하고, 기본적으로 컨테이너는 객체를 생성하고 객체간의 의존성을 이어주는 역할을 한다.
1) BeanFactory
BeanFactory 인터페이스는 IoC컨테이터의 기능을 정의하고 있는 인터페이스
Bean의 생성 및 의존성 주입, 생명주기(lifecycle) 관리 등의 기능을 제공
* Bean: IoC컨테이너에 의해 생성되고 관리되는 객체
2) ApplicationContext
ApplicationContext는 BeanFactory를 상속받아 BeanFactory가 제공하는 기능 외에 AOP, 메세지처리, 이벤트 처리 등의 기능을 제공
BeanFactory를 상속받았으므로 당연히 BeanFactory의 기능을 모두 제공한다. 그래서 ApplicationContext를 사용하는게 바람직하다.
2. DI(Dependency Injection) - 의존성 주입
의존성 주입이란 객체가 서로 의존하는 관계가 되게 의존성을 주입하는 것
객체지향 프로그램에서 의존성 이란 하나의 객체가 어떠한 다른 객체를 사용하고 있는 것.
즉, IOC에서 DI는 각 클래스 사이에 필요로 하는 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 주는 것
3. POJO (Plain Old Java Project)
평범한 자바 오브젝트
일반적인 J2EE 프레임워크에 비해 구현을 위해 특정 인터페이스를 구현하거나 상속받을 필요가 없다. -> 객체가 가볍다.
getter/setter를 가진 단순 자바 오브젝트로 정의를 하고 있다. 이러한 단순 오브젝트는 의존성이 없고 추후 테스트 및 유지보수가 편리하다.
4. AOP(Aspect Oriented Programming) - 관점 지향 프로그래밍
핵심기능과 공통기능을 분리시켜 핵심 로직에 영향을 끼치지 않게 공통기능을 끼워 넣는 개발 형태
- 중복 되는 코드를 제거
- 효율적인 유지보수가 가능
- 재활용성이 극대화
5. MVC 패턴
1) Model : 데이터 처리를 담당
Service 영역과 DAO영역으로 구성
- Service 부분은 불필요하게 HTTP통신을 하지 않아야하고 request나 response와 같은 객체를 매개변수로 받아선 안된다
- Service는 view에 종속적인 코드가 없어야 하고 View 부분이 변경되더라도 Service 부분은 그대로 재사용 할 수 있어야 한다.
- DAO는 Database Data에 접근하는 객체
2) View : 사용자가 보게 될 결과 화면을 출력
Controller를 통해 모델에 데이터에 대한 시각화를 담당
- View는 자신이 요청을 보낼 Controller의 정보만 알고 있어야 하는 것이 핵심
3) Controller : 사용자의 입력처리와 흐름 제어를 담당
View에 받은 요청을 가공하여 Model(Service 영역)에 이를 전달한다. 또한 Model로 부터 받은 결과를 View로 넘겨주는 역할
- 모든 요청 에러와 모델 에러를 처리
참고 URL