Spring 특징
- Java를 기반으로한 프레임워크
- POJO 프로그래밍을 지향 : 별도의 API가 아닌 Java 코드를 이용하여 객체를 구성하는 방식, 특정 라이브러리나 기술에 종속적이지 않다.
- 데이터베이스와 연동되어 트랜잭션을 지원한다.
- 의존성 주입(DI)를 통하여 스프링 내부의 객체를 관리해준다.
- 스프링 컨테이너에 Bean객체를 등록(컴포넌트 스캔을 통해 Bean에 등록)하면 스프링 컨테이너가 Bean의 생명주기(생성→의존성 설정→ 초기화 → 소멸)을 모두 관리해준다.
- 의존성 부여의 경우 @Autowired로 주입된 객체를 스프링이 스프링 컨테이너에서 찾아 의존관계를 외부에서 넣어준다.
장점
정형화 되어 있는 프레임워크임으로 일정수준의 품질을 기대할 수 있다.
유지보수가 비교적 쉽다
단점
많은 기능을 합해 놓은 프레임워크의 특징상 무거운편이다.
기존 스프링을 배우던 때에 Spring에 대해 공부하며 정리한 내용이다. 해당 내용에 틀린 내용은 없지만 깊이가 부족하고 Spring을 왜 사용하게 되었는지, 실제로 사용하면 어떤 이점이 있는지에 대한 내용이 없어 보충하고자 글을 적어본다.
Spring의 탄생과 가치는 SOLID 원칙과 밀접한 연관이 있다. SOLID에 대해서는 이전에 정리한 적이 있다.
객체지향의 5가지 원칙(SOLID)
그렇다면 이 원칙 중 무엇을 만족시키기 위하여 Spring이 탄생한 것일까. 글로 정리하며 알아보려 한다. 이 개시글은 그 첫번째로 의존관계와 제어의 역전의 필요성과 예시를 적어본다.
객체 지향 설계를 하였을때 Service와 Repository로 분리된 아키텍쳐로 개발을 했다고 가정해보자. 이때 DIP 의존관계 역전 원칙 과 OCP 개방-폐쇠 원칙을 준수하기 위해서는 Service와 Repository를 아래 다이어그램과 같이 인터페이스와 구현체로 분리 할 필요가 있다.
이러한 구조에서 ServiceImpl 에서 직접 Repository의 구현체의 객체를 만든다면 이는 DIP와 OCP 원칙을 준수한 것이 아니다.
//코드 예시
import ~.MemberRepository;
import ~.MemberRepositoryImpl_1;
public class MemberServiceImpl_1 implement MemberService{
private final MemberRepository = new MemberRepositoryImpl_1();
}
그 이유는 MemberServiceImpl이 인터페이스와 구현체 모두에게 의존하고 있는 상황이기 때문이다.
이 방법을 해결하기 위해서는 MemberServiceImpl은 인터페이스만 의존한 상태에서 생성자를 통하여 구현체를 주입받아야 한다. 이를 위해 의존관계를 주입해주는 설정값을 의미하는 Configration을 Service와 Client 사이에 둔다. 이런 상황을 의존관계 주입을 개발자가 직접하는것이 아닌 Config가 대신 해주는 제어의 역전이라 부른다.
MemberServiceImpl
import ~.MemberRepository;
public class MemberServiceImpl_1 implement MemberService{
private final MemberRepository;
}
AppConfig
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl_1(memberRepository());
}
public MemberRepository memberRepository() {
return new MemberRepositoryImpl_1();
}
}
Main
public class Main {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
}
}
객체지향 설계의 효과
DIP (의존관계 역전 원칙)와 OCP (개방-폐쇄 원칙) 에 적합한 설계가 되었다.
DIP :
- 구체화에 의존하지 않고 추상화에 의존하여 매개체간의 느슨한 결합 관계를 구성하였다.
OCP :
- 다형성과 추상화를 활용하여 확장 가능성을 열고 변경을 최소화 할 수 있게 되었다.
- 구현체의 코드를 직접 변경하는 것이 아니라 추상화된 기능을 여러 구현체로 구현하여 기능을 확장할 수 있게 되었다.
'Spring' 카테고리의 다른 글
Spring AOP / @Aspect (JoinCut와 Advice) (2) | 2024.01.12 |
---|---|
AOP의 정의와 프록시/데코레이션 패턴 (1) | 2024.01.04 |
의존 관계 자동 주입(@Autowired, @ComponentScan) (0) | 2024.01.02 |
스프링 컨테이너와 싱글톤(feat. @Configuration) (0) | 2023.12.28 |
MVC 아키텍쳐 및 SpringMVC 구조 (0) | 2023.12.26 |