[Spring] Spring Framework?? 그게 뭔데?

chiyongs·2022년 7월 1일
3
post-thumbnail

Spring Framework란 🌱

Spring Framework는 자바 진영의 대표적인 오픈소스 프레임워크입니다. 자바 언어의 가장 큰 특징은 바로 "객체지향 언어"라는 점입니다. 따라서, Spring Framework는 객체 지향 언어가 가진 특징들을 살려 좋은 객체 지향 애플리케이션을 개발할 수 있도록 도와줍니다.

Spring의 특징

Spring Framework가 가진 특징은 다음과 같습니다.

  • 경량 컨테이너로서 자바 객체를 직접 관리
  • POJO(Plain Old Java Object) 방식의 프레임 워크
  • IoC(Inversion of Control), 즉 제어의 역전을 통해 모든 객체에 대한 제어권을 개발자가 아닌 IoC 컨테이너에 위임
  • DI(Dependency Injection), 의존성 주입을 지원
  • AOP(Aspect Orient Programming), 관점 지향 프로그래밍을 통해 핵심 로직에서 공통 관심사항을 분리하여 각각 모듈화하여 관리 가능
  • 높은 확장성

Spring Framework에 대해 들어보셨다면 IoC, DI, AOP에 대해 은근슬쩍 들어보셨을 것이라 생각됩니다. 그렇다면 Spring Framework와 매일 함께 나오는 이 용어들은 무엇일까요??

경량 컨테이너 & POJO 방식의 프레임 워크

Spring Framework는 Java Object들의 생성부터 소멸까지의 라이프사이클을 관리해줍니다. 또한, J2EE 프레임워크에 비해 기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍습니다.

POJO란?

Wikipedia에 따르면

Plain Old Java Obejct, 간단히 POJO는 말 그대로 해석을 하면 오래된 방식의 간단한 자바 오브젝트라는 말이다. Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용하게 된 용어이다.

POJO라는 용어는 이후에 주로 특정 자바 모델이나 기능, 프레임워크 등을 따르지 않는 자바 오브젝트를 지칭하는 말로 사용되었다.

IoC는 Inversion Of Control의 약자이며 제어의 역전이라 합니다.

그렇다면 제어의 역전은 무슨 의미일까요?
전통적인 프로그래밍에서는 프로그래머가 작성한 프로그램이 외부 라이브러리의 코드를 호출해 이용합니다. 하지만 IoC가 적용된 구조에서는 외부 라이브러리의 코드가 프로그래머가 작성한 코드를 호출합니다.
IoC를 사용하는 목적은 다음과 같습니다.

  • 작업을 구현하는 방식과 작업 수행 자체를 분리합니다.
  • 모듈을 제작할 때, 모듈과 외부 프로그램의 결합에 대해 고민할 필요 없이 모듈의 목적에 집중할 수 있습니다.
  • 다른 시스템이 어떻게 동작할지에 대해 고민할 필요 없이, 미리 정해진 협약대로만 동작하게 하면 됩니다.
  • 모듈을 바꾸어도 다른 시스템에 부작용을 일으키지 않습니다.

예시 🎂

그렇다면 Spring에서 IoC가 어떻게 적용되어있는지 알아봅시다.
"나혼자"는 여자친구의 생일을 위해 수제 케이크를 만들어주기로 했습니다.

public class BirthdayService {
	
	private HandmadeCake handmadeCake;
    
    public void celebrate() {
		handmadeCake = new HandmadeCake();
        handmadeCake.setCream("whipped cream");
        handmadeCake.setFruit("strawberry");
        ... 이런저런 수제 케이크 관련 설정....
    }
}

이처럼 나혼자 는 수제 케이크의 생성부터 소멸까지 객체에 대한 관리를 직접 해야했습니다.
하지만, Spring에서는

@Service //Spring Bean으로 등록하기 위해 사용
public class BirthdayService {
	
    @Autowired
	private HandmadeCake handmadeCake;
    
    public void celebrate() {
    	giveCake(handmadeCake);
    }
}

위 소스코드처럼 Spring은 마치 수제 케이크 전문점처럼 직접 수제 케이크를 만들어줍니다. 또한, 수제 케이크 객체에 대한 생명주기와 관리를 관리해줍니다.
따라서, 개발자가 비즈니스 로직에 더 집중할 수 있도록 만들어줍니다.

DI는 Dependency Injection의 약자이며 의존성 주입이라 합니다.

그렇다면 의존성 주입은 무슨 의미일까요?
객체를 필요로 하는 클래스 내에서 직접 객체를 생성하는 것은 이후에 클래스로부터 독립적으로 인스턴스의 생성을 변경하는 것이 불가능하기 때문에 유연하지 못합니다.
의존성 주입은 객체간의 결합도를 느슨하게 만들어주고 DIP(의존관계 역전 원칙)과 SRP(단일 책임 원칙)을 따르도록 객체의 생성에 대한 의존성을 객체의 행위로부터 분리하는 것입니다. 따라서, 외부로부터 필요한 객체를 주입받아 사용합니다.
객체지향 프로그래밍과 객체지향의 5원칙에 대해서 궁금하시다면 해당 글을 참조해주세요!

예시 🚀

"도지"는 우주 탐사선 개발팀에서 일하고 있습니다. 우주 분야는 정말 아주 매우 세밀하고 정교한 계산 작업이 요구됩니다. 도지네 팀은 우주탐사선에 사용할 계산기를 개발했습니다. 하지만, 도지네 팀의 자체 개발 계산기(MyCalculator.java)로 인해 우주 탐사선 1호가 실패했습니다. 따라서, 도지 팀은 자체 계산기를 사용하지 않고 세계적으로 권위적이고 유명한 계산기를 사용하기로 결정하였습니다.

public class ToTheMarsProject {
	
    public Object goMars() {
    	MyCalculator myCalculator = new MyCalculator();
		Object calculatedResult = myCalculator.calculate();
        ...
    }
}
public class MyCalculator {
    // 야심차게 자체 개발한 계산기....
	public Object calculate() {
    	...
    }
}

하지만, 기존 코드는 자체 개발한 MyCalculator를 쓴다고 생각하고 코드를 작성하였습니다. 그러다보니 세계적으로 권위적이고 유명한 NASA의 계산기를 사용하기 위해선 기존의 코드를 갈아엎어야 하는 불상사가 발생했습니다. 😫

도지 팀은 이런 불상사를 다시는 겪지 않기 위해서 다음과 같이 코드를 수정했습니다.

public class ToTheMarsProject {
	
    public Object goMars(Calculator calculator) {
		Object calculatedResult = calculator.calculate();
        ...
    }
}

이제 도지 팀은 어떠한 외부의 계산기를 사용하더라도 goMars,화성가는 메서드를 계산기에 의해 수정할 필요가 없어졌습니다. 이처럼 DI, 의존성 주입을 통해 객체간 결합도와 의존성을 낮추고 행위에만 집중할 수 있습니다.

AOP는 Aspect Orient Programming의 약자이며 관점 지향 프로그래밍입니다. 🗂

AOP는 핵심 비즈니스 로직에 있는 공통 관심사항을 분리하여 각각을 모듈화하는 것을 의미합니다.
공통으로 많이 사용되는 인증, 로깅, 트랜잭션 처리에 용이합니다.
AOP의 가장 큰 특징이자 장점은

  • 중복되는 코드를 제거할 수 있습니다.
  • 코드 재활용성이 극대화됩니다.
  • 변화를 수용하기에 용이합니다.

예를 들어, 메서드 이름이 create로 시작한다면 해당하는 메서드들이 호출될 때 로깅을 해야한다면 기존 프로그래밍 방식에서는 create로 시작하는 메서드들에서 직접 다 로깅 작업을 해주어야 했습니다.

void createBuilding() {
	log...
}

int createDesktop() {
	log...
}

하지만, AOP를 도입한다면 이런 공통된 부분을 하나의 모듈로 만들어 처리할 수 있습니다.

@Around("execution ...")
Object loggingCreateMethods(ProceedingJoinPoint pjp) {
	...
}

참고 - Spring에서 AOP를 사용하는 방법을 알고 싶으시다면 AspectJ에 대해 공부하시면 좋을 것 같습니다.

Spring은 높은 확장성을 가지고 있습니다. 👨‍👩‍👧‍👦

Spring은 정말 많은 라이브러리를 함께 지원하고 있습니다. 하지만, 라이브러리들에 종속적이지 않을 뿐더러 필요한 라이브러리들을 더 추가하여 사용할 수 있습니다.
또한 Spring은 자체적으로 매우 훌륭한 기능들을 개발하고 소유하고 있습니다.
다음은 Spring 공식 사이트에서 볼 수 있는 스프링이 진행하고 있는 프로젝트들입니다. 이 외에도 Spring은 다양한 프로젝트들을 진행하고 있습니다.


마무리 🙋‍♂️

이번 글에서는 Spring에 대해 정리해보았습니다. Spring Framework에 대한 내용은 너무 방대하기 때문에 그 중 중요한 특징이라고 생각하는 것들을 위주로 글을 작성해보았습니다. 잘못된 내용이나 오타가 있다면 댓글로 알려주시면 감사하겠습니다.


Ref

0개의 댓글