1] 개요
- Spring FrameWork는 EJB(Enterprise Java Bean)를 주 프레임워크로 사용할 때 불편했던 부분을 해소 (EJB가 너무 스펙이 좋지않아서..)
- 2003년 6월 Apache 2.0 License로 공개가 되었다
= 장점
1] 생산성
=> 스프링은 개발자가 이론적으로는 알아야 하는 부분이 많지만, 결과적으로 작성하는 코드의 양은 줄어든다.
2] 품질보증
=> 프레임워크는 개발에 필요한 구조가 절반정도는 만들어져 있기 때문에, 필요한 부분만 조립하는 형태로 개발이 가능하다. 프레임워크를 사용하면 회사 입장에서는 일정한 품질이 보장되는 결과를 얻을 수 있다.
3] 유지보수
=> 코드의 의존관계가 명시되지 않으므로 결합도가 낮아지기 때문에 유지보수가 편리해진다.
= 스프링 프레임워크의 구조
2] 특징
1] 경량 컨테이너로써 자바 객체를 직접 관리
=> 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
2] POJO(Plain Old Java Object) 방식의 프레임워크
(https://ko.wikipedia.org/wiki/Plain_Old_Java_Object)
3] 제어의 역전[IOC(Inversion Of Control)]을 지원
=> 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출
4] DI(Dependency Injection)을 지원
=> 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
5] AOP(Aspect-Oriented Programming)
=> 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리가능
6] 영속성(Persistence)과 관련된 다양한 서비스를 지원
=> iBatis나 Hibernate등 이미 완성도가 높은 DB처리 라이브러리와 연결할 수 있는 인터페이스를 제공.
7] 스프링은 확장성이 높음
=> 스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기에 용이하다.
3] DI(Dependency Injection) - 의존 주입
=> 설명 : 밖에서 주입
= 프로그래머는.. 1) 부품을 만든다(클래스 구현) / 2) 부품 조립 명세서를 정의한다(생성자 주입 방식)
= 스프링 프레임워크는.. 1) 부품을 조립한다 (자동 DI) / 2] 쓸 줄 아는 "제품"은 알아서 사용한다. (ex) URL - Controller Mapping)
=> 명세서에 따라 자동으로 부품을 조립하는 것과 비슷하다.
DI 문법 3가지
1] 생성자 주입 방식 (권장)
- Unit Test(단위 테스트)가 쉽다.
- final 선언이 가능
- 순환 의존성이 발생한 경우에 대응(BeanCurrentlyCreationException 발생)
- 단일 책임 원칙을 더 잘 지키게 함 (생성자의 파라미터가 많아지면 위험신호이고, 리펙토링 할 필요성이 발견 됨)
2] setter 주입 방식
- 권장하지 않음...!
3] 필드 주입 방식
- 코드가 간결함
=> 장점으로 볼 수 있음. - Unit Test(단위 테스트)가 어렵다.
- final 선언이 불가능
- 순환 의존성이 발생한 경우 Detect 불가능.
=> (A→B, B→A)
4] Ioc(Inversion of Control) - 제어의 역전
= 개념
: 개발자가 제어하던 프로그램의 흐름을 컨테이너가 제어
- 스프링 Bean 이란?
- 스프링이 관리하는 독립적인 단위로서의 객체(Object)
- 일반 자바 Object와 다른 것이 없고, 그냥 스프링이 관리하고 있음
- 작업을 할 수 있는 Object이고, 이 Object는 스프링이 관리하면서 언제든 DI를 할 수 있다.
- 스프링 Bean의 Scope
- Singleton(디폴트) : 스프링 컨테이너에 단 하나만 존재하며, DI(주입)시 같은 Object가 사용
- Prototype : 다수의 객체가 존재. DI(주입)시 매번 다른 Object가 생성
- Request : 한 HTTP Request동안 단 하나만 존재
- Session : 한 HTTP Session동안 단 하나만 존재
- 스프링 Bean 생성 문법 (Annotation)
- @Bean
=> 외부 라이브러리에서 정의한 클래스를 스프링 Bean으로 등록할 때 - @Component
=> 개발자가 직접 작성한 Class를 스프링 Bean으로 등록할 때 - @Controller
=> (=@Component) / Presentation Layer의 의미) - @Service
=> (=@Component) / Business Layer의 의미) - @Repository
=> (=@Component) / Persistence Layer의 의미)
- @Bean
결론 : @Component와 같은 기능역할이지만, 어노테이션명을 의미상으로 나누었다.
5] AOP (Aspect Oriented Programming)
- 하나의 디자인 패턴이다..
- 공통 기능을 정의한다
- 99.9% Proxy AOP이다
- 공통관심사항(cross-cutting concern)
=> 공통기능으로 어플리케이션 전반에 걸쳐 필요한 기능
(ex) 로그, 트랙잭션, 보안 관련 코드 등)
- 핵심관심사항(core concern)
=> 핵심로직, 핵심 비즈니스 로직
- AOP 프레임워크
=> AOP에서는 핵심 로직을 구현한 코드에서 공통 기능을 직접 (호출하기 귀찮아서 만들어졌다는..?)
=> AOP에서는 분리한 공통 기능의 호출까지도 관점으로 다룬다. 그리고 이러한 각 모듈을 산재한 관점을 횡단 관점이라 부르고 있다.
=> AOP에서는 이러한 횡단 관점까지 분리함으로써 각 모듈로부터 관점에 관한 코드를 완전히 제거하는 것을 목표로한다!
- Weaving 방식
1] 컴파일 시 Weaving
(ex. AspectJ)2] 클래스 로딩시 Weaving (JVM이 Class를 로딩할 때)
(ex. AspectWerkz)3] 런타임시 Weaving (프록시를 이용하여 AOP를 지원 - 코드나 바이너리 파일의 변경이 없음)
(ex. Spring AOP)
= 공통 기능호출하는 코드가 포함되는 경우
- 스프링에서의 AOP
=> 스프링에서는 자체적으로 런타임시에 Weaving하는 Proxy기반의 AOP를 지원. 따라서 스프링 AOP는 외부에서 메소드 호출 시에만 적용이 가능.
(클래스내의 메소드에서 다른 내부의 메소드를 호출할때는 동작하지 않음)
=> spring-boot-starter-aop 라이브러리를 사용하면 쉽게 AOP구현 가능하다.
=> 참고자료
(https://jeong-pro.tistory.com/171)
6] 스프링 MVC
: Spring 프레임워크에서 제공하는 웹 모듈이다.
- Model(모델) : 데이터를 처리하는 부분
- View(뷰) : 화면을 담당하는 부분
- Controller(컨트롤러) : 요청을 처리하는 부분으로 뷰와 모델사이의 통신 역할
= Spring MVC의 흐름
클라이언트(웹브라우저) -> 요청 전송 -> DispatcherServlet -> HandlerMapping (요청 URL과 매칭되는 컨트롤러 검색) -> HandlerAdapter (처리 요청) -> Controller -> DispatcherSevlet -> ViewResolver (컨트롤러의 실행 결과를 보여줄 View 탐색) -> View -> 응답
= 스프링 MVC Controller의 특징
1] 파라미터 수집
- 사용자의 요청에 필요한 데이터를 추출하고 VO(DB의 레코드와 상응되는 클래스) 나 DTO(컨트롤러, 뷰, 비즈니스등의 계층간 데이터 교환을 위한 자바빈즈)로 변환하는 파라미터의 수집 작업을 진행.
2] 애노테이션을 통한 간편 설정
- 스프링 MVC 설정은 MVC나 애노테이션을 사용가능하고, 주로 애노테이션을 이용하여 클래스나 메소드의 선언에 필요한 애노테이션을 추가하는 작업을 통해 요청이나 응답에 필요한 모든 처리를 진행.
3] 테스트의 편리
- WAS의 실행없이도 테스트할 수 있는 편리한 방법을 제공
7] Spring Boot 간단 소개
= 스프링 응용프로그램을 독립적으로 작성, 빌드, 실행 수 있으며 Embeded Tomcat, jetty의 사용이 가능하므로, WAR 파일로 빌드해서 배포할 필요가 없다
= Tomcat이나 Jetty가 내장되어 프로젝트를 .jar 파일 형태로 간단히 배포할 수 있다.
= 복잡한 xml 설정을 간소화하여 어노테이션 기반의 java config로 교체하여 쉬운 서버 설정이 가능
= 빠른 웹 프로젝트 생성가능
= 2014년 4월 1.0 Ver 최초 release
'SpringFramework > Spring' 카테고리의 다른 글
Spring - ResponseEntity (0) | 2021.10.08 |
---|---|
Spring - Mybatis FrameWork 개념 및 설정 (0) | 2021.09.30 |
Spring Package 구조와 역할 (0) | 2021.09.30 |
Jenkins를 이용한 서버 Spring Boot 배포 - pipeline (0) | 2021.09.15 |
Spring - 자주사용하는 Annotation 정리 (0) | 2021.02.24 |