DevSprout / Hands-On-Microservices-with-Spring-Boot-and-Spring-Cloud

:rocket: 스프링으로 하는 마이크로서비스 구축 스터디
6 stars 2 forks source link

Chapter 4,5,6 - 도커, OpenAPI/Swagger, 영속성 추가 #4

Open LOG-INFO opened 2 years ago

minkukjo commented 2 years ago

느낀 점

배운 것

MinJunKweon commented 2 years ago

느낀점

책이 던지는 질문에 대한 풀이 (오답주의)

Chapter 04

  1. 가상머신(VM)과 도커 컨테이너의 주요 차이점

⇒ VM은 각 가상환경별로 OS를 띄우고 완전히 격리되어 있는 환경을 구성해서 리소스를 관리합니다. 그렇기 때문에 보안상 이득이 있지만, VM에 할당된 리소스를 보다 유연하게 조절하기 어렵다는 단점이 있습니다. 반면 컨테이너 기반의 가상화는 네임스페이스와 cgroup을 사용해 환경을 분리하기 때문에 모든 컨테이너가 호스트 OS를 공유하게 됩니다. 분리되는 자원(CPU, MEM, FileSystem 등)만 격리되어 있기 때문에 좀 더 유연한 자원 분배가 가능해지게 되고, OS를 따로 띄우는 오버헤드가 없어서 VM에 비해 가볍습니다. 하지만 그만큼 VM에 비해 보안상 취약하다는 단점이 있습니다.

  1. 도커가 네임스페이스, cgroup을 사용하는 목적은 무엇인가?

⇒ 도커 컨테이너 내부에서 CPU, MEM과 같은 가용 리소스를 분리하기 위해 사용합니다. 즉, 컨테이너 간의 환경 분리를 위해 사용합니다.

  1. 컨테이너의 최대 메모리 설정을 무시하고, 허용량을 초과해 메로리를 할당한 자바 애플리케이션은 어떻게 되는가?

⇒ 도커 컨테이너에 대한 지원이 없는 JDK 9 이전 버전에서는 런타임에서 지정된 메모리보다 더 큰 메모리를 할당하려하면 도커 컨테이너가 즉각 중단되어, 애플리케이션 레이어에서 에러 원인 파악이 사실상 불가능합니다. 하지만 도커 지원이 있는 JDK 10 이후 버전에서는 가용 메모리가 컨테이너에 할당된 메모리로 인식되므로 기본값 설정으로는 메모리 허용량을 초과하는 경우는 없습니다.

  1. 스프링 기반 애플리케이션을 소스 코드 수정 없이 도커 컨테이너로 실행하려면 어떻게 해야하는가?

⇒ JDK 이미지를 베이스로한 Dockerfile을 정의해서 컨테이너화 시킨 후 빌드 후 생성된 jar 파일을 컨테이너에서 실행합니다.

  1. 다음의 도커 컴포즈 코드가 작동하지 않는 이유는 무엇인가?
review:
  build: microservices/review-service
  ports:
    - "8080:8080"
  environment:
    - SPRING_PROFILES_ACTIVE=docker

product-composte:
  build: micorservices/product-composite-service
  ports:
    - "8080:8080"
  environment:
    - SPRING_PROFILES_ACTIVE=docker

services:가 빠졌어요

Chapter 05

  1. 스프링 폭스로 RESTful 서비스의 API 문서를 작성할 때의 장점은 무엇인가?

⇒ API 스펙이 변경되었을 때, 개발자가 따로 API 문서를 최신화 하지 않아도 자동으로 문서가 업데이트된다.

  1. 스프링 폭스가 지원하는 API 문서화 사양은 무엇인가?

⇒ 질문을 잘 이해못했는데.. spring-boot-webmvc에서 지원하는 URL 매핑 애노테이션(ex. @GetMapping)이 달린 메소드에 어노테이션을 추가함으로서 API 설명을 추가할 수 있다.

그리고 Docket 빈을 사용하여 API 전반적인 일반 정보와 연락처 등등을 제공한다.

  1. 스프링 폭스 Docket 빈의 사용 목적은 무엇인가?

⇒ 특정 API에 국한되지 않는 일반적인 정보(ex. 담당자 연락처, 라이선스 등..)를 담기위해 사용하고, 글로벌한 메시지 처리를 정의하기 위해 사용한다.

  1. 스프링 폭스가 API 문서 작성을 위해 런타임에 검사하는 애노테이션에는 어떤 것들이 있는가?

@Api , @ApiOperation , @ApiResponse 등등..

  1. YAML 파일에서 :| 의 의미는 무엇인가?

: : 항목을 구분하기 위한 구분자로서 사용, | : 멀티라인의 문자열을 입력하기 위해 사용

  1. 내장된 스웨거 뷰어로 수행했던 API 호출을 뷰어를 사용하지 않고 반복하려면 어떻게 해야 하는가?

⇒ Swagger UI에서 제공하는 curl 명령어를 복사해서 직접 터미널에서 실행해본다.

Chapter 06

  1. 엔티티와 레포지토리에 기반한 공통 프로그래밍 모델인 스프링 데이터는 다양한 유형의 데이터베이스 엔진에 사용할 수 있다. 6장에 나온 코드 예제에서 MySQL과 MongoDB 영속성 코드의 가장 큰 차이점은 무엇인가?
    • MySQL
    • Transactional 어노테이션을 사용
    • Spring Data가 아닌 JPA (javax.persistence API)를 사용해서 접근
    • 인메모리 DB를 사용하여 테스트하기 위해 h2 사용
    • MongoDB
    • 트랜잭션이 불가능 (보통 몽고디비를 샤드하여 사용하고, Primary - Secondary 구조로 인해 기본적인 @Transactional 어노테이션을 지원하지 않는 경우가 많다.)
  2. 스프링 데이터로 낙관적 잠금을 구현하기 위한 필수 요소는 무엇인가?

@Version 어노테이션을 사용해서 스테일 데이터(stale data)에 대한 업데이트인지 여부를 판단해야한다.

  1. MapStruct의 사용 목적은 무엇인가?

⇒ API에서 사용하는 객체(모델)과 DB에 데이터를 저장하고 관리하기 위한 객체(엔티티)를 매핑해주는 역할을 하기 위해 사용한다.

  1. 오퍼레이션이 멱등성을 가진다는 것의 의미는 무엇이며, 유용한 이유는 무엇인가?

멱등성을 가진다 : 상태를 가지지 않고 같은 입력에 대해서는 항상 같은 결과를 반환한다는 의미 상태를 가지지 않기 때문에 테스트가 용이하고, 반환될 결과를 기대하기 쉽다.

  1. API를 사용하지 않고 MySQL 및 MongoDB 데이터베이스에 저장된 데이터에 접속하려면 어떻게 해야 하는가?

⇒ 직접 DB에 붙어야겠쥬? DB엔진에서 제공하는 드라이버를 통해 CLI 환경 혹은 클라이언트 툴을 사용해 직접 DB 서버에 접속하는 방식이 있다.

2rohyun commented 2 years ago

느낀점


끄적끄적


LOG-INFO commented 2 years ago

04. 도커를 사용한 마이크로서비스 배포

05. OpenAPI/스웨거를 사용한 API 문서화

06. 영속성 추가