Open LOG-INFO opened 2 years ago
http://localhost:8080/swagger-ui.html
⇒ http://localhost:8080/swagger-ui/
⇒ VM은 각 가상환경별로 OS를 띄우고 완전히 격리되어 있는 환경을 구성해서 리소스를 관리합니다. 그렇기 때문에 보안상 이득이 있지만, VM에 할당된 리소스를 보다 유연하게 조절하기 어렵다는 단점이 있습니다. 반면 컨테이너 기반의 가상화는 네임스페이스와 cgroup을 사용해 환경을 분리하기 때문에 모든 컨테이너가 호스트 OS를 공유하게 됩니다. 분리되는 자원(CPU, MEM, FileSystem 등)만 격리되어 있기 때문에 좀 더 유연한 자원 분배가 가능해지게 되고, OS를 따로 띄우는 오버헤드가 없어서 VM에 비해 가볍습니다. 하지만 그만큼 VM에 비해 보안상 취약하다는 단점이 있습니다.
⇒ 도커 컨테이너 내부에서 CPU, MEM과 같은 가용 리소스를 분리하기 위해 사용합니다. 즉, 컨테이너 간의 환경 분리를 위해 사용합니다.
⇒ 도커 컨테이너에 대한 지원이 없는 JDK 9 이전 버전에서는 런타임에서 지정된 메모리보다 더 큰 메모리를 할당하려하면 도커 컨테이너가 즉각 중단되어, 애플리케이션 레이어에서 에러 원인 파악이 사실상 불가능합니다. 하지만 도커 지원이 있는 JDK 10 이후 버전에서는 가용 메모리가 컨테이너에 할당된 메모리로 인식되므로 기본값 설정으로는 메모리 허용량을 초과하는 경우는 없습니다.
⇒ JDK 이미지를 베이스로한 Dockerfile을 정의해서 컨테이너화 시킨 후 빌드 후 생성된 jar 파일을 컨테이너에서 실행합니다.
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:
가 빠졌어요
⇒ API 스펙이 변경되었을 때, 개발자가 따로 API 문서를 최신화 하지 않아도 자동으로 문서가 업데이트된다.
⇒ 질문을 잘 이해못했는데.. spring-boot-webmvc에서 지원하는 URL 매핑 애노테이션(ex. @GetMapping
)이 달린 메소드에 어노테이션을 추가함으로서 API 설명을 추가할 수 있다.
그리고 Docket 빈을 사용하여 API 전반적인 일반 정보와 연락처 등등을 제공한다.
⇒ 특정 API에 국한되지 않는 일반적인 정보(ex. 담당자 연락처, 라이선스 등..)를 담기위해 사용하고, 글로벌한 메시지 처리를 정의하기 위해 사용한다.
⇒ @Api
, @ApiOperation
, @ApiResponse
등등..
:
과 |
의 의미는 무엇인가?⇒ :
: 항목을 구분하기 위한 구분자로서 사용, |
: 멀티라인의 문자열을 입력하기 위해 사용
⇒ Swagger UI에서 제공하는 curl 명령어를 복사해서 직접 터미널에서 실행해본다.
@Transactional
어노테이션을 지원하지 않는 경우가 많다.)⇒ @Version
어노테이션을 사용해서 스테일 데이터(stale data
)에 대한 업데이트인지 여부를 판단해야한다.
MapStruct
의 사용 목적은 무엇인가?⇒ API에서 사용하는 객체(모델)과 DB에 데이터를 저장하고 관리하기 위한 객체(엔티티)를 매핑해주는 역할을 하기 위해 사용한다.
⇒ 멱등성을 가진다 : 상태를 가지지 않고 같은 입력에 대해서는 항상 같은 결과를 반환한다는 의미 상태를 가지지 않기 때문에 테스트가 용이하고, 반환될 결과를 기대하기 쉽다.
⇒ 직접 DB에 붙어야겠쥬? DB엔진에서 제공하는 드라이버를 통해 CLI 환경 혹은 클라이언트 툴을 사용해 직접 DB 서버에 접속하는 방식이 있다.
Shared Lock 또는 Exclusive Lock
을 걸고 시작한다. 즉, Shared Lock을 걸게 되면 write를 하기위해서는 Exclucive Lock을 얻어야하는데 Shared Lock이 다른 트랜잭션에 의해서 걸려 있으면 해당 Lock을 얻지 못해서 업데이트를 할 수 없다. 수정을 하기 위해서는 해당 트랜잭션을 제외한 모든 트랜잭션이 종료(commit) 되어야한다.
Dockerfile
직접 작성하는 것보단 jib
를 사용하면 편하다. 기능 제한이 조금 있긴 하다. 3.0.0-SNAPSHOT
못 찾음@EnableSwagger2Webflux
deprecated 됨
느낀 점
희찬님 말씀대로 4,5,6도 꽤나 날먹이었다. 3장 한꺼번에 읽는건 좋은 결정이었다고 생각.
5가 특히나 날먹이어서 그냥 스윽 읽고 넘김.
4장에서 좋았던 점은 자바 9 이하에서는 왜 JVM과 컨테이너의 궁합이 안좋은지 알 수 있었다. ( 새롭게 알게 되었음 )
자바 6에서는 낙관적 락에 대해서 다시 한 번 복습하는 계기가 되었음. ( 비관적 락도 같이 공부하게 되어서 개이득 )
배운 것
도커는 namespace를 이용해 사용자, 프로세스, 파이 시스템, 네트워킹 등의 전역 시스템 리소스를 컨테이너에 분배한다고 함.
그리고 cgroup을 이용해 컨테이너(프로세스)가 사용하는 CPU와 메모리를 제한.
4장에서 자바랑 컨테이너랑 궁합이 별로였는데, 자바 10부터 좋아졌다고 해서 좀 찾아봄
https://www.docker.com/blog/improved-docker-container-integration-with-java-10/
대충 요약하자면, 자바 9 이하에서는 JVM이 컨테이너의 메모리, CPU 사용에 문제가 있어서 애플리케이션 성능이 저하됐었다고 함.
자바 10에서부터는 Cgorup에서 설정한 제약 조건을 인지하기 시작하면서 성능이 올라갔다고 하네요.
왜 자바 9 이하에서는 문제가 있었냐? 하면 JVM이 Cgroup이 설정한 CPU, 메모리 제한을 인식하지 못하는 이슈가 있었다네요.
자바 10부터는 알잘딱으로 cgroup의 제약조건을 알아먹고, 자바 빌드할 때 컨테이너에 메모리 제약 걸어두면 그걸 찰떡같이 알아먹는다고 하네요.
JPA는 낙관적 락을 Version 애노테이션으로 제공