Spring Framework

HY·2022년 4월 27일
0

Java 웹 개발

목록 보기
6/6

스프링 프레임워크 Spring Framework는 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로서 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다.

자바 언어의 가장 큰 특징은 객체 지향 언어라는 것인데, 스프링은 이런 특징을 잘 살려낸 프레임워크로, 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와준다.

🌱 배경

스프링이 나오기 전, 자바 진영에서는 애플리케이션을 개발할 때 EJB라는 기술을 많이 사용했는데, 무겁고 배우기 어려웠고 EJB에 의존적으로 개발을 해야 했다. 이러한 단점 때문에 간단한 옛날 방식의 자바 오브젝트, POJO (Plain Old Java Object)를 사용하자는 의견이 나오기 시작했다.
로드 존슨 Rod Johnson이 출간한 책에서 EJB를 사용하지 않고 엔터프라이즈 애플리케이션을 개발하는 방법을 소개했는데, 이후 이를 기반으로 스프링이 탄생하게 되었다.

🍃 특징

객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만든다. 객체들로 잘게 나누고, 변경이 필요한 부분이 있다면 해당 부분만 부품을 갈아 끼우듯이 교체한다. 이를 위해 인터페이스를 사용하는데, 사용할 때는 내부 구조는 몰라도, 대상의 역할(인터페이스)만 알면 된다. 그러면 구현이 달라져도 사용하는 입장에서는 수정이 필요 없이 그대로 사용할 수 있게 된다.

스프링은 객체 지향을 기반으로 하는 프레임워크로 다음과 같은 특징을 가진다.

POJO

Plain Old Java Object의 줄임말으로 특정 기술에 의존적이지 않은 순수한, 객체 지향 원리에 충실한 자바 객체를 의미한다.
스프링이 나오기 전, Java EE 등 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용되게 된 용어라고 한다. 스프링은 POJO 방식의 프레임워크로, 특정 기술에 의존적이지 않은 자바 객체를 사용해서 프로그래밍한다.

IoC/DI

Inversion of Control, 제어의 역전이라는 의미로, 원래는 개발자가 객체의 생성 및 의존관계를 제어했지만, 스프링에서는 스프링 컨테이너(IoC 컨테이너)가 객체의 생성부터 삭제까지 객체의 라이프 사이클과 의존성 관리를 해준다. 스프링이 관리하는 객체를 Bean이라고 한다.

기존에는 클래스 내부에서 사용하고자 하는 객체를 생성했다면, 스프링에서는 객체(Bean)를 스프링이 실행될 때 먼저 생성한 뒤, 필요한 곳에 만들어놓은 객체를 주입한다.
이것을 DI(Dependency Injection), 의존성 주입이라고 한다.

예를 들어, service 클래스에서 dao 객체를 사용할 때를 생각해보자.

private BookDao bookDao = BookDaoImpl.getBookDao();

service 클래스에서 BookDaoImpl 객체를 직접적으로 가져오고 있다.
이렇게 되면, 만약 BookDaoImpl이 아닌 BookDao 인터페이스를 상속한 다른 클래스로 교체하고 싶으면, 이 코드를 직접 바꾸어 주어야 한다. 이는 이 두 객체 간에 결합이 강한 것이고, 이를 해결하기 위한 것이 의존성 주입이다.

스프링에서는 설정을 통해 다음과 같이 작성할 수 있다.

@Autowired
private BookDao bookDao;

스프링의 BeanFactory에서 객체(Bean)을 관리하는데, 만약 BookDaoImpl이 아닌 BookDao 인터페이스를 상속한 다른 클래스로 교체하고 싶으면, 설정 정보를 바꿔주면 된다. 이를 통해 클래스 내부에서 직접 바꾸지 않아도 되어 결합도가 줄어들어 유연한 코드를 작성할 수 있다는 장점이 있다.

AOP

예를 들어, 모든 메서드에서 실행 시간을 잰다고 생각해보자.
그렇다면 메서드의 시작과 끝에 시간을 재기 위한 코드가 모든 메서드에 똑같이 들어갈 것이다.
이런 코드는 메서드의 핵심 기능을 담당하지는 않지만 모든 메서드에서 공통적으로 필요하고, AOP를 도입하기 전까지는 이런 코드가 반복된다는 단점이 있었다.

그래서 AOP가 등장하게 되었는데, AOP는 관점 지향 프로그래밍(Aspect Oriented Programming)의 줄임말으로, 소스 코드의 핵심적인 기능에서 부가적인 부분(다른 메소드들과 공통적인 부분)을 분리해 Aspect라는 모듈 형태로 만드는 방법이다.
이를 통해 모듈성이 증가하고 재사용성이 높아져 기존 OOP를 보완할 수 있다.

간단한 예제를 통해 알아보자.

public void method1 {
	long start = System.currentTimeMillis();
    
    ... (핵심 로직)
    
    long end = System.currentTimeMillis();
    System.out.println("time : " + start - end + "ms");
}

만약, 위와 같은 코드가 있고 시간 측정 부분을 빼서 다른 메서드에도 적용하고 싶다면, 다음과 같이 Aspect를 분리해서 사용할 수 있다.

@Aspect
public class ExecutionTimeAspect {

	@Around("execution(* com.practice.backend..*)")
	public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
		long start = System.currentTimeMillis();
    
    	Object ret = joinPoint.proceed();
    
    	long end = System.currentTimeMillis();
    	System.out.println("time : " + start - end + "ms");
        
        return ret;
    }
}

자세한 설정과 사용 방법에 대해서는 이후 포스팅에서 좀 더 자세히 다뤄볼 예정이다.

📚 Spring Framework Module

스프링 프레임워크는 기능에 따라 20여 개의 모듈로 이루어져 있다. 이 모듈들은 그림과 같이 크게 Core Container, Data Acess/Integeration, Web, AOP, Instrumentation, Test 그룹으로 나눌 수 있다.

Core container는 스프링 프레임워크에서 가장 중요한 부분으로 Beans, Core, Context, SpEL가 있다. Beans는 객체 Bean을 지원하고, 위에서 봤던 의존성 주입을 담당한다. Core는 다른 모듈들의 핵심이 되는 부분으로 다른 스프링 모듈들이 기본적으로 사용하는 모듈이다. Context는 국제화, 애플리케이션 생명주기 이벤트 등을 지원함으로써 BeanFactory를 확장한다.

그 외에도 AOP 기능을 지원하는 Spring AOP, 웹 MVC를 지원하는 Spring Web MVC 등 다양한 모듈이 있다.

스프링을 사용할 때, 이 모듈을 모두 사용하는 것은 아니고 필요한 것들을 골라 사용할 수 있다.

🟢 Spring Boot

스프링은 설정이 절반이라는 말이 있을 정도로 설정해줘야할 부분이 많다. 그래서 나온게 스프링부트로 설정의 많은 부분을 자동화해줘서 편리하게 개발할 수 있다.

0개의 댓글