Rest 와 백엔드 서비스 아키텍처

merci·2023년 3월 26일
0

Rest Api 프로젝트

목록 보기
3/6

Rest ( Representational State Transfer )

  • 웹의 장점을 최대로 활용할 수 있는 아키텍쳐

  • http 프로토콜을 의도에 맞게 디자인하도록 유도

  • http의 주요 의도는 웹 리소스의 전송과 클라이언트-서버 간의 상호작용을 위한 표준화된 프로토콜을 제공

  • http 는 REST아키텍처를 구현할때 사용하면 좋은 프로토콜이다.

  • REST의 기본 원칙을 성실히 지킨 서비스 디자인을 “RESTful” 이라고 표현 (REST아키텍쳐로 설계)


REST 의 제약조건

  • 클라이언트 / 서버구조 -> 네트워크를 통해 서버( 웹 어플리케이션 )에 접근, 각자의 역할 분리

  • stateless - 상태정보를 저장하지 않는다. 브라우저는 요청마다 쿠키를 전송(또는 토큰) - 서버는 처리만

  • 캐시가능 - 웹에서 사용하는 기존 인프라를 그대로 활용이 가능 ( Http 의 캐싱 기능 )

  • 일관적인 인터페이스 ( 사용자가 보기에 ) - URI 일관성, 사용자가 예상하기 쉽게

  • 레이어 ( 책임 분리 ) - 인증서버, 캐시서버, 로드밸런서, 암호화, 애플리케이션 등

  • 코드-온-디멘드 ( 필수는 아님 ) - 서버에서 코드를 보내 브라우저에서 실행 ( CSR )

    ( rest 는 아키텍쳐 / REST API 구현은 - @RestController 등을 이용 )


REST API 규칙

  • URI는 자원을 표현하는 데에 집중

  • HTTP Method(GET, POST, PUT, DELETE 등)으로 자원을 관리하는것이 REST한 API를 설계 규칙

  • 소문자를 사용

  • 언더바 대신 하이픈을 사용

  • 계층관계는 / 를 이용해서 구분

  • 파일 확장자는 포함하지 않음

  • 전달 하고자 하는 자원의 명사를 사용, 컨트롤 자원일 경우 동사 허용

  • URI에 작성되는 영어는 복수형을 사용

문서작성을 해보면




백엔드 서비스 아키텍처

  • 레이어드 아키텍처 패턴 이용 - 스프링 프로젝트에서 코드를 적절하게 분리 / 관리

  • 자기보다 하위의 레이어만 접근이 가능

  • REST 아키텍쳐 스타일 - 브라우저가 어떤 형식으로 요청하고 응답을 받는가


DTO

데이터베이스에서 반환된 비즈니스 데이터를 담기 위한 클래스를 기능에 따라 엔티티, 모델, DTO(Data Transfer Object)라고 한다.

엔티티, 모델을 바로 리턴하지 않고 DTO로 변환해 리턴하게 되는데 이유는 - 비즈니스 로직을 캡슐화 - DB 테이블 스키마 노출을 방지하기 위함


레이어드 아키텍처 패턴

컨트롤러 레이어 - http 와 긴밀한 연결
spring-boot-starter-web 의 어노테이션 이용하면 쉽게 연결가능
@RestController / @Controller / @GetMapping / @PostMapping / @ResponseBody 등..

서비스 레이어 - 컨트롤러와 퍼시스턴스 사이에서 비즈니스 로직 을 수행 / 다른 레이어와 분리 - 로직에 집중
@Service - 단순히 스프링에 서비스 레이어임을 알려주는 어노테이션

퍼시스턴스 레이어 - 쿼리의 결과를 자바오브젝트로 바꾸는 모델링의 과정을 ORM Object Relation Mapping 이라고 한다.


JPA

DB테이블을 자바에서 사용하려면 엔티티마다 모델링을 해줘야한다.
ORM 을 집중적으로 해주는 클래스 - DAO (Data Access Object) 를 작성

이러한 반복적인 파싱과정을 Hibernate 같은 ORM 프레임워크 / JPA 가 대신 해준다
스프링데이터 jpa를 이용 -> jpaRepository

JPA 에서 사용할 엔티티 생성

@Entity
@Table(name = 테이블이름 )
@ID - pk 지정
@GeneratedValue(strategy = GenerationType.IDENTITY) 생성 전략 필요

@NoArgsConstructor
@Getter
@Table(name = "user_tb")
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    @JsonIgnore
    private String password;
    private String email;
    @CreationTimestamp
    private Timestamp createdAt;
    
    @Builder
    public User(Long id, String username, String password, String email, Timestamp createdAt) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
        this.createdAt = createdAt;
    }
}
  • 퍼시스턴스 레이어의 역할 - DB와 통신 쿼리 보내고 해석, 엔티티 오브젝트로 변환

  • 서비스 레이어의 역할 - 외부 컴포넌트 ( http, DB ) 로부터 추상화되어 온전히 비즈니스 로직에만 집중

  • 컨트롤러 레이어의 역할 - http요청/응답을 어떻게 받고 리턴할 것인가


REST API로 CRUD 구현

  • http post - create REST API
  • http get - retrieve REST API
  • http update - update REST API
  • http delete - delete REST API

구현 과정은 퍼시스턴스 -> 서비스 -> 컨트롤러

서비스 구현에 앞서 디버깅을 위한 로그 설정을 한다.
@Slf4j - Slf4j 라이브러리

  • 첫번째로 퍼시스턴스 레이어 - 쿼리 작업을 한다.

  • 두번째로 서비스 레이어 - 검증/(트랜잭션) - save() - 로그 남기기 / 리턴
    검증부분은 재사용할 예정이므로 리팩토링한다. ( private 메소드 )

  • 세번째로 컨트롤러 레이어 // 포스트맨으로 테스트한다.

REST API의 이점

RESTful API를 제공하는 백엔드 서버에서는 HTTP 요청을 통해 클라이언트에게 데이터를 전송한다.
프론트엔드 프레임워크들은 서버에서 받아온 데이터를 이용해 동적으로 UI를 구성해서 화면에 보여주게 된다.
RESTful API를 사용하면 백엔드와 프론트엔드가 독립적으로 개발될 수 있고, 서로간의 의존성이 낮아져서 유지보수와 확장성이 향상된다.

profile
작은것부터

0개의 댓글