MSA에서 CORS 문제를 해결하는 4가지 전략
·
기술 학습
실무나 사이드프로젝트를 하면 항상 만나게 되는 에러가 있는데 바로 CORS이다.자주 보는 CORS 에러지만 우리가 제대로 이해하고 해결하고 있는지는 곰곰히 생각해보자. 프로젝트를 진행하면서 CORS 에러를 만나면 "Access-Control-Allow-Origin: *" 을 추가하고 넘어가곤 했다.모놀리식에서는 그걸로 충분할 수 있지만, MSA 환경에서는 이 접근이 보안 취약점이 되거나 운영상 큰 장애 요인이 될 수 있다.이번 글에서 CORS의 동작 원리를 정확히 이해하고, MSA에서 CORS를 어느 계층에서 어떻게 관리할 수 있는지 설계 관점까지 알아보고자 한다.1. Same-Origin Policy — 왜 브라우저는 Cross-Origin 요청을 막을까?1. 브라우저를 악용하는 공격하나의 시나리오를 ..
TCP/IP 체크섬(Checksum) 내부 동작 원리
·
기술 학습
개요TCP/IP 프로토콜 스택에서 체크섬(Checksum) 은 데이터가 전송 과정에서 손상되지 않았는지 검증하는 오류 검출 메커니즘이다.오늘날 인터넷의 모든 패킷은 이 체크섬을 거쳐 전송된다. 체크섬은 TCP/IP 스택의 여러 계층에서 동작하며, 각 계층의 체크섬은 보호 범위와 목적이 다르다.이번 정리에서는 체크섬의 내부 동작 원리를 세 계층으로 나누어 정리한다.L2 데이터 링크 계층의 Ethernet CRC (32bit)L3 네트워크 계층의 IP Header Checksum (16bit)L4 전송 계층의 TCP/UDP Checksum (16bit)1. 기반 원리 - 1의 보수 연산과 설계 배경checksum에 대해 들어가기 전에 bit 세계에서 역수를 취하기 위한 보수 방법 2가지에 대해 알아보자.1의..
Java 기반 동기/비동기, 블로킹/논블로킹 정리
·
기술 학습
서로 다른 관심사동기/비동기와 블로킹/논블로킹은 흔히 혼용되지만, 실제로는 서로 다른 관심사를 다루는 별개의 축이다. 이 구분을 명확히 하는것이 모든 논의의 바탕이 되므로 명확히 짚어보자. 동기(Synchronous) vs 비동기(Asynchronous) 작업 완료를 누가 확인하는가?동기(Synchronous)호출자(Caller)가 직접 작업의 완료 여부를 확인하거나 기다린다. 결과를 호출자가 내놓으라고 끌어오는 Pull 방식이다.비동기(Asynchronous)피호출자(Callee)가 작업이 완료되면 호출자에게 알려준다. 콜백(callback), 이벤트(event) 등을 통해 결과를 내보내는 Push 방식이다.즉, 동기/비동기의 핵심은 완료 통지의 주체가 누구인가이다.블로킹 (Blocking) vs 논블..
ANSI Isolation Level vs MySQL Isolation Level: 같은 이름, 다른 보장
·
기술 학습
들어가며트랜잭션 격리 수준(Transaction Isolation Level)은 동시에 실행되는 트랜잭션 사이에서 데이터의 일관성을 어디까지 보장할지를 결정하는 설정이다. 격리 수준이 높을수록 일관성은 강해지지만 동시성은 떨어지고, 낮을수록 동시성은 좋지만 이상현상(anomaly)에 노출될 수 있다. 대부분의 개발자가 REPEATABLE READ, READ COMMITTED 같은 격리 수준 이름을 알고 있다.그런데 ANSI SQL-92 표준이 정의한 REPEATABLE READ와 MySQL InnoDB가 실제로 제공하는 REPEATABLE READ는 같은 수준의 격리를 보장할까? 결론부터 말하면, 같은 이름이지만 보장하는 범위가 다르다. 이 글에서는 ANSI SQL-92 (이하 ANSI SQL) 표준의 ..
MSA에서 ACID의 의미
·
기술 학습
ACIDACID의 의미부터 확인하자.ACID 자체의 의미RDBMS 단일 트랜잭션을 기준으로Atomicity (원자성)Consistency (일관성)Isolation (격리성)Durability (지속성)위 4가지 속성이 하나의 DB 커넥션 안에서 트랜잭션을 통해 보장되는 것을 말한다.사실 데이터베이스 관점에서 트랜잭션을 정의하는 속성이므로 ACID 트랜잭션이라 말하는게 맞다.MSA에서 ACID가 깨지는 이유MSA의 본질은 서비스별로 독립된 데이터를 가지는 것이다. 이로인해 단일 DB 트랜잭션으로 여러 서비스의 데이터 정합성을 보장하는 것이 원칙적으로 불가능해진다.ACID의 4가지 속성 모두가 서비스의 경계를 넘는 순간 보장할 수 없게 된다.ACID 각 속성이 어떻게 깨지는가Atomicity모놀리식에서는 ..
객체지향 설계 원칙 - SOLID
·
기술 학습
개요객체지향의 핵심은 구현과 역할을 분리하는 것이다.객체에게 역할을 부여하고, 그 역할에 따라 책임을 할당하며, 객체 간 협력을 통해 시스템이 동작한다. 그렇다면 객체지향에서 좋은 설계와 아키텍처란 무엇일까?바로 SOLID 원칙이다.SOLID는 좋은 설계를 얻기 위해 지켜야 할 규범이며, 이 원칙들은 소프트웨어의 유지보수성과 확장성을 높이기 위한 것이다.유지보수성무엇이 유지보수성을 높이는 것일까? 가독성?가독성은 사람마다 다르며, 좋지 못한 코드가 오히려 가독성이 더 좋을 수도 있다. 가독성은 유지보수성의 명확한 기준이 되지 못한다. 유지보수성을 높이는 명확한 기준은 다음 세 가지이다.영향 범위 — 코드 변경으로 인한 영향 범위가 어떻게 되는가?의존성 — 소프트웨어의 의존성 관리가 잘 이뤄지고 있는가?확..
JVM 동시성 프로그래밍 딥다이브 6-1. Synchronization Fundamentals 동기화 기법 - Mutual Exclusion (상호배제)
·
기술 학습/JVM 스레드 딥다이브
개요Mutual Exclusion / 상호배제는 공유 자원에 대한 경쟁 상태를 방지하고 동시성 제어를 위한 ["락/Lock"] 매커니즘이다.스레드가 임계영역에서 Mutex 객체의 플래그를 소유하고 있으면 (락 획득) 다른 스레드가 액세스할 수 없으며 해당 임계 영역에 액세스 하려고 시도하는 모든 스레드는 차단된다. Mutex 객체 플래그가 해제된 경우 (락 해제)에만 액세스할 수 있다.Mutex 락을 가진 오직 한개의 스레드만이 임계영역에 진입할 수 있고 락을 획득한 스레드만이 락을 해제할 수 있다.Mutext뮤텍스는 락/락 해제를 통해 자원을 보호하는 락체계 동기화 도구이다.문제점데드락데드락은 두 개 이상의 스레드가 서로가 가진 락을 기다리면서 상호적으로 블로킹 되는 경우.이로 인해 아무 작업도 수행할..
JVM 동시성 프로그래밍 딥다이브 5. Synchronization Fundamentals 동기화 개념 - 싱글/멀티 스레드 & 동기화
·
기술 학습/JVM 스레드 딥다이브
싱글 스레드 & 멀티 스레드개요프로세스는 오직 한개의 스레드로만 구성되는 싱글 스레드 프로세스와 하나 이상의 스레드로 구성되는 멀티 스레드 프로세스로 구분된다.스레드의 선택 기준은 어떤 방식이 더 효율적으로 자원을 사용하고 성능처리에 유리한가에 있다.싱글스레드 장점- 문맥교환 비용이 없다.- 동기화 이슈가 없다.- 자원 비용이 적다. 멀티스레드 장점- 동시성으로 사용자 응답성이 향상된다.- CPU 멀티코어의 병렬성으로 성능이 향상된다.- 한 스레드의 오류가 다른 스레드로 전파되지 않는다. 멀티스레딩과 동시성CPU의 동시적 작업 처리는 CPU 코어 개수보다 스레드의 개수가 많을 때, 즉 멀티스레딩 환경에서 자원을 효율적으로 배분하고 사용하기 위해 설계된 방식이다.같은 프로그램 안에서 실행되는 여러 스레드가..
JVM 동시성 프로그래밍 딥다이브 4-2. 스레드 활용 - ThreadLocal
·
기술 학습/JVM 스레드 딥다이브
개요ThreadLocal 객체 설명자바에서 스레드는 오직 자기 자신만이 접근해서 읽고, 쓸수 있는 로컬 변수 저장소를 제공하며, 이를 ThreadLocal이라고 한다.각 스레드는 고유한 ThreadLocal 객체를 속성으로 가지고 있으며 ThreadLocal은 스레드 간 격리되어있다.스레드는 ThreadLocal에 저장된 값을 특정한 위치나 시점에 상관없이 어디에서나 전역변수처럼 접근해서 사용할 수 있다.즉, 변수값을 전달해주지 않아도 된다.모든 스레드가 공통적으로 처리해야하는 기능이나 객체를 제어해야하는 상황에서 스레드마다 다른 값을 적용해야하는 경우 주로 사용한다. (Authorziation/Authentication 관리, 트랜잭션 관리, 로그 추적 등) ThreadLocalMap 객체 설명Thre..
JVM 동시성 프로그래밍 딥다이브 4-1. 스레드 활용 - 예외처리, 유저/데몬 스레드, ThreadGroup
·
기술 학습/JVM 스레드 딥다이브
스레드 예외 처리 UncaughtExceptionHandler기본적으로 스레드의 run()은 예외를 던질 수 없기 때문에 예외가 발생할 경우 run() 안에서만 예외를 처리해야 한다.Thread 밖에서 Thread 내부에서 발생한 RuntimeException을 Try Catch로 잡아봤자 예외는 잡아지지 않고, 사라져버린다.그렇다면 스레드가 비정상적으로 종료되었거나 특정한 예외를 스레드 외부에서 캐치하기 위해서 어떻게 해야할까?-> UncaughtExceptionHandler 인터페이스를 통해 예외를 핸들링하게 된다. UncaughtExceptionHandler캐치되지 않는 예외에 의해 Thread가 비정상 종료되었을 때 호출되는 핸들러 인터페이스이다.@FunctionalInterfacepublic i..