[Spring] Spring이란?
업데이트:
개요
백엔드 개발자로서 성장하기 위해 스프링 프레임워크의 필요성을 느껴 공부하기로한지 약 1달이 지났다. ssafy 지원이라던지 졸업논문이라던지 여러 일이 있다보니 쉽게 잡히지 않았고, 필요성은 여전히 느끼고 있기에 친한 후배와 마음이 맞아 스터디를 만들게 됐다. 동시에 이를 배우고 싶어하는 후배들과 함께하면 좋을 것이라는 생각에 함께하게 되었다. 목표는 책 ‘배워서 바로쓰는 스프링 프레임워크’를 1회독 하는것인데, 다들 프로그래밍을 접한지 그리 오랜 기간이 지나지 않았기 때문에 걱정반 근심반이지만 모두들 끈기 있게 함께했으면 좋겠다는 작은 바람이 있다.
스프링 프레임워크 스터디 스프링파전(전에는 해물파전을 먹으며 만든 알고리즘 스터디의 이름이 해물파전이었는데, 그 후속작 같은 느낌이다.)을 시작하기에 앞서 이 전에 스프링 프레임워크를 공부하며 든 생각이 ‘나는 서버를 만들어보고 싶은데 왜 하나도 언급이 없지?’라는 의문을 먼저 해결하고자 포스트를 작성하게 되었다.
Framework ?
먼저 스프링은 언어가 아니다. 자바를 근간으로 하는 Framework인데, Library와는 차이점이 있다. Library는 한가지 및 어떤 작업을 수행하기 만들어 놓은 기능이라고보면 되는 반면(numpy, panads과 같이) Framework의 경우는 어떤 결과물(소프트웨어)를 내기 위한, Library를 포함하는 상위 구조이다.
Spring을 배우기에 앞서 Framework에 대한 이해가 먼저 필요하다고 생각한다.
프레임워크는 어떤 목적이나 작업을 수행하기 위해 만들어진 ‘구조’이며 소프트웨어 개발에서 그 중심 역할이 될 수 있는 역할을 한다. Spring은 말하자면, 많은 프레임워크 중 웹페이지를 만드는데 필요한 기능인 페이지 구현, DB관리, 유저 인증 등 기능을 구현할 수 있는 웹 프레임워크에 속하겠다.
(건물을 만들기 위해서 망치부터 만들 필요는 없는 것과 비슷하다고 이해했다.)
프레임워크를 사용하지 않는다면 사소한 기능부터 모두 구현을 해야하고, 그에 따라 많은 시간을 소비하고 그 품질도 보장되기 힘들다.
Spring ?
spring은 경량 컨테이너로 자바 객체를 담고 직접 관리한다.
객체를 담고 직접관리한다는 의미는, 객체의 생성과 소멸 또 그 생명주기를 관리한다는 뜻이며, 객체를 컨테이너에 담는다는 의미는 언제든지 원할 때 Spring의 컨테이너로부터 필요한 객체를 가져와 사용할 수 있다는 의미이다.
IoC(Inversion of Control), 제어의 역전
객체를 컨테이너로부터 가져와 사용할 수 있다는 것은 제어의 역전을 의미한다.
제어의 역전이 가지는 의미는 본래 객체의 생성, 객체들 간의 관계를 설정하고,사용과 제거에 걸친 제어권을 해당 애플리케이션이 갖는 것이 아닌 컨테이너에게 넘기는 것을 의미한다. 이 스프링 컨테이너는 애플리케이션 객체를 한꺼번에 책임지기 때문에 만들어진 애플리케이션 객체들을 한 곳으로 모아 조합하기 위해 팩토리나 서비스 로케이터 등의 디자인 패턴을 직접 구현할 필요가 없다.
이는 스프링 프레임워크가 경량 컨테이너이기에 가질 수 있는 특징이다.(‘Spring = 제어의 역전’은 아니다.)
이 스프링 컨테이너가 생성하고 관리하는 애플리케이션 객체들을 빈(Bean)이라고 부른다.
DI(Dependency Injection)
Spring의 또다른 특징은 의존 관계 주입(DI)이다.
DI에 관해서 알아보기 전에 의존 관계에 대해서 알아보았다.
Dependency, 의존관계란
데이터베이스나 다른 개발 관련 공부를 하다보면 의존, 의존관계라는 말을 빈번하게 접할 수 있다.
먼저 책 “배워서 바로 쓰는 스프링 프레임워크”에서는 다음과 같이 DI에 관해 명시한다.
자바 애플리케이션은 애플리케이션의 행동 방식을 제공하기 위해 상호 작용하는 객체로 이뤄지는데, 객체가 다른 객체와 상호 작용하는 경우를 객체의 의존 관계 라고 한다.
좀 더 구체적으로 말하자면 A,B라는 객체들로 이뤄진 애플리케이션이 존재할 때 A객체가 B로 인해서 변화한다면, A객체가 B객체의 변화로 인해 영향을 받는다면 “A객체는 B객체에 의존한다.” 라고 할 수 있다.
이때 DI는 객체간 의존 관계를 생성자 인수, 세터 메서드 인수로 명시하고 객체를 생성할 때 생성자나 세터를 통해 의존 관계를 주입하는 방식을 따르는 디자인 패턴이다. 생성된 애플리케이션 객체를 주입하는 위 IoC에서 언급한대로 애플리케이션에게 있는 것이 아니라 스프링 컨테이너에 있기 때문에 스프링 컨테이너의 입장에서 보자면 DI를 제어의 역전, Ioc로 부른다.
스프링을 쓰는 이유, 장점
1. 스프링은 먼저, 객체 생성과 의존 관계 주입을 처리함으로써 자바 애플리케이션
조합을 쉽게 만들어준다.
2. 스프링은 POJO(자바의 평범한 객체)로 애플리케이션을 개발하는 것을 권장한다.
3. 번거로운 준비 코드를 알아서 처리해주는 추상화 계층을 제공하여 데이터베이스, MBean
등 상호 작용을 쉽게 만들어준다.
4. 트랜 잭션을 사용하는 애플리케이션 개발에 선언적 트랜잭션 관리(다른 코드와 트랜잭션을
분리할 수 있다.)를 사용해 트랜잭션을 관리할 수 있다.
5. 스프링은 사용자 인증과 권환 부여 기능을 제공하여 안전한 자바 애플리케이션을
만들 수 있도록 돕는다.
이 외에도 더 많은 장점이 있겠지만, 가장 와닫는 부분을 간추렸다. 이로서 스프링을 이해하기 위해 간략하게나마 정리를 마쳤다. 미래의 나와 스프링을 시작하려는 사람들에게 도움이 되었으면 한다.
댓글남기기