본문 바로가기

전체 글

(105)
13 레디스 운영하기 (끝) 레디스를 잘 운영하기 위한 대시보드 모니터링, 레디스 마이그, 장애 유발 가능한 환결 설정/커맨드를 알아보자 레디스 모니터링 구축하기익스포터: 상태를 실시간으로 스크랩해 메트릭 수집하는 프로그램프로메테우스: 메트릭 기반 오픈소스 모니터링 시스템지정한 타깃(익스포터)으로 HTTP로 직접 접근해 시계열 데이터를 pull방식으로 수집한다.promQL 쿼리 지원그라파나: 오픈소스 메트릭 데이터 시각화 도구프로메테우스 및 여러 데이터소스를 추가해 메트릭을 시각화해서 볼 수 있다.얼럿 매니저: 프로메테우스에서 설정한 알람 규칙 임계치 도달하면 얼럿 매니저를 통해 sms/이메일/슬랙 등으로 전송할 수 있다. 설치익스포터 설치노드 익스포터레디스 익스포터얼럿 매니저 설치프로메테우스 설치그라파나 설치 레디스 플러그인으로 ..
12장 클라이언트 관리 레디스가 클라이언트 처리/관리하는 방법, 성능 향상 위한 파이프라이닝, 클라이언트 사이드 캐싱에 대해 알려주겠다 클라이언트 핸들링TCP 포트, 유닉스 소켓을 통해 연결레디스는 클라 연결 수락하는데 TCP 포트, 유닉스 소켓을 사용할 수 있다.일반적으로 TCP 포트로 받음port 6379설정파일에서 unixsocket, unixsockerperm 설정하면 원하는 경로에 소켓 파일 생성 가능unixsocket /tmp/redis.socketunixsocketperm 777※동일한 서버 안에 앺과 레디스가 같이 있는 구조면 성능 향상※.socket 파일은 데이터 저장 용도가 아니라 데이터 주고받는 용도임이후 클라가 해당 소켓 파일 경로로 레디스 서버 연결 가능 (redis-cli -s /tmp/redis.so..
11장 보안 원본 저장소 데이터 들고 있는거고 pub/sub 메시지 전달자 역할이기 때문에 보안은 중요하다 커넥션 제어커넥션을 제어하는 3가지 방법bind10.0.0.2, 127.0.01만 레디스 접근 가능bind: 서버는 여러 개의 네트워크 인터페이스를 가질 수 있다.여러 IP 중 어떤 IP만 레디스 접근 가능하게할건지 지정한다.0.0.0.0 혹은 * 로 설정하면 모든 연결 허용특정 값 설정하는 것 권장 패스워드이전 버전각 인스턴스에 하나의 패스워드만 설정 가능 (requirepass)# 비번 설정 or redis.confCONFIG SET requirepass password-a (auth)로 redis-cli 접속redis-cli -a password혹은redis-cliAUTH password### 6버전 이후..
10장 클러스터 Lettuce client 설정에러 응답이 와야 레디스 클러스터 failover가 실행될텐데 AWS 랙 화재로 응답 자체가 안 오는 상황이없음(해결) periodic refresh는 주기적으로 강제 새로고침으로 해결 가능레투스는 flag가 fail 난 노드를 자동으로 필터링 해주지 않음(해결)코드에서 수동으로 토폴리지에서 제외해줌 레디스 클러스터와 확장성확장성(scalability): 증가하는 트래픽에 유연하게 대응할 수 있는 능력스케일 업: 수직 확장.서버 하드웨어를 높은 사양으로 업그레이드 (디스크, cpu, 메모리)스케일 아웃: 수평 확장. 장비 추가 레디스에서의 확장성키 eviction이 자주 발생한다면? 메모리 스케일 업 고려키 eviction: 레디스가 maxmemory만큼 데이터 차 있는데 ..
9장 센티널 고가용성 기능이 필요한 이유만약 마스터가 장애나서 수동으로 failover해야하는 상황이라면복제본에서 REPLICA OF ON ONE 입력해 읽기 전용 상태 해제앺 코드에서 레디스 엔드포인트를 복제본 IP로 변경 후 앺 배포과정을 거쳐야한다. 그럼 장애 처리가 지연돼 서비스 기능의 문제로 이어진다.또한 캐시 look aside 구조라면 레디스 장애날 동안 MYSQL 같은 원본 DB로 요청이 집중돼 서버 부하 급증돼 서비스 영향 끼칠 수 있다.센티널 (Sentinel)레디스 자체 고가용성 기능데이터 저장하는 레디스 인스턴스랑 다른 역할 하는 별도 프로그램센티널의 자동 failover 사용하면 마스터 장애나도 다운타임 최소화할 수 있다.센티널 기능모니터링: 마스터, 복제본 인스턴스 상태 실시간 확인자동 페일..
8장 복제 가용성(Availability)Availability = Available for Use Time / Total Time서비스를 정상적으로 사용할 수 있는 시간의 비율가용성이 높은 시스템을 고가용성 시스템이라고 한다.레디스에서 고가용성을 확보하는 법복제: 마스터 노드 데이터를 복제본 노드로 실시간 복사하는 기능. 마스터 장애 나도 데이터는 복제본에서 챙길 수 있음 (8장)자동 페일오버: 마스터에서 발생한 장애 감지해서 클라이언트 연결을 복제본 노드로 자동으로 redirection하는 기능. 수동으로 레디스 엔드포인트 변경할 필요 없어 빠른 장애 조치 가능 (9장)레디스에서의 복제 구조일단 운영중인 서비스에 복제본 노드 추가하는 이유?하드웨어는 언제든지 고장날 수 있으니 마스터 DB 다운됐을 때 대신 사용..
7장 레디스 데이터 백업 방법 레디스에서 데이터 영구 저장하기레디스는 메모리에서 관리되기 때문에 인스턴스가 재시작되면 모두 날라갈 가능성이 있으니 백업 정책은 중요하다.복제 정책도 있으나 서로 목적이 다르고(복제는 가용성, 백업은 데이터 복구), 의도치 않게 데이터 삭제 커맨드가 실행되면 복제 정책으로도 복구할 수 없다.백업하는 방법 2가지: RDB, AOFAOF(Append Only File): 메모리 변경있는 모든 쓰기 작업을 차례대로 기록, 복원할 때 커맨드 실행해가며 데이터 재구성RDB(Redis Data Base): 스냅샷 방식. 일정 시점에 메모리에 저장된 데이터 전체 저장실제로 RDB는 바이너리 형태로, AOF는 RESP(레디스 프로토콜)형태로 저장된다.장단점RDB: AOF보다 복원이 빠르나 특정 시점으로 복구는 불가능A..
6장 레디스를 메시지 브로커로 사용하기 1.pub/sub(publish, subscribe), 2.메시징 큐(list), 3.이벤트 스트림(stream)메시지 브로커메시지 브로커가 필요한 이유최근 서비스 아키텍쳐(MSA)에선 각 애플리케이션 간 느슨하면서 탄탄한 상호 작용이 필요하기 때문핵심 역할모듈 간 통신에서 커넥션 실패 같은 장애가 바로 전파되지 않게 비동기 통신으로 하는게 권장된다. 메시지 브로커를 사용하면 서비스 간 통신이 불가능하더라도 바로 장애로 이어지지 않게, 당장 메시지 처리하지 못해도 메시지를 쌓아두어 나중에 처리할 수 있는 채널을 만들어둔다.크게 두 형태: 메시징 큐, 이벤트 스트림 메시징큐와 이벤트 스트림메시징 큐생산자-소비자이벤트 스트림발행자-구독자방향성 관점메시징 큐: 생산자는 소비자의 큐로 직접 push 한다. 같은..
5장 레디스를 캐시로 사용하기 캐시원본 데이터 저장소보다 더 빠르고 효율적으로 접근할 수 있는 임시 데이터 저장소목표: 응답속도 줄이기부가 효과: 원본 저장소 리소스 줄일 수 있고 원본 저장소가 장애난 상황에서 캐시에서 가져오기 때문에 장애 영향 줄일 수 있다. 캐시 적용하면 좋은 경우원본 저장소에서 매번 계산을 해서 가져온다거나 읽기 시간이 오래걸리는 경우캐시에서 가져오는 속도가 더 빠른 경우캐시에 저장된 데이터가 잘 변하지 않는 경우자주 검색되는 데이터일 경우 캐시로서 레디스 쓰면 좋은 점키-값 또는 다양한 자료구조 지원으로 저장/반환할 때 변환 과정없어도 돼서 간단하다.메모리 위에 존재해서 굉장히 빠르다.센티널, 클러스터 사용하면 자동으로 장애 감지해 페일오버돼서 고가용성이다.클러스터 사용하면 스케일아웃도 쉽다. 캐싱 전략: 레..
4장 레디스 자료 구조 활용 사례 실시간 리더보드 - sorted set실시간 리더보드에 sorted set이 좋은 이유실시간으로 정렬돼야하는데 sorted set은 저장할때부터 정렬되므로 조회가 빠름 ZADD, ZREVRANGE, ZINCRBY, ZUNIONSTORE127.0.0.1:6379> ZADD score:250116 100 player:1 (integer) 1127.0.0.1:6379> ZADD score:250116 500 player:2(integer) 1127.0.0.1:6379> ZADD score:250116 700 player:3(integer) 1127.0.0.1:6379> ZREVRANGE score:250116 0 2 withscores1) "player:3"2) "700"3) "player:2"4) "500"..
3장 레디스 기본 개념 redis-cli -h 127.0.0.1 -p 6379string, list, set, hash, sorted set, 비트맵, hyperloglog, geospatial, streamstring한 키에 최대 512MB 저장 가능이진 데이터, JPEG 이미지 같은 바이트 값 HTTP 응답값 다양하게 저장 가능키 하나에 값도 하나 저장되는 유일한 자료 구조SET, GET127.0.0.1:6379> set hello world // 키 값OK127.0.0.1:6379> get hello"world"127.0.0.1:6379> set hello newval NX(nil)127.0.0.1:6379> get hello"world"127.0.0.1:6379> set hello newval XXOK127.0.0.1:..
2장 레디스 시작하기 도커로 띄움서버 환경 설정 변경file descriptor 수는 레디스 maxClients + 32 로소켓도 파일이다: 리눅스는 클라이언트가 접속할 때마다 '소켓'을 생성하는데, 이를 파일(File Descriptor)로 취급합니다.레디스 내부에서 쓰는 파일 디스크립터 수는 32다.만약 nofiles 값이 1024(기본값인 경우가 많음)라면, 클라이언트가 1,000명만 접속해도 레디스는 더 이상 요청을 받을 수 없다.ulimit -a 로 open files 혹은 nofiles 로 파일 디스크립터 값 확인 THP(Transparent Huge Page) 기능 끄기리눅스는 메모리를 페이지 단위(4KB)로 관리하는데, 메모리 크기 클수록 페이지 관리 테이블 크기(TLB)가 커짐테이블 크기가 크면 오버헤드 이슈..
1장 마이크로서비스 아키텍처와 레디스 소프트웨어 아키텍처의 변화(모놀리틱 → MSA)로 인해 데이터 저장소의 요구사항(RDB -> NOSQL)이 바뀌었다모놀리틱 아키텍처전체 애플리케이션을 하나의 단위로 배포, 관리장점: 구조 단순, 소규모에 적합단점:한 곳의 장애가 전체 장애로 퍼질 수 있다프레임워크가 통일이라 새로운 기술 적용이 쉽지 않다배포 시간이 오래 걸린다데이터 저장소 : RDB가 많이 쓰였다.모든 데이터를 한 곳에서 관리하므로 관계형이 표준이었다.마이크로서비스 아키텍처특정 단위로 모듈을 쪼개서 관리장점: 배포가 상대적으로 간단해 요구사항 빨리 처리 가능, 신기술 적용 특정 부분만 해볼 수 있음단점: 관리포인트가 많아져 소규모에서는 어려움데이터 저장소: NoSQL각 모듈에 필요한 데이터를 독립적으로 저장하는게 편리구조화되지 않은 비정..
테스트 클래스 다른 모듈에서 공유하기 배경멀티 모듈로 구성되어 있다: s3 접근하는 data-s3 모듈, 스프링 배치 batch 모듈batch 모듈에서 s3 접근이 필요한 로직들은 data-s3 모듈에 들어있다.하고싶은 것data-s3 모듈에서 테스트용 빈을 구현해 batch모듈에서도 쓰고 싶다.S3Mock을 사용한 테스트용 S3Client지금까지는batch 모듈에서 직접 구현함batch 모듈에서 S3Mock 디펜던시 주입 (io.findify:s3mock_2.12)batch 모듈에서 S3MockConfig 빈 생성→ S3MockConfig 는 s3와 관련된 클래스이니 data-s3 모듈에서 생성하고, batch 모듈에 공유하여 사용하고 싶은 것첫 번째 방법 - testFixtures 플러그인 사용(장점) batch 모듈에서 testImpl..
최신 정보검색론 1장부터 11장까지 책 내용을 정리한 PPT입니다https://docs.google.com/presentation/d/1IwnPWQdgyo3Gsbh_TF0QqTbA-pmFS4lDbFvXsLbYMuQ/edit?slide=id.g36768965a52_0_125&pli=1#slide=id.g36768965a52_0_125 [스터디] 최신 정보검색론최신 정보검색론 1장 소개 2025.6.16docs.google.com Chapter 1 소개Chapter 2 검색 사용자 인터페이스Chapter 3 모델링Chapter 4 검색평가Chapter 5 연관 피드백과 질의확장Chapter 6 문서: 언어 및 특성Chapter 7 질의: 언어 및 특성Chapter 8 텍스트 분류Chapter 9 색인과 검색Chapter 1..
opencode 튜토리얼 - LLM모델을 CLI에서 사용하기 opencode 는 여러 LLM을 CLI 환경에서 사용할 수 있는 AI Coding Agent이다.opencode 사용법, agent 생성하는 법에 대해 알아보기로 한다.opencode 특징TUI 기반이다 (설정같은 건 CLI로 하긴 함)여러 LLM 들을 한 곳에서 사용할 수 있다agent를 지원하지 않는 LLM(ex. github copilot)도 agent를 사용할 수 있다 (생성은 안되더라)독스 학습이 쉽다opencode툴 자체는 무료지만 사용하려는 LLM에 대해서는 API key를 이용하든 구독을 하든 돈을 내야한다. ※참고) 용어-화면 매핑CLI터미널 창TUIopencode 커맨드 입력한 후opencode 설치독스brew install opencode(맥북)opencode help 커맨드를 통해..
Jenkins Helm Charts 파보기 목적젠킨스를 쿠버네티스로 띄운다.helm repository에 젠킨스를 한 번에 띄울 수 있는 chart(패키지)가 있기에 어떤 내용으로 jenkins가 구성되어 있는지 알아보기로 한다.차트 다운 받기레포 세팅helm repo add jenkins https://charts.jenkins.iohelm repo update 레포 확인helm search repo jenkinsNAME CHART VERSION APP VERSION DESCRIPTION jenkins/jenkins 5.8.90 2.516.3 Jenkins - Build great things at any scale!… 차트 다운helm pull jenkins/jenkins --version 5.8.90 --destination /Users/e..
[Webflux] nested flatMap 지옥 해결하기 상황아래 로직을 구현한 코드가 flatMap 안에 flatMap 이 포함되어 있다. 코드 라인이 길고 들여쓰기가 많아서 가독성이 그리 좋지 않아 보인다.1번 작업 실행1번 작업 결과가 0이면 에러 던지기1번 작업 결과 후처리 (prefix 변수에 저장)1번 결과 받아서 2번 작업 실행2번 작업 결과가 0이면 에러 던지기2번 결과 받아서 3번 작업 실행1번 작업 결과 + 2번 작업 결과 + 3번 작업 결과 더해서 반환※ 각 작업은 1초 잠든 후 숫자를 반환한다.public Mono nestedFlatMap() { AtomicReference prefix = new AtomicReference("Prefix"); return _1번_작업() .flatMap(fir..
코사인 유사도 증명하기 문서 간의 유사도, 즉 벡터 간의 유사도를 구하기 위해 코사인 유사도를 많이 사용한다.코사인 유사도가 어떻게 이 수식이 나오게 되었는지 수학적으로 증명해보도록 한다.필자는 고등학교 이후로 거의 수학을 다시 볼 일이 없었기 때문에 왜 이런 공식이 이런 형태로 되어있는지 궁금하여 정리한 글이다.코사인 유사도두 개의 문서를 v, u 라는 벡터로 임베딩했을 때, 두 벡터의 코사인 값은 다음과 같다.$$cosθ = \frac{v⋅u}{∥v∥∥u∥}$$유사도 비교하기벡터 v 를 기준으로 v 와 u 가 비슷한지, v 와 w 가 비슷한지 cosθ 으로 판단해보자.고등학교 때 $cosθ = \frac{x}{r}$ 임을 배웠다.두 벡터는 비슷할수록 θ 가 작아진다. (점점 가까워지므로)θ 가 작을수록 cosθ는 점점 커진..
[Elasticsearch] action.auto_create_index 를 설정하자 색인 시 인덱스 자동 생성을 방지해줄 수 있는 action.auto_create_index 설정을 해보자최종 elasticsearch.ymldiscovery.type: single-nodebootstrap.memory_lock: trueaction.auto_create_index: ".watches,.triggered_watches,.watcher-history-*"xpack.ml.enabled: falsenetwork.host: 0.0.0.0 ES 7.1.11. elasticsearch.yml 에 action.auto_create_index=false 설정항상 컨네이너 삭제 후 재시작함(에러) 컨테이너 뜰 때 Caused by: java.lang.IllegalArgumentException: the [..
[5/5] Node-exporter → Consul → Promethus → Grafana 연동하기 이전 글에서 prometheus 까지 데이터 수집을 완료하였다. [4/5] Node-exporter → Consul → Promethus → Grafana 연동하기이전 글에서 prometheus 을 구축하였다. [2/5] Node-exporter → Consul → Promethus → Grafana 연동하기이전 글에서 node-exporter 를 구축하였다.이제 consul 을 구축해보자② Consul파이프라인을 구성할 때 consul 이elsboo.tistory.com이제 grafana 를 구축해보자⑤ Grafanadocker-compose.ymlversion: '3'services: grafana: image: grafana/grafana container_name: grafana ..
[4/5] Node-exporter → Consul → Promethus → Grafana 연동하기 이전 글에서 prometheus 을 구축하였다. [2/5] Node-exporter → Consul → Promethus → Grafana 연동하기이전 글에서 node-exporter 를 구축하였다.이제 consul 을 구축해보자② Consul파이프라인을 구성할 때 consul 이 반드시 필요하지는 않다. 결국 prometheus 에서만 exporter 를 알면 되기 때문이다. 하지만 consuelsboo.tistory.com이제 consul 에 node-exporter 를 등록하면 prometheus 까지 잘 수집되는지 확인해보자④ node-exporter 등록node-exporter 용 json 설정파일을 생성 후 consul 의 register API를 호출하면 된다.curl --request PU..
[3/5] Node-exporter → Consul → Promethus → Grafana 연동하기 이전 글에서 consul 을 구축하였다. [2/5] Node-exporter → Consul → Promethus → Grafana 연동하기이전 글에서 node-exporter 를 구축하였다.이제 consul 을 구축해보자② Consul파이프라인을 구성할 때 consul 이 반드시 필요하지는 않다. 결국 prometheus 에서만 exporter 를 알면 되기 때문이다. 하지만 consuelsboo.tistory.com 이제 prometheus 를 구축해보자③ Prometheusprometheus 는 exporter 들을 한데로 모으는 깔때기 같은 역할이다. node-exporter 를 consul 을 통해 prometheus 에 등록할 수 있게 해보겠다.docker-compose.ymlversion: ..
[2/5] Node-exporter → Consul → Promethus → Grafana 연동하기 이전 글에서 node-exporter 를 구축하였다. [1/5] Node-exporter → Consul → Promethus → Grafana 연동하기최종 결과: 시스템 정보를 그라파나 대시보드로 확인할 수 있다각종 데이터를 그라파나를 통해 대시보드로 편리하게 확인할 수 있다. cpu 사용량, 메모리 사용량 같은 시스템 정보를 그라파나로elsboo.tistory.com이제 consul 을 구축해보자② Consul파이프라인을 구성할 때 consul 이 반드시 필요하지는 않다. 결국 prometheus 에서만 exporter 를 알면 되기 때문이다. 하지만 consul 이 가지고 있는 큰 장점이 있다. 바로 서비스 디스커버리이다.서비스 디스커버리는 node-exporter 같은 서비스를 API 한 번 호출..
[1/5] Node-exporter → Consul → Promethus → Grafana 연동하기 최종 결과: 시스템 정보를 그라파나 대시보드로 확인할 수 있다각종 데이터를 그라파나를 통해 대시보드로 편리하게 확인할 수 있다. cpu 사용량, 메모리 사용량 같은 시스템 정보를 그라파나로 볼 수 있는 모니터링 파이프라인을 도커를 사용해 구축해보겠다.① Node-exporter각종 데이터를 모아주는 수집기를 exporter 혹은 agent라고 부른다. exporter의 종류는 mysql, elasticsearch 등 다양하게 수집할 수 있다. 나는 그 중에서 하드웨어와 OS 메트릭 등을 확인할 수 있는 node-exporter를 사용할 것이다.docker-compose.yml 구성은 공식 깃을 참고하였다.version: '3'services: node_exporter: image: quay.io/..
검색 "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
[아호코라식 (Aho-corasick) 알고리즘] 논문 이해하기 (3) - 성능 측정 이전 글에서는 아호코라식 알고리즘의 구조에 대해서 알아보았다.이번 글에서는 아호코라식과 엘라스틱서치(ES) 로 검색을 했을 때 성능 측정을 간단하게 해볼 것이다.결론색인 키워드: 5543 개검색 요청: 1000 개 아호코라식ES메모리 사용량5 mb2 mb색인 시간42 ms286 ms검색 시간7 ms2051 ms아호코라식이 압도적으로 빠르다. (색인시간은 약 6.8배, 검색시간은 약 293배 빠름)메모리 사용량은 아호코라식이 더 잡아먹는다. (ES 보다 2.5배)아호코라식은 색인시간이 검색시간보다 더 오래걸린다. (42 ms > 7 ms)ES는 검색시간이 색인시간보다 더 오래걸린다. (2051 ms > 286 ms)※ 검색 결과는 고려하지 않았다.자세한 이야기[색인 키워드] 한글로 이루어진 단어 5543 ..
[ElasticSearch] update_by_query version_conflict_engine_exception & update 쿼리 비교 문제운영 중인 인덱스 문서를 update_by_query 로 실시간으로 업데이트하는 배치를 만들었다. 첫 테스트를 하는데 몇 초 지나더니 version_conflict_engine_exception 에러가 간헐적으로 발생하기 시작했다.해결update_by_query 를 bulk update 로 바꿨다.[기존]POST my_index/_update_by_query{ "query": {"term": {"_id": {"value": "1"}}}, "script": { "source": "ctx._source.updated_by_query = true", "lang": "painless" }} [변경후]POST _bulk{"update": {"_index": "my_index", "_id": ..
로그에 클래스, 메소드명 자동 출력하기 언어: JAVALogging Framework: logback팀 컨벤션 혹은 원활할 디버깅을 위해 로그에 클래스명과 메소드명을 출력하는 경우가 있다.가장 쉬운 방법은 로그에 하드코딩으로 집어넣는 방법일 것이다.log.info("[Class][Method] Message occurred.")하지만 클래스, 메소드명이 바뀔 때마다 수동으로 챙겨줘야하는 불편함이 있다.그래서 클래스, 메소드명을 자동으로 출력할 수 있는 2가지 방법을 소개한다.log.info("method called");2024-06-22 18:07:53.409 INFO 7905 --- [ main] d.h.s.methodlog.MethodLogService : [MethodLogService][log] method called① 애노테이션으..
[정리] 그림으로 배우는 리눅스 구조 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.추천한다! 그림도 많아서 리눅스의 전체적인 흐름을 이해하는데 어렵지 않았다.-리눅스는 커널이라는 핵심 프로그램과 그 외로 나뉜다.커널이 하는 일접근제어, 명령 순서 제어, 자원 배분, 공유프로세스가 저장 장치에 직접 접근하면 명령 순서 같은 게 깨질 수 있음. 그래서 커널을 통해 간접 접근 하도록 한다.프로세스 스케줄링메모리 관리장치 접근cpu 모드 2가지커널 모드: 명령을 실행하는 데 아무 제약이 없다사용자 모드: 명령 실행에 제약이 걸린다.시스템 콜시스템콜을 호출하면 사용자 모드에서 커널 모드로 변경이 돼 호출 처리가 된다.OS 라이브러리OS 가 미리 공통된 기능을 묶어 라이브러리를 제공한다.표준 C 라이브러리 (l..