프레임워크
- 완성된 소프트웨어가 아니라 어떤 문제를 해결하기 위해서 만들어진 미완의 모듈로 모든 자바 개발자들이 공통으로 사용하는 기능을 미리 만들어서 제공하는 프로그램
(해결해야 하는 문제 - 내가 개발해야 하는 시스템
⇒ 교육시스템, 예약시스템, 인터넷뱅킹, 쇼핑몰…)
- 재사용이 가능한 모듈, 일반적으로 프레임워크를 이용해서 개발하는 시스템들의 공통모듈들은 프레임워크에서 제공하는 기능을 이용해서 개발
- 공통모듈 - DB연동, 트랜젝션처리, 뷰관리, 로그기록, 보안, 다국어처리, 메시징…
- 검즘받은 프로그램으로 신뢰성 높은 시스템을 개발할 수 있다.
- 프레임워크를 사용하면 개발자들간의 의사소통이 가능
- 대부분 개발자들이 직접 개발하고 처리하던 작업을 프레임워크가 제공해주기 때문에 유지보수나 시스템 개발을 위해 필요한 시간을 절약
- 프레임워크를 제대로 이해하고 있다는 전제가 필요함
- 경량의 모듈로 개발이 가능
- 프레임워크에서 제공하는 모듈은 (xxx,.jar - 라이브러리, 기능) 누가 언제 어떤 시스템을 개발하더라도 바로 사용할 수 있는 가볍고 안정적인 모듈
스프링의 핵심 기능
- IoC컨테이너
- DI
- AOP
- PSA
- 스프링 웹 MVC
- 스프링 JDBC
- 트랜잭션, 커넥션풀, 스케쥴러…
스프링의 특징
- 자바기반 프레임워크(코트린으로 확장…)
- 스프링은 OOP 특성을 잘 살려서 개발을 할 수 있도록 도와주는 프레임워크
- 변경이 용이한 프로그램
⇒ 기존 시스템을 구성하는 요소가 변경된다고 하더라도 유연하게 시스템을 운영할 수 있도록 지원 - 자바의 대표적인 특징 (다형성) ( 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 언어 )
⇒ OOP 언어의 특징인 다형성을 극대화 시켜서 클래스를 설계할 수 있도록 도와준다.
- 스프링이 제공하는 IoC 컨테이너를 통해 필요한 객체를 전달받아 사용한다.
프로그램 안에서 사용하는 모든 객체에 대한 lifecycle을 컨테이너가 알아서 관리한다.
- 스프링을 잘 활용하기 위한 방법
- oop특성을 잘 활용해서 개발해야 한다.
- 상위 인터페이스와 구현을 분리해서 개발한다.
(상위 인터페이스를 만들고 상위 인터페이스를 상속받아 클래스를 구현할 수 있도록 설계)
- SOLID (객체지향 언어를 이용해서 좋은 시스템을 설계하기 위한 5가지 원칙)
- SRP(Single Responsibility Principle 단일책임의 원칙)
⇒ 하나의 클래스는 하나의 책임만 가질 수 있도록 설계
기능을 수정할때 수정하려고 하는 기능 외의 것들이 수정되면 안된다.
⇒ MVC패턴
⇒ 계층을 나누어서 개발하는 이유
(컨트롤러, 뷰, 서비스, DAO)
- OCP(Open Close Principle 개방폐쇄의 원칙)
⇒ 소프트웨어를 개발 유지보수에 있어서 확장 (기능추가) 에는 열려 있어야 하고 변경에는 닫혀있어야 한다. (기존의 잘 실행되고 있는 프로그램은 기능이 추가된다고 해서 변경되면 안된다.)
⇒ 다형성을 이용해서 인터페이스와 인터페이스를 구현하는 클래스를 분리
- LSP ( )리스코프치환
- ISP ( ) 인터페이스 의존
- DIP (Dependency Inversion Principle 의존관계 역전의 원칙)
⇒ 개발을 할때 상위 인터페이스에 의존해야 하며 즉, 상위인터페이스를 이용해서 개발할 수 있도록 작성
⇒ 구현된 클래스 (하위클래스)에 의존(사용)하면 안된다.
- SRP(Single Responsibility Principle 단일책임의 원칙)
IoC(Inversion of Control)컨테이너의 사용
객체의 lifecycle을 관리하는 컴포넌트
- DI와 DL
- 제어의 역전
- 내가 관리하던 객체를 컨테이너에 위임
- 즉, 내가 필요한 곳에서 직접 소스안에서 객체생성을 하지 않고 컨테이너에게 전달받아서 사용할 수 있도록
- IoC 컨테이너에서 빈은 싱글톤으로 관리된다. (기본설정)
⇒ 스프링 빈 : 스프링 컨테이너가 관리하는 객체
스프링 IoC컨테이너의 종류
BeanFactory ← ApplicationContext ← WebApplicationContext
- BeanFactory - getBean이 호출되면서 사용할 객체가 만들어진다.
- ApplicationContext - IoC 컨테이너안에서 대표되는 객체인 ApplicationContext객체가 만들어질 때 등록된 모든 객체를 만들고 객체와 객체의 관계까지 모두 설정하면서 IoC컨테이너가 초기화가 된다.
(xml, bean, annotation에 설정된 모든 객체를 만들기 때문에 현재 사용핮 않는 객체라고 하더라도 문제가 있으면 빈을 만들다가 오류가 발생한다.)
보통 Application에서 사용
getBean을 호출하면 스프링 컨테이너가 가지고 있는 객체를 찾아서 리턴
scope="prototype”로 변경하면 getBean이 호출될때마다 객체를 생성한다.
- WebApplicationContext - 웹 환경에서 사용. DispatcherServlet 내부에서 사용
|___ 대표 컨테이너이므로 인터페이스, 하위들을 이용해서 작업
- DL (Edpendency Lookup)
⇒ 설정파일에 등록한 객체를 컨테이너가 제공하는 메소드(getBean)를 이용해서 찾아와서 사용
- DI (Dependency Injection)
⇒ 사용자가 스프링 컨테이너로부터 직접 객체를 찾아와서 사용하는 DL과 다르게 스프링 컨테이너 내부에서 설정파일에 등록된 객체를 직접 생성하고 내부에서 의존하고 있는 객체도 생성해서 연결시켜주는 작업
⇒ 스프링 컨테이너에 의해 자동으로 객체들의 관계가 설정되도록 하려면 객체가 사용하고 있는 의존모듈을 어떤 방법으로 주입받을 것인지 미리 설정 파일(일반객체나 어노테이션)에 등록해야 한다.
⇒ 또한 주입받을 방법에 맞는 생성자나 setter메소드를 미리 준비해야 한다.
- Constructor Injection
- 생성자를 통해 주입받기 (어노테이션으로 넘어가도 주로 사용하는 방법이 될 것임)
- 주입받을 클래스에서 객체를 주입받을 수 있도록 생성자를 미리 정의해놓아야 한다.
- 아래와 같이 그냥 빈을 생성하는 것은 기본 생성자를 호출해서 객체를 생성하겠다고 컨테이너에게 알려주는 것임
<bean id="dao" class="basic.MemberDAO"/>
- 주입받을 객체가 있는 경우 빈을 등록할 때 주입받을 수 있도록 설정해야 한다.
<bean id="dao" class="basic.MemberDAO">
<constructor-arg></constructor-arg>
</bean>
constructor-arg 를 정의해서 생성자의 매개변수를 나타낼 수 있다.
constructor-arg의 갯수가 매개변수의 갯수
- Setter Injection(Porperty Injection)
- Setter 메소드를 통해 주입받기
- 컨테이너로 부터 주입을 받는 방식이 생성자가 아니라 setter메소드를 통해서 전달받도록 설정
- 객체를 주입받는 클래스는 기본생성자와 setter메소드를 준비해야 한다.
- xml에는 <property>엘리먼트를 정의하고 작업해야 한다.
- Constructor Injection
'코딩딩 > Spring' 카테고리의 다른 글
JPA의 준영속 상태 (0) | 2023.10.31 |
---|---|
Spring 기초 2 (0) | 2023.09.19 |
JDBC (1) | 2023.09.08 |
서블릿 (0) | 2023.09.06 |
싱글톤 컨테이너 (1) | 2023.08.28 |