목록전체 글 (54)
우리네 장

test_and_set ( &arg ) ? - 동기화 메커니즘을 코드적으로 표현할 때 사용되는 함수로, 스레드 혹은 프로세스의 원자적 실행을 보장한다. 하드웨어 명령어로 cpu의 도움을 받아 인터럽트가 발생하지 않고, 한 번에 한 스레드 혹은 프로세스만 접근 할 수 있다. 인자로 받는 값과 응답 값은 0과 1 둘 중 하나이며, 해당 함수의 역할을 인자로 받은 arg의 값을 그대로 return 해줌과 동시에 무조건 1로 set 해준다. 그래서 while문 안에서 사용될 때 arg의 값이 0이어야지만 while문을 벗어날 수 있다. 소프트웨어 적으로 동기화 기법을 이용한 코드를 작성하여도, 기계어 단계에서 실행될 때 load 및 store 등으로 분할되어 실행되기 때문에 완전한 원자적 실행을 위해서 하드웨어..
프로젝트 환경 Tomcat 8.5 JDK 1.8 SpringFramework 4.3.25 Mybatis 3.5 Oracle 11g Synchronized ? - JAVA 단에서 지원하는 프로세스 동기화 키워드 참고 : https://qpmi1zm29.tistory.com/43 📝문제 상황 해당 앱을 유지보수 할 당시, 반복적으로 접수되는 버그성 문의가 있었습니다. 사용자들의 수강 이력을 히스토리 성으로 관리하기 위해, 강의 최초 수강 시점에 "( 사용자 아이디 + 강의 고유 값 )" 을 키로 하여 테이블에 데이터를 남겼는데요. 당연히 삽입 전에 데이터 중복 확인을 하였으나, 같은 삽입 요청이 굉장히 빠르게 발생하는 경우 테이블에 insert 문이 반영되기 전, select ( 중복 조회 )가 이루어지게 ..
실행하고자 하는 실행 파일이 존재하는 경우, 그냥 COPY 명령어를 통해 파일을 컨테이너 내부로 옮겨 실행하면 되지만, 실제 운영 환경에서 파이프라인을 통해 CI/CD를 구성할 때는 그 과정에서 빌드를 수행해 실행파일을 생성해줘야 한다. 이를 위해 Dockerfile 에서는 builder stage와 run stage를 구분지어 설정이 가능하다. [ 예시 파일 - react app ] FROM node:alpine as builder WORKDIR "/usr/src/app/" COPY package.json ./ RUN npm install COPY ./ ./ CMD [ "node", "run" ,"build" ] FROM nginx COPY --from=builder /usr/src/app/build ..

API Gateway ? - 사용자 혹은 시스템의 호출을 한 장비에서 일괄적으로 처리할 수 있게 해준다. 프록시의 역할로써, 외부에 내부의 구조를 숨긴다. 사용자의 요청에 따라 적절한 서비스로 요청을 라우팅 해준다. 진입로라고 생각하면 된다. 일괄적 처리 서비스 마다, 동일하게 수행하는 작업을 추출하여 게이트웨이에게 맡길 수 있다. 대표적으로 아래와 같은 기능들에 사용한다. 인증과 권한 로깅 / 추적 / 상관관계 회로차단기 캐싱기능 서비스 검색 통합 부하 분산 IP 허용 목록에 추가 헤더, 쿼리문자열 변환 3. 회로차단기 : 운영 중인 서비스에 문제가 생겼을 경우, 그 경로로 요청이 들어오지 못하게 한다. 보통 응답 캐싱과 함께 사용한다. 게이트웨이가 관리하는 서비스들이 auto-scaling을 할 때,..

[ Netfilx Eureka ] - MSA에서 Service Registry 의 역할과 Discovery Server ( Naming Server ) 를 구현하는데 사용할 수 있는 Spring cloud 내 API이다. - Discovery Server에 마이크로 서비스들이 : 정보를 key:value 형태로 저장하고 있다. - 외부에서 서비스 요청이 들어왔을 때, Load-Balancer나 API Gateway로 요청이 넘어오면, Discovery Server에게 해당 요청에 맞는 서비스가 어디에 있는지 위치를 물어본다. D/S는 위치 정보를 다시 Load-Balancer나 API Gateway로 넘겨주게 되면 그 정보를 바탕으로 해당하는 서버로 요청 정보를 보내준다. - Discovery Serve..

Docker compose는 다중 컨테이너로 구성된 도커 어플리케이션을 실행/중지 하기 위한 개념이다. Docker compose 사용을 위해서는 docker-compose.yml 파일이 필요한데, - Dockerfile : 현재 로컬 머신의 프로젝트를 docker를 이용해 이미지를 빌드하기 위한 파일 - docker-compose.yml : 다중 컨테이너들을 한 번에 실행할 때 컨테이너 끼리의 통신을 위한 설정 파일 이라고 생각하면 될 것 같다. 중요한 점은, 컨테이너들 끼리 통신하기 위해서는 반드시 설정이 필요한데, 멀티 컨테이너 네트워크 연결에 사용되는 것이 docker-compose.yml 파일이라는 점이다. [ 표현하고자 하는 프로젝트 구조 ] [ 완성된 docker-compose.yml 파일 ..
Docker image 생성 시 필요한 준비물! - Dockerfile - Base Image : image layers 중 가장 아래 위치하는 layer로 OS, jdk 등의 software가 위치한다. - 임시 컨테이너 : 사용자가 설정하는 부분은 아니고, docker가 이미지를 생성하면서 생성하는 임시 컨테이너 [ 일단 완성된 Dockerfile ] - 아래는 Node.js app 기준 - FROM node:10 --Base Image를 정한다 : / 생략 시 lastest로 가장 최신버전을 받아온다. WORKDIR /usr/src/app --WORKDIR을 지정하지 않을 시, 아래 CD 명령어에서 컨테이너 내부의 root 경로에 파일 을 복사한다. 이는 두 가지 문제점을 발생 시킨다. -- 1. ..
- 도커 이미지 내부 파일 구조 보기 docker + run + + [ ls ] 위 명령어에서 네 번째 ls 는 디렉토리의 구조를 조회하는 명령어 이다. 네 번째에 명령어가 추가적으로 기입 되었을 때 의미는 " 기존의 이미지의 실행 명령어를 무시하고 네 번째 기입된 명령어를 컨테이너에서 실행해라 " 는 의미이다. ex. docker run Alpine ls 그러나 docker run hello-world ls 는 실행가능하지 않다는 에러가 출력된다. 그 이유는 hello-world 이미지에는 ls 명령을 실행할 수 있는 실행 파일이 없기 때문이다. > 이미지에 따라서 실행할 수 있는 명령어가 다 다르다. - 컨테이너들 나열하기 docker + ps + [ -a ] -a는 all..