It's Ward

[Spring] Spring의 특징과 계층 구조 본문

Java/Spring

[Spring] Spring의 특징과 계층 구조

I'm ward 2022. 6. 20. 22:48

Spring을 공부하고 있지만, 기본기가 부족하여 항상 되돌아 오는건 

"아 이걸 왜 써야하는거지?", "한번 봤던 것 같은데.." 였다.

이 참에, 확실한 정보를 기억하면서 공부하고 조금 더 내 스스로 이해할 수 있도록 기존의 클론코딩 리뷰보다 기본 지식들을 정리하는 시간을 가지려고 한다.

 

Spring Framework

JAVA 기반의 플랫폼 개발을 위한 오픈소스 애플리캐이션 프래임워크 중 하나.

프레임워크 : 개발할 때 설계 기본이 되는 뼈대나 구조, 환경 ( 애플리케이션 흐름의 주도권을 가지고 있음)

재사용성, 확장성 부분에서 객체 지향 설계원칙에 맞아 개발을 쉽게 할 수 있도록 도와주고, 개발자들이 핵심 로직을 효율적으로 개발할 수 있도록 기본 틀, 공통 프로그래밍 모델과 API를 제공한다.

 

Spring Framework  핵심기술

 

1) 스프링 DI 컨테이너(Spring DI Container)

컨테이너 : 스프링에서 컨테이너란 설정 정보를 참고 애플리케이션을 구성하는 각각의 객체(Bean)를 생성, 소멸 같은 라이플 사이클을 관리하는 것. 

DI(Dependency Injection): 각각의 계층이나 서비스들 간에 의존성을 갖는 객체에 대해서는 프레임워크를 통해 연결해 준다. 외부에서 객체를 생성해서 넣어주는 방식

IoC (Inversion of Control)  : "제어의 역전" 이라는 의미로 메소드나 객체의 생성, 소멸 등 호출 작업을 개발자가 하는 것이 아니라, 외부(스프링 프레임워크)에 위임하여, 결정되는것

스프링 컨테이너는 애플리캐이션을 개발자들이 쉽게 만들 수 있도록 객체의 제어권을 스프링 프레임워크에 넘겨 컴포넌트의 의존관계 결정, 설정, 생명 주기를 해결해 주는 것이다.

 

2) AOP(Aspect Oriented Programming) 

관점지향 프로그래밍 이라고 불리는 이것은, 애플리케이션에 공통적으로 나타나는 부가적인 기능들을 독립적으로 모듈화 하는 프로그래밍 모델이다.

어플리케이션는 핵심기술(객체가 제공하는 고유의 기능)과 부가적인 기능(단독적으로 사용되지않고 핵심기능을 보조하기 위한 기능)으로 구분할 수 있는데, 

애플리케이션의 요구사항이 복잡해지고, 어려운 기술들이 추가되면, 모든 책임과 관심사, 부가적인 기능들을 분리하는게 어렵다.

스프링에서하는 AOP를 지윈해, 개발자들이 다양한 서비스들과 기술들을 적용해도, 책임을 분리하여 클린 코드를 지향하는데 도와준다.

->알고가면 좋은 내용 : @Transactional 2022.06.18 - [Spring Boot] - [Spring] 트랜잭션(Transaction)이란 무엇일까?

 

[Spring] 트랜잭션(Transaction)이란 무엇일까?

1. 트랜잭션은? 데이터 베이스의 상태를 변화시키기 위해 수행하는 작업의 단위 - 상황에 따라 여러개가 만들어 질 수 있음 2. 어떤 특징이 있나요? 2개 이상의 쿼리를 하나의 커넥션으로 묶어 DB

its-ward.tistory.com

 

3) PSA(Portable Service Abstraction)

 일관성 있는 서비스 추상화로, 단순하게, 다른 코드에서 어떠한 코드를 떼네어 다른 부분에 사용하여도 이상없도록 사용되는 경우를 볼 수 있다.  

예시로 스프링에서 MVC 패턴을 사용할 때, Controller를 만들어 ,@GetMapping / PostMapping... 등  value값으로 url을 변경하는 경우, 해당하는 url을 요청하면, 응답을 받아 처리가되는데,  별다른 조건없이도 spring 프레임워크를 불러오는 것만으로도 다른 프로젝트에서 동일하게 해당 기능을 사용할 수 있다. 

이처럼 특정 서비스를 이용할 때, 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있는 것으로, 개발자들이 기존 코드를 거의 변경하지 않고 웹  기술스택을 간편하게 바꿀 수 있도록 해준다. 

 

Spring Framework 계층 구조

로그램의 관심, 책임, 성격 등등 다른 것들을 분리하게되면, 분리된 각 요소들끼리의 응집도가 높아지고 결합도가 낮아지게 된다. 결합도가 높아진다는 것은 즉, 한가지 기능을 수정하게 되면, 다른 요소들 까지 영향을 받아 프로그램을 유지보수하는데에 굉장히 힘들어 진다는 것이다.

이러한 문제를 해결하기 위해 Spring에서는 요청들을 처리하기 위한 계층을 3가지로 나누었고, Spring을 사용하는 개발자들도 어느정도 일관된 프로그램을 양식처럼 만들어 사용할 수 있게되었다.

한마디로, 시스템 전체를 수정하지 않고, 특정한 계층의 기능이나 성능을 개선하는것이 가능하다. 

스프링 프레임워크 계층 구조

1.프레젠테이션 계층 (Presentation Layer) 

클라이언트로부터의 HTTP 요청을 수신하고, 해당하는 응답을 주는 계층이다. 

어떤 요청을 받았고, 어떤 응답형태와 데이터를 반환하는지에 대한 책임을 가지고 있어, URI를 어떤 방식으로 처리할 것이지에 대한 설계가 필요하다.(UI 연결 및 JSON 응답.. 등등)

Get : 외부에서 접근해오는 페이지 / 정보 조회

Post : 데이터를 처리하는 페이지

2. 서비스 계층

요구사항에 맞게 비지니스 로직을 작성하고, 해결하는 계층으로, 서비스의 핵심 로직들이 주로 담겨있다.

트랜잭션에 대한 관리를 서비스 계층에서 처리하고, 최근 트랜드로는 도메인 중심의 개발로 변경하여 우리가 알고있는 비즈니스 로직은 도메인 객체(계층)에서 처리하고 실제 서비스 계층은 데이터의 적합성 검증과 트랜젝션 처리, 다른 레이어들과 통신하기 위한 인터페이스를 제공하는데 사용하고있다.

2016년 까지만 하더라도 Service 계층에서 비즈니스 로직을 작성하였지만 2018년 부터는 도메인 객체에서 주로 작성하는 것으로 보임

3. 데이터 엑세스 계층

Entity를 이용하여 데이터 베이스 구조를 만들었다면, 데이터 엑세스 계층을 데이터를 저장하거나 조회하는 등 (CRUD)를 어떻게 할 것인지를 정해 DB에 접근하는 계층(findAll .. 등)으로 @Repository 어노테이션을 사용해 빈으로 등록하여, 에러 추상화 등 부가적인 기능을 제공받을 수 있다.

Entity로 만든 표

테이블 자체가 Entity이고, 가로의 행 부분(id, title, createdTime)이 Entity 객체, 세로부분이 Column 이다.

 

 

계층들은 DTO(Data Transfer Object)를 통해 데이터 교환을 진행한다. 데이터 엑세스 계층에서 데이터를 얻어, 서비스나 컨트롤러 등으로 데이터를 보낼 때 사용되는 객체이다. 이동하는 데이터들은 데이터 베이스와 정확하게 일치하지 않을수도 있다. 

각 계층들은 자신의 계층이 가지고 있는 책임에만 충실하도록 개발되어야 좋은 프로그램이라고 할 수 있다.

결합도가 높아지는 경우 재사용이 불가능하며 테스트 코드를 작성하는데에 어려움을 주고, 각 계층별 예외가 발생할 경우, 찾기 힘들게 될것이다.

 

마무리하며..

스프링특징과 계층구조에 대해 간단하게 알아보았는데, 개발자들의 생산성을 높이기 위해 굉장히 최적화하였다는 생각이 든다. 프레임워크의 한가지 특징이겠지만, 사용하는 입장에서는 굉장히 편하게 사용하고, 기능들의 안정성이나 성능이 뛰어나 내가 이 구조를 정확하게 이해할 수만 있다면 멋진 서비스들을 만들 수 있는 개발자가 될 수 있을거라 생각한다.

 

 

참고 

https://stdbc.tistory.com/20

https://mangkyu.tistory.com/156

https://whitepro.tistory.com/265

https://gmlwjd9405.github.io/2018/12/25/difference-dao-dto-entity.html

https://sowon-dev.github.io/2020/10/18/201019spring/

https://home.cs.colorado.edu/~kena/classes/5448/f12/presentation-materials/aydin.pdf

Comments