Spring은 엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 프레임워크이다.
엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는
스프링이 등장하기 이전에는 비즈니스 로직을 구현하기 위해 일련의 작업들을 개발자들이 수 작업으로 처리했다면 현재는 스프링 프레임워크와 같은 도구들이 등장하면서 작업들이 자동화되고 효율적으로 관리될 수 있게 되었다. 또한, 빌드 툴이 발전하면서 개발과정에서 필요한 빌드, 배포, 테스트 등의 작업들도 자동화될 수 있게 되었다. Maven이나 Gradle과 같은 빌드툴을 사용하여 프로젝트의 의존성 관리와 빌드 과정을 자동화하여 개발자는 더욱 효율적으로 프로젝트를 관리하고 비즈니스 로직에 집중할 수 있게 되었다.
오픈소스
어떤 개인 및 기업도 스프링을 사용하여 웹 애플리케이션을 개발할 수 있다.
경량급
기존 사용하던 기술과 비교하여, 스프링을 사용했을 때에 개발자가 작성해야 할 코드가 상대적으로 단순하다. 스프링을 사용함으로써 기존 기술을 사용할 때에 불가피하게 작성해야만 했던 불필요하게 복잡한 코드를 제거하여 코드의 복잡성을 낮출 수 있다.
프레임워크
프레임워크란, 어떠한 목적을 쉽게 달성할 수 있도록 해당 목적과 관련된 코드의 뼈대를 미리 만들어둔 것을 의미한다.
스프링의 특징
IoC (Inversion of Control, 제어의 역전)
A 인스턴스가 B인스턴스의 메서드를 호출하고 있다면 A는 B와 의존 관계라고 표현할 수 있다. 비스프링 개발에서는 new
키워드를 사용하여 인스턴스를 생성하는 코드를 작성했다. 이처럼 코드를 작성하면 A가 사용할 객체를 B가 아니라, 새롭게 C를 정의해서 사용하고자 한다면 기존의 B를 사용하던 객체들(A 포함)을 전부 수정해야한다.
스프링 개발에서는 A는 자신이 사용할 객체를 스스로 생성하지 않고, 생성자를 통해 외부로부터 받아온다. 애플리케이션의 외부에서 A가 사용할 객체를 별도로 설정할 수 있다. 이처럼 개발자가 아닌 스프링 컨테이너가 A가 사용할 객체를 생성하여 의존 관계를 맺어주는 것을 IoC(Inversion of Control, 제어의 역전)이라고 하며, 그 과정에서 B를 A의 생성자를 통해 주입해주는 것을 DI(Dependency Injection, 의존성 주입)라고 한다.
IoC 컨테이너는 객체의 생성부터 소멸까지 관리한다. 즉, 컨테이너에 객체를 담아두고 필요 시 컨테이너로부터 객체를 가져와 사용한다.
DI (Dependency Injection, 의존성 주입)
IoC 컨테이너는 어떤 객체가 필요로 하는 의존관계에 있는 다른 객체를 직접 생성하여 주입해주는 역할을 한다. 이 때, 주입해주는 것을 의존성 주입(DI)라고 한다. 의존관계가 소스코드 내부가 아닌 외부의 설정 파일을 통해 정의된다. 코드 간의 재사용성을 높인다.
스프링에서는 ApplicationContext
라는 존재가 필요한 객체들을 생성하고, 필요한 객체들을 주입하는 역할을 한다. ApplicationContext가 관리하는 객체들을 빈(Bean)이라 하고, 빈과 빈 사이의 의존관계를 처리하는 방식으로 ① XML 설정, ② 어노테이션 설정, ③ JAVA 설정 방식을 이용할 수 있다.
POJO (Plain Old Java Object)
순수 Java 만을 통해서 생성한 객체를 의미한다. 특정 라이브러리나 컨테이너의 기술에 종속적이지 않아 보다 변화와 확장에 유연하게 대처할 수 있다. 인터페이스를 직접 구현하거나 상속받을 필요가 없어 객체지향 설계를 제한없이 적용할 수 있으며, 코드가 단순해져 테스트와 디버깅 또한 쉬워진다.
AOP (Aspect Oriented Programming, 관심 지향 프로그래밍)
애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해 구현하는 것을 AOP라고 한다. 중복되는 기능들을 따로 빼놓아 필요할 때만 호출하여 쓰며 재사용성을 높여준다.
보안이나 로그, 트랜잭션과 같이 비즈니스 로직은 아니지만 반드시 처리가 필요한 부분을 스프링에서횡단 관심사
(cross-concern)라고 한다. AOP는 이러한 횡단 관심사를 모듈로 분리하는 프로그래밍이다. 이를 통해 개발자는 핵심 비즈니스 로직에만 집중해서 코드를 구현할 수 있고, 다른 관심사를 적용할 때 코드의 수정을 최소화 시킬 수 있으며 유지보수가 수월하다.
스프링의 특징 총 정리
- IoC 컨테이너 기반
- 의존성 주입(DI)을 통한 객체 간의 관계 구성
- AOP : 기능별 모듈화
- POJO : 플랫폼에 비의존적
- 편리한 MVC 구조
- ORM 프레임워크 연동 : MyBatis
- WAS 의 종속적이지 않은 개발환경
비스프링 개발 vs 스프링 개발
비스프링 개발
new
키워드를 이용하여 인스턴스 생성
// UserMain.java
UserService s = new UserService();
s.mesg();
스프링 개발
- 스프링에서는 클래스를 빈(bean)이라고 함
- 직접 빈을 new 하지 않고 외부에서 위임해서 관리
- 외부의 실체 클래스는
ApplicationContext
스프링 작업순서
- 빈 생성 *.java
- 빈을 xml에 등록 ( src.main.resource 에 xml 파일 생성)
- ApplicationContext를 통해 xml 파일 연결
- ApplicationContext가 xml에 등록된 빈 정보를 보고 자동생성 ~ 소멸처리
<!-- Spring Bean Configuration File -->
<bean id="service" class="com/service/UserService" />
// TestMain.java
ApplicationContext ctx =
new GenericXmlApplicationContext("classpath:com/config/user.xml");
UserService service = ctx.getBean("id값", UserService.class);
service.method();
빈(bean) 의 의존관계 처리 방식 3가지 - Configuration metadata
- xml based configuration
- annotation based configuration ➜ 가장 자주 사용
- java based configuration
[Spring] 의존성 주입 (DI, Dependency Injection) - ① XML 설정
의존성 주입(DI, Dependency Injection) 의존성은 하나의 객체가 다른 객체의 상태에 따라 영향을 받는 것을 의미한다. 의존성과 주입을 결합해서 생각하면 '객체가 필요한 특정 객체를 외부에서 밀어
gangintheremark.tistory.com
'WebServer > Spring' 카테고리의 다른 글
[Spring] BeanFactoryPostProcessor를 이용한 설정 메타데이터 정의 (0) | 2023.09.13 |
---|---|
[Spring] 빈 생명주기(LifeCycle) 콜백 메서드 (0) | 2023.09.12 |
[Spring] 의존성 주입(DI, Dependency Injection) - ② 어노테이션 설정 (0) | 2023.09.12 |
[Spring] 컬렉션 의존성 주입 (0) | 2023.09.04 |
[Spring] 의존성 주입 (DI, Dependency Injection) - ① XML 설정 (1) | 2023.09.02 |