보라코딩
WW10 본문
240304
- kafka : 고가용성을 위해 '여러 개의 Kafka 서버와 Zookeeper로 구성된 클러스터 구조'로 사용
ㄴ 일반적으로 3개 이상의 kafka 서버(Broker)로 구성되며, 이러한 구조를 통해 broker에 저장된 메시지를 다른 broker에게 공유하고 하나의 브로커에 문제가 생겼을 때, 다른 브로커로 그 역할을 대체해서 시스템을 정상적으로 유지시키는 방식으로 동작
ㄴ 각각의 카프카 서버를 kafka broker라고 하며(또는 bootstrap server), n개의 broker 중 1대는 리더의 역할을 수행
ㄴ 'Zookeeper'는 분산 어플리케이션의 데이터 관리 기능을 가지고 있으며, 여러 개의 broker 들을 컨트롤해 주는 역할을 수행
( zookeeper 없이 kafka가 동작 불가 )
< Stateful vs Stateless >
- 무상태(stateless) : 유저가 토큰을 가지고 있음. 유저(클라이언트)에 대한 특정 정보가 서버가 아닌 유저 측에 저장되어 있음
- 상태유지(stateful) : 서버측에 저장되어 있음
즉, stateless와 stateful을 구분하는 기준은 ‘클라이언트의 정보가 서버에서 관리되는가?’로 생각해볼 수 있습니다.
< 인증 vs 인가 >
- 인증(Authentication)은 접근할 수 있는 사용자인지 자격을 1차적으로 검증하는 것입니다.
- 인가(Authorization)는 접근 권한을 식별. 1차적으로 우리 서버에 접근할 수 있다고 하더라도, 권한에 따라 접근할 수 있는 리소스(정보)가 다르다면 그 권한에 따라 인가해주어야 하는 것
ㄴ 즉, 인증은 누구인지 확인하는 것이고 인가는 무엇을 할 수 있는지 알아보는 것입니다.
240305
도메인 주도 설계로 시작하는 마이크로서비스 개발 공부 중...
- 개발자의 역할은 문제 영역의 비지니스 로직을 분석 및 이해하고 프로그래밍 언어라는 도구로 잘 표현하는 일
ㄴ 잘 표현한다 : 기능이 잘 동작하는 것과 더불어 이해하기 쉽고 변경하기 쉬운 시스템을 만드는 것
- 고수준 : 비지니스 로직. 핵심 영역이기에 보호 받아야 함. 저수준의 변경이나 확장에 영향 받지 않음
- 저수준 : 프레젠테이션 계층(화면 표현 및 전환처리) 및 데이터 액세스 계층(데이터 처리)
- 고수준 영역은 저수준 영역에 의존하지 않게 해야 하며, 저수준이 고수준에 의존해야 한다.
- 저수준 영역은 언제든지 교체, 확장 가능해야 하며 이 변하가 고수준 영역에 영향을 줘서는 안된다.
- 저수준 영역의 구체 클래스가 고수준 영역의 추상 인터페이스에 의존하는 의존성 역전 원칙을 적용한다.
- 인터페이스는 고수준의 안정된 영역에 존재해야 하며, 저수준의 어댑터가 이를 구현한다.
- 애그리거트 : 여러 개의 객체를 묶어 하나의 큰 객체
- 바운디드 컨텍스트 : 도메인 주요 개념 정의하고 도메인 간의 경계를 식별 (도메인 간의 경계)
- 유비쿼터스 언어 : 바운디드 컨텍스트 내의 도메인 주요 개념을 표현하기 위해 도메인 내 공통으로 사용하는 언어
- 컨텍스트 맵 : 하나의 큰 도메인을 여러 개의 바운디드 컨텍스트로 식별하고 관계를 표현한 그림
240306
- 프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위
- 스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
- 프로그램 : 일이 저장 장치에 있지만 메모리에는 올라가 있지 않은 정적인 상태 (코드 덩어리)
- 프로세스 : 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태 (코드 덩어리 실행)
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4
- 동기화 : 다중 스레드 환경에서 발생할 수 있는 두 가지 주요 문제인 "원자성(Atomicity)"과 "가시성(Visibility)"을 해결하기 위한 기술
ㄴ 원자성 : 한 작업이 불분할하게 실행되어야 함 (중간 상태도 허용하지 않고, 전체가 완료되거나 전혀 실행되지 않아야 함)
ㄴ 가시성 : 한 스레드에서 수행한 변경이 다른 스레드에서 즉시 반영되어야 함. 메모리의 캐시 문제로 인해 스레드가 쓴 값이 다른 스레드에게 보이지 않을 수 있음 => volatile로 가시성 보장
- 자바 volatile : CPU 캐시를 사용하지 않고 메인 메모리에 직접 접근하므로, 여러 스레드 간의 변수의 일관성을 보장
- 자바 AtomicInteger : 멀티스레드 환경에서 안전하게 정수 값을 증가 또는 감소시키기 위한 기능을 제공
- 자바 synchronized : 스레드 간 동기화. 해당 코드 영역을 임계 구역(여러 스레드가 동시에 접근하지 못하도록 보호되며, 하나의 스레드만이 해당 영역에 진입)으로 만든다.
- 블로킹 : 동기화 작업이나 입출력 작업에서 발생하며, 프로그램이나 스레드가 특정 조건이나 이벤트를 기다리는 동안 작업이 멈추는 현상
- 논블로킹 : 프로그램이나 스레드가 특정 작업을 기다리는 동안 다른 작업을 수행할 수 있는 상태
- 컨텍스트 스위칭 : 컴퓨터의 중앙 처리 장치(CPU)가 여러 작업(Task 또는 프로세스) 간에 전환되는 프로세스를
하나의 작업이 실행되다가 다른 작업으로 전환되는 과정에서 현재 실행 중인 작업의 상태 정보(컨텍스트)를 저장하고, 새로운 작업의 상태 정보를 로드하여 계속해서 다음 명령어를 실행하는 것
- Virtual Thread : JVM에 의해 생성되기 때문에 시스템 콜과 같은 커널 영역의 호출이 적고, 메모리 크기가 일반 스레드의 1%에 불과합니다. 따라서 Thread에 비해 컨텍스트 스위칭 비용이 적습니다.
- graceful shutdown : 처리 중인 요청이 있다면 마무리하고 server를 종료
- 직렬화 : 객체나 데이터 구조를 메모리나 파일과 같은 형태로 변환하는 과정 (객체를 JSON 또는 XML 형식으로 변환)
- 역직렬화 : 직렬화된 데이터를 다시 원래의 객체나 데이터 구조로 변환하는 과정 (JSON이나 XML 데이터를 읽어와서 객체로 변환)
ApplicationRunner
WatchService
log4j2.yml
스프링 이벤트
- 롤링 : 주로 로그 파일이나 기록 파일을 일정 조건에 따라 주기적으로 새로 생성하고, 이전에 생성된 파일들을 보관하거나 압축하는 것을 의미
- Redis 샤딩, L7 Load Balancer 공부하기
240307
유지보수 하다가 신규 개발 하니까 넘 재밌다..
시간 가는줄 모르고 코딩 코딩
씨샵 하다가 스프링 하니까 좋다..
사무실이 조용해서 좋다.
삽질도 열심히 하면서 하나 둘 배워가는 중 ..!
여전히 고민되는 건 예외처리와
클린아키텍처에 잘 맞춰서 개발 중인가
남들이 보기에 이해하기 쉬운 코드인가
고민할 것들은 끝이 없다 ㅎ.ㅎ
그래도 재밌어 :)
- ExecutorService:
개념: ExecutorService는 Java에서 스레드 풀을 관리하고 작업을 비동기적으로 실행하기 위한 인터페이스입니다.
동작: 스레드 풀을 생성하고 작업을 제출하면, ExecutorService는 스레드를 관리하며 작업을 스케줄링하고 실행합니다. 이를 통해 스레드를 생성 및 소멸하는 비용을 줄이고, 여러 작업을 효율적으로 처리할 수 있습니다.
활용: 병렬로 수행해야 하는 작업이 많을 때 유용하며, Java에서는 Executors 클래스를 사용하여 다양한 유형의 스레드 풀을 생성할 수 있습니다.
- Feign Client:
개념: Feign은 마이크로서비스 아키텍처에서 다른 마이크로서비스로 HTTP 통신을 쉽게 수행하기 위한 선언적인 웹 서비스 클라이언트입니다.
동작: Feign은 인터페이스 기반으로 사용되며, 사용자는 마치 로컬 인터페이스를 호출하듯이 마이크로서비스 간 통신을 수행할 수 있습니다. Feign은 서비스 디스커버리와 로드 밸런싱을 자동으로 처리하며, 사용자는 특별한 코드 없이 HTTP API 호출을 선언할 수 있습니다.
활용: 주로 마이크로서비스 간의 통신이 필요한 분산 시스템에서 사용됩니다. Spring Cloud Feign은 Spring 기반의 애플리케이션에서 Feign을 쉽게 통합할 수 있도록 지원합니다.
240308
< HTTP 통신 방법 >
- RestTemplate
Spring Framework 이전 버전에서 주로 사용되었으며, 쉽게 접근하고 사용할 수 있습니다.
동기식 호출 방식이기 때문에 단순한 요청 처리에는 효과적입니다.
대량의 요청 처리나 비동기적인 처리가 필요한 경우에는 성능 이슈가 발생할 수 있습니다.
- WebClient
Spring Framework 5부터 도입된 비동기식 HTTP 클라이언트입니다.
비동기 및 리액티브 스트림 처리를 지원하여 확장성과 성능 면에서 우수합니다.
리액티브 스트림을 활용하여 대량의 요청을 효과적으로 처리할 수 있습니다.
비동기 처리의 개념과 리액티브 프로그래밍에 익숙해져야 합니다.
- OpenFeign
선언적인 REST 클라이언트로서 서비스 간의 통신을 자동화합니다.
인터페이스 기반의 API 정의로 간단하고 직관적인 코드 작성이 가능합니다.
Spring Cloud와의 통합을 지원하여 마이크로서비스 아키텍처에서 유용합니다.
자동화된 요청 처리와 부가적인 기능 지원으로 개발 생산성을 향상시킵니다.
- URI 명사로 / 언더바 금지 / 소문자 사용
- 멱등성
- payload
스프링부트 공식 홈페이지에서 의존성 버전 참고 가능!!
Dependency Versions
docs.spring.io