Spring이란?
엔터프라이즈용 Java 애플리케이션을 간편하게 만들게 해주는 도구
스프링이 등장하기 이전에는 비즈니스 로직을 구현하기 위해 기술 자체에 대한 공부를 추가적으로 해야만 했습니다. 비즈니스 로직을 구현하는 기술 자체가 복잡하고 어려웠기 때문입니다.
스프링은 이전 기술에 비해 사용 방법이 상대적으로 덜 복잡합니다. 따라서, 개발 초기에 기본적인 설정과 적용시킬 기술들만 잘 선택을 해준다면, 기술보다는 애플리케이션의 로직 자체에 더 집중하여 비즈니스 로직을 구현할 수 있습니다.
오픈소스
스프링은 모든 사용자에게 무료로 열려 있습니다. 즉, 어떤 개인 및 기업도 스프링을 사용하여 웹 애플리케이션을 개발을 할 수 있으며, 필요하다면 스프링의 코드를 일부 수정하여 사용하여도 무관합니다. 이처럼 오픈소스로 프로젝트를 공개해 놓으면 여러 사람이 프로젝트의 코드를 사용해봄으로써 다양한 검증 과정을 거칠 수 있다는 장점이 있습니다.
애플리케이션 프레임워크
애플리케이션을 개발하는 데에 있어 필요한 모든 업무 분야 및 모든 기술과 관련된 코드들의 뼈대를 제공합니다.
Spring의 특징은?
POJO 프로그래밍 지향
POJO란, Plain Old Java Object, 즉 순수 Java만을 통해서 생성한 객체를 의미합니다.
순수 Java 만을 사용한다는 것은 Java 및 Java의 스펙에 정의된 기술만 사용한다는 의미입니다.즉, 어떤 객체가 외부의 라이브러리나 외부의 모듈을 가져와서 사용하고 있다면, 그 객체는 POJO라고 할 수 없습니다. POJO는 말 그대로, 다른 기술을 사용하지 않는 순수한 Java만을 사용하여 만든 객체인 것입니다.
POJO는 순수 Java만을 사용하여 만든 객체이므로 특정 기술이나 환경에 종속되지 않습니다. 따라서, 외부 기술이나 규약의 변화에 얽매이지 않아, 보다 유연하게 변화와 확장에 대처할 수 있습니다. 이러한 POJO를 사용하여 비즈니스 로직을 구현하면 객체지향 설계를 제한없이 적용할 수 있으며, 코드가 단순해져 테스트와 디버깅 또한 쉬워집니다. 이처럼 비즈니스 로직을 구현하는 데에 POJO를 적극적으로 활용하는 프로그래밍 패러다임을 POJO 프로그래밍이라고 합니다.
요약
1. POJO는 외부라이브러리나 모듈을 사용하지 않은 순수한 자바객체.
2. 특정 기술 / 환경에 종속되지 않아 규약이나 변화에 얽메이지 않는다.
3. 객체지향 설계를 제한없이 적용할 수 있으며, 코드가 단순해져 테스트와 디버깅 또한 쉬워진다.
DI (Dependency Injection) 의존성 주입
의존성이란 말 그대로 어떤 로직을 수행하기 위해 필요한 함수나 클래스가 필요하다는 것 ( 의존 )을 말한다.
객체를 만들 때 로직을 수행하기 위한 클래스나 함수를 직접 내부에 작성해서 사용한다.
그러나 스프링에서는 외부에서 미리 의존관계가 있는 클래스와 함수를 미리 만들어놓기 때문에 우리는 필요할 때 마다 외부에서 가져온 객체를 직접 주입만 시키면된다.
이처럼 외부에서 만들어진 인스턴스들을 스프링에선 Bean이라 부르고 이 Bean은 모두 싱글톤 패턴이 적용된다.
DI의 궁극적인 목적은 의존성을 줄이는 것이다.
- 디자인패턴 중 팩토리 패턴이 사용된다.
IOC (Inversion Of Control) 제어의 역전
개발자는 인스턴스를 직접 생성하고 관리해왔습니다.
그러나 스프링에서는 이러한 인스턴스들을 직접관리하지 않고 스프링에 그 권한을 위임하여 사용합니다.
스프링에서는 이러한 객체들의 생성/생명주기를 관리할 수 있는데 이를 IoC Container 라고 합니다.
AOP (Aspect-Oriented Programming) 관점 지향 프로그래밍
문제를 바라보는 관점에서 프로그래밍하는 기법이다.
OOP 방식으로 프로그래밍하면서 중복성을 최대한 줄여나감에도 불구하고
트랜잭션, 로깅, 성능체크, 보안 등과 같이 공통적으로 중복이되는 코드가 생겨납니다.
이 공통적인 관심사를 해결하기 위한 방법이 AOP입니다.
Spring의 필터, 인터셉터, 어드바이스 등이 해당 개념을 반영하여 특정 관점의 문제들을 해결하기 위해 만든 기능입니다.
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] ObjectMapper 직렬화 시 한글문자 ??? 문제 (0) | 2023.11.17 |
---|---|
[Spring] ObjectMapper - LocalDateTime 직렬화 문제 (0) | 2023.11.17 |
[Spring] 유효성 검증 - Validation (0) | 2023.11.13 |
[Spring] REST API 테스트 코드 작성하기 (0) | 2023.11.06 |
[Spring] 테스트 코드에서 JPA metamodel must not be empty! 예외가 발생할 때 (0) | 2023.11.04 |