🌱 스프링이란? 🌱
엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크
정확한 표현으로는 '스프링 프레임워크(Spring Framwork)'
스프링 프레임워크(Spring Framwork)는 자바에서 가장 많이 사용되는 프레임워크 이다.
의존성 주입(DI, Dependency Injection)과 제어역전(IOC, Inversion Of Control),
관점 지향 프로그래밍(AOP)이 가장 중요한 요소라고 말할 수 있다.
위 요소들을 통해 느슨한 결합을 달성할 수 있으며 개발한 어플리케이션은 단위 테스트를 수행하기 용이하다.
👉 제어역전 (IOC, Inversion Of Control) 👈
우리가 프레임워크 없이 개발할 때에는 객체의 생성, 설정, 초기화, 메소드 호출, 소멸(이하 객체의 생명주기)을 프로그래머가 직접 관리한다.
또한 전통적인 프로그래밍에서는 외부 라이브러리를 사용할 때, 개발자가 직접 외부 라이브러리를 호출하는 형태로 이용한다.
하지만, 프레임워크를 사용하면 객체의 생명 주기를 모두 프레임워크에 위임할 수 있다. 즉, 외부 라이브러리가 프로그래머가 작성한 코드를 호출하고, 흐름을 제어한다.
이와 같이 개발자가 작성한 객체나 메서드의 제어를 개발자가 아니라 외부에 위임하는 설계 원칙을 제어의 역전이라고 한다. 즉, 프레임워크는 제어의 역전 개념이 적용된 대표적인 기술이라고 할 수 있다.
제어의 역전에서는 오브젝트 스스로가 사용할 오브젝트를 결정하지도, 생성하지 않는다. 원칙의 이름 그대로 제어에 대한 권한이 개발자에서 외부 환경으로 역전되는 것 이다.
좀 더 간단히 이야기해보자.
전통적인 방식으로 라이브러리를 사용하는 것은 우리의 프로젝트의 일부분으로서 라이브러리를 가져와 우리가 직접 제어하는 것이다.
반면 IoC는 우리의 코드가 프레임워크의 일부분이 되어 프레임워크에 의해 제어되는 것 이라고 생각하면 될 것 같다.
어플리케이션의 제어 책임이 프로그래머에서 프레임워크로 위임되므로, 개발자는 핵심 비즈니스 로직에 더 집중할 수 있다는 장점이 있다.
👉 의존성 주입 (DI, Dependency Injection) 👈
“A가 B를 의존한다.”는 표현은 어떤 의미일까? 추상적인 표현이지만, 토비의 스프링에서는 다음과 같이 정의한다.
"의존대상 B가 변하면, 그것이 A에 영향을 미친다."
-이일민, 토비의 스프링 3.1, 에이콘(2012), p113
즉, B의 기능이 추가 또는 변경되거나 형식이 바뀌면 그 영향이 A에 미친다.
✔ 먼저 DI를 사용하지 않는 코드를 살펴보자
1
2
3
4
5
6
7
8
9
10
|
@RestController
public class NoDIController {
private MyService service = new MyService();
@GetMapping("/hello")
public String getHello() {
return service.getHello();
}
}
|
cs |
예제 코드와 같이 DI를 사용하지 않는 코드의 경우
- Cotroller는 MyService 객체에 의존하게 된다.
- 객체의 인스턴스를 얻게 되면 객체간의 결합도가 올라간다.
- 이런 코드 작성은 단위테스트를 위해 Mock 객체를 사용할 수 없게 된다.
✔ 다음은 DI를 사용한 코드를 살펴보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@Service
public class MyServiceImpl implements MyService {
@Override
public String getHello() {
return "Hello";
}
}
@RestController
public class DIController {
MyService service;
@Autowired
public DIController(MyService myService) {
this.myService = myService;
}
@GetMapping("/hello")
public String getHello() {
return service.getHello();
}
}
|
cs |
예제 코드와 같이 DI를 사용한 코드의 경우
- Service, Autowired 어노테이션을 통해 MyService의 인스턴스를 획득
- 위와 같이 코드를 작성하면 단위테스트 상황에서 Service 객체를 Mock 객체로 대체하여 쉽게 테스트 할 수 있다.
DI 장점
1. 의존성이 줄어든다
의존한다는 것은 그 의존대상의 변화에 취약하다는 것이다. (대상이 변화하였을 때, 이에 맞게 수정해야한다.)
DI로 구현하게 되었을 때, 주입 받는 대상이 변하더라도 그 구현 자체를 수정할 일이 없거나 줄어들게 된다.
2. 재사용성이 높은 코드가 된다.
기존에 DI를 의존 받지 않은 클래스를 살펴보면 내부에서 사용되었던 MyService 객체를 별도로 구분하여 구현하면,
다른 클래스에서 재사용할 수 있게 된다.
3. 테스트하기 좋은 코드가 된다.
기존에 DI를 의존 받지 않은 클래스에서는 단위테스트를 위해 Mock 객체를 사용할 수 없었다.
또한, Controller를 Test하기 위해서는 Service 도 더불에 테스트를 해야하는 현상이 발생할 수 있게된다.
의존성을 주입 받으면 Mock객체로 대체하여 쉽게 테스트할 수 있다.
👉 관전 지향 프로그래밍 (AOP, Aspect Oriented Programming) 👈
스프링 프레임워크에서 제공하는 강력한 기능 중 하나
AOP는 쉽게 말해, OOP를 보완하는 수단으로, 여러 곳에 쓰이는 공통 기능 -> EX) 날짜, 시간
이들을 모듈화하여 필요한 곳에 연결을 함으로써 유지보수 또는 재사용에 용이하도록 하는 것을 의미한다.
AOP를 통해 기존 프로젝트에 다양한 기능을 로직 수정 없이 추가할 수 있음
이런 개발 방식을 통해 결합도를 낮춘 개발이 가능하게 된다.
🔋스프링부트(Spring Boot)란?
스프링은 기존 기술의 복잡성을 크게 줄인 프레임워크이지만, 그럼에도 불구하고 스프링을 사용하기 위해서는 여러 가지의 사항들을 설정해주어야 합니다.
아래는 스프링으로 개발을 할 때에 설정해주어야 하는 설정 정보를 담고 있는 파일인데 매우 복잡한 구조로 이루어져 있다.
하지만 걱정할 필요 없습니다. 스프링 부트가 있기 때문입니다. 스프링 부트를 사용하면 위의 복잡한 설정 정보를 아래와 같이 간략하게 줄일 수 있습니다.
설정 내용이 대폭 줄어들지 않았나요?
이처럼 설정 정보를 간략화할 수 있는 이유는 스프링 부트가 기존의 복잡한 설정을 대신 해주고 있기 때문입니다.
즉, 스프링 부트는 스프링으로 애플리케이션을 만들 때에 필요한 설정을 간편하게 처리해주는 별도의 프레임워크입니다.
스프링 부트를 사용하면 기존에 어려운 초기 설정에 쏟아야 했을 시간과 노력을 절약하여 비즈니스 로직을 구현하는데에 집중할 수 있습니다.
스프링 부트를 사용하면 초기 설정을 간편하게 할 수 있는 것 외에도 몇 가지 장점이 있습니다.
기존에는 배포를 할 때에 별도의 외장 웹 서버를 설치하고, 프로젝트를 War 파일로 빌드하여 배포를 진행했는데, 이러한 방식은 처리 속도가 느리며 번거롭다는 단점을 가집니다.
반면, 스프링 부트는 자체적인 웹 서버를 내장하고 있어, 빠르고 간편하게 배포를 진행할 수 있습니다.
또한, 스프링 부트를 사용하면 독립적으로 실행 가능한 Jar 파일로 프로젝트를 빌드할 수 있어, 클라우드 서비스 및 도커와 같은 가상화 환경에 빠르게 배포할 수 있습니다.
출처
https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/
https://www.youtube.com/watch?v=YSsl5-q2BR4
'Spring' 카테고리의 다른 글
application.properties과 application.yml 차이 (1) | 2023.02.06 |
---|---|
[Spring] 빌드 관리 도구 메이븐(Maven)과 그래들(Gradle) (1) | 2023.01.11 |