[Spring] 스프링이란?
▶스프링(Spring) 이란?
- 스프링은 자바 프레임워크이다.
- 프레임워크란 "뼈대나 근간을 이루는 코드들의 묶음"
▷프레임 워크(Framework)를 사용하는 이유는?
-개발자는 각 개개인의 능력 차이가 큰 직종이고, 개발자 구성에 따라 프로젝트의 결과 역시 큰 차이를 낳는다.
-프레임워크는 이런 상황을 극복하기 위한 코드의 결과물이다.
-프레임워크를 이용한다는 의미는 프로그램의 기본 흐름이나 구조를 정하고, 모든 팀원이 이 구조에 자신의 코드를 추가하는 방식으로 개발하게 된다.
▷왜 스프링 프레임 워크를 사용할까?
1) 경량 프레임워크(light-weight Framework)
-기존 엔터프라이즈급 프레임워크들의 가장 큰 문제점은 복잡성이다.
-다양한 경우를 처리할 수 있는 다양한 기능을 가지도록 만들다 보니 하나의 기능을 위해서 너무 많은 구조가 필요한 상태가 되었다.
-이러한 복잡성을 해결하기 위해서 나온 경량화된 프레임워크가 스프링이다.
-일반적인 Java의 클래스와 인터페이스를 이용하는 구조이기 때문에 진입장벽이 높지 않았고, EJB로 대표되는 복잡한 프레임워크에 비해 가볍기 때문에 빠르게 엔터프라이즈급의 시스템을 작성할 수 있었다.
2) 프로젝트의 전체 구조를 설계할때 유용한 프레임워크
3) 다른 프레임워크들의 포용
4) 개발 생산성과 개발도구의 지원
▶Spring의 핵심 기술
1) 의존성 주입(DI; Dependency Injection), Spring DI 컨테이너
-의존성(Dependency)이란 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것을 의미
-의존성은 하나의 객체가 다른 객체의 상태에 따라 영향을 받는 것.
-흔히 A 객체가 B 객체 없이 동작이 불가능한 상황을 "A가 B에 의존적이다"라고 표현
-주입(Injection)을 직역하자면 외부에서 "밀어 넣는 것"을 의미
-의존성과 주입을 결합해서 생각해보면 의존성 주입(DI)이란 "어떤 객체가 필요한 객체를 외부에서 밀어 넣는다"라는 의미가 됨
▷첫번째 그림은 스프링을 사용하지 않으며, A객체가 필요한 B, C 객체를 직접 생성하는 방법이다.
▷두번째 그림은 스프링을 사용하며, A객체가 필요한 B, C 객체를 Setter()또는 생성자를 통해 의존성을 주입 받는 방법이다.
-이 두 가지 방법의 차이는 필요한 객체를 얻기 위해서 주체가 능동적인지 수동적인지에 대한 문제이다.
-의존성 주입 방식을 사용하려면, 의존성이 필요한 객체에 필요한 객체를 찾아서 "주입"하는 역할을 하는 "Spring DI 컨테이너"라는 존재가 필요함
▷그렇다면 왜 "외부에서 객체를 주입하는 방식"을 사용할까?
-"주입을 받는 입장에서는 어떤 객체인지 신경 쓸 필요가 없다", "어떤 객체 의존하든 자신의 역할은 변하지 않는다"와 같은 의미로 볼 수 있음
-결국 Spring의 의존성 주입(DI)과 DI 컨테이너 기술은 객체 지향의 "다형성"과 좋은 객체 지향 설계의 5가지 원칙 중"OCP", "DIP" 를 가능하게 지원해준다.
2) 관점 지향 프로그래밍(AOP; Aspect Oriented Programming)
-좋은 개발환경의 중요 원칙 중 하나는 "개발자가 비즈니스 로직에만 집중할 수 있게 한다"이다.
-이 목표를 이루기 위해서는 몇 가지 중요한 원칙이 있지만, 가장 쉽게 생각할 수 있는 것은 "반복적인 코드의 제거"이다
-스프링은 프레임워크를 이용한 개발에도 이러한 반복적인 코드르 줄이고, 핵심 비즈니스 로직에만 집중할 수 있는 방법을 제공한다.
-대부분의 시스템이 공통으로 가지고 있는 보안이나 로그, 트랜잭션과 같은 비즈니스 로직은 아니지만, 반드시 처리가 필요한 부분을 스프링에서는 "횡단 관심사(cross-concern)"라고 한다.
-스프링은 이런 횡단 관심사를 분리해서 제작하는 것이 가능하다.
-AOP는 이러한 횡단 관심사를 모듈로 분리하는 프로그래밍의 패러다임이다.
● AOP의 장점
1) 개발자는 핵심 비즈니스 로직에만 집중해서 코드를 개발할 수 있다.
2) 각 프로젝트마다 다른 관심사를 적용할 때, 코드의 수정을 최소화할 수 있다.
3) 원하는 관심사의 유지보수가 수월한 코드를 구성할 수 있다.
▷물론 이외에도 Spring은 스프링 MVC, 스프링 WebFlux, 스프링 시큐리티, 트랜잭션, JDBC, ORM 지원, XML 지원, 스프링 기반 테스트 지원 등 다양한 기술을 지원한다
▶Spring의 진짜 핵심은?
- 스프링은 바로 자바 언어 기반 프레임워크이다. 자바 언어의 가장 큰 특징은 "객체 지향 언어"이다.
- 즉, Spring은 객체 지향 언어가 가진 가장 강력한 특징을 살려내는 프레임워크이며, 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 것이 "스프링 프레임워크(Spring Framework)" 이다.
참고자료