먹었으면 뇌를 쓰자
스프링 프레임워크란 뭘까? 본문
스프링은 JAVA/Kotlin 언어를 기반으로 편리한 개발을 돕는 프레임워크이다.
스프링은 한국 전자정부표준프레임워크이다.
IDE(통합 개발 환경) 프로그램은 이클립스 기반 Spring Tools, IntelliJ 등이 있다.
내가 살짝 맛본 IDE는 인텔리J이다. 이클립스가 직관적이고 깔끔하다면,
인텔리J는 빠르고 성능이 좋다는 인상을 받았다.
스프링은 여러 특징이 있다. 그런데 이해하기가 꽤나 어렵다.
그래서 내가 이해할 수 있는 내용을, 이해할 수 있는 말로 정리해보았다.
스프링의 특징 ① AOP(관점 지향 프로그래밍)
애플리케이션에는 핵심 기능과 부가 기능이 있다.
예를 들어 성심당 웹 페이지에서 빵을 주문하는 앱을 만든다고 하자.
클래스 A(빵 주문)
핵심 기능 : 주문
부가 기능 : 로그 추적(어떤 핵심 기능이 호출되었는지 기록), 트랜잭션 등
클래스 A를 실행하면 주문 기능과 로그 추적 기능이 동시에 일어난다.
그런데 로그 추적 기능을 다른 클래스 B(배송지 입력), C(결제)...에 적용하려면 너무 번거롭다.
로그 추적 기능(부가 기능)과 같이 다른 부분에 계속 반복해서 쓰는 코드를
흩어진 관심사(Crosscutting concerns)라고 한다.
여기서 나온 개념이 관점(Aspect)이다.
관점(Aspect)이란 흩어진 관심사를 하나의 모듈로 만든 것으로, 필요할 때 재사용하는 것이다.
이제 핵심 기능과 부가 기능은 코드상 완전히 분리된다.
관점을 사용한 프로그래밍 방식을 AOP, 관점 지향 프로그래밍이라고 한다.
이렇게 핵심 기능과 부가 기능이 분리되면
" 로그 추적 기능을 클래스 A와 C에 추가해라"와 같이 제어할 수 있다.
AOP에서 사용되는 주요 단어들이 있다.
Aspect : 흩어진 관심사를 모듈화한 것. 주로 어떤 로직의 부가 기능이다.
Target : Aspect를 적용하는 곳이다. (클래스, 메소드 등)
Adivice : Aspect가 실질적으로 어떤 일을 해야 하는지 정의한 것이다.
JointPoint : Advice가 적용되는 위치이다.
PointCut : Advice가 적용될 JointPoint를 구체적으로 정의한 것이다. '메소드 a의 진입 시점에 호출하라'
스프링의 특징 ② IoC(제어 역전)
개발자가 프로그래밍을 하면 외부 라이브러리의 코드가 호출되는 것이 기본 방식이다.
하지만 스프링은 이와 반대로 외부 라이브러리 코드가 개발자의 프로그래밍을 호출한다.
즉, 스프링한테 제어권이 있고 필요할 때 개발자의 코드가 호출될 수 있다.
스프링이 갖고 있는 IoC 컨테이너에 의해 생성되고 관리되는 객체를 빈(bean)이라고 한다.
컨테이너 : 객체를 생성하고 조립한다.
빈 : 컨테이너를 통해 생성된 객체이다.
스프링의 특징 ③ DI(의존성 주입)
객체를 직접 생성하지 않고, 외부에서 생성한 후 주입하는 것이다.
A 클래스와 B 클래스가 있다고 하자.
A 클래스의 메소드 안에서 B 클래스의 객체를 생성하면,
A는 B에 '의존'하게 된다.
두 클래스의 외부에서 A 클래스의 메소드를 호출하고,
파라미터 값으로 B 클래스의 객체를 전달한다면 이것은 '주입'이 된다.
이 둘을 합쳐서 A와 B의 '의존' 관계가 외부에서 '주입'을 통해 이루어지는 걸 생각해보자.
그렇다면 결국 의존성 주입이란,
외부에서 파라미터 값으로 전달받은 B 클래스 객체를 A 클래스 메소드 안에서 사용하는 것이다.
- 생성자를 이용한 의존 객체 주입
- Setter를 이용한 의존 객체 주입
- List를 이용한 의존 객체 주입
- Map을 이용한 의존 객체 주입
위 사진의 출처 티스토리 블로거 님이 쓰신 예제를 보면서
의존 객체 주입을 좀 더 이해할 수 있었다.
public class Pencil {
}
public class Store {
private Pencil pencil;
public Store() {
this.pencil = new Pencil();
}
}
Store 클래스에서 Pencil을 판매하려고 생성자를 통해
클래스 내부에서 pencil 객체를 생성한다면,
나중에 판매 품목을 Food로 변경할 경우 생성자를 변경해야 한다.
또한 이 경우 Store 클래스와 Pencil 클래스가 서로 강하게 결합되어 있다.
Pencil, Food 등 여러 품목을 하나로 표현하기 위해
Product 인터페이스를 만든다.
그러고 난 뒤, Product 인터페이스로 구현되는 각각의 클래스(Pencil, Food)를 만든다.
이제 Store 클래스에서는 외부에서 product로 판매할 상품을 주입받을 수 있다.
public class Store {
private Product product;
public Store(Product product){
this.product = Product;
}
}
스프링이 제공하는 모듈(라이브러리)
spring-core : 제어 역전(IoC)과 의존성 주입(DI)을 제공한다
spring-aop : 관점 지향 프로그래밍(AOP) 구현 기능을 제공한다
spring-jdbc : 적은 양의 코드로 DB를 다룰 수 있는 기능을 제공한다
spring-tx : 트랜잭션 관련 기능을 제공한다
spring-webmvc : MVC 모델 구현 기능을 제공한다
'Framework > Spring boot' 카테고리의 다른 글
Spring 학습 내용을 정리한 로드맵 - 1. 스프링이란 무엇인가 (0) | 2022.12.27 |
---|---|
스프링은 어떻게 작동하는 걸까? (0) | 2022.12.14 |
스프링 MVC, Annotation, API, JSON은 대체 뭘까? (0) | 2022.10.29 |