안녕하세요😎 백엔드 개발자 제임스입니다 :)
오늘 포스팅은 스프링(Spring)과 스프링 부트(Spring Boot)에 대한 내용입니다. 아마 몇몇 개발자들은 이 두 개가 같다고 생각할 수 있습니다. 저 또한 차이를 정확하게 알지 못했습니다.
"스프링과 스프링 부트의 차이점이 무엇인가요?" , "스프링의 특징에 대해서 말해주세요"
기술면접에서 자주 나오는 단골 문제입니다. 막상 질문을 들으면, 쉽게 대답하지 못할 수 있습니다. 그래서 이번 정리를 통해 확실하게 알아보려고 합니다.
스프링(Spring)에 대해서 알아보기
1. 스프링이란?
먼저 스프링(Spring)이 무엇인지 알아보겠습니다. 스프링은 자바 기반의 웹 애플리케이션을 만들 수 있는 프레임워크입니다. 다시 말하면 엔터프라이즈용 자바 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크입니다. 이러한 스프링은 모든 사용자에게 무료로 열려 있습니다. 즉, 어떤 개인 및 기업도 스프링을 사용하여 웹 애플리케이션을 개발할 수 있으며, 필요하다면 스프링의 코드를 일부 수정하여 사용할 수 있습니다. 뿐만 아니라 안정적인 개발과 개선이 보장됩니다.
* 정리
1) 흔히 스프링이라 부르지만, "스프링 프레임워크(Spring Framework)"가 정확한 표현입니다.
2) 자바(Java) 엔터프라이즈 개발을 위한 "오픈소스 경량급 애플리케이션 프레임워크"입니다.
[Spring 공식 문서] 왜 Spring으로 불리는가?
Whatever happened next, the framework needed a name. In the book it was referred to as the “Interface21 framework” (at that point it used com.interface21 package names), but that was not a name to inspire a community. Fortunately Yann stepped up with a suggestion: “Spring”. His reasoning was association with nature (having noticed that I'd trekked to Everest Base Camp in 2000); and the fact that Spring represented a fresh start after the “winter” of traditional J2EE. We recognized the simplicity and elegance of this name, and quickly agreed on it.
> 스프링은 전통적인 J2EE의 "겨울" 이후에 새로운 시작인 봄을 나타내는 의미입니다.
2. 스프링의 탄생
스프링이 등장하기 이전에는 EJB(Enterprise Java Bean)라는 기술이 주로 사용되었습니다. EJB가 과거 기술의 단점을 보완하여 등장했음에도, 여전히 불필요하게 복잡한 코드를 작성해야만 했습니다. 따라서 코드의 복잡성을 줄이기 위해 '스프링'이 탄생하게 되었습니다.
3. 스프링 특징
1) POJO 프로그래밍 지향
스프링의 대표적인 특징으로 POJO 프로그래밍을 지향한다는 점입니다. POJO란, Plain Old Java Object의 약자로 순수 Java만을 통해서 생성한 객체를 말합니다.
순수 Java만을 사용한다는 것은 Java 및 Java의 스펙에 정의된 기술만 사용하는 것을 말합니다. 즉, 외부의 라이브러리나 모듈을 가져와서 사용한다면, 그 객체는 POJO라고 할 수 없습니다.
POJO는 순수 Java만을 사용하여 만든 객체이므로, 특정 기술이나 환경에 종속되지 않습니다. 따라서 보다 유연하게 변화와 확장에 대처할 수 있습니다. 이를 기반으로 비즈니스 로직을 구현하면, 객체지향 설계를 제한 없이 적용할 수 있으며, 코드가 단순해져서 테스트와 디버깅 또한 쉬워집니다.
아래 그림은 POJO 프로그래밍을 위해 스프링이 지원하는 기술들입니다. 스프링의 특징이기도 합니다. 아래에서 자세하게 알아보겠습니다.
2) IoC (Inversion of Control) / DI (Dependency Injection)
먼저 IoC는 제어의 역전입니다. 우리는 Java가 객체 지향 프로그래밍 언어라는 것을 알고 있습니다. 따라서 개발자가 직접 객체를 생성하고, 소멸시키는 등 관리를 해줘야 합니다. 스프링 내부에는 컨테이너가 있습니다. 이러한 컨테이너는 객체의 생성부터 소멸까지 객체 생명주기 관리를 대신해 줍니다. 말 그대로 개발자가 하던 일을 스프링이 대신하는 것입니다. 객체 제어권이 바뀐 것입니다.
DI는 의존성 주입입니다. 흔히들 IoC와 DI를 헷갈려하거나 동일시하는 경우가 있습니다. 하지만 서로 다른 개념입니다. 위에서 알아봤듯이 IoC는 프로그램 제어권을 역전시키는 개념이고, DI는 해당 개념을 구현하기 위해 사용하는 디자인 패턴 중 하나로, 객체의 의존관계를 외부에서 주입시키는 패턴입니다.
의존대상 B가 변하면, 그것이 A에 영향을 미친다.
- 이일민, 토비의 스프링 3.1, 에이콘(2012), p113
public class A {
private B b = new B();
}
위와 같이 A라는 클래스가 있습니다. 보다시피 A 클래스 내부에서 B 객체를 생성하고 있기 때문에 A가 반드시 내부에서 생성한 B 인스턴스에 의존하는 것으로 의존관계가 고정됩니다. 즉, B 내부의 변경이 일어난다면, A에도 영향을 미치게 됩니다. 이런 경우를 'A가 B에 의존한다.'라고 합니다.
public class A {
private B b;
public A(B b) {
this.b = b;
}
}
위 코드는 어떨까요? 여전히 B가 변경되면, A의 내용도 변경됩니다. 하지만 의존 대상을 직접 생성하는 것이 아니라 외부로부터 주입받는다고 할 수 있습니다. 이와 같이 의존성을 주입하는 방법에는 세 가지가 있습니다. 첫 번째는 스프링에서 권장하는 생성자 주입, 두 번째는 Setter 주입, 세 번째는 인터페이스 주입 방식입니다.
* IoC와 DI 사용의 이점
1) 프로그램의 진행 흐름과 구체적인 구현을 분리
2) 개발자는 비즈니스 로직에 집중
3) 구현체 사이의 변경이 용이
4) 객체 간 의존성이 낮아지며, 모듈 간의 느슨한 결합
5) 모든 객체를 주입할 수 있기 때문에 단위 테스트가 쉬워짐
6) 코드 가독성과 재사용률 향상
3) AOP (Aspect Oriented Programming)
AOP는 관점 지향 프로그래밍입니다. 애플리케이션을 개발할 때, 공통 관심 사항과 핵심 관심 사항으로 분류할 수 있습니다. 주로 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 공통 관심 사항으로 취급합니다. AOP는 이러한 공통 기능들을 분리하여 관리하는 기법을 의미합니다.
AOP는 코드 중복의 문제를 해결하고, 재사용성을 높여주는 장점을 제공합니다.
4) PSA (Portable Service Abstraction)
PSA는 일관된 서비스 추상화입니다. 이는 환경의 변화와 관계없이 일관된 방식의 기술로 접근 환경을 제공하는 추상화 구조를 말합니다.
PSA를 잘 만든 인터페이스라고 생각하면 좋습니다. 대표적으로 JDBC를 생각할 수 있습니다. MySQL 데이터베이스를 사용하여 애플리케이션을 개발했는데, 다른 DB로 바꿔야 하는 상황이라고 가정하겠습니다. 그럼 특정 DB에 맞게 코드를 일일이 수정해야 합니다. 스프링은 Java를 사용하여 데이터베이스에 접근하는 방법을 규정한 인터페이스를 제공합니다. 이를 JDBC라고 합니다. 덕분에 데이터베이스 바꾸어도 기존에 작성한 코드를 수정하지 않아도 됩니다. 다시 말하면, 특정 기술에 종속되지 않게 됩니다.
이러한 JDBC처럼 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용될 수 있도록 한 것을 PSA라고 합니다.
4. 참고
https://docs.spring.io/spring-framework/docs/current/reference/html/index.html
스프링 부트(Spring Boot)란?
* 시작하기에 앞서
스프링 부트(Spring Boot)의 '부트(Boot)' 의미가 궁금했습니다.
부팅(Boot-ing)의 어원을 찾아보니, '스스로의 발을 스스로 꺼내는 행동'이라고 합니다.
이러한 의미로 스프링에서 스스로 무언가를 하는 것인가라고 유추했습니다.
스프링 부트는 스프링으로 애플리케이션을 만들 때에 필요한 설정을 간편하게 처리해 주는 별도의 프레임워크입니다. 스프링 부트를 사용하면, 초기 설정에 쏟아야 했을 시간과 노력을 절약하여 비즈니스 로직을 구현하는 데에 집중할 수 있습니다.
이 것 외에도 몇 가지 장점이 있습니다. 기존에는 배포를 할 때 별도의 외장 웹 서버를 설치하고, 프로젝트를 War 파일로 빌드하여 배포했습니다. 이러한 방식은 처리 속도가 느리며, 버전을 고려해야 하는 단점이 있습니다. 반면, 스프링 부트는 자체적인 웹 서버를 내장하고 있습니다. 덕분에 자동으로 버전 관리 되고, 빠르고 간편하게 배포할 수 있습니다. 그리고 독립적으로 실행 가능한 Jar 파일로 프로젝트를 빌드하면서 클라우드 서비스 및 도커와 같은 가상화 환경에서도 빠르게 배포할 수 있습니다.
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
> 스프링 부트는 단독적이고, 상용화 수준의, 스프링 기반 애플리케이션을 단지 실행할 수 있을 정도로 쉽게 만들 수 있다.
스프링과 스프링 부트 차이 정리
- 'spring-boot-starter-web' 을 통해서 dependency 설정을 자동화합니다.
- spring boot가 버전을 직접 관리하며, 'spring-boot-starter-web'을 사용하여 종속된 모든 라이브러리를 알맞게 찾아서 사용합니다.
- 종송성이나 호환 버전에 대해 신경 쓸 필요 없습니다.
- 공통적으로 필요한 DispatcherServlet 같은 설정을 어노테이션을 이용하여 대신합니다.
- Spring boot의 main 메서드는 @SpringBootApplication을 갖고 있습니다.
- 내장된 서버와 jar 파일을 이용해서 자바 옵션만으로 손쉽게 배포할 수 있습니다.
'개발 > Spring&JPA' 카테고리의 다른 글
[스프링 시큐리티] 비인증 사용자를 위한 '익명 사용자' 알아보기 (6) | 2023.03.15 |
---|---|
[스프링 시큐리티] WebSeucrityConfigurerAdapter Deprecated 대처 (2) | 2023.01.25 |
[Spring MVC] DTO 분석, DTO를 Service 계층에서 처리해도 될까? (2) | 2022.11.01 |
[JPA] Spring Data JPA의 DB 초기화 (2) | 2022.10.02 |
[스프링] 백엔드 개발자의 필수 과제, '순환 참조(Circular Reference)' 문제 해결 (4) | 2022.09.18 |