![]() | ![]() |
---|
EJB (Enterprise Java Beans) 를 사용했다가 낮은 개발생산성을 인해 만든것이 Spring 이다.
다양한 편의성을 제공하여 개발을 편하게 해주는 엔터프라이즈용 경량급 프레임워크임.
👍 경량급
Spring이 탄생하게된 이유.
EJB (Enterprise Java Beans) 를 사용했다가 낮은 개발생산성을 인해 만든것이 Spring 이다.
순수한 자바객체로 특정 라이브러리, 환경, 프레임워크에 의존하지 않고 종속되지 않게 해야하는 개발론.
- 의존관계로 사용될 클래스를 직접 생성하는게 아닌 외부로부터 필요한 때에 생성하는것. IoC 컨테이너에서 관리된다.
- DI와 같은 작업을 개발자가 하는게 아닌 프레임워크가 해준다.
- 보통 3가지 방법을 통해 DI를 할 수 있다.
class A {
private final B b;
// 생성자를 통한 주입
public A(B b){
this.b = b;
}
}
class A {
@Autowired
private B b;
}
class A {
@Autowired
public void setB(B b){
this.b = b;
}
}
☝ 기본적으로 생성자 주입이 권장된다.
순환참조 예방
**Application 작동시점**에서 순환참조를 확인할 수 있다. ※ Spring Boot 2.6 부터는 순환참조가 기본적으로 허용되지 않기 때문에 이하 버전에서만 효과가 있다.
불변성 보장
Application 실행 시점에서 의존성이 주입되고 final 키워드를 사용하여 다른 방법과 달리 객체의 불변성 을 보장할 수 있다.
테스트의 편리함
컴파일 시점의 객체를 주입받아 테스트 코드 작성이 가능하고, 누락 객체가 있을 경우 컴파일 시점에서 확인되기 때문에 테스트를 보다 쉽게 할 수 있다.
공통으로 사용되는 기능 혹은 로직을 분리하여 재사용, 유지보수가 용이하게 하는것.
@Aspect 어노테이션을 사용하며@Aspect class A{ // Around: 타켓의 실행 전후로 처리 됨 @Around("b()") public void test(){ // b() 메소드의 적용될 코드 } // Before: 타켓이 실행 전 처리 됨 @Before("b()") public void test2(){ // 생략 } // After Returning: 타겟이 실행 후 처리 됨 @After Returning("b()") public void test3(){ // 생략 } // After Throwing: 타겟이 예외를 발생시키면 처리 됨 @After Throwing("b()") public void test4(){ // 생략 } }
이와 같이 실행, 예외처리 이벤트 발생시 처리되게 할 수 있다.
같은 추상화 계층내에 다른 서비스로 비즈니스 로직의 수정없이 교체가 가능하다.
의존성을 spring-boot-starter-web > spring-boot-starter-webflux로 변경만 해도 tomcat이 아닌 netty로 실행이 가능하다. ↳ 스프링에서 서비스가 추상화된 인터페이스를 제공해주기 때문
정형화 :
라이브러리, 추상화 인터페이스 등 정형화된 부분으로 일정 수준 이상의 품질을 유지하고 생산성이 증가한다.
IoC / DI :
개발자가 해야할 부분을 프레임워크가 해줌으로써 생산성이 증가한다.
설정이 간편한 스프링기반 프레임워크
기본적인 부분은 스프링과 동일함.
spring initializr 를 통해 만들거나 InteillJ와 같은 IDE를 통해 프로젝트 생성가능
프로젝트내에 WAS를 가지고 있어 간편함.
spring-boot-starter-web이 Tomcat을 내장
↳ spring-boot-starter-webflux의 경우 netty로 설정가능
application.properties에 DB, View, logging 등 간편하게 설정 할 수 있음.
Jar로 빌드하여 간단한 배포가 가능함.