2024.06.21

김무영·2024년 6월 24일

MSA(Microservices Architecture)

  • MSA는 작고 독립적인 서비스들로 분리하여 구성하는 개발방식
  • 각각의 서비스는 특정기능(로그인, 회원관리, 게시판관리)을 담당하며, 독립적으로 개발/배포가 가능하다.
  • 특징
    • 독립적 배포 : 배포, 업데이트시 다른 서비스에 영향을 주지 않는다.
    • 다양한 기술 스택 가능 : 각 서비스는 다른 프로그래밍언어, 데이터베이스, 프레임워크를 사용할 수 있어서 각 서비스에 최적화된 기술을 선택하여 개발할 수 있다.
    • 확장성 : 필요한 서비스만 확장할 수 있어서 자원의 효율성을 향상시킬 수 있다.
    • 도입 : Netflix, Amazon, Uber 등 도입하여 서비스 하고 있다.
  • 장점
    • 독립적인 배포와 개발
    • 확장성 : 필요한 서비스만 개별적으로 확장하고 서비스 할 수 있다.
      • Scale-out : 서버를 여러 대 추가하여 시스템을 확장
      • Scale-up : 기존 서버사양을 업그레이드하여 시스템 확장 ( RAM 증설 등등)
    • 신뢰성 : 하나의 서비스가 실패하더라도 전체시스템이 중단되지 않도록 설계와 서비스 가능.
    • 유연한 기술 스택 : 서비스마다 다른언어나 환경으로 구현 가능.
    • 유지 보수의 편의성.
  • 단점
    • 복잡성 증가, 데이터 일관성문제, 네트워크 지연 발생 가능, 테스트의 복잡도 향상
    • 운영부담 : 각 서비스의 배포, 모니터링, 로깅관리, 장애처리를 각각 수행해야하기 때문에 운영비용 증가.
  • MSA는 대규모 시스템의 확장성과 유연성을 높이는데 매우 유용하나 복잡성, 운영부담이 따라온다.

모놀리식 아키텍쳐(Monolithic Architech)

  • 전통적인 개발방식으로 하나의 프로젝트에 모든 기능이 함께 포함되는 구조.
  • 장점
    • 초기 개발이 유리하며 빠르게 프로토타입을 개발할 수 있다.
    • 필요한 모든 기능을 한번만 호출하기 때문에 복잡한 통신 없이 직접 사용가능.
  • 단점
    • 코드 베이스가 커지면 커질수록 복잡해지므로 유지관리가 어려워진다.
    • 일부 기능을 수정하거나 변경할 때마다 전체 애플리케이션을 재배포해야한다.
  • 간단한 소규모프로젝트나 단기프로젝트에 적합.
    • 스택오버플로우는 MSA 도입하지 않고 모놀리식으로 서비스(하루 평균 접속자 870만)

Spring Boot는 MSA로 개발하는데 매우적합.

  • 독립적 실행 가능 : Spring Boot는 독립적으로 실행하는 Jar로 패키징가능
  • 간편한 설정 : application.properties를 사용하여 간편한 관리 및 운영.
  • 내장서버 지원 : Tomcat,Jetty등 다양한 내장서버로 개발된 애플리케이션을 빠르게 실행

RESTful

  • REST(Representational State Transfer) 아키텍쳐 스타일을 따르는 웹 서비스
  • REST는 웹의 기존 기술과 프로토콜을 사용하여 네트워크상의 클라이언트와 서버간의 통신을 설계하는 방법을 제안. (클라이언트가 다양하게 만들어질 수 있다.)

REST의 기본 원칙

  1. 자원(Resource)에 기반한 아키텍처 스타일 자원은 URI로 식별된다.
  2. 표현 (Representation)
    • 자원은 여러 형태로 표현(응답 , 요청) => 가장 일반적으로 JSON , XML형식을 사용한다.
      • 예 ) {id:1,username:"홍길동"}
  3. 상태 (Staeless)
    • RESTful 서비스는 무상태(Stateless)를 기본이고, 각 요청을 독립적이고 서버는 이전상태를 기억하지 않는다
  4. HTTP method를 사용.
    • REST는 HTTP 프로토콜의 method를 사용하여 CRUD작업을 수행
      • GET : 자원을 조회할 때 사용 $.ajax({type:"GET"}) -> SELECT => @GetMapping
      • POST : 자원을 생성할 때 사용 $.ajax({type:"POST"}) -> INSERT => @PostMapping
      • PUT : 자원을 전체 업데이트할 때 사용 $.ajax({type:"PUT"}) -> UPDATE => @PutMapping
      • PATCH : 자원의 부분 업데이트할 때 사용 $.ajax({type:"PATCH"}) -> UPDATE => @PutMapping
      • DELETE : 자원을 삭제할 때 사용 $.ajax({type:"DELETE"}) -> DELETE => @DeleteMapping

RESTful장점

  • 단순성 : REST는 HTTP표전을 기반하므로 이해와 사용이 쉽다.
  • 유연성 : 다양한 데이터형식 지원 (JSON,XML)
  • 무상태성 : 서버가 클라이언트의 상태를 유지하지 않으므로 서버 확장성이 향상된다.

RESTful단점

  • 복잡성증가.
  • 표준이 없다. (REST자체는 명확한 표준이 아니므로 구현할 때 일관성 있게 하는게 중요)

RestController와 Controller

  • 공통점 : 웹 프로토콜을 사용하여 요청을 받는다.
  • 차이점
    • @RestController
      • 주로 JSON,XML등의 응답 데이터를 반환하는 Back-end API를 작성
      • @ResponseBody가 포함되어있어서 반환되는 값을 데이터 자체가 반환된다
      • 웹 애플리케이션에서 일부분의 서비스를 구현할 때 사용.
    • @Controller
      • 주로 HTML페이지를 랜더링하는 JSP(뷰)를 반환
      • 클라이언트가 웹 브라우저에서 직접 접근할 수 있는 URL을 제공
  • @PathVariable : 요청 URl의 가장 마지막 URI만 잘라내는 annotation
    • Http://localhost/user/test였을 때 @GetMapping(/user/{userId})라고 정의하고 parameter에 @PathVariable을 정의하면 가장 마지막 값인 test만 얻어진다.
  • 예 ) - AJAX GET방식
    • 요청 URL =>
      $.ajax({
      	url:"/user/접속자아이디",
          type:"GET",
          dataType:"JSON",
          success:function(jsonObj){
          	파싱
          }
          })
  • 예 ) - Back-end API
    ```
     @GetMapping("/user/{userid}")
     public String method(@PathVariable String userId){
    	조회작업을 JSONObject반환
     }
    ```

  • 예 ) - AJAX POST방식
    • 요청 URL =>
      $.ajax({
      	url:"/user/접속자아이디",
          type:"POST",
          dataType:"JSON",
          success:function(jsonObj){
          	파싱
          }
          })
  • 예 ) - Back-end API
    ```
    @PostMapping("/user/{userid}")
    public String method(@RequestParam String userId){
    	조회작업을 JSONObject반환
    }
    ```

  • 예 ) - AJAX PUT방식
    • 요청 URL =>
      $.ajax({
      	url:"/user/접속자아이디",
          type:"PUT",
          dataType:"JSON",
          success:function(jsonObj){
          	입력된 아이디에 해당하는 자원 변경
          }
          })
  • 예 ) - Back-end API
    ```
    @PutMapping("/user/{userid}")
    public String method(@PathVariable String userId, 변경할 값,,,,){
    	입력된 아이디
    }
    ```

  • 예 ) - AJAX DELETE방식
    • 요청 URL =>
      $.ajax({
      	url:"/user/접속자아이디",
          type:"DELETE",
          dataType:"JSON",
          success:function(jsonObj){
          	파싱
          }
          })
  • 예 ) - Back-end API
    		@DeleteMapping("/user/{userid}")
    public String method(@PathVariable String userId,삭제할 기준의 다른값,){
    	삭제 작업
        결과 JSONObject
    }

0개의 댓글