목록분류 전체보기 (54)
우리네 장

📝 문제 상황 사용자가 앱을 처음 키게 되면, 네이티브 단에서 서버로 버전 체크 API를 요청하게 됩니다. 버전 업데이트가 필요한 경우, 앱 파일을 다운받을 수 있는 s3 링크를 내려주게 되는데, private S3를 사용했기 때문에 아래 이미지처럼 보안 토큰이 포함된 presigned Url을 응답으로 내려주었습니다. 그런데 iOS의 경우, itms-services 프로토콜을 이용해서 해당 url에 접근 할 때, 정상적으로 파일이 다운로드 받아지지 않았습니다.. 보안토큰 없이 https://presigned-url.ap-northeast-2.s3/test/xxx.ipa 로 public 하게 접근하면 정상 다운로드가 되는데 말이죠..! 혹시나 하여, url에 포함된 토큰 부분의 인코딩을 바꿔보는 등 여러..

온프라미스 환경에서 클라우드 환경으로 인프라를 전환하면서, 서버를 이중화로 구축하였습니다. 세션 공유 정책으로 Sticky Session을 사용하기로 하였으나, 하이브리드 앱의 특성으로 인해 험난했던 여정을 소개합니다.. ※ 작성자에게만 험난할 수 있음.. ※ 왜 Sticky Session ? 일단 다양한 세션 정책 중 왜 Sticky Session을 사용하였을까요?? 아래 이미지는 저희가 사용했던 인프라 구성도를 대략적으로 작성해 본 것입니다. 관리자용 사이트는 private ALB를 사용하여, 일반 사용자가 접근하지 못하도록 구성하였고, 일반 사용자 분들은 public ALB를 통해 이중화 된 서버에 접근하도록 하였습니다. 이때 저 ALB Group 내 WEBWAS1 과 3 의 세션을 유지하도록 해야..
어플리케이션을 운영하면서 사용자 요청 별로 생성이 되어야 하는 클래스도 존재하지만, 딱 하나의 인스턴스만 생성하여 사용해야 하는 클래스가 있다. 이런 경우 싱글톤 패턴을 적용하여 구상한다. 싱글톤 클래스는 외부에서 객체의 생성을 막아야 하며, 외부에서 객체를 사용하기 위해 제공할 수단이 필요하다. 그러므로, private 생성자를 갖고, static으로 인스턴스를 제공하는 메소드가 필요하다. 멀티 스레드 환경에서 Thread-safe하게 인스턴스를 외부로 제공하기 위해서 사용되는, 4가지 구현 방법이 존재한다. 이는 제공되는 인스턴스의 내부 필드에 대해서 thread-safe 한 것은 아니다. 클래스를 불변 클래스로 구성하거나, 변경되지 않는 데이터일 경우 필드와 메소드까지 final로 정의한다. syn..
- 자바에서 모든 인스턴스는 1개의 모니터를 가지고 있으며, 각 모니터는 1개의 ConditionVariable만을 가질 수 있다. - synchronized 키워드를 통해 동기화 메커니즘을 코드적으로 구현할 수 있다. - 인스턴스 lock 뿐만 아니라 클래스 lock 또한 존재한다. - 인스턴스 lock 과 클래스 lock은 별개의 lock으로 공유되지 않는다. - 자바는 기본적으로 signal and continue 방식을 지원한다. 자바에서 모니터 연산 ? 앞서 보았던 모니터 연산에서 메소드 명만 변경이 되었고 역할은 동일하다. wait () : 스레드가 lock을 취득했으나, 코드 실행 조건에 맞지 않아 해당 스레드를 condition variable의 waiting queue를 통해 wait 상..
모니터 또한 동기화 메커니즘 중 하나이다. 모니터의 목적 ? - 상호 배제 구현 - 특정 조건에 부합할 경우에만 임의의 스레드 로직을 실행하는 것. → 조건 별 실행 여부를 제어할 수 있다. 모니터는 뮤텍스 Lock 과 Condition Variable 로 구성되어 있다. - 상호 배제 구현을 위해 뮤텍스 Lock을 사용한다. - Lock을 획득하려 하였으나 취득하지 못한 스레드는 뮤텍스가 가진 entry queue에서 wait 상태로 전환된다. - entry queue는 무조건 FIFO로 구현된 것은 아니다. 내부 요소들에 모두 같은 가중치를 두고 경합을 벌여 우선순위를 결정하는 구현체도 존재한다. - " 조건 별 실행 여부 "를 Condition Variable ( CV ) 로 구현하는데, 모니터 하..
최근 모던 컴퓨팅 환경에서는 우리가 작성한 명령어를 실행할 때, JVM이 최적화를 진행한다. 이 최적화 과정은 동시 메모리 접근이 없음을 기본 전제로 하며, 컴파일러에게 임의의 변수가 공유자원임을 명시해주면 생략되는 과정이기도 하다. 1. cpu 데이터 캐싱 cpu의 처리속도 < RAM 에서 데이터를 로딩하는 속도 는 아주 많은 차이가 난다. 매번 RAM에서 연산에 요구되는 값을 가져와 처리를 하면, 로딩 시간을 기다리느라 cpu가 낭비될 것이다. cpu 캐싱은 l1~l3 같은 cpu 내부 캐시 메모리에 필요한 데이터 블록을 최초 로딩하고, 이후 참조가 있을 경우 캐시 메모리를 참조하여 데이터 접근 속도를 줄여 cpu 낭비를 예방할 수 있다. 캐싱 메모리에서 변경된 데이터는 바로 RAM과 동기화 되지 않..

세마포어는 뮤텍스와 비슷하지만, 몇 가지 차이점이 존재한다. 1. 여러 개의 스레드 혹은 프로세스가 임계 영역에 접근할 수 있다. - 즉, N개의 lock을 가질 수 있다. 2. lock을 획득한 주체가 아닌 다른 스레드 혹은 프로세스가 해제 할 수 있다. public class Semaphore { private volatile int value = 3; private volatile int guard = 0; //value 일종의 여러개의 T/P가 공유하는 공유자원 이므로, 임계영역으로 보호해주기 위해 추가된 변수이다. //guard 사용하게 되면 lock과 unlock이 동시에 발생하는 경우를 막아준다. public void wait() { //acquire lock while ( test_and_..

스핀락에서는 lock 해제를 확인하는 스레드 혹은 프로세스 ( T/P ) 들을 실행하느라 cpu에 낭비가 발생한다고 하였다. 뮤텍스는 이를 보완하여, entry queue를 사용해 lock을 점유하고자 하는 T/P들을 wait 상태로 변경하고, cpu가 다른 T/P를 처리할 수 있도록 하였다. 세마포어를 소개하면서 말하겠지만, 뮤텍스는 lock을 획득한 T/P만 lock을 해제 할 수 있다. public class Mutex { private volatile int lock = 0; private volatile int value = 0; //lock도 일종의 여러개의 T/P가 공유하는 공유자원 이므로, 임계영역으로 보호해주기 위해 추가된 변수이다. //value를 사용하게 되면 lock과 unlock이..