본 포스팅은 'React.js, 스프링 부트, AWS로 배우는 웹 개발 101 - 김다정'님의 책을 보고 작성되었습니다.
목차
1. 레이어드 아키텍처
2. 모델, Entity, DTO
3. REST API
레이어드 아키텍처
레이어드 아키텍처란?
레이어드 아키텍처 패턴은 스프링 프로젝트 내부에서 어떻게 코드를 적절히 분리하고 관리할 것인지에 대한 것이다.
- 퍼시스턴스 레이어는 데이터 베이스와 연결하는 부분으로 영속성(데이터를 생성한 프로그램의 종료에도 사라지지 않는 것을 의미한다.)을 가지는 부분이다.
- 비지니스 레이어는 핵심 비지니스 로직을 진행하는 부분이다.
- 프레젠테이션 레이어는 Controller를 가지는 부분이다.
- 데이터베이스 레이어는 DB 관련 부분이다.
레이어드 아키텍처 특징
- 사용하는 용도에 맞는 여러 레이어로 나누어 사용한다.
- 레이어 사이에 계층이 있어 해당 레이어의 바로 위의 계층이나 아래 계층만 사용할 수 있다.
- Controller는 바로 아래 있는 Service 계층만 사용
- Service는 Controller나 Persistence 계층만 사용
- 가끔은 중간에 섞어서 사용하기도 한다 그러나 일반적으로는 바로 위 아래의 계층을 사용한다 생각해두자.
모델, Entity, DTO
DTO
- 실제 Model을 넘기면 문제가 생길 수 있어 비지니스 로직을 캡슐화 하기 위해서 DTO를 사용한다.
- DTO는 데이터를 전달하는데 사용하는 오브젝트로 Data Transfer Object의 줄임말로 단순히 데이터의 변경이 아닌 전달에 사용한다.
- 즉, 엔티티나 테이블의 정보 노출 없이 다른 객체(DTO)로 바꿔서 제공하여 서비스의 내부 로직을 숨기고, 데이터베이스를 안전하게 숨길 수 있게 해주는 것이 DTO이다.
Model
- 비지니스 데이터를 담는 역할을 한다.
Entity
- 데이터베이스의 테이블과 스키마를 표현한다.
- java에서는 데이터베이스 테이블을 자바 클래스로 표현한 경우를 엔티티라고 한다. (@Entity를 붙인 클래스는 엔티티 클래스라고 한다. 이는 데이터베이스의 테이블과 매핑되어 사용한다.)
REST API
- Representational State Transfer의 약자로 아키텍처 스타일이다.
- 아키텍처 스타일
- 반복되는 아키텍처 디자인을 의미한다.
- 아키텍처 패턴
- 반복되는 문제 상황을 해결하는 도구를 의미한다
REST 제약조건
- 클라이언트 서버(Client-Server)
- 리소스를 관리하는 서버가 존재하고 다수의 클라이언트가 리소스를 소비하려고 네트워크를 통해 서버에 접근하는 구조를 의미한다.
- 상태가 없는(Stateless)
- 상태가 없다는 것은 클라이언트가 서버에 요청을 보낼 때 이전 요청의 영향을 받지 않음을 의미한다.
- HTTP는 기본적으로 상태가 없는 프로토콜이다. 따라서 HTTP를 사용하는 웹 애플리케이션은 기본적으로 상태가 없는 구조를 따른다.
- 그러나 상태가 있어야 할 경우엔 서버가 아닌 데이터베이스 같은 퍼시스턴스에 상태를 저장해야 한다.
- 캐시가 되는 데이터(Cacheable)
- 서버에서 리소스를 리턴할 때 캐시가 가능한지 아닌지 명시할 수 있어야 한다.
- 일관적인 인터페이스(Uniform Interface)
- 애플리케이션의 리소스에 접근할 때 인터페이스가 일관적이어야 한다는 의미이다.(예로 URI의 일관성이 있다.)
- 레이어 시스템(Layered System)
- 클라이언트가 서버에 요청할 때 여러 개의 레이어로 된 서버를 거칠 수 있다.
- 클라이언트는 서버의 레이어 존재 유무를 알지 못한다.
- 코드 - 온 - 디맨드 (선택 사항)
- 선택사항으로 클라이언트는 서버에 코드를 요청할 수 있고 서버가 리턴한 코드를 실행할 수 있다.
REST와 HTTP
REST는 아키텍처이고 HTTP는 REST 아키텍처를 구현할 때 사용하면 쉬운 프로토콜이다.