스프링 프레임워크(Spring Framework)
스프링은 자바(Java) 기반의 애플리케이션 프레임워크이며 현재 가장 많이 사용되고 있다. 현재 우리나라의 ‘전자정부 표준 프레임워크’의 기반 기술로 채택되어 공공기관 웹 서비스를 개발할 때도 사용된다.
자바 언어로 엔터프라이즈급 애플리케이션을 개발하기 위한 필요한 기능들을 다양하게 제공하여 개발을 좀 더 쉽게 하도록 사용하는 도구이다.
💡 스프링의 핵심 가치
“애플리케이션 개발에 필요한 기반을 제공해서 개발자가 비즈니스 로직 구현에만 집중할 수 있게끔 하는 것”
제어 역전(IoC : Inversion of Control)
일반적인 자바 개발의 경우 사용하려는 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 사용한다. 즉, 객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조이다.
하지만 IoC를 적용한 스프링 환경에서는 개발자가 사용할 객체를 직접 생성하지 않고 객체의 생명 주기(Life cycle) 관리를 프레임워크(스프링)에 위임한다.
객체의 관리가 프레임워크에 넘어간 것을 제어 역전이라고 부르며, 이러한 제어 역전을 통해 의존성 주입(DI), 관점 지향 프로그래밍(AOP) 등이 가능해진다.
💡 제어 역전(IoC : Inversion of Control)
“스프링을 사용하면 객체의 제어권을 프레임워크로 넘기기 때문에 개발자는 비즈니스 로직을 작성하는데에만 집중하면 된다.”
”컨트롤의 제어권이 개발자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 개발자의 코드를 호출한다.”
의존성 주입(DI : Dependency Injection)
의존성(Dependency) 이란?
의존성이란 하나의 객체나 클래스가 다른 객체나 클래스를 필요로 하거나, 그것에 의존하는 관계를 의미한다. 즉,
파라미터나 리턴값 또는 지역변수 등으로 다른 객체를 참조하는 것이다.
의존성을 관리하기 위해 스프링과 같은 프레임워크에서는 의존성 주입을 사용한다.
의존성 주입(DI)
의존성 주입은 제어 역전의 방법 중 하나로, 사용할 객체를 개발자가 직접 생성하지 않고 프레임워크가 생성한 객체를 주입받아 사용하는 방식이다.
DI를 사용하여 객체를 직접 생성하지 않고 외부에서 생성한 객체를 주입받도록 하여 결합도를 낮추고 유연성을 높일 수 있다.
@Autowired 라는 어노테이션(annotation)을 통해 의존성을 주입한다. 4.3 이후 버전은 생성자를 통해 의존성을 주입할 때 생략 가능하지만 가독성을 위해 어노테이션을 명시하는 것이 좋다.
의존성 주입 방법
- 필드 주입 (Field Injection)
- setter 주입 (Setter Injection)
- 생성자 주입 (Constructor Injection)
다른 방식들과 다르게 생성자 주입 방식은 레퍼런스 객체 없이는 객체를 초기화할 수 없게 설계할 수 있다.
그러한 이유로 스프링 공식 문서에서 권장하는 의존성 주입 방법은 생성자 주입 방식이다.
💡 의존성 주입(DI : Dependency Injection)
“의존성 주입을 사용하면 클래스는 외부에서 주입받은 의존성 객체를 사용하므로, 의존성과 클래스 간의 결합도가 낮아지며 유연성과 재사용성이 향상된다.”
관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)
우선 AOP는 기존의 OOP(Object-Oriented Programming, 객체 지향 프로그래밍)를 보완하는 개념으로, OOP에서는 해결하기 어려운 문제들을 보다 쉽게 해결할 수 있게 도와주는 개념이다.
AOP는 관점을 기준으로 묶어 개발하는 방식을 의미하며, 여기서 관점(aspect)이란 어떤 기능을 구현할 때 ‘핵심 기능’과 ‘부가 기능’으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다.
’핵심 기능’은 우리가 적용하고자 하는 핵심 비즈니스 로직이다. ‘부가 기능’은 횡단적 관심사항 (Cross-Cutting Concerns)이라고도 하며 핵심 기능을 수행하기 위해서 행해지는 로깅, 트랜잭션 관리, 보안, DB연결, 파일 입출력 등의 기능을 말한다.
AOP는 프록시 패턴을 기반으로 구현되며, 부가 기능을 핵심 기능 메소드 실행의 전후 또는 예외 발생 시점에 넣을 수 있다.
(참고) Filter, Interceptor(특정 URL 진입 도중 가로채어서 특정 작업을 수행하는 것)
AOP를 구현하는 방법
컴파일 시점에 삽입
컴파일 시점 적용 방식은 AspectJ 컴파일러가 일반 .java 파일을 컴파일할 때 부가기능을 넣어서 .class 파일로 컴파일해주는 것을 의미한다. 이 동작을 에스팩트와 실제 코드를 연결하는 **위빙(weaving)**이라고 부른다.
컴파일된 클래스를 로딩하는 시점에 삽입
JVM내 클래스로더에 .class 파일을 올리는 시점에 바이트 코드를 조작해 부가기능 로직을 추가하는 방식이다.
프록시 패턴을 이용한 방식
컴파일, 클래스 로딩, main() 메서드의 실행 이후에 자바가 제공하는 범위내에 부가 기능을 적용하는 방식이다. 이미 런타임 중이라 코드를 조작하기 어려워 스프링, 컨테이너, DI, 빈 등 여러 개념과 기능을 총동원하여 프록시를 통해 부가 기능을 적용하는 방식이다.
프록시는 메서드 실행 시점에서만 다음 타겟을 호출할 수 있기 때문에, 런타임 시점에 부가기능을 적용하는 방식은
메서드의 실행 지점으로 제한된다.
AOP 용어 및 개념
● Joinpoint : ‘클래스의 인스턴스 생성 시점’, ‘메소드 호출 시점’ 및 ‘예외 발생 시점’ 과 같이 어플리케이션을 실행할 때 특정 작업이 시작되는 시점
● Weaving : 어드바이스를 핵심 로직 코드에 삽입하는 것
● Target : 핵심 로직을 구현하는 클래스
● Aspect : 여러 객체에 공통으로 적용되는 공통 관점 사항
● Advisor : 어드바이스와 포인트컷을 하나로 묶어 취급한 것
● Pointcut : 여러 개의 조인포인트를 하나로 결합한(묶은) 것
● Advice : 조인포인트에 삽입되어 동작할 수 있는 코드
Advice Type | 설명 |
Before | 조인포인트 실행 이전에 실행, 일반적으로 리턴타입 void |
After returning | 조인포인트 완료후 실행 (ex. 메서드가 예외없이 실행될 때) |
After Throwing | 메서드가 예외를 던지는 경우 실행 |
After (finally) | 조인포인트의 동작과 관계없이 실행 |
Around | 메서드 호출 전후에 수행(조인포인트 실행 여부 선택, 반환 값 변환, 예외 변환, try~catch~finally 구문 처리 가능 등), 가장 강력한 어드바이스이다. |
💡 관점 지향 프로그래밍(AOP)
“AOP는 공통의 부가 기능을 모듈화하여 핵심 비즈니스 로직 개발 중에 부가 기능이 필요할 경우 그 지점에 밀어 넣는 것이다.”
“AOP를 통해 로깅, 트랜잭션 관리, 보안 등과 같은 부가 기능을 애플리케이션의 다른 부분에 영향을 주지 않고 분리하여 관리할 수 있다.
“AOP는 애플리케이션의 유지보수성과 재사용성을 향상시키는 데 큰 도움을 준다”
스프링 프레임워크의 다양한 모듈
💡 스프링 프레임워크의 다양한 모듈
“개발에 필요한 모듈만 선택해서 사용 가능하게 설계되어 있으며, 이를 경량 컨테이너 설계라고 부른다.”
Reference
갓대희의 작은공간 : [Spring] 스프링(Spring) 정의 및 특징 정리
'Back > Spring' 카테고리의 다른 글
Spring : Entity와 DTO 역할 분리 (0) | 2024.11.02 |
---|---|
Spring : JPA와 Spring Data JPA (0) | 2024.10.27 |
Spring : MyBatis (0) | 2024.10.26 |
Spring : 관점 지향 프로그래밍(AOP) (0) | 2024.10.21 |
Spring : 의존성 주입(DI)의 세 가지 방법 (생성자, setter, 필드 주입) (1) | 2024.10.20 |