백엔드 개발을 시작하면서 Spring을 사용해서 개발을 했었지만, Spring이 정확히 어떤 건지?
Spring을 왜 사용하며, Spring을 어떻게 잘 사용할 수 있는지에 대해서는 생각해본적이 없는 것 같아서
한번 정리를 하고 시작해야겠다.
Spring | Why Spring
“We use a lot of the tools that come with the Spring framework and reap the benefits of having a lot of the out of the box solutions, and not having to worry about writing a ton of additional code—so that really saves us some time and energy.” SEAN G
spring.io
스프링이 무엇인지 공식문서를 참고해서 정리해봤다.
1. Spring이란?
말 그대로 자바 프로그래밍을 할때 누구나 더 빠르고, 쉽고, 안전하게 할 수 있도록 도와주며 속도 및 단순성, 생산성에 중점을 둔 세계에서 가장 인기있는 Java 프레임워크라고 소개한다.
여기서 프레임워크(FrameWork)란
프로그램 설계에 있어 미리 구축되어있는 틀을 제공해준다고 생각하면 좋을 것 같다. 백엔드 프로세스를 구축하는데 있어 기본적인 틀을 제공해주어 높은 품질의 프로그램을 빠르게 개발할 수 있고 같은 틀을 사용하는 사람들끼리 코드를 보기에도 편리하다는 장점이 있다.
그리고 스프링에는 다양한 기술들이 있는데
- 스프링 프레임워크
- 스프링 부트 - (기본적인 프레임워크는 셋팅해야할 것들이 굉장히 많고 어렵기 때문에 기본적으로 세팅을 도와줌) https://start.spring.io/ 이 사이트를 통해 편리하게 사용할 수 있다.
- 스프링 데이터 - (CRUD를 편리하게 사용할 수 있도록 도와줌)
- 스프링 클라우드
- 스프링 시큐리티 (보안 관련 기능들을 편리하게 사용할 수 있다.) - Oauth
- 스프링 Rest Docs (api문서를 편리하게 사용할 수 있도록) - Swagger를 사용할 수도 있다.
- 스프링 배치
등등 여러가지 기능들을 사용해서 프로그래밍을 할 수 있다는 장점이 있다.
2. Spring FrameWork를 왜 사용하는가??
위의 다양한 기술들을 지원해줘서 편리하게 프로그래밍을 할 수 있기 때문에 사용하는 부분도 있지만 스프링에는 다양한 특징들이 있다.
경량급
스프링을 정의함에 있어 경량급이라 함은 기존에 스프링 대신 사용하던 기술들과 비교하여, 스프링을 사용했을 때에 개발자가 작성해야 할 코드가 상대적으로 단순하다는 것을 표현하기 위함이다.
스프링을 사용하게 되면 기존 기술을 사용할 때에 불가피하게 작성해야만 하는 불필요하게 복잡한 코드를 제거하여 코드의 복잡성을 낮출 수 있다.
POJO (Plain Old Java Object ) 프로그래밍을 지향
간단하게 얘기하면 순수 Java만을 사용하여 만든 객체를 뜻한다.
POJO 프로그래밍을 하는 것이 중요한 이유는 외부 라이브러리를 가지고 객체를 사용한다했을 때 POJO 프로그래밍을 하지 않게 되면 해당 외부 라이브러리가 deprecated 되었을 경우에 객체들에 관한 코드를 전부 바꾸어줘야한다는 큰 단점이 있다. 이렇게 외부 모듈에 의존하도록 객체를 사용하게 되면 나중에 문제가 발생할 수 있기 때문에 POJO 프로그래밍을 하는 것이 중요하다.
//필드와 Getter, Setter만 존재하는 기본적인 POJO의 예시
public class Person{
private String name;
private int age;
public String getName(){
return name;
}
public String getAge(){
return age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
}
IoC / DI - (Inversion of Control / Dependency Injection, 제어의 역전 / 의존성 주입)
자바는 객체지향 언어이므로, 객체들 간의 관계를 적절히 맺어주는 것이 중요하다. 예를들어서
A인스턴스가 B인스턴스의 메서드를 호출하고 있다면 A와 B는 의존관계를 맺은 것이고, 이 둘은 "A가 B에 의존하는 관계"라고 표현할 수 있다. A가 B의 기능을 가져다가 사용하고 있기 때문이다.
이렇게 A가 B에 의존하고 있는 경우에서 새롭게 C를 정의해서 B대신 사용하고자 한다면 A의 코드를 변경할 수 밖에 없는 상황이 발생한다.
하지만 B를 사용하던 객체가 A뿐만 아니라, 수십 또는 수백개가 있다면 모든 객체의 코드를 수정해야 함으로 시간낭비를 하게 된다.
Class A{
public void methodA(){
B를 쓰다가 C를 쓰기 위해선 이렇게 코드를 수정해줘야만 한다.
//B b = new B();
//b.example();
C c = new C();
c.example();
}
}
//---------------------------------------------//
// IoC/DI를 통해서 이것을 수정하면
// 1. 인터페이스 I의 추상 메서드로 정의
interface I {
void example();
}
class A{
// 3. 인터페이스 타입의 필드를 선언
private I i;
// 4. 생성자를 통해 외부로부터 인스턴스를 받아와 i 초기화 -> 이렇게 하면 i를 입맛에 맞게 바꿔줄 수 있음
public A(I i){
this.i = i;
}
public void methodOfA(){
// 5. 메서드를 호출
i.example();
}
}
// 2. A가 사용하는 메서드를 가진 객체들이 I를 구현하도록 한다.
class C implements I{
public void example();
}
이것을 방지하기 위해서 스프링을 통해 개발자가 아닌 스프링이 A가 사용할 객체를 생성하여 의존 관계를 맺어주는 것을 IoC라고 하고 그 과정에서 C를 A의 생성자를 통해 주입해주는 것을 DI라고 한다.
AOP (Aspect Oriented Programming, 관점 지향 프로그래밍)
애플리케이션 개발할 때 구현해야 하는 기능들은 공통 관심사항과 핵심 관심사항으로 분류할 수 있다.
이 때, 핵심 관심 사항과 공통 관심 사항이 함께 모여있으면 코드 중복될 수밖에 없다. 이렇게 중복이 되어져 있는 경우에, 공통 관심 사항을 수행하는 로직이 변경되면 모든 중복 코드를 찾아서 일일이 수정해주어야만 한다.
이것을 방지하기 위해 애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해내는 것을 AOP라고 한다.
참고
스프링과 스프링부트(Spring Boot)ㅣ정의, 특징, 사용 이유, 생성 방법
스프링은 Java 백엔드 개발에 있어 떼어놓을 수 없는 프레임워크입니다. Java 백엔드의 핵심 기술이 되는 스프링 프레임워크와 스프링 부트가 무엇인지, 나아가 스프링 부트를 활용하여 프로젝트
www.codestates.com