레이어드 아키텍처(Layered Architecture)란 애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조를 의미, 여러 방면에서 쓰이는 개념이며, 어떻게 설계하느냐에 따라 용어와 계층의 수가 달라짐
일반적으로 레이어드 아키텍처라고 하면 3계층 또는 4계층 구성을 의미. 이 차이는 인프라(데이터 베이스) 레이어의 추가 여부로 결정
스프링 부트는 별도의 설정 없이 spring-boot-starter-web의 의존성을 사용할 떄는 기본적으로 스프링 MVC 구조를 띠게 되며, 대체로 아래 사진과 같은 레이어드 아키텍처를 이룬다.
레이어드 아키텍처는 일반적인 계층 구조를 기반으로 필요에 따라 조금씩 변형해 사용. 가장 중요한 부분은 비즈니스 계층 영역인데, 비즈니스 로직을 어디서 담당할지 결정하고 설계하는 것이 좋다. 비즈니스 로직은 도메인 계층에서 담당하는 것이 일반적.
스프링에서 JPA를 사용하면 @Entity를 정의한 클래스가 도메인 객체가 되며, 이곳에서 비즈니스 로직을 설계하는 게 좋음.
디자인 패턴(Design Pattern)은 소프트웨어를 설계할 때 자주 발생하는 문제들을 해결하기 위해 고안된 해결책. 디자인 패턴에서 '패턴'이라는 단어는 애플리케이션 개발에서 발생하는 문제는 유사한 경우가 많고 해결책도 동일하게 적용할 수 있다는 의미를 내포. 그러나 디자인 패턴이 모든 문제의 정답은 아니며, 상황에 맞는 최적 패턴을 결정해서 사용하는 것이 바람직
디자인 패턴을 구체화해서 정리한 대표적인 분류 방식으로 'GoF 디자인 패턴'이 있음.
<GoF 디자인 패턴>
GoF 디자인 패턴은 생성(Creational)패턴, 구조(Structural)패턴, 행위(Behavioral)패턴 총 세 가지로 구분
객체 생성에 사용되는 패턴으로, 객체를 수정해도 호출부가 영향을 받지 않게 함
추상 팩토리(Abstract Factory) : 구체적인 클래스를 지정하지 않고 상황에 맞는 객체를 생성하기 위한 인터페이스를 제공하는 패턴
빌더(Builder) : 객체의 생성과 표현을 분리해 객체를 생성하는 패턴
팩토리 메서드(Factory Method) : 객체 생성을 서브클래스로 분리해서 위임하는 패턴
프로토타입(Prototype) : 원본 객체를 복사해 객체를 생성하는 패턴
싱글톤(Sigleton) : 한 클래스마다 인스턴스를 하나만 생성해서 인스턴스가 하나임을 보장하고 어느 곳에서도 접근할 수 있게 제공하는 패턴
인스턴스 : 일반적으로 실행 중인 임의의 프로세스, 클래스의 현재 생성된 오브젝트를 가리킨다. 객체(오브젝트)의 인스턴스는 데이터베이스나 SGA, 백그라운드 프로세스등 광범위한 컴퓨터시스템 자원의 접근에 할당된 물리 메모리의 일부를 가리킨다.
객체를 조합해서 더 큰 구조를 만드는 패턴
객체 간의 알고리즘이나 책임 분배에 관한 패턴, 객체 하나로는 수행할 수 없는 작업을 여러 객체를 이용해 작업을 분배. 결합도 최소화를 고려할 필요가 있음
책임 연쇄(Chain of Reposibility) : 요청 처리 객체를 집합으로 만들어 결합을 느슨하게 만드는 패턴
커맨드(Conmmand) : 실행될 기능을 캡슐화해서 주어진 여러 기능을 실행하도록 클래스를 설게하는 패턴
인터프리터(Interpreter) : 주어진 언어의 문법을 위한 표현 수단을 정의하고 해당 언어로 구성된 문장을 해석하는 패턴
이터레이터(Iterator) : 내부 구조를 노출하지 않으면서 해당 객체의 집합 원소에 순차적으로 접근하는 방법을 제공하는 패턴
미디에이터(Mediator) : 한 집합에 속한 객체들의 상호작용을 캡슐화하는 객체를 정의한 패턴
메멘토(Memento) : 한 집합에 속한 객체들의 상호작용을 캡슐화하는 객체를 정의한 패턴
옵저버(Observer) : 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버 목록을 객체에 등록해 상태가 변할 때마다 메서드 등을 통해 객체가 직접 옵저버에게 통지하게 하는 디자인 패턴
스테이트(State) : 상태에 따라 객체가 행동을 변경하게 하는 패턴
스트래티지(Strategy) : 행동을 클래스로 캡슐화해서 동적으로 행동을 바꿀 수 있게 하는 패턴
템플릿 메서드(Template Method) : 일정 작업을 처리하는 부분을 서브클래스로 캡슐화해서 전체 수행 구조는 바꾸지 않으면서 특정 단계만 변경해서 수행하는 패턴
비지터(Visitor) : 실제 로직을 가지고 있는 객체(visitor)가 로직을 적용할 객체(element)를 방문하여 실행하는 패턴
Rest API는 대중적으로 가장 많이 사용되는 애플리케이션 인터페이스이다
'Representatinal State Transfer'의 약자로, 월드 와이드 웹(WWW)과 같은 분산 하이퍼미디어 시스템 아키텍처의 한 형식. 주고받는 자원(Resource)에 이름을 규정하고 URI에 명시해 HTTP 메서드(GET, POST, PUT, DELETE)를 통해 해당 자원의 상태를 주고 받는 것을 의미
먼저 API는 'Application Programming Interface'의 약자로, 애플리케이션에서 제공하는 인터페이스를 의미. API를 통해 서버 또는 프로그램 사이를 연결할 수 있다. 즉, REST API는 REST 아키텍처를 따르는 시스템/애플리케이션 인터페이스라고 볼 수 있다. REST 아키텍처를 구현하는 웹 서비스를 'RESTful하다'라고 표현
인터페이스(interface)는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다. 즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미한다. 컴퓨팅에서 컴퓨터 시스템끼리 정보를 교환하는 공유 경계
유니폼 인터페이스란 '일관된 인터페이스'를 의미. 즉, REST 서버는 HTTP 표준 전송 규약을 따르기 때문에 어떤 프로그래밍 언어로 만들어졌느냐와 상관없이 플랫폼 및 기술에 종속되지 않고 타 언어, 플랫폼, 기술 등과 호환해 사용할 수 있다는 것을 의미
REST는 '무상태성(stateless)'이라는 특징을 가짐. 무상태성이란 서버에 상태 정보를 따로 보관하거나 관리하지 않는다는 의미. 서버는 클라이언트가 보낸 요청에 대해 세션이나 쿠키 정보를 별도 보관하지 않음. 그렇기 때문에 한 클라이언트가 여러 요청을 보내든 여러 클라이언트가 각각 하나의 요청을 보내든 개별적으로 처리. 이렇게 구성된 서비스는 서버가 불필요한 정보를 관리하지 않으므로 비즈니스 로직의 자유도가 높고 설계가 단순
REST는 HTTP 표준을 그대로 사용하므로 HTTP의 캐싱 기능을 적용할 수 있다. 이 기능을 이용하기 위해서는 응답과 요청이 모두 캐싱 가능한지(Casheable) 명시가 필요하며, 캐싱이 가능한 경우 클라이언트에서 캐시에 저장해두고 같은 요청에 대해서는 해당 데이터를 가져다 사용. 이 기능을 사용하면 서버의 트랜잭션 부하가 줄어 효율적이며 사용자 입장에서 성능이 개선
REST 서버는 네트워크 상의 여러 계층으로 구성될 수 있음(Layered System). 그러나 서버의 복잡도와 관계없이 클라이언트는 서버와 연결되는 포인트만 알면 됨.
REST 서버는 API를 제공하고 클라이언트는 사용자 정보를 관리하는 구조로 분리해 설계. 이 구성은 서로에 대한 의존성을 낮추는 기능을 한다.