Backend/Spring

[Spring] 스프링의 개념과 특징 총정리

코코무 2024. 2. 22. 10:57

※ 본 글은 교재 [코드로 배우는 스프링 웹 프로젝트 - 구멍가게 코딩단]을 바탕으로 작성되었습니다.

 

 

 

프레임워크

 

프레임워크란 뼈대나 근간을 이루는 코드들의 묶음을 말합니다.

 

그렇다면 이것이 필요한 이유는 무엇일까요?

개발자 특성상, 개인의 능력 차이가 큰 직종이기 때문에 개발자 구성에 따라 프로젝트의 결과는 큰 차이를 낳는데

이 부분을 극복하기 위해 프레임워크가 필요합니다.

프로그램의 기본 흐름과 구조를 정하면 팀원들이 이 구조에 맞게 자신이 만드는 코드를 추가하여 개발하게 됩니다.

 

라이브러리도 마찬가지로 미리 만들어져있는 기능이기는 하지만 개발자가 그 흐름을 직접 결정합니다.

 

프레임워크의 장점은 구조를 미리 코드로 만들어 놓았기 때문에 이미 시작이 반입니다.

일정한 품질이 보장되는 결과물을 얻고 개발 시간까지 단축할 수 있습니다.

 

 

 

스프링 프레임워크의 개념

 

자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크

엔터프라이즈급(기업을 대상으로 하는 대규모 환경의 개발) 애플리케이션을 개발하기 위한

모든 기능을 종합적으로 제공하는 가장 성공적인 '경량 프레임워크(특정 기능을 위주로 간단한 jar 파일 등을 이용하여 모든 개발이 가능하도록 구성됨)'입니다.

 

원래는 모든 작업을 사용자가 직접 제어하는 구조였다면

IOC(Inversion of Control,  제어의 반전) 기반인 스프링 프레임워크는 제어의 흐름을 특별한 객체에 모든 것을 위임합니다.

 

IOC는 DI와 DL로 구현됩니다.

 

DI(Dependenct Injection, 의존성 주입): 객체가 서로 의존하는 관계가 되도록 의존성을 주입하는 것을 말합니다.

각 클래스 사이에서 필요로 하는 의존 관계를 객체(빈) 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 준다. 뒤에서 더 자세히 보겠습니다.

DL(Dependency Lookup, 의존성 검색): 컨테이너에서는 객체들을 관리하기 위해 별도의 저장소에 빈을 저장하는데, 개발자가 컨테이너에서 제공하는 API를 이용하기 위해 사용할 빈을 검색하는 방법입니다.

 

 

스프링 프레임워크의 주요 특징

 

1. POJO(Plain Old Java Object) 기반의 구성

스프링은 경량 프레임워크지만 그 내부는 객체 간의 관계를 구성할 수 있는 특징을 가집니다. 특히 이 관계를 구성할 때 별도의 API를 필요로 하지 않는다. 이것은 일반적인 Java 코드를 이용하여 객체를 구성하는 방식을 스프링에서도 사용할 수 있음을 의미합니다.

 

2. 의존성 주입(DI)

의존성(Dependency)은 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없음을 의미합니다. 

주입(Injection)은 외부에서 밀어 넣는 것을 말합니다(치과에서는 '마취'라는 뜻으로 통용됩니다💉).

이 둘을 결합하면 '어떤 객체가 필요한 객체를 외부에서 밀어넣는다'는 의미가 됩니다.

 

주입 받는 입장에서는 어떤 객체인지 신경 쓸 필요 없이 어디에 의존하든 자신의 역할은 변하지 않습니다. 

그렇다면 당연하게도 필요한 객체를 주입해주는 제3자가 필요합니다.

스프링에서는 그 제3자가 'ApplicationContext'입니다. 이 친구가 필요한 객체들을 생성하고 주입하는 역할을 해 주는 구조입니다. 그리고 이 친구가 관리하는 객체들을 빈(bean🥜)이라 하며, 빈과 빈 사이의 의존관계를 처리하는 방식으로 XML 설정, 어노테이션 설정, Java 설정 방식을 이용할 수 있습니다.

 

3. AOP(Aspect Oriented Programming) 지원

좋은 개발환경을 구성하기 위해서는 반복적인 코드를 제거하고 개발자가 비즈니스 로직에만 집중할 수 있게 해야 합니다.

 

반드시 처리가 필요한 부분인 횡단 관심사(cross-concern)를 모듈(프로그램을 구성하는 구성 요소)로 분리하는 역할을 AOP가 합니다.

 

4. 트랜잭션(Transaction)의 지원

트랜잭션이란 DB의 상태를 변화시키기 위해 수행하는 작업의 단위를 말합니다. 스프링은 이 트랜잭션  관리를 어노테이션이나 XML로 설정할 수 있기 때문에 매번 상황에 맞는 코드를 작성할 필요가 없도록 설계되었습니다.

 

 

스프링 MVC의 구조

 

MVC 구조는 내부적으로 root-context.xml로 사용하는 일반 Java 영역과 servlet-context.xml로 설정하는 Web관련 영역을 같이 연동해서 구동합니다.

 

JSP에서도 MVC 구조를 배웠었습니다. [Model / View / Controller]

 

스프링의 MVC 구조는 크게View/ Controller / Service / DAO / DTO 이렇게 이루어져 있습니다(물론 더 세분화도 가능).

 

1. View

사용자에게 보여지는 화면입니다.

스프링에서는 JSP를 통해 화면을 구성하고 Controller를 통해 백엔드 서버와 연결합니다.

 

2. Controller

View와 Service 사이를 연결합니다.

클라이언트에서 입력한 URL에 맞는 View를 보여주고 View에서 처리하는 데이터를 Service로 전달해줍니다.

 

3. Service

실제 로직을 처리하는 곳으로 모든 기능은 이곳에서 만들어집니다.

Controller를 통해 화면과 연결되고, DAO를 통해 DB와 연결됩니다.

 

4. DAO(Data Access Object)

프로젝트와 DB를 연결합니다.

Mapper에 SQL을 명시한 뒤 Mapper와 함께 데이터베이스와 데이터를 주고 받습니다.

 

5. DTO(Data Transfer Object)

VO(Value Object)라고도 불리우며(완벽히 같은 의미는 아니다) MVC 구조 사이사이에서 데이터 교환을 위한 오브젝트입니다. getter/setter 두 가지 함수만 가지고 있으며 주로 DB 테이블과 매칭합니다.

 

흐름의 순서는 다음과 같습니다.

view controller service serviceImpl DTO/VO  mapper interface mapper xml   db