🔔[Born To Be Dev] Innovation Camp/WIL

5주차 개인과제 - API / Client & Server / WAS , Web Server / HTTP 프로토콜 / Restful API

디카페인라떼 2022. 8. 27. 23:42
API란 무엇인가?

[참고] 노마드 코더  - API를 알아야하는 이유 : https://youtu.be/iyFHfzCRHA8

 

  • Application Programming Interface  응용 프로그램 프로그래밍 인터페이스
    • 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스.
    • 즉, 애플리케이션을 서로 연결하여 서로 통신 할 수 있다.
  • API는 은행 창구 / 레스토랑 점원 !
    • 고객에게 요청/주문을 박고 금고/주방에 전달 후 다시 응답을 고객에게 전달
  • OPEN API란?
    • 외부 사이트와 자유롭게 활용 및 공유하도록 설계된 API
    • 대부분 무료제공이지만, 호출 수에 따라 비용발생 가능

 


Client 와 Server 란 무엇인가?
  • 네트워킹 Networking
    • 두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것
  • 클라이언트 Client
    • 서비스를 사용하는 컴퓨터
    • 서버와 이어진 모든 기기와 단말기에서 이용하는 웹에 접근하는 SW이며, 주로 서버에 요청을 보내고 응답을 받는 역할
  • 서버 Server
    • 서비스를 제공하는 컴퓨터
    • 사양에 관계없이 서비스를 제공하는 소프트웨어가 실행되는 컴퓨터
  • 서비스 Service
    • 위에서 본 것 처럼 서버는 클라이언트로부터 요청을 받아 응답을 내려주고 클라이언트는 서버에 데이터를 요청하고 응답을 받는다. 재화와 서비스의 개념에서 가져와 서비스라고 일컫는다.

WAS란 무엇인가? Web Server와 차이점은 무엇인가?
참고블로그 : https://codechasseur.tistory.com/25
  • 웹서버 Web Server
    • 클라이언트로부터 HTTP 요청을 받아들이고 HTML 문서와 같은 웹페이지를 반환하는 컴퓨터 프로그램
    • 요청을 받아 정적인 컨텐츠를 제공하는 서버
    • 대표적인 웹 서버 : Apache 
      • 정적인 컨텐츠 : 단순HTML문서, CSS,JS,이미지, 파일 등 즉시 응답가능한 컨텐츠

  • WAS
    • 인터넷 상에서 HTTP 프로토콜을 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어, 주로 동적 서버 컨텐츠를 수행하는 것으로 웹서버와 구별되며 주로 데이터베이스 서버와 같이 수행
    • 웹서버+웹컨테이너
      • 웹컨테이너 : 웹서버가 보낸 JSP,PHP 등의 파일을 수행한 결과를 다시 웹서버로 보내주는 역할
    • 웹 서버 단독으로는 처리할 수 없는 데이터베이스의 조회나 다양한 로직 처리가 필요한 동적 컨텐츠를 제공
    • 대표적인 WAS 종류 : Tomcat

 

 

웹 서비스 아키텍쳐


HTTP 프로토콜이란 무엇인가?
참고블로그 : https://joshua1988.github.io/web-development/http-part1/
  • Hypertext Transfer Protocol : 브라우저와 서버 간의 데이터를 주고받기위한 프로토콜
    • 프로토콜 : 상호 간의 정의한 규칙
  • 특징
    • Stateless : 데이터를 주고받기 위한 각각의 데이터요청이 서로 독립적임
    • 일반적으로 TCP/IP 통신 위에서 동작. 기본포트는 80번
  • HTTP Request & HTTP Response

Restful API는 무엇인가?
참고블로그 : https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
  • Representational State Transfer
    • 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것
    • 즉, 자원(resource)의 표현(representation) 에 의한 상태 전달
      • 자원(resource)의 표현(representation)
        • 자원: 해당 소프트웨어가 관리하는 모든 것
        • -> Ex) 문서, 그림, 데이터, 해당 소프트웨어 자체 등
        • 자원의 표현: 그 자원을 표현하기 위한 이름
        • -> Ex) DB의 학생 정보가 자원일 때, ‘students’를 자원의 표현으로 정한다.
      • 상태(정보) 전달
        • 데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달한다.
        • JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.
      • 월드 와이드 웹(www)과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 개발 아키텍처의 한 형식
        • REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일이다.
        • REST는 네트워크 상에서 Client와 Server 사이의 통신 방식 중 하나이다.

    • REST의 구체적인 개념
      • HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.
        • 즉, REST는 자원 기반의 구조(ROA, Resource Oriented Architecture) 설계의 중심에 Resource가 있고 HTTP Method를 통해 Resource를 처리하도록 설계된 아키텍쳐를 의미한다.
        • 웹 사이트의 이미지, 텍스트, DB 내용 등의 모든 자원에 고유한 ID인 HTTP URI를 부여한다.
        • CRUD Operation
          • Create : 생성(POST)
          • Read : 조회(GET)
          • Update : 수정(PUT)
          • Delete : 삭제(DELETE)
          • HEAD: header 정보 조회(HEAD)

JWT를 쓰는 이유?

2022.08.23 - [SPRING] - [SPRING] Spring Security - 쿠키 vs 세션 vs JWT + Token

❗❗로그인 시 토큰이 더 나은 이유? (세션 방식보다 토큰이 더 나은 이유?)

  • 세션 
    • 클라이언트당 정보를 따로 DB에 저장해주어야 함!
    • (클라이언트에게는 계속 연결된걸로 보이지만) 끊임없이 Session ID를 요청하고 응답해야함 (DB에 접속)
  • 토큰
    • 로그인 시 처음에만 회원 DB를 확인하고 확인 토큰 (Access Token)부여
    • 추후 로그인하여 요청/응답 시행시 다시 DB에 접속할 필요가 없이 Token에 부여된 정보만으로 로그인 연결을 보여줄 수 있음. 

❗❓보안 : 토큰을 훔치면?? 

  •  토큰의 만료기간을 짧게 한다 => Refresh Token을 도입한다!
    • Refresh Token : Access Token의 재발급용
    • (Access Token의 만료시간을 짧게 하고 Refresh Token을 재발급하여 증정.Access Token보다 만료시간이 긺. 만료시 재로그인하도록)

 

❗❗Monolithic Architecture Service에서 MSA로 바뀌면서 각 서비스별 별도의 DB 가 생성됨.

그러면서 처음 회원 - 로그인으로 Access Token으로 접근 후 주문으로 들어가게되면 다시 회원DB를 검색하면서 Overload(과부하)가 발생됨 

=> 과부하를 방지하기 위해서 느슨한 결합 / 낮은 의존성의 필요성이 대두 됨

=>JWT를 사용하자! 

 

 

Spring Security의 흐름?

2022.08.23 - [SPRING] - [SPRING] Spring Security framework

 

  • Client 의 요청은 모두 Spring Security 를 거침
  • Spring Security 역할
    1. 인증/인가
      1. 성공 시: Controller 로 Client 요청 전달
        1. Client 요청 + 사용자 정보 (UserDetails)
      2. 실패 시: Controller 로 Client 요청 전달되지 않음
        1. Client 에게 Error Response 보냄

더보기
  1. Client
    1. 로그인 시도
    2. 로그인 시도할 username, password 정보를 HTTP body 로 전달 (POST 요청)
    3. 로그인 시도 URL 은 WebSecurityConfig 클래스에서 변경 가능
  2. 인증 관리자 (Authentication Manager)
    1. UserDetailsService 에게 username 을 전달하고 회원상세 정보를 요청
  3. UserDetailsService
    1. 회원 DB 에서 회원 조회
      1. 회원 정보가 존재하지 않을 시 → Error 발생
    2. 조회된 회원 정보(user) 를 UserDetails 로 변환
    3. UserDetails 를 "인증 관리자"에게 전달
  4. "인증 관리자" 가 인증 처리
    1. 아래 2 개의 username, password 일치 여부 확인
      1. Client 가 로그인 시도한 username, password
      2. UserDetailsService 가 전달해준 UserDetails 의 username, password
      1. password 비교 시
        1. Client 가 보낸 password 는 평문이고, UserDetails 의 password 는 암호문
        2. Client 가 보낸 password 를 암호화해서 비교
      2. 인증 성공 시 → 세션에 로그인 정보 저장
      3. 인증 실패 시 → Error 발생
  5. 로그아웃 처리
    • "GET /user/logout" 요청 시 로그아웃
    • 서버 세션에 저장되어 있는 로그인 사용자 정보 삭제

 

 

다양한 연관관계 매핑
참고블로그 : https://velog.io/@conatuseus/JPA-%EB%8B%A4%EC%96%91%ED%95%9C-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91

 

  • 다중성
    연관관계는 다음과 같은 다중성이 있습니다.
    다대일(@ManyToOne), 일대다(@OneToMany), 일대일(@OneToOne), 다대다(@ManyToMany)
    보통 다대일과 일대다 관계를 가장 많이 사용하고 다대다 관계는 실무에서 거의 사용하지 않습니다.
  • 단방향, 양방향
    테이블은 외래 키 하나로 조인을 사용해서 양방향으로 쿼리가 가능하므로 사실상 방향이라는 개념이 없습니다.
    반면에 객체는 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있습니다.
    객체 관계에서 한 쪽만 참조하는 것을 단방향 관계라 하고, 양쪽이 서로 참조하는 것을 양방향 관계라 합니다.
  • 연관관계의 주인
    테이블은 외래 키 하나로 두 테이블의 연관관계를 맺습니다. 따라서 테이블의 연관관계를 관리하는 포인트는 외래 키 하나입니다.
    반면에 객체 양방향 관계는 A->B, B->A 처럼 참조가 2군데입니다. JPA는 두 객체 연관관계 중 하나를 정해서 데이터베이스 외래 키를 관리하는데 이것을 연관관계의 주인이라 합니다. 외래 키를 가진 테이블과 매핑한 엔티티가 외래 키를 관리하는 게 효율적이므로 보통 이곳을 연관관계의 주인으로 선택합니다. 주인이 아닌 방향은 외래 키를 변경할 수 없고 읽기만 가능합니다.
    연관관계의 주인이 아니면 mappedBy 속성을 사용하고 연관관계의 주인 필드 이름을 값으로 입력해야 합니다.
AOP란?

2022.09.01 - [SPRING] - [SPRING] AOP 개념 (수정중)

  • AOP
    • 흩어진 관심사들을 Aspect를 이용하여 모듈화 시킴(어드바이스)
      • 모듈화 ? : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것
    • 개발자가 모듈화시킨 Aspect를 클래스에 어느 속에 사용해야하는지만 정의해 주면 됨. (포인트컷)
    • 즉, Aspect로 모듈화하고 핵심적인 비즈니스로직에서 분리하여 재사용하겠다는 것

 

JPA - cascade
  • 영속성 전이
  • 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들기 위해 JPA에서 제공하는 옵션
  • @OneToOne, @OneToMany, @ManyToOne 연관 관계가 있는 어노테이션에 cascade() 지원
  • Cascade 종류
    • CascadeType.ALL: 모든 Cascade를 적용
    • CascadeType.PERSIST: 엔티티를 영속화할 때, 연관된 엔티티도 함께 유지
    • CascadeType.MERGE: 엔티티 상태를 병합(Merge)할 때, 연관된 엔티티도 모두 병합
    • CascadeType.REMOVE: 엔티티를 제거할 때, 연관된 엔티티도 모두 제거
    • CascadeType.DETACH: 부모 엔티티를 detach() 수행하면, 연관 엔티티도 detach()상태가 되어 변경 사항 반영 X
    • CascadeType.REFRESH: 상위 엔티티를 새로고침(Refresh)할 때, 연관된 엔티티도 모두 새로고침

  • 엔티티의 상태

 

      • Transient : JPA가 엔티티를 모르는 상태, 즉 최초의 객체들이 생성된 단계
      • Persistent : JPA가 관리중인 상태, DB에 들어간 것을 의미하지는 않는다. 즉 save() 메소드를 사용했다고 해서 바로 DB에 insert 되는 것은 아니며 이 상태를 Persistent라고 부른다.( 1차 캐시, Dirty Checking, Write Behind 등)
      • Detached : JPA가 더이상 관리하지 않는 상태.
      • Removed : JPA가 관리하긴 하지만 삭제하기로 한 상태.

  • 고아 객체 제거 (OrphanRemoval)
    • 부모 엔티티와 연관관계가 끊어진 자식 엔티티(고아 객체,Orphan)를 자동으로 삭제하는 기능
    • OrphanRemoval을 사용하면 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거하여 자식 엔티티가 자동으로 삭제됨
  • 영속성 전이 + 고아 객체
    • 일반적으로 엔티티는 EntityManager.persist()를 통해 영속화하고, remove()를 통해 제거되며, 엔티티 스스로 생명주기를 관리
    • CascadeType.ALL + OrphanRemoval = true를 동시에 사용하면 부모 엔티티를 통해 자식 엔티티의 생명 주기 또한 관리 가능

 

'🔔[Born To Be Dev] Innovation Camp > WIL' 카테고리의 다른 글

6주차 9/5~9/11 WIL  (0) 2022.09.11
5주차 8/29~9/4 WIL  (0) 2022.09.04
4주차 8/21~8/28 WIL  (0) 2022.08.27
2주차 8/8~8/13 WIL  (0) 2022.08.14
1주차 8/1~8/6 WIL  (0) 2022.08.07