bong-u/til

๐Ÿ  home ๐Ÿˆ repository
new OpenSearch๋ฅผ ํ™œ์šฉํ•œ RAG ์‹ค์Šต
๐Ÿค– ์ธ๊ณต์ง€๋Šฅ
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„์—์„œ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค. ์šฐ๋ฆฌ ํŒ€์˜ ์ฃผ์ œ๋Š” ํŠน์ • ์ธ๋ฌผ์—๊ฒŒ ์ƒ๋‹ด์„ ๋ฐ›๋Š” ๊ฒƒ ๊ฐ™์€ ๋Œ€ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฑ—๋ด‡์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํŠน์ • ์ธ๋ฌผ์ด ํ–ˆ๋˜ ๋ง์„ ๋ชจ์•„ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ RAG ๋ชจ๋ธ์— ์ ์šฉ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์ˆœ์„œ ์ผ๋ก  ๋จธ์Šคํฌ๊ฐ€ TED์—์„œ ํ•œ ์ธํ„ฐ๋ทฐ๋ฅผ ํ…์ŠคํŠธ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. OpenSearch ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„๋ฒ ๋”ฉํ•ด์„œ OpenSearch์— ์ €์žฅํ•œ๋‹ค. RAG ๋ชจ๋ธ์ด OpenSearch๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. 1. ์ผ๋ก  ๋จธ์Šคํฌ ์ธํ„ฐ๋ทฐ ํ…์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ ํŠœ๋ธŒ์—์„œ “์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ"๋ฅผ ํ†ตํ•ด ์ธํ„ฐ๋ทฐ ์ž๋ง‰์„ ๊ฐ€์ ธ์˜จ๋‹ค. 122:03 2EM: ์ด ํฐ ํŠธ๋Ÿญ์„ ๋ชฐ๋ฉด์„œ ๋ง๋„ ์•ˆ๋˜๋Š” ์›€์ง์ž„์„ ๋ณด์˜€์ฃ . 3CA: ์•„์ฃผ ๋ฉ‹์ง€๋„ค์š”. ์ž, ๊ทธ๋Ÿผ ์ •๋ง ๊ต‰์žฅํ•œ ์‚ฌ์ง„์—์„œ 422:09 5์กฐ๊ธˆ์€ ๋œ ๊ต‰์žฅํ•œ ์‚ฌ์ง„์„ ๋ณด์ฃ . "์œ„๊ธฐ์˜ ์ฃผ๋ถ€๋“ค"์ธ๊ฐ€์—์„œ ๋‚˜์˜ค๋Š” ๊ท€์—ฌ์šด ์ง‘ ์‚ฌ์ง„์ธ๋ฐ์š”. 622:15 7์ด๊ฒŒ ๊ฐ‘์ž๊ธฐ ์™œ ๋‚˜์˜จ๊ฑฐ์ฃ ? 8... ์ผ๋ก  ๋จธ์Šคํฌ๊ฐ€ ํ•œ ๋ง๋งŒ ์†์ˆ˜ ์ •๋ฆฌํ•œ๋‹ค. 1๋„ค. ์ œ ์Šค์Šค๋กœ๋„ ๊ทธ ์งˆ๋ฌธ์„ ์ž์ฃผ ํ•˜๋Š” ํŽธ์ž…๋‹ˆ๋‹ค. 2์ €ํฌ๋Š” LA์˜ ์ง€ํ•˜์— ๊ตฌ๋ฉ์„ ๋‚ด๋ ค๊ณ  ํ•˜๋Š”๋ฐ์š”. ์ด๋Š” ๊ตํ†ต ์ฒด์ฆ์„ ์™„ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•œ 33์ฐจ์› ๋„คํŠธ์›Œํฌ์˜ ํ„ฐ๋„์ด ๋  ์ˆ˜๋„ ์žˆ๋Š” ์‹œ๋ฐœ์ ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. 4๊ตํ†ต ์ฒด์ฆ์€ ์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ์˜ ์˜ํ˜ผ์„ ํƒˆํƒˆ ํ„ฐ๋Š” ๋ฌธ์ œ ์ค‘์˜ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. 5์„ธ๊ณ„ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น˜๊ณ  ์žˆ์ฃ . ์ธ์ƒ์—์„œ ๋„ˆ๋ฌด๋„ ๋งŽ์€ ๋ถ€๋ถ„์„ ๊ฐ€์ ธ๊ฐ‘๋‹ˆ๋‹ค. 6... 2. OpenSearch ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ 1docker create -it -p 9200:9200 -p 9600:9600 -e OPENSEARCH_INITIAL_ADMIN_PASSWORD={password} -e "discovery.type=single-node" -v opensearch_vol:/usr/share/opensearch/data --name opensearch opensearchproject/opensearch ์„ค๋ช… -p 9200:9200 : OpenSearch HTTP ํฌํŠธ -p 9600:9600 : OpenSearch ๋ชจ๋‹ˆํ„ฐ๋ง ํฌํŠธ -e OPENSEARCH_INITIAL_ADMIN_PASSWORD={password} : ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ • -e “discovery.type=single-node” : ๋‹จ์ผ ๋…ธ๋“œ๋กœ ์‹คํ–‰ -v opensearch_vol:/usr/share/opensearch/data : ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ SSL ์˜ค๋ฅ˜ ๋ฐœ์ƒ๊ณผ ํ•ด๊ฒฐ ํ•˜์ง€๋งŒ ์œ„ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค 12024-07-05 22:15:12 Caused by: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: ... 22024-07-05 22:15:12 at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1314) ~[netty-handler-4.1.110.Final.jar:4.1.110.Final] 32024-07-05 22:15:12 at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1387) ~[netty-handler-4.1.110.Final.jar:4.1.110.Final] 42024-07-05 22:15:12 at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:530) ~[netty-codec-4.1.110.Final.jar:4.1.110.Final] 52024-07-05 22:15:12 at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469) ~[netty-codec-4.1.110.Final.jar:4.1.110.Final] 62024-07-05 22:15:12 ... 16 more ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์ด ๊ธธ์ง€ ์•Š๊ณ , ํ•ด๋‹น ํฌํŠธ๋Š” ์™ธ๋ถ€์— ๋…ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ SSL์„ ๋„๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. 1/usr/share/opensearch/config/opensearch.yml 2# ๋ณ€๊ฒฝ ์ „ 3plugins.security.ssl.http.enabled: true 4# ๋ณ€๊ฒฝ ํ›„ 5plugins.security.ssl.http.enabled: false 3. ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ž„๋ฒ ๋”ฉ ๋ฐ OpenSearch์— ์ €์žฅ RAG ์„ธ์…˜์„ ํ•ด์ฃผ์‹  ๋ฉ˜ํ† ๋‹˜์ด ์งœ์ค€ ์ฝ”๋“œ๋ฅผ ์ ๊ทน! ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€๋‹ค. OpenSearch ์ธ๋ฑ์Šค ์ƒ์„ฑ 1from opensearchpy import OpenSearch 2import torch 3from transformers import AutoTokenizer, AutoModel 4from langchain.text_splitter import RecursiveCharacterTextSplitter 5from langchain_community.document_loaders import TextLoader 6from langchain_community.vectorstores import OpenSearchVectorSearch 7 8INDEX_NAME = "elon_musk" 9FILE_NAME = "ted_elon_musk_script.txt" 10 11## OpenSearch ์—ฐ๊ฒฐ ์„ค์ • 12client = OpenSearch( 13 hosts=[{"host": "localhost", "port": 9200}], http_auth=("admin", {password}) 14) 15 16## ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ 17loader = TextLoader(file_path=FILE_NAME, encoding="utf-8") 18docs = loader.load() 19 20text_splitter = RecursiveCharacterTextSplitter( 21 chunk_size=100, 22 chunk_overlap=0, 23 separators=["\n"], 24 length_function=len, 25) 26 27documents = text_splitter.split_documents(docs) 28 29# print(documents) 30 31## Embedding ๋ชจ๋ธ ์ •์˜ 32class MyEmbeddingModel: 33 def __init__(self, model_name): 34 self.tokenizer = AutoTokenizer.from_pretrained(model_name) 35 self.model = AutoModel.from_pretrained(model_name) 36 37 def embed_documents(self, doc): 38 inputs = self.tokenizer( 39 doc, return_tensors="pt", padding=True, truncation=True, max_length=512 40 ) 41 42 with torch.no_grad(): 43 outputs = self.model(**inputs) 44 embeddings = outputs.last_hidden_state.mean(dim=1).tolist() 45 46 return embeddings 47 48 def embed_query(self, text): 49 inputs = self.tokenizer( 50 [text], padding=True, truncation=True, return_tensors="pt", max_length=512 51 ) 52 with torch.no_grad(): 53 outputs = self.model(**inputs) 54 embeddings = outputs.last_hidden_state.mean(dim=1).tolist() 55 return embeddings 56 57 58## index ๊ตฌ์กฐ ์ •์˜ 59index_body = { 60 "settings": { 61 "analysis": { 62 "tokenizer": { 63 "nori_user_dict": { 64 "type": "nori_tokenizer", 65 "decompound_mode": "mixed", 66 "user_dictionary": "user_dic.txt", 67 } 68 }, 69 "analyzer": { 70 "korean_anlyzer": { 71 "filter": [ 72 "synonym", "lowercase", 73 ], 74 "tokenizer": "nori_user_dict", 75 } 76 }, 77 "filter": { 78 "synonym" :{ 79 "type": "synonym_graph", 80 "synonyms_path" : "synonyms.txt" 81 } 82 } 83 } 84 } 85} 86 87## Embedding ๋ชจ๋ธ ์ƒ์„ฑ 88my_embedding = MyEmbeddingModel("monologg/kobert") 89 90## OpenSearch์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž… 91vector_db = OpenSearchVectorSearch.from_documents( 92 index_name=INDEX_NAME, 93 body=index_body, 94 documents=documents, 95 embedding=my_embedding, 96 op_type="create", 97 opensearch_url="http://localhost:9200", 98 http_auth=("admin", {password}), 99 use_ssl=False, 100 verify_certs=False, 101 ssl_assert_hostname=False, 102 ssl_show_warn=False, 103 bulk_size=1000000, 104 timeout=360000, 105) 106 107result = vector_db.add_documents(documents, bulk_size=1000000) tokenizer๋Š” ํ•œ๊ตญ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” “nori_tokenizer"๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. embedding ๋ชจ๋ธ์€ ์ €๊ฑฐ ๋ง๊ณ ๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์–ด๋–ค ๋ชจ๋ธ์ด ํ”„๋กœ์ ํŠธ์— ๊ฐ€์žฅ ๋ถ€ํ•ฉํ•˜๋Š” ๋ชจ๋ธ์ธ์ง€๋Š” ์‹คํ—˜์„ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. curl์„ ํ†ตํ•ด localhost:9200/elon_musk/_search๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด ์ž„๋ฒ ๋”ฉํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋“ค์–ด๊ฐ”๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 4. RAG ๋ชจ๋ธ์ด OpenSearch๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ๋Œ€๋‹ต ์ƒ์„ฑ 1from langchain.prompts import PromptTemplate 2from langchain.chains import LLMChain 3from langchain_openai import ChatOpenAI 4from opensearchpy import OpenSearch 5import os 6 7INDEX_NAME = "elon_musk" 8 9# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • 10os.environ["OPENAI_API_KEY"] = {api_key} 11 12llm = ChatOpenAI( 13 model_name="gpt-3.5-turbo", 14) 15 16prompt_template = PromptTemplate( 17 input_variables=["context", "question"], 18 template=""" 19Imagine you are {character_name}, 20a wise and experienced advisor. Given the context: "{context}", 21how would you respond to this inquiry: "{question}"?', 22(in korean) 23""", 24) 25 26 27llm_chain = LLMChain(llm=llm, prompt=prompt_template) 28 29client = OpenSearch( 30 hosts=["http://localhost:9200"], 31 http_auth=("admin", {password}), 32 use_ssl=False, 33 verify_certs=False, 34 ssl_assert_hostname=False, 35 ssl_show_warn=False, 36) 37 38def search_documents(query): 39 search_body = {"query": {"match": {"text": query}}} 40 response = client.search(index=INDEX_NAME, body=search_body) 41 hits = response["`its"]["hits"] 42 return [hit["_source"]["text"] for hit in hits] 43 44if __name__ == "__main__": 45 question = input("Enter your question\n") 46 search_results = search_documents(question) 47 48 print(search_results) 49 50 # context = " ".join(search_results) 51 context = "" 52 53 response = llm_chain.invoke({"character_name": INDEX_NAME, "context": context, "question": question}) 54 55 print (response["text"]) OpenSearch์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ RAG ๋ชจ๋ธ์— ๋„ฃ์–ด ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. search_documents ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด OpenSearch์— ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ context๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฒฐ๊ณผ ์งˆ๋ฌธ ํ…Œ์Šฌ๋ผ์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด? RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๋Œ€๋‹ต ํ…Œ์Šฌ๋ผ๋Š” ํ˜์‹ ์ ์ธ ๊ธฐ์—…์œผ๋กœ์„œ ๋ฏธ๋ž˜๋ฅผ ํ–ฅํ•œ ๋น„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์ „๊ธฐ ์ž๋™์ฐจ ๊ธฐ์ˆ ๊ณผ ์—๋„ˆ์ง€ ์†”๋ฃจ์…˜์€ ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ์˜ ํ˜์‹ ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ธ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. RAG๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ ์šฉ๋œ context [‘๊ธธ๊ฒŒ ๊ฐˆ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•„์š”.\n๊ทธ๋Ÿฌ๋„ค์š”. ์ €๋Š” ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ํ…Œ์Šฌ๋ผ์— ๋จธ๋ฌผ ์ƒ๊ฐ์ด์—์š”.\n๊ทธ๋ฆฌ๊ณ  ์ค€๋น„ ์ค‘์— ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ผ๋„ ๋งŽ๊ณ ์š”. ์•„์‹œ๋‹ค์‹œํ”ผ, ๋ชจ๋ธ 3์ด ์ถœ์‹œ ์˜ˆ์ •์ด๊ณ ์š”.’, ‘์˜ฌํ•ด ๋ง๊นŒ์ง€ LA์—์„œ ๋‰ด์š•๊นŒ์ง€\n์™„์ „ ์ž์œจ ์ฃผํ–‰์œผ๋กœ ํšก๋‹จํ•˜๋Š” ๊ณ„ํš์— ๋งž์ถฐ์„œ ์ง„ํ–‰ ์ค‘์ด์—์š”.\n์‚ฌ๋žŒ์ด ํ…Œ์Šฌ๋ผ์— ํƒ€์„œ ์šด์ „๋Œ€๋ฅผ ์žก์ง€ ์•Š๊ณ  “๋‰ด์š•"์„ ์ฐ์œผ๋ฉด ๊ทธ๋ฆฌ๋กœ ๊ฐ„๋‹ค๋Š” ๋ง์ด๋„ค์š”.’, ‘๊ธธ๊ฒŒ ๊ฐˆ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•„์š”.\n๊ทธ๋Ÿฌ๋„ค์š”. ์ €๋Š” ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ํ…Œ์Šฌ๋ผ์— ๋จธ๋ฌผ ์ƒ๊ฐ์ด์—์š”.\n๊ทธ๋ฆฌ๊ณ  ์ค€๋น„ ์ค‘์— ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ผ๋„ ๋งŽ๊ณ ์š”. ์•„์‹œ๋‹ค์‹œํ”ผ, ๋ชจ๋ธ 3์ด ์ถœ์‹œ ์˜ˆ์ •์ด๊ณ ์š”.’, ‘์˜ฌํ•ด ๋ง๊นŒ์ง€ LA์—์„œ ๋‰ด์š•๊นŒ์ง€\n์™„์ „ ์ž์œจ ์ฃผํ–‰์œผ๋กœ ํšก๋‹จํ•˜๋Š” ๊ณ„ํš์— ๋งž์ถฐ์„œ ์ง„ํ–‰ ์ค‘์ด์—์š”.\n์‚ฌ๋žŒ์ด ํ…Œ์Šฌ๋ผ์— ํƒ€์„œ ์šด์ „๋Œ€๋ฅผ ์žก์ง€ ์•Š๊ณ  “๋‰ด์š•"์„ ์ฐ์œผ๋ฉด ๊ทธ๋ฆฌ๋กœ ๊ฐ„๋‹ค๋Š” ๋ง์ด๋„ค์š”.’] RAG๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋Œ€๋‹ต ์ €๋Š” ํ…Œ์Šฌ๋ผ๋ฅผ ๋งค์šฐ ๊ธ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ๋Š” ํ˜์‹ ์ ์ธ ๊ธฐ์ˆ ๊ณผ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๋น„์ „์„ ๊ฐ–์ถ˜ ๊ธฐ์—…์œผ๋กœ์„œ, ์ž์œจ ์ฃผํ–‰ ๊ธฐ์ˆ ์„ ํ†ตํ•ด ์šฐ๋ฆฌ์˜ ์‚ถ์„ ํ˜์‹ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ „๊ธฐ์ฐจ ์‹œ์žฅ์„ ์„ ๋„ํ•˜๊ณ  ํ™˜๊ฒฝ์— ์นœํ™”์ ์ธ ์ฐจ๋Ÿ‰์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ‹์ง„ ๊ธฐ์—…์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ์˜ ๋ฏธ๋ž˜๊ฐ€ ๋ฐ๊ณ  ํฅ๋ฏธ๋กœ์šด ์ผ๋“ค์ด ๊ณ„์†ํ•ด์„œ ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ณ ์ฐฐ ํ™•์‹คํžˆ RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ๊ฐ๊ด€์ ์ด๊ณ  ์ผ๋ฐ˜์ ์ธ ๋Œ€๋‹ต์„ ํ•˜๋Š” ๋ฐ˜๋ฉด, RAG๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ…Œ์Šฌ๋ผ์— ๋Œ€ํ•ด ๊ธ์ •์ ์ธ ์ผ๋ก  ๋จธ์Šคํฌ์˜ ๋Œ€๋‹ต๊ณผ, ์ž์œจ์ฃผํ–‰ ๊ธฐ์ˆ ์„ ์–ธ๊ธ‰ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ˜์˜ํ•˜์—ฌ ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•˜์˜€๋‹ค.
new RAG ์ด๋ก  ์ •๋ฆฌ + OpenSearch
๐Ÿค– ์ธ๊ณต์ง€๋Šฅ
RAG (Retrieval-Augmented Generation) RAG๋Š” ๊ฒ€์ƒ‰๊ณผ ์ƒ์„ฑ์„ ๊ฒฐํ•ฉํ•œ ๋ชจ๋ธ๋กœ, ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์–ป์€ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋ธ LLM์˜ ๋ฌธ์ œ์  ํ• ๋ฃจ์‹œ๋„ค์ด์…˜: ์ƒ์„ฑ ๋ชจ๋ธ์ด ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์— ์—†๋Š” ๋‚ด์šฉ์„ ์ƒ์„ฑํ•˜๋Š” ํ˜„์ƒ ์ตœ์‹ ์˜ ์‘๋‹ต์„ ๊ธฐ๋Œ€ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ์ผ๋ฐ˜์ ์ธ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ถœ์ฒ˜๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ RAG๋Š” ์œ„์—์„œ ์„œ์ˆ ํ•œ LLM ๋ฌธ์ œ์˜ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ด๋‹ค. OpenSearch OpenSearch๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„์œผ๋กœ, ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜์˜ ํฌํฌ ๋ฒ„์ „ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฃผ์š” ๊ธฐ๋Šฅ ๋ถ„์‚ฐ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ๋ณด์•ˆ ์‹œ๊ฐํ™”์™€ ๋Œ€์‹œ๋ณด๋“œ ์ง€์› index์™€ document index : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค document : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ถ„์„๊ธฐ Analyzer (Character Filter + Tokenizer + Token Filter) ํ…์ŠคํŠธ๋ฅผ ํ† ํฐํ™”ํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ ๋ถ„์„ ๊ณผ์ • Character Filter ํŠน์ • ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ Tokenizer ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Token Filter ํ† ํฐ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ OpenSearch์—์„œ ์ง€์›ํ•˜๋Š” ์š”์†Œ Tokenizer Standard Tokenizer : ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ, ๋ฌธ์žฅ ๋ถ€ํ˜ธ ์‚ญ์ œ Letter Tokenizer : ๋ฌธ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Whitespace Tokenizer : ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Ngram Tokenizer : ๋ถ€๋ถ„ ๋ฌธ์ž์—ด๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Token Filter Standard Token Filter : ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Œ Lowercase Token Filter : ํ…์ŠคํŠธ๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ Synonym Token Filter : ๋™์˜์–ด ์ฒ˜๋ฆฌ Analyzer Standard Analyzer : Standard Tokenizer + Standard Token Filter Simple Analyzer : Letter Tokenizer + Lowercase Token Filter Whitespace Analyzer : Whitespace Tokenizer + Lowercase Token Filter OpenSearch ์ ‘๊ทผ์„ ์œ„ํ•œ cURL ๋ช…๋ น์–ด ์ธ๋ฑ์Šค ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/_cat/indices" ํŠน์ • ์ธ๋ฑ์Šค ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}" ์ „์ฒด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}/_search" ํŠน์ • ๊ฒ€์ƒ‰์–ด๋กœ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}/_search" \ 3-H "Content-Type: application/json" \ 4-d '{"query": {"match": {"field": "value"}}}' ์ธ๋ฑ์Šค ์‚ญ์ œ 1curl -X DELETE -u {username}:{password} \ 2"http://localhost:9200/{index_name}"
new Nginx์—์„œ HTTPS ์„ค์ •ํ•˜๊ธฐ
๐Ÿ”จ ๊ฐœ๋ฐœ ๋„๊ตฌ
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„๋ฅผ ์ง„ํ–‰์ค‘์ด๋‹ค. ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์€ docker-compose๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. AWS EC2์— ๊ตฌ๋™ ์ค‘์ธ ์„œ๋ฒ„์— HTTPS๋ฅผ ์ ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋„๋ฉ”์ธ ๊ตฌ๋งค ์—†์ด ์‹œ๋„๋ฅผ ํ–ˆ์œผ๋‚˜, AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ๋„๋ฉ”์ธ์œผ๋กœ SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์—†์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋„๋ฉ”์ธ์„ ๊ตฌ๋งคํ•˜๊ณ , Route 53์„ ํ†ตํ•ด ๋„๋ฉ”์ธ์„ ์—ฐ๊ฒฐํ–ˆ๋‹ค. ๋ชฉํ‘œ Nginx๋ฅผ ์ด์šฉํ•˜์—ฌ HTTPS๋ฅผ ์ ์šฉํ•œ๋‹ค. ๋ฐฉ๋ฒ• 1. docker-compose.yml์— certbot ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 1certbot: 2 image: certbot/certbot 3 container_name: certbot 4 volumes: 5 - ./certbot/conf:/etc/letsencrypt 6 - ./certbot/www:/var/www/certbot 7 depends_on: 8 - nginx 9 10 # certbot์„ ๋ฌดํ•œ๋ฃจํ”„๋กœ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ 11 entrypoint: "/bin/sh -c 'trap exit TERM; while :; do sleep 6h & wait $${!}; done;'" 2. nginx.conf๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. # certbot์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • location /.well-known/acme-challenge/ { allow all; root /var/www/certbot; } 3. certbot ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™œ์šฉํ•ด์„œ SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค. 1docker exec -it certbot certbot certonly \ 2 # ์›น ๋ฃจํŠธ ๋ฐฉ์‹์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑ 3 --webroot \ 4 # ์›น ์„œ๋ฒ„์˜ ์›น ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ง€์ • 5 --webroot-path=/var/www/certbot \ 6 # ์ธ์ฆ์„œ ๊ฐฑ์‹  ๋ฐ ์ค‘์š”ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ง€์ • 7 --email {์ด๋ฉ”์ผ ์ฃผ์†Œ} \ 8 # Let's Encrypt ์„œ๋น„์Šค ์•ฝ๊ด€์— ๋™์˜ 9 --agree-tos \ 10 # EFF(Electronic Frontier Foundation) ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ๋ฐ›์ง€ ์•Š๋„๋ก ์„ค์ • 11 --no-eff-email \ 12 # SSL ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•  ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์ง€์ • 13 -d {๋„๋ฉ”์ธ ์ด๋ฆ„} 4. Nginx ์›น ์„œ๋ฒ„์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  SSL ์„ค์ • ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋‹ค์šด ๋ฐ›์€ ํ›„ ํŒŒ์ผ์„ ์•Œ๋งž์€ ์œ„์น˜๋กœ ์ด๋™์‹œํ‚จ๋‹ค. ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” /etc/letsencrypt/๋กœ ์ด๋™์‹œ์ผฐ๋‹ค. 1sudo curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf > "./options-ssl-nginx.conf" 2 3sudo curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem > "./ssl-dhparams.pem" 5. nginx.conf๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. server { listen 80; charset utf-8; server_name {๋„๋ฉ”์ธ ์ด๋ฆ„}; # HTTP ์š”์ฒญ์„ HTTPS๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; charset utf-8; server_name { ๋„๋ฉ”์ธ ์ด๋ฆ„ }; # SSL ์ธ์ฆ์„œ ์„ค์ • ssl_certificate /etc/letsencrypt/live/api.forest-of-thoughts.site/fullchain.pem; # SSL ์ธ์ฆ์„œ ํ‚ค ์„ค์ • ssl_certificate_key /etc/letsencrypt/live/api.forest-of-thoughts.site/privkey.pem; # SSL ์„ค์ • ํŒŒ์ผ ํฌํ•จ include /etc/letsencrypt/options-ssl-nginx.conf; # Diffie-Hellman ํ‚ค ์„ค์ • ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } 6. nginx ์ปจํ…Œ์ด๋„ˆ ์„ค์ •์„ ์ˆ˜์ •ํ•œ๋‹ค. 1nginx: 2 image: nginx:stable 3 ports: 4 - "80:80" 5 - "443:443" 6 volumes: 7 - ./nginx.conf:/etc/nginx/nginx.conf 8 - ./certbot/conf:/etc/letsencrypt 9 - ./certbot/www:/var/www/certbot ํ•ด ํšŒ๊ณ  ๋ณดํ†ต crontab์„ ํ™œ์šฉํ•ด์„œ ์ž๋™์œผ๋กœ ์ธ์ฆ์„œ ๊ฐฑ์‹ ์„ ๋ฐ›๋Š”๋‹ค. ์ด๋ฒˆ์—๋Š” ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์ด ๊ธธ์ง€ ์•Š์•„์„œ, ์ˆ˜๋™์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋‹ค์Œ์—๋Š” ์ž๋™์œผ๋กœ ์ธ์ฆ์„œ ๊ฐฑ์‹ ์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ๋„์ „ํ•ด๋ณด์ž.
new C++ ๊ฐœ๋… ์ •๋ฆฌ
๐ŸŒŠ C/CPP
๋ณธ ๋‚ด์šฉ์€ 2023 MISRA-CPP ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๊ฐœ๋…์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค. ์ฐธ์กฐ(Reference)์™€ ํฌ์ธํ„ฐ(Pointer) ํฌ์ธํ„ฐ(Pointer) ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜ 1// ๋ณ€์ˆ˜ ์„ ์–ธ 2int a = 10; 3int* b = &a; // a์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅ 4 5// ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ 6void add(int* a, int* b) { 7 *a + *b; 8} 9 10add(&a, &b); ์ฐธ์กฐ(Reference) ๋ณ€์ˆ˜์— ๋ณ„์นญ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ ์ด๋ฆ„์œผ๋กœ ๋Œ€์ƒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ œ์•ฝ์‚ฌํ•ญ ์ฐธ์กฐ๋Š” ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค. ์ฐธ์กฐ๋Š” ํ•œ ๋ฒˆ ์ดˆ๊ธฐํ™”๋˜๋ฉด ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ์ฐธ์กฐ๋Š” NULL๋กœ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์—†๋‹ค. 1// ๋ณ€์ˆ˜ ์„ ์–ธ 2int a = 10; 3int& b = a; // a์˜ ๋ณ„์นญ์„ b๋กœ ์ง€์ • 4 5// ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ 6void add(int& a, int& b) { 7 a + b; 8} 9add (a, b); ํ…œํ”Œ๋ฆฟ (Template) ํ…œํ”Œ๋ฆฟ์€ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ, ํƒ€์ž…์„ ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ 1template <typename T> 2T add(T a, T b) { 3 return a + b; 4} ํด๋ž˜์Šค ํ…œํ”Œ๋ฆฟ 1template <typename T> 2class Point { 3public: 4 T x, y; 5 Point(T x, T y) : x(x), y(y) {} 6}; ํ…œํ”Œ๋ฆฟ ํŠน์ˆ˜ํ™” (Template Specialization) ํ…œํ”Œ๋ฆฟ์„ ํŠน์ • ํƒ€์ž…์— ๋Œ€ํ•ด ๊ตฌ์ฒดํ™”ํ•˜๋Š” ๊ฒƒ ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ ๋ช…์‹œ์  ํŠน์ˆ˜ํ™” 1template <typename T> 2T add(T a, T b) { 3 return a + b; 4} 5 6// int ํƒ€์ž…์— ๋Œ€ํ•œ ํŠน์ˆ˜ํ™” 7template <> 8int add(int a, int b) { 9 return a + b; 10} ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ ๋ถ€๋ถ„ ํŠน์ˆ˜ํ™” 1template <typename T> 2T add(T a, T b) { 3 return a + b; 4} 5 6// ํฌ์ธํ„ฐ ํƒ€์ž…์— ๋Œ€ํ•œ ๋ถ€๋ถ„ ํŠน์ˆ˜ํ™” 7template <typename T> 8T add(T* a, T* b) { 9 return *a + *b; 10} ์†์„ฑ (Attribute) ์ปดํŒŒ์ผํ• ๋•Œ ํŠน์ • ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ [[noreturn]] (~c++11) ํ•จ์ˆ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœ์ž์—๊ฒŒ ์ œ์–ด๊ถŒ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋ƒ„ [[noreturn]]์œผ๋กœ ์„ ์–ธ๋œ ํ•จ์ˆ˜๊ฐ€ ์ •์ƒ์ ์ธ ๋ฐ˜ํ™˜์„ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ undefined behavior ๋ฐœ์ƒ 1[[noreturn]] void error() { 2 throw "error"; 3} 4int32_t main() { 5 error(); 6 return 0; // dead code๋กœ ์ตœ์ ํ™”๋  ์ˆ˜ ์žˆ์Œ 7} [[maybe_unused]] (~C++17) ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ํƒ€์ž…์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌด์‹œํ•˜๋„๋ก ๋ช…์‹œ 1[[maybe_unused]] int a = 10; [[nodiscard]] (~C++17) ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฒฝ๊ณ ํ•˜๋„๋ก ๋ช…์‹œ ๋ฐ˜๋Œ€๋กœ (void) ํ˜•ํƒœ๋กœ ์บ์ŠคํŒ…ํ•˜์—ฌ ๊ฒฝ๊ณ ๋ฅผ ์–ต์ œํ•  ์ˆ˜ ์žˆ์Œ 1[[nodiscard]] int add(int a, int b) { 2 return a + b; 3} [[fallthrough]] (~C++17) switch๋ฌธ์—์„œ case ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•  ๋•Œ, break๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ฒฝ๊ณ ๋ฅผ ์–ต์ œ 1switch (a) { 2 case 1: 3 std::cout << "1" << std::endl; 4 [[fallthrough]]; // ์˜๋„์ ์œผ๋กœ 2๋กœ ๋„˜์–ด๊ฐ„๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œ 5 case 2: 6 std::cout << "2" << std::endl; 7 break; 8 default: 9 std::cout << "default" << std::endl; 10 break; 11} if constexpr (~C++17) compile time์— ์กฐ๊ฑด๋ฌธ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ธ”๋ก์€ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Œ ํ…œํ”Œ๋ฆฟ๊ณผ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ ํ…œํ”Œ๋ฆฟ์€ compile time์— ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ if constexpr๋Š” ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ 1template <typename T> 2void print(T value) { 3 if constexpr (std::is_same_v<T, int>) { 4 std::cout << "int: " << value << std::endl; 5 } else if constexpr (std::is_same_v<T, double>) { 6 std::cout << "double: " << value << std::endl; 7 } else { 8 std::cout << "unknown type" << std::endl; 9 } 10} Lambda (~C++11) ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ํ‘œํ˜„์‹ ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉ 1auto add = [](int a, int b) { 2 return a + b; 3}; Transient/Non-transient lambda Transient lambda ์ฆ‰์‹œ ํ˜ธ์ถœ๋˜๊ณ  ์†Œ๋ฉธ๋˜๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜ 1 int x = 10; 2 auto result = [](int x) { 3 return x * 2; 4 }(); // ์ฆ‰์‹œ ํ˜ธ์ถœ Non-transient lambda ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋žŒ๋‹ค ํ•จ์ˆ˜ 1std::function<int32_t()> add = [](int a) { 2 return a + 10; 3}; 4 5int32_t result = add(10); Closure (~C++11) lambda expression์—์„œ ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๋ฐฉ์‹ 1int a = 10; 2auto add = [&a](int b) { 3 return a + b; 4}; Capture lamda ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ lambda ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ ์‹œ์ ์˜ ์™ธ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ parameter ๋ฐฉ์‹๊ณผ์˜ ๋น„๊ต 1// parameter ๋ฐฉ์‹ 2void addAndPrint(int a, int b) { 3 std::cout << a + b << std::endl; 4} 5 6int main() { 7 int x = 10; 8 int y = 20; 9 addAndPrint(x, y); // ๋งค๋ฒˆ ํ˜ธ์ถœํ•  ๋•Œ ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผ ํ•จ 10} 1// capture ๋ฐฉ์‹ 2int x = 10; 3int y = 20; 4 5auto addAndPrint = [&x, &y]() { // ์™ธ๋ถ€ ๋ณ€์ˆ˜ x์™€ y๋ฅผ ์ฐธ์กฐ๋กœ ์บก์ฒ˜ 6 std::cout << x + y << std::endl; 7}; 8 9addAndPrint(); // ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด๋„ ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅ Capture List [&] : ๋ชจ๋“  ์™ธ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐ๋กœ ์บก์ฒ˜ [=] : ๋ชจ๋“  ์™ธ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ์บก์ฒ˜ [a] : ๋ณ€์ˆ˜ a๋ฅผ ๊ฐ’์œผ๋กœ ์บก์ฒ˜ [&a] : ๋ณ€์ˆ˜ a๋ฅผ ์ฐธ์กฐ๋กœ ์บก์ฒ˜ Escape Sequence ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์—์„œ ํŠน์ • ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž์—ด Escape Sequence Description \' ์ž‘์€ ๋”ฐ์˜ดํ‘œ \" ํฐ ๋”ฐ์˜ดํ‘œ \? ๋ฌผ์Œํ‘œ \\ ์—ญ์Šฌ๋ž˜์‹œ \a ๋ฒจ ์†Œ๋ฆฌ \b ๋ฐฑ์ŠคํŽ˜์ด์Šค \f ํผ ํ”ผ๋“œ \n ๊ฐœํ–‰ \r ์บ๋ฆฌ์ง€ ๋ฆฌํ„ด \t ์ˆ˜ํ‰ ํƒญ \v ์ˆ˜์ง ํƒญ \0 ๋„ ๋ฌธ์ž \nnn 8์ง„์ˆ˜ \xnn 16์ง„์ˆ˜ Encoding C++์—์„œ๋Š” ๋ฌธ์ž ๋ฆฌํ„ฐ๋Ÿด์— ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์—ฌ ์ธ์ฝ”๋”ฉ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ Encoding Prefix Example Literal Wide L L'A' Literal UTF-8 u8 u8'A' Literal UTF-16 u u'A' Literal UTF-32 U U'A' ASCII none '\x41' UTF-8 none '\xC3\xA9' Unicode (UTF-16) none '\u0041' Unicode (UTF-32) none '\U00000041' Cast Operator C++์—์„œ๋Š” ๋‹ค์–‘ํ•œ ํ˜•๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณต static_cast ๋…ผ๋ฆฌ์ ์œผ๋กœ ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ ๊ธฐ๋ณธ ํƒ€์ž… ๊ฐ„์˜ ๋ณ€ํ™˜, ํฌ์ธํ„ฐ/์ฐธ์กฐ ๊ฐ„์˜ ๋ช…์‹œ์  ๋ณ€ํ™˜์— ์‚ฌ์šฉ ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ฒ€์ฆ -> ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋งž์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ 1int a = 10; 2double b = static_cast<double>(a); dynamic_cast ์ƒ์† ๊ด€๊ณ„์—์„œ์˜ ํ˜•๋ณ€ํ™˜์„ ์œ„ํ•ด ์‚ฌ์šฉ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ์•ˆ์ „ํ•œ ํ˜•๋ณ€ํ™˜์„ ๋ณด์žฅ ๋ฐ˜๋“œ์‹œ ๊ฐ€์ƒ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋‹ค์šด์บ์ŠคํŒ… ์‹œ, ํ˜•๋ณ€ํ™˜์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ nullptr์„ ๋ฐ˜ํ™˜ 1class Base { 2public: 3 virtual void print() {} 4}; 5class Derived : public Base { 6public: 7 void print() override {} 8}; 9 10Base* base = new Derived(); 11Derived* derived = dynamic_cast<Derived*>(base); // ์•ˆ์ „ํ•œ ๋‹ค์šด์บ์ŠคํŒ… const_cast ํฌ์ธํ„ฐ ๋˜๋Š” ์ฐธ์กฐํ˜•์˜ const ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ์ƒ์ˆ˜ํ˜• -> ๋น„์ƒ์ˆ˜ํ˜•์œผ๋กœ ๋ณ€ํ™˜ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋ฉด undefined behavior ๋ฐœ์ƒ 1const int a = 10; 2int* b = const_cast<int*>(&a); reinterpret_cast ํฌ์ธํ„ฐ ํ˜•๋ณ€ํ™˜์ด๋‚˜ ๋น„๋…ผ๋ฆฌ์  ํ˜•๋ณ€ํ™˜์„ ์œ„ํ•ด ์‚ฌ์šฉ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํฌ์ธํ„ฐ๋ฅผ ๋ณ€ํ™˜ undefined behavior๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ ์™„์ „ํžˆ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ 1int a = 10; 2int* b = reinterpret_cast<int*>(&a); constexpr (~C++11) ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํ‰๊ฐ€๋˜๋Š” ํ‘œํ˜„์‹์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๋ณ€์ˆ˜ compile time ์ƒ์ˆ˜์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ 1constexpr int num1 = 10; 2 3int a = 20; 4constexpr int num2 = a; // error: ๋ณ€์ˆ˜ a๋Š” runtime์— ๊ฒฐ์ •๋˜๋ฏ€๋กœ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ํ•จ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ compile time์— ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅ ์ธ์ž ๊ฐ’์ด compile time ์ƒ์ˆ˜์ธ ๊ฒฝ์šฐ -> constexpr ํ•จ์ˆ˜๋กœ ๋™์ž‘ ์ธ์ž ๊ฐ’์ด compile time ์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ -> constexpr ํ•จ์ˆ˜๋กœ ๋™์ž‘ body์—์„œ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ตฌ๋ฌธ goto try-catch ์ดˆ๊ธฐํ™” ์ˆ˜ํ–‰์ด ์—†๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฆฌํ„ฐ๋Ÿด ํƒ€์ž…์ด ์•„๋‹Œ ๋ณ€์ˆ˜ ์„ ์–ธ static ๋ณ€์ˆ˜ ์„ ์–ธ tls(thread local storage) ๋ณ€์ˆ˜ ์„ ์–ธ ๋“ฑ… 1constexpr int fibonacci(const int n) { 2 if (n <= 1) return n; 3 return fibonacci(n - 1) + fibonacci(n - 2); 4} 5fibonacci(10); // compile time์— ๋‹ค ๊ณ„์‚ฐ๋˜์–ด์„œ 55๋กœ ๋Œ€์ฒด๋จ lvalue, rvalue ์ฐธ์กฐ lvalue ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œํ˜„์‹ lvalue ์ฐธ์กฐ 1int b = 10; 2int& a = b; // a๋Š” b์˜ ์ฐธ์กฐ์ž (lvalue ์ฐธ์กฐ) 3a = 20; ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—์„œ์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ 1class MyClass { 2public: 3 void show() & { 4 std::cout << "lvalue function called (object is lvalue)" << std::endl; 5 } 6}; 7 8MyClass obj; 9obj.show(); // lvalue ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœ rvalue ๋ฉ”๋ชจ๋ฆฌ์— ์œ„์น˜์— ํ• ๋‹น๋œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œํ˜„์‹ ์ฃผ์†Œ๊ฐ€ ์—†๊ฑฐ๋‚˜, ์ž„์‹œ๋กœ ํ• ๋‹น๋œ ๊ฐ’ ์ฃผ๋กœ ํ‘œํ˜„์‹์ด๋‚˜ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์ด๋‹ค. move semnatics๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. rvalue ์ฐธ์กฐ (~C++11) 1int&& a = 10; 2 3void show() && { 4 std::cout << "rvalue function called (object is rvalue)" << std::endl; 5} ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—์„œ์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ 1class MyClass { 2public: 3 void show() && { // rvalue์—์„œ๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ 4 std::cout << "rvalue function called (object is rvalue)" << std::endl; 5 } 6}; 7 8MyClass().show(); // rvalue ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœ ๊ฐ€์ƒํ•จ์ˆ˜ ์ƒ์† ๊ด€๊ณ„์—์„œ ๋™์  ๋ฐ”์ธ๋”ฉ์„ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ๋‹คํ˜•์„ฑ ํด๋ž˜์Šค(polymorphic class)๋ผ๊ณ  ํ•จ ์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์ถ”์ƒ ํด๋ž˜์Šค(abstract class)๋ผ๊ณ  ํ•จ virtual ์ง€์ •์ž ๊ฐ€์ƒ ํ•จ์ˆ˜ : ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ์„ ํƒ์ ์ž„ ์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜ : ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ํ•„์ˆ˜์ž„ 1class Base { 2public: 3 // ๊ฐ€์ƒํ•จ์ˆ˜ 4 virtual void show() { 5 std::cout << "Base::show()" << std::endl; 6 } 7 8 // ์ˆœ์ˆ˜ ๊ฐ€์ƒํ•จ์ˆ˜ 9 virtual void print() = 0; 10}; override ์ง€์ •์ž ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ 1class Derived : public Base { 2public: 3 void show() override { 4 std::cout << "Derived::show()" << std::endl; 5 } 6}; final ์ง€์ •์ž ์ƒ์†์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ‚ค์›Œ๋“œ ํด๋ž˜์Šค์— ์‚ฌ์šฉ : ์ƒ์†์„ ๋ฐฉ์ง€ ํ•จ์ˆ˜์— ์‚ฌ์šฉ : ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ๋ฐฉ์ง€ 1// ์ƒ์†์„ ๋ฐฉ์ง€ 2class Car final { ... }; 3 4// ์ƒ์†๊ณผ ๊ฐ™์ด ์“ฐ์ด๋Š” ๊ฒฝ์šฐ 5class Derived final : public Base { ... }; 6 7class Base { 8public: 9 // ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ๋ฐฉ์ง€ 10 void show() final { ... } 11}; enum vs enum class enum ๊ธฐ์กด์˜ C ์Šคํƒ€์ผ ์—ด๊ฑฐํ˜• ์ปดํŒŒ์ผ ์‹œ์ ์— ์ •์ˆ˜ํ˜• ์ƒ์ˆ˜๋กœ ๋ณ€ํ™˜ -> ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์—†์Œ ๋‹ค๋ฅธ enum ์˜์—ญ์ด๋ผ๋„ ๋ณ€์ˆ˜๋ช…์ด ์ค‘๋ณต๋˜๋ฉด ์ถฉ๋Œ ๋ฐœ์ƒ 1enum Color { 2 RED, 3 GREEN, 4 BLUE 5}; 6Color color = RED; enum class (~C++11) enum์˜ ํ™•์žฅ๋œ ๋ฒ„์ „ ๋ฌต์‹œ์  ํ˜•๋ณ€ํ™˜์ด ๋ถˆ๊ฐ€๋Šฅ -> ๋ช…์‹œ์  ํ˜•๋ณ€ํ™˜ ํ•„์š” enum ์˜์—ญ์ด ๊ฒฉ๋ฆฌ๋˜์–ด ๋ณ€์ˆ˜๋ช…์ด ์ค‘๋ณต๋˜์–ด๋„ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ 1enum class Color { 2 RED, 3 GREEN, 4 BLUE 5}; 6Color color = Color::RED; explicit ์ง€์ •์ž ๋‹จ์ผ ์ธ์ž ์ƒ์„ฑ์ž์˜ ์•”์‹œ์  ํ˜•๋ณ€ํ™˜์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๋‹จ์ผ ์ธ์ž ์ƒ์„ฑ์ž ์•ž์— ์‚ฌ์šฉ 1class MyClass { 2public: 3 explicit MyClass(int a) : a(a) {} 4} 5 6MyClass obj = 10; // error: ์•”์‹œ์  ํ˜•๋ณ€ํ™˜ ๋ถˆ๊ฐ€ 7MyClass obj(10); // ok ์ˆจ๊ฒจ์ง„ friend ํ•จ์ˆ˜ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ•จ์ˆ˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜ํ•ด์•ผ ํ•จ ADL๋กœ๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ 1namespace MyMath { 2 class Point { 3 int x, y; 4 5 Point(int x, int y) : x(x), y(y) {} 6 7 friend void operator+(Point& a, Point& b) { 8 a.x += b.x; 9 a.y += b.y; 10 } 11 }; 12} 13int32_t main() { 14 MyMath::Point a(10, 20); 15 MyMath::Point b(30, 40); 16 17 a + b; 18} ADL (Argument Dependent Lookup) ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ธ์ž์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ 1namespace MyMath { 2 struct Point { 3 int x, y; 4 Point(int x, int y) : x(x), y(y) {} 5 }; 6 7 void operator+(Point& a, Point& b) { 8 a.x += b.x; 9 a.y += b.y; 10 } 11} 12int32_t main() { 13 MyMath::Point a(10, 20); 14 MyMath::Point b(30, 40); 15 16 a + b; // ADL๋กœ ์ธํ•ด MyMath::operator+ ํ•จ์ˆ˜ ํ˜ธ์ถœ 17 MyMath::operator+(a, b); // ADL์ด ์—†์—ˆ๋‹ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ 18} std::variant (~C++17) ์—ฌ๋Ÿฌ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๋ฅผ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค union๊ณผ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•˜์ง€๋งŒ, type-safeํ•จ 1std::variant<int, double, std::string> value = 1; 2cout << std::get<int>(value) << endl; // 1 3 4value = 3.14; 5cout << std::get<double>(value) << endl; // 3.14 6 7value = "hello"; 8cout << std::get<std::string>(value) << endl; // hello ๋ฉค๋ฒ„, ๋น„๋ฉค๋ฒ„ ํ•จ์ˆ˜ index() : ํ˜„์žฌ ์ €์žฅ๋œ ํƒ€์ž…์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜ holds_alternative<T>() : ํŠน์ • ํƒ€์ž…์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ get<T>() : ํŠน์ • ํƒ€์ž…์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ (ํƒ€์ž…์ด ๋งž์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ) get_if<T>() : ํŠน์ • ํƒ€์ž…์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ (ํƒ€์ž…์ด ๋งž์ง€ ์•Š์œผ๋ฉด nullptr ๋ฐ˜ํ™˜) visit() : ์ €์žฅ๋œ ํƒ€์ž…์„ ๋ชฐ๋ผ๋„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ 1std::variant<int, double, std::string> value; 2 3value = "hello"; 4value.index(); // 2 (ํƒ€์ž… ์ˆœ์„œ๋Œ€๋กœ index ํ˜•์„ฑ) 5 6std::holds_alternative<double>(value); // true 7 8value = 1; 9std::get<int>(value); // 1 10std::get_if<int>(&value); // 1 11 12std::visit([](auto& arg) { 13 std::cout << arg << std::endl; 14}, value);
new Spring - RESTful API์—์„œ ๋‚ด๋ง˜๋Œ€๋กœ ์—๋Ÿฌ ์‘๋‹ตํ•˜๊ธฐ
๐Ÿƒ Spring
1. ํด๋ž˜์Šค ์ •์˜ 1@Getter 2@RequiredArgsConstructor 3public class ExceptionResponse { 4 private final LocalDateTime timestamp = LocalDateTime.now(); // 2023-08-01T00:00:57.5995502 5 private final int status; // 400 6 private final String error; // MethodArumentNotValidException 7 private final String message; // ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค 8 private final String path; // /api/customer 9} ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค, ์ฃผ์„์—๋Š” ํ•ด๋‹น ํ•„๋“œ์˜ ์˜ˆ์‹œ๋ฅผ ์ ์–ด๋†“์•˜๋‹ค 2. ResponseEntity ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜ ์ •์˜ 1private ResponseEntity<ExceptionResponse> handleException(HttpStatus status, Exception e, HttpServletRequest request) { 2 ExceptionResponse response = new ExceptionResponse( 3 status.value(), e.getClass().getSimpleName(), e.getMessage(), request.getRequestURI()); 4 return new ResponseEntity<>(response, status); 5} ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งˆ๋‹ค ExceptionResponse ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์ƒ๊ฒจ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์—ˆ๋‹ค ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ HttpStatus๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋ฐ›์•˜๋‹ค 3. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ 1@ExceptionHandler(NoSuchElementException.class) 2public ResponseEntity<ExceptionResponse> handleNoSuchElementException(NoSuchElementException e, HttpServletRequest request) { 3 return handleException(HttpStatus.NOT_FOUND, e, request); 4} ๋ณธ ํ•จ์ˆ˜๋Š” @RestControllerAdvice๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค์— ์ •์˜๋˜์—ˆ๋‹ค ์ง์ ‘ ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ResponseEntity๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค ์ •๋ฆฌ ์œ„์˜ ์˜ˆ์‹œ๋Š” NoSuchElementException์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, HTTP ์ƒํƒœ์ฝ”๋“œ๋Š” 404, body๋Š” ๋‚ด๊ฐ€ ์ •์˜ํ•œ๋Œ€๋กœ ์‘๋‹ตํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค REST Api์—์„œ ์ผ๊ด€์„ฑ์žˆ๊ณ  ๊ฐ„๊ฒฐํ•œ ์‘๋‹ต์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค
new ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ ์‹ค๊ธฐ ์ค€๋น„
๐ŸŽธ ๊ธฐํƒ€
๋ณผ๋“œ์ฒด์˜ ๊ฐœ๋…์€ ๊ธฐ์ถœ ๋ฌธ์ œ์—์„œ ๋“ฑ์žฅ, ๋‚˜๋จธ์ง€ ๊ฐœ๋…์€ ๋ชจ์˜๊ณ ์‚ฌ์—์„œ ๋“ฑ์žฅ SW ๊ณตํ•™ ๊ด€๋ จ ๊ฐœ๋… SOLID ์›์น™ S : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (SRP) O : ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™ (OCP) : ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ , ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™ L : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (LSP) : ์„œ๋ธŒํƒ€์ž…์€ ์–ธ์ œ๋‚˜ ์ž์‹ ์˜ ๊ธฐ๋ฐ˜ ํƒ€์ž…์œผ๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™ I : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (ISP) D : ์˜์กด ์—ญ์ „ ์›์น™ (DIP) : ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™ SOA(Service-Oriented Architecture) : ์„œ๋น„์Šค ์ง€ํ–ฅ ์•„ํ‚คํ…์ฒ˜ Walk Through : ๊ฒ€ํ†  ์ž๋ฃŒ๋ฅผ ํšŒ์˜ ์ „์— ๋ฐฐํฌํ•ด์„œ ์‚ฌ์ „๊ฒ€ํ† ํ•œ ํ›„ ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ถœํ•˜๊ณ  ๋ฌธ์„œ๋กœ ๋งŒ๋“œ๋Š” ๊ธฐ๋ฒ• ์ •ํ˜• ๋ช…์„ธ ๊ธฐ๋ฒ• : ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ์ˆ˜ํ•™์  ์›๋ฆฌ์™€ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์„œ์ˆ ํ•˜๋Š” ๊ธฐ๋ฒ• ๋””์ž์ธ ํŒจํ„ด Abstract Factory Pattern : ์ƒ์„ฑ ํŒจํ„ด; ๊ฐ์ฒด ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋Š” ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์ •์˜ํ•˜๋Š” ํŒจํ„ด Decorator Pattern : ๊ตฌ์กฐ ํŒจํ„ด; ๊ฐ์ฒด์— ์ถ”๊ฐ€์ ์ธ ์ฑ…์ž„์„ ๋™์ ์œผ๋กœ ๋ถ€์—ฌํ•˜๋Š” ํŒจํ„ด Memento Pattern : ํ–‰์œ„ ํŒจํ„ด; ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋Š” ํŒจํ„ด Factory Method Pattern : ์ƒ์„ฑ ํŒจํ„ด; ๊ฐ์ฒด ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋Š” ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์ •์˜ํ•˜๋Š” ํŒจํ„ด Bridge Pattern : ๊ตฌ์กฐ ํŒจํ„ด; ์ถ”์ƒํ™”์™€ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํŒจํ„ด Observer Pattern : ํ–‰์œ„ ํŒจํ„ด; ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ํŒจํ„ด Proxy Pattern : ๊ตฌ์กฐ ํŒจํ„ด; ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ๋Œ€๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŒจํ„ด Iterator Pattern : ํ–‰์œ„ ํŒจํ„ด; ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํŒจํ„ด ์ด์ƒ ํ˜„์ƒ : ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ• ๋•Œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ค‘๋ณต๋˜์–ด ๋ฆด๋ ˆ์ด์…˜ ์กฐ์ž‘์‹œ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๊ณค๋ž€ํ•œ ํ˜„์ƒ์ผ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ ๋ฒˆ๋‹ค์šด ์ฐจํŠธ : ๋‚จ์€ ์ž‘์—…๋Ÿ‰์„ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ํ‘œ์‹œํ•˜์—ฌ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ์ฐจํŠธ COCOMO : ๋ณดํ—ด์ด ์ œ์•ˆํ•œ ํ”„๋กœ๊ทธ๋žจ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋น„์šฉ์„ ์‚ฐ์ •ํ•˜๋Š” ๋ฐฉ์‹ (์กฐ์งํ˜•, ๋ถ„๋ฆฌํ˜•, ์ž„๋ฒ ๋””๋“œํ˜•) CPM : ํ”„๋กœ์ ํŠธ์˜ ์ž‘์—…์„ ๋„คํŠธ์›Œํฌ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ์ „์ฒด ํ”„๋กœ์ ํŠธ์˜ ์ผ์ •์„ ๊ณ„์‚ฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ PERT : ๋น„๊ด€์น˜, ์ค‘๊ด€์น˜, ๋‚™๊ด€์น˜์˜ 3์  ์ถ”์ • ๋ฐฉ์‹์„ ํ†ตํ•ด ์ผ์ •์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ• ๊ฒฐํ•จ ์ง‘์ค‘ : 20%์˜ ๋ชจ๋“ˆ์—์„œ 80%์˜ ๊ฒฐํ•จ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์›๋ฆฌ ์‚ด์ถฉ์ œ ํŒจ๋Ÿฌ๋…์Šค : ๋™์ผํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ฒฐํ•จ์„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์›๋ฆฌ ๋ฐฐ์น˜ ๋‹ค์ด์–ด๊ทธ๋žจ : ์‹œ์Šคํ…œ์˜ ๋ฌผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ, ์–ด๋–ค SW๊ฐ€ ์–ด๋–ค HW์— ๋ฐฐ์น˜๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ„ ํŒจํ‚ค์ง€ ๋‹ค์ด์–ด๊ทธ๋žจ : ์‹œ์Šคํ…œ์˜ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ ๋ธŒ๋ฃฉ์Šค์˜ ๋ฒ•์น™ : “๋Šฆ์–ด์ง„ ํ”„๋กœ์ ํŠธ์— ์ธ๋ ฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์˜คํžˆ๋ ค ๋” ๋Šฆ์–ด์ง„๋‹ค"๋Š” ๋ฒ•์น™ ํ™”์ดํŠธ๋ฐ•์Šค ํ…Œ์ŠคํŠธ ๊ฒ€์ฆ ๊ธฐ์ค€ ๋ฌธ์žฅ(Statement) ์ปค๋ฒ„๋ฆฌ์ง€ : ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชจ๋“  ๋ฌธ์žฅ์ด ์ตœ์†Œํ•œ ํ•œ ๋ฒˆ์€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ค€ ๋ถ„๊ธฐ(Branch) ์ปค๋ฒ„๋ฆฌ์ง€ : ๊ฐ ๊ฒฐ์ •๋ฌธ์ด ์ฐธ, ๊ฑฐ์ง“์„ ํ•œ ์ด์ƒ ๊ฐ–๋„๋ก ์กฐํ•ฉํ•˜๋Š” ์ปค๋ฒ„๋ฆฌ์ง€ ์กฐ๊ฑด(Condition) ์ปค๋ฒ„๋ฆฌ์ง€ : ๊ฒฐ์ •๋ฌธ ๋‚ด์˜ ๊ฐ ์กฐ๊ฑด์ด ์ฐธ, ๊ฑฐ์ง“์„ ํ•œ ์ด์ƒ ๊ฐ–๋„๋ก ์กฐํ•ฉํ•˜๋Š” ์ปค๋ฒ„๋ฆฌ์ง€ ๊ฒฐ์ •(Decision) ์ปค๋ฒ„๋ฆฌ์ง€ : ๊ฐ ์ „์ฒด ์กฐ๊ฑด์‹์˜ ์ฐธ, ๊ฑฐ์ง“์„ ํ•œ ์ด์ƒ ๊ฐ–๋„๋ก ์กฐํ•ฉํ•˜๋Š” ์ปค๋ฒ„๋ฆฌ์ง€ ์›์ธ ๊ฒฐ๊ณผ ๊ทธ๋ž˜ํ”„ : ํ”„๋กœ๊ทธ๋žจ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๋‚˜ํƒ€๋‚ด์–ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋„์ถœํ•˜๋Š” ๊ธฐ๋ฒ• ์•ŒํŒŒ/๋ฒ ํƒ€ ํ…Œ์ŠคํŠธ : ์•ŒํŒŒ-๊ฐœ๋ฐœ์ž์™€ ํ•จ๊ป˜ ์ˆ˜ํ–‰, ๋ฒ ํƒ€-๊ฐœ๋ฐœ์ž ์—†์ด ์ˆ˜ํ–‰ ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ๊ฐœ๋… Hub & Spoke : EAI ๊ตฌ์ถ• ์œ ํ˜•; ๋‹จ์ผํ•œ ์ ‘์ ์˜ ํ—ˆ๋ธŒ ์‹œ์Šคํ…œ์„ ํ†ตํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ์ค‘์•™ ์ง‘์ค‘์‹ ๋ฐฉ์‹ MQTT : IoT ์žฅ์น˜ ๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ๋Ÿ‰ ๋ฉ”์‹œ์ง• ํ”„๋กœํ† ์ฝœ CoAP : M2M ๋…ธ๋“œ๋“ค ์‚ฌ์ด์—์„œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์†ก์ˆ˜์‹ ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ „์†กํ•˜๋Š” REST ๊ธฐ๋ฐ˜์˜ ํ”„๋กœํ† ์ฝœ ๊ฑฐ๋ฆฌ ๋ฒกํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋„คํŠธ์›Œํฌ ๋ผ์šฐํŒ… ํ”„๋กœํ† ์ฝœ์˜ ํ•œ ์ข…๋ฅ˜; ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ž์‹ ์˜ ๊ฑฐ๋ฆฌ์™€ ์ด์›ƒ ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜์—ฌ ์ตœ์  ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋งํฌ ์ƒํƒœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋„คํŠธ์›Œํฌ ๋ผ์šฐํŒ… ํ”„๋กœํ† ์ฝœ์˜ ํ•œ ์ข…๋ฅ˜; ๊ฐ ๋…ธ๋“œ๊ฐ€ ์ „์ฒด ๋„คํŠธ์›Œํฌ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ์ตœ์  ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํšŒ์„  ์ œ์–ด : ๋‘ ๊ฐœ์˜ ์Šคํ…Œ์ด์…˜์ด ๋™์‹œ์— ์‹ ํ˜ธ๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ œ์–ดํ•˜๋Š” ๊ธฐ์ˆ  Slowris : ๋‹ค๋Ÿ‰์˜ HTTP ์—ฐ๊ฒฐ์„ ๋™์‹œ์— ์—ด๊ณ  ์œ ์ง€ํ•˜๋Š” DoS RUDY : ๋А๋ฆฐ ์†๋„๋กœ ์–‘์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ถœํ•˜์—ฌ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” DoS Slow Http read Dos : HTTP ์š”์ฒญ ํŒจํ‚ท์˜ ํ—ค๋”๋ฅผ ๋ณ€์กฐํ•˜์—ฌ ์›น ์„œ๋ฒ„์— ๋ณด๋‚ด ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ํ•˜๋Š” DoS SNMP(Simplified Network Management Protocol) : ๋„คํŠธ์›Œํฌ ์žฅ๋น„์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ DHCP(Dynamic Host Configuration Protocol) : ๋„คํŠธ์›Œํฌ ์žฅ์น˜์— IP ์ฃผ์†Œ๋ฅผ ์ž๋™์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ํ”„๋กœํ† ์ฝœ RARP (Reverse Address Resolution Protocol) : MAC ์ฃผ์†Œ -> IP ์ฃผ์†Œ ๋ณ€ํ™˜ ํ”„๋กœํ† ์ฝœ Ad-hoc ๋„คํŠธ์›Œํฌ : ์ค‘์•™ ๋ผ์šฐํ„ฐ๋‚˜ ์•ก์„ธ์Šค ์ง€์  ์—†์ด ์„œ๋กœ ์ง์ ‘ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ž„์‹œ ๋ถ„์‚ฐ ๋ฌด์„  ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ๊ตํ™˜ ๋ฐฉ์‹ ๊ฐ€์ƒํšŒ์„  ๋ฐฉ์‹ : ๋ชฉ์ ์ง€ ํ˜ธ์ŠคํŠธ์™€ ๋ฏธ๋ฆฌ ์—ฐ๊ฒฐ ํ›„ ํ†ต์‹ ํ•˜๋Š” ์—ฐ๊ฒฐํ˜• ๊ตํ™˜ ๋ฐฉ์‹ ๋ฐ์ดํ„ฐ๊ทธ๋žจ ๋ฐฉ์‹ : ํ—ค๋”๋ฅผ ๋ถ™์—ฌ์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋น„์—ฐ๊ฒฐํ˜• ๊ตํ™˜ ๋ฐฉ์‹ L2TP (Layer 2 Tunneling Protocol) : VPN ํ”„๋กœํ† ์ฝœ์˜ ์ผ์ข…์œผ๋กœ, PPP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์บก์Аํ™”ํ•˜๊ณ  ์ „์†กํ•˜๋Š” ๋ฐฉ์‹ ์˜ค๋ฅ˜ ์ œ์–ด ๋ฐฉ์‹ FEC (Forward Error Correction) : ์˜ค๋ฅ˜ ๊ฒ€์ถœ, ์Šค์Šค๋กœ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ์‹ Hamming Code BEC (Backward Error Correction) : ์˜ค๋ฅ˜ ๊ฒ€์ถœ, ์žฌ์ „์†ก ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹ Parity ๊ฒ€์‚ฌ CRC (Cyclic Redundancy Check) : ๋ฐ์ดํ„ฐ ๋ธ”๋ก์— ๋Œ€ํ•œ ๋‹คํ•ญ์‹ ๋‚˜๋ˆ—์…ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ์ฒดํฌ์„ฌ์„ ์ด์šฉ ๋ณด์•ˆ ๊ด€๋ จ ๊ฐœ๋… kill switch : ์Šค๋งˆํŠธํฐ ์ด์šฉ์ž๊ฐ€ ๋„๋‚œ๋‹นํ•œ ์Šค๋งˆํŠธํฐ์˜ ์ž‘๋™์„, ์›น์‚ฌ์ดํŠธ๋ฅผ ํ†ตํ•ด ์ •์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ผ์ข…์˜ ์žํญ ๊ธฐ๋Šฅ ์ œ๋กœ ๋ฐ์ด ๊ณต๊ฒฉ : ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์•Œ๋ ค์ง€๊ธฐ ์ „์— ํ•ด๋‹น ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜์—ฌ ์ด๋ฃจ์–ด์ง€๋Š” ๊ณต๊ฒฉ ARP Spoofing : ARP ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์ƒ์˜ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์˜ MAC ์ฃผ์†Œ๋ฅผ ์œ„์กฐํ•˜๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ• ๋””์ง€ํ„ธ ํฌ๋ Œ์‹ : ๋””์ง€ํ„ธ ๊ธฐ๊ธฐ์—์„œ ๋ฐœ์ƒํ•œ ๋ฒ”์ฃ„๋‚˜ ์‚ฌ๊ณ ์˜ ์ฆ๊ฑฐ๋ฅผ ์ˆ˜์ง‘, ๋ถ„์„, ๋ณด์กดํ•˜๋Š” ๊ณผ์ • ๋ฃจํŠธํ‚ท : ์‹œ์Šคํ…œ์— ๋ชฐ๋ž˜ ์„ค์น˜๋˜์–ด ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ์„ ์ œ์–ดํ•˜๋Š” ์•…์„ฑ ์†Œํ”„ํŠธ์›จ์–ด ์Šคํ”ผ์–ด ํ”ผ์‹ฑ : ํŠน์ • ๊ฐœ์ธ์ด๋‚˜ ์กฐ์ง์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋งž์ถคํ˜• ํ”ผ์‹ฑ ๊ณต๊ฒฉ APT ๊ณต๊ฒฉ : ํŠน์ • ํƒ€๊นƒ์„ ๋ชฉํ‘œ๋กœ ๋‹ค์–‘ํ•œ ์ˆ˜๋‹จ์„ ํ†ตํ•œ ์ง€์†์ ์ด๊ณ  ์ง€๋Šฅ์ ์ธ ๋งž์ถคํ˜ ๊ณต๊ฒฉ ๊ธฐ๋ฒ• SET(Secure Electronic Transaction) : ์ „์ž ์ƒ๊ฑฐ๋ž˜์—์„œ ์•ˆ์ „ํ•œ ๊ฒฐ์ œ๋ฅผ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ ์‚ฌ์ด๋ฒ„ ํ‚ฌ์ฒด์ธ : ๋กํžˆ๋“œ ๋งˆํ‹ด์˜ ๊ณต๊ฒฉํ˜• ๋ฐฉ์œ„ ์‹œ์Šคํ…œ DAC (Discretionary Access Control) : ์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹ MAC (Mandatory Access Control) : ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๊ฐ€ ์ •์ฑ…์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹ 3A (AAA) : ์ •๋ณด ๋ณด์•ˆ์˜ ํ•ต์‹ฌ์š”์†Œ Authentication Authorization Accounting ISMS (Information Security Management System) : ์ •๋ณด ๋ณดํ˜ธ๋ฅผ ์œ„ํ•œ ๊ด€๋ฆฌ ์ฒด๊ณ„ ์‚ฌํšŒ๊ณตํ•™ ๊ธฐ๋ฒ• : ์ธ๊ฐ„์˜ ์‹ฌ๋ฆฌ์™€ ํ–‰๋™์–‘์‹์„ ์ด์šฉํ•˜์—ฌ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ์— ์นจ์ž…ํ•˜๋Š” ๊ธฐ๋ฒ• SIEM : ๋ณด์•ˆ ์ •๋ณด ๋ฐ ์ด๋ฒคํŠธ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ; ๋ณด์•ˆ ๋กœ๊ทธ์™€ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์ง‘, ๋ถ„์„ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด์•ˆ ์œ„ํ˜‘์„ ํƒ์ง€ํ•˜๊ณ  ๋Œ€์‘ํ•˜๋Š” ์‹œ์Šคํ…œ ์›œ VS ๋ฐ”์ด๋Ÿฌ์Šค ์›œ : ์Šค์Šค๋กœ ๋ณต์ œํ•˜์—ฌ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „ํŒŒ๋˜๋Š” ์•…์„ฑ ์ฝ”๋“œ; ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์„ ๊ฐ์—ผ์‹œํ‚ค์ง€ ์•Š์Œ ๋ฐ”์ด๋Ÿฌ์Šค : ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์— ์‚ฝ์ž…๋˜์–ด ์‹คํ–‰๋  ๋•Œ๋งŒ ํ™œ์„ฑํ™”๋˜๋Š” ์•…์„ฑ ์ฝ”๋“œ; ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์„ ๊ฐ์—ผ์‹œํ‚ด ๋Œ€์นญํ‚ค, ๋น„๋Œ€์นญํ‚ค(๊ณต๊ฐœํ‚ค) ๋Œ€์นญํ‚ค : AES, DES, ARIA SEED ๋น„๋Œ€์นญํ‚ค : RSA, ECC ATM(Asynchronous Transfer Mode) : ๊ณ ์† ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•œ ์…€ ๊ธฐ๋ฐ˜์˜ ํŒจํ‚ท ๊ตํ™˜ ๋ฐฉ์‹; 53๋ฐ”์ดํŠธ์˜ ๊ณ ์ • ๊ธธ์ด ์…€์„ ์‚ฌ์šฉ ์Šค๋จธํ•‘(Smurfing) : ICMP ํŒจํ‚ท์„ ์ด์šฉํ•˜์—ฌ ๋Œ€๋Ÿ‰์˜ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” DoS ๊ณต๊ฒฉ ๊ธฐ๋ฒ•; ๊ณต๊ฒฉ์ž๊ฐ€ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ฃผ์†Œ๋กœ ICMP Echo ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์‘๋‹ต์„ ํƒ€๊ฒŸ์—๊ฒŒ ์ „์†กํ•˜๊ฒŒ ํ•จ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๊ฐœ๋… ๋‚™๊ด€์  ๊ฒ€์ฆ : ํŠธ๋žœ์žญ์…˜์„ ์ผ๋‹จ ์ˆ˜ํ–‰ํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜ ์ข…๋ฃŒ ์‹œ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ˜์˜ํ•˜๋Š” ๊ธฐ๋ฒ• 2PC (Two-Phase Commit) : ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์—์„œ ํŠธ๋žœ์žญ์…˜์˜ ์›์ž์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๋‹จ๊ณ„๋กœ ์ปค๋ฐ‹์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹ ์™„์ „ ํ•จ์ˆ˜ ์ข…์†(Full) : ๋ฆด๋ ˆ์ด์…˜์˜ ๋ชจ๋“  ์†์„ฑ์ด ๊ธฐ๋ณธํ‚ค์—๋งŒ ์ข…์†๋˜๋Š” ์ƒํƒœ ๋ถ€๋ถ„ ํ•จ์ˆ˜ ์ข…์†(Partial) : ๋ฆด๋ ˆ์ด์…˜์˜ ์ผ๋ถ€ ์†์„ฑ์ด ๊ธฐ๋ณธํ‚ค์—๋งŒ ์ข…์†๋˜๋Š” ์ƒํƒœ ์ดํ–‰ ํ•จ์ˆ˜ ์ข…์†(Transient) : A->B, B->C ์ด๋ฉด A->C๊ฐ€ ์„ฑ๋ฆฝํ•˜๋Š” ์ƒํƒœ ์ฒดํฌํฌ์ธํŠธ ํšŒ๋ณต ๊ธฐ๋ฒ• : ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๊ฒ€์‚ฌ์  ์ดํ›„์— ์ฒ˜๋ฆฌ๋œ ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•ด์„œ๋งŒ ์žฅ์• ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๊ธฐ๋ฒ• ๋กœํ‚น : ๋‹ค์ค‘ ํŠธ๋žœ์žญ์…˜ ํ™˜๊ฒฝ์—์„œ ํŠธ๋žœ ์žญ์…˜์˜ ์ˆœ์ฐจ์  ์ง„ํ–‰์„ ๋ณด์žฅํ•˜๋Š” ์ง๋ ฌํ™” ๊ธฐ๋ฒ• LIKE ๋ฌธ๋ฒ• % : 0๊ฐœ ์ด์ƒ์˜ ๋ฌธ์ž์—ด๊ณผ ์ผ์น˜ [ ] : 1๊ฐœ์˜ ๋ฌธ์ž์™€ ์ผ์น˜ [^ ] : 1๊ฐœ์˜ ๋ฌธ์ž์™€ ๋ถˆ์ผ์น˜ _ : ํŠน์ • ์œ„์น˜์˜ 1๊ฐœ ๋ฌธ์ž์™€ ์ผ์น˜ ๊ด€๊ณ„ ํ•ด์„ : ๋น„์ ˆ์ฐจ์  ์–ธ์–ด; ๊ด€๊ณ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์งˆ์˜ํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜ํ•™์  ํ‘œํ˜„ ๋ฐฉ๋ฒ• ALL : ์ฃผ๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์ค‘ํ–‰ ์—ฐ์‚ฐ์ž; ๋ชจ๋“  ํ–‰์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•จ ANY : ์ฃผ๋กœ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์ค‘ํ–‰ ์—ฐ์‚ฐ์ž; ํ•˜๋‚˜ ์ด์ƒ์˜ ํ–‰์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ์ฐธ ๊ด€๊ณ„๋Œ€์ˆ˜ ๊ธฐํ˜ธ: $\cup$(ํ•ฉ์ง‘ํ•ฉ), $-$(์ฐจ์ง‘ํ•ฉ), $\times$(์นดํ‹ฐ์…˜ ๊ณฑ), $\pi$(ํ”„๋กœ์ ํŠธ), $\bowtie$(์กฐ์ธ), $\sigma$(์„ ํƒ), $\div$(๋‚˜๋ˆ—์…ˆ) ์กฐ์ธ ๋ฐฉ์‹ Theta Join : ์กฐ์ธ ์กฐ๊ฑด์ด ๋“ฑํ˜ธ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋น„๊ต ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์กฐ์ธ ๋ฐฉ์‹ Equi Join : ์กฐ์ธ ์กฐ๊ฑด์ด ๋“ฑํ˜ธ(=)์ธ ์กฐ์ธ ๋ฐฉ์‹ Natural Join : ๋‘ ๋ฆด๋ ˆ์ด์…˜์˜ ๊ณตํ†ต ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์ž๋™์œผ๋กœ ์กฐ์ธํ•˜๋Š” ๋ฐฉ์‹ ์„ธ์…˜ ํ•˜์ด์žฌํ‚น (Session Hijacking) : ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์„ ํƒˆ์ทจํ•˜์—ฌ ๋ถˆ๋ฒ•์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ• OS ๊ด€๋ จ ๊ฐœ๋… ๋งˆ์ดํฌ๋กœ์ปค๋„ : ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ Kernel Mode๊ฐ€ ์•„๋‹Œ User Mode์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์ดˆ์†Œํ˜• ์ปค๋„ ํ”„๋กœ์„ธ์Šค ์Šค์ผ€์ฅด๋ง SJF(Shortest Job First) : ๊ฐ€์žฅ ์งง์€ ์ž‘์—…์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ HRN (Highest Response Ratio Next) : ๋Œ€๊ธฐ ์‹œ๊ฐ„๊ณผ ์„œ๋น„์Šค ์‹œ๊ฐ„์„ ๊ณ ๋ คํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹ RR(Round Robin) : ๊ฐ ํ”„๋กœ์„ธ์Šค์— ๋™์ผํ•œ ์‹œ๊ฐ„ ํ• ๋‹น๋Ÿ‰์„ ์ฃผ๊ณ  ์ˆœํ™˜์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ SRTF(Shortest Remaining Time First) : ๋‚จ์€ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ์งง์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ ํ”ผํ„ฐ์Šจ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋‘ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ๋ณด์žฅํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜; ํ”Œ๋ž™๊ทธ์™€ ํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ˜ธ ๋ฐฐ์ œ์™€ ์ง„์ž… ํ—ˆ์šฉ์„ ๊ตฌํ˜„ ๊ธฐํƒ€ ๊ฐœ๋… ํ”ผ์ฝ”๋„ท : ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ๋œ ์žฅ์น˜๊ฐ€ ๋ธ”๋ฃจํˆฌ์Šค ๊ธฐ์ˆ ์ด๋‚˜ UWB ํ†ต์‹  ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ ๋ง์„ ํ˜•์„ฑํ•˜๋Š” ๋ฌด์„  ๋„คํŠธ์›Œํฌ ๊ธฐ์ˆ  ์ง€๊ทธ๋น„ :์ €์† ์ „์†ก ์†๋„๋ฅผ ๊ฐ–๋Š” ํ™ˆ์˜คํ† ๋ฉ”์ด์…˜ ๋ฐ ๋ฐ์ดํ„ฐ ๋„คํŠธ์›Œํฌ๋ฅผ ์œ„ํ•œ ํ‘œ์ค€ ๊ธฐ์ˆ  ํด๋ฆฌ์–ด๋ง ํ•˜์šฐ์Šค : ๋””์ง€ํ„ธ ์ €์ž‘๊ถŒ ๋ผ์ด์„ ์‹ฑ์„ ์ค‘๊ฐœํ•˜๊ณ  ๋ผ์ด์„ ์Šค ๋ฐœ๊ธ‰์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ •์‚ฐ์†Œ ๋ฐ์ดํ„ฐ ๋งˆํŠธ : ๋ฐ์ดํ„ฐ์˜ ํ•œ ๋ถ€๋ถ„์œผ๋กœ์„œ ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ๋‹ด์€ ๋น„๊ต์  ์ž‘์€ ๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค OLAP : ์˜จ๋ผ์ธ ๋ถ„์„ ์ฒ˜๋ฆฌ; ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋žต์ ์ธ ์ •๋ณด๋กœ ๋ณ€ํ™˜์‹œ์ผœ์„œ ์˜์‚ฌ๊ฒฐ์ •์„ ์ง€์›ํ•˜๋Š” ์—ญํ•  ์ˆ˜ํ–‰ semantic web : ์›น ์ƒ์˜ ์ •๋ณด์— ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๊ธฐ๊ณ„๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ  ์˜จํ†จ๋กœ์ง€(Ontology) : ํŠน์ • ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ๊ฐœ๋…๊ณผ ๊ทธ๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๋ช…์„ธ ๋””์ง€ํ„ธ ์•„์นด์ด๋น™ : ๋””์ง€ํ„ธ ์ž๋ฃŒ๋ฅผ ์žฅ๊ธฐ์ ์œผ๋กœ ๋ณด์กดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ณผ์ • CEP(Complex Event Processing) : ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋Œ€๋Ÿ‰์˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๊ธฐ์ˆ  ๋…ธ๋ชจํฌ๋น„์•„ : ์Šค๋งˆํŠธํฐ์„ ์žƒ์–ด๋ฒ„๋ฆฌ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•œ ๋ถˆ์•ˆ๊ฐ ITIL(Information Technology Infrastructure Library) : ์˜๊ตญ ์ •๋ถ€๊ฐ€ ๋‹ค์–‘ํ•œ IT ์„œ๋น„์Šค๋“ค์˜ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•๋“ค์„ ๋ชจ์•„ ๋งŒ๋“  ํ‘œ์ค€์ ์ธ ์ฐธ๊ณ  ๋ฌธ์„œ ๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹ : ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ์—์„œ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ณผ์ • ์˜คํ”ˆ ์Šคํƒ : ์•„ํŒŒ์น˜ ๋ผ์ด์„ ์Šค๋กœ ๋ฐฐํฌ๋˜๋Š” ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ BCP(Business Continuity Planning) : ์žฌํ•ด ๋ฐœ์ƒ ์‹œ ๋น„์ฆˆ๋‹ˆ์Šค ์šด์˜์„ ์ง€์†ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ„ํš Trust Zone : ARM์—์„œ ๊ฐœ๋ฐœํ•œ ๋ณด์•ˆ ๊ธฐ์ˆ ๋กœ, ํ•˜๋“œ์›จ์–ด ๊ธฐ๋ฐ˜์˜ ๋ณด์•ˆ ์˜์—ญ์„ ์ œ๊ณตํ•˜์—ฌ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๊ธฐ์ˆ  WSDL (Web Services Description Language) : ์›น ์„œ๋น„์Šค์˜ ๊ธฐ๋Šฅ์„ ๊ธฐ์ˆ ํ•˜๋Š” XML ๊ธฐ๋ฐ˜์˜ ์–ธ์–ด EAI : ๊ธฐ์—… ๋‚ด ๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ†ตํ•ฉ ๋ฐ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์œ„ํ•œ ์†”๋ฃจ์…˜ NUI (Natural User Interface) : ์‹ ์ฒด๋ฅผ ํ™œ์šฉํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ : AES, DES, RSA, IDEA, Skipjack CVS : Concurrent Versions System; ๋ถ„์‚ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ; ์ค‘์•™ ์ง‘์ค‘์‹ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ SVN : Subversion; ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์˜ ์ผ์ข…; CVS์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋จ
new ์ปดํŒŒ์ผ๋Ÿฌ๊ฐœ๋ก 
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๊ฐœ์š” ์ปดํ“จํ„ฐ์™€ ์ธ๊ฐ„์ด ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ• ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์–ด์…ˆ๋ธ”๋ฆฌ์–ด์˜ ๋ฒˆ์—ญ๊ธฐ๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ(Assembler)๋ผ๊ณ  ํ•œ๋‹ค cpu์นฉ์…‹์ด ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๊ฐ€ ๋ฐ”๋€๋‹ค ๊ณ ๊ธ‰์–ธ์–ด ๊ณ ๊ธ‰์–ธ์–ด์˜ ๋ฒˆ์—ญ๊ธฐ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ(Compiler)๋ผ๊ณ  ํ•œ๋‹ค ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ •ํ™•ํ•œ ์ •์˜ ์–ด๋–ค ์–ธ์–ด๋กœ ์“ฐ์—ฌ์ง„ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ™์€ ์—ญํ• ์˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ 1952๋…„ ๊ทธ๋ ˆ์ด์Šค ํ˜ธํผ(Grace Hopper)๊ฐ€ UNIVAC์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด A-0 ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ œ์ž‘ ์ปดํŒŒ์ผ๋Ÿฌ vs ์ธํ„ฐํ”„๋ฆฌํ„ฐ ํ”„๋กœ๊ทธ๋žจ ์ฒ˜๋ฆฌ๊ณผ์ • ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ฒ˜๋ฆฌ ๊ณผ์ • Lexical analysis (์–ดํœ˜ ๋ถ„์„) token์„ ์ƒ์„ฑํ•˜๋Š”์ผ, token์€ ์–ดํœ˜์˜ ์ตœ์†Œ ๋‹จ์œ„ Syntax analysis (๊ตฌ๋ฌธ ๋ถ„์„) token์„ ์ฝ์–ด์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ƒ‰, ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ ๋‹ค (์ฃผ๋กœ ํŠธ๋ฆฌํ˜•ํƒœ) Semantic analysis (์˜๋ฏธ ๋ถ„์„) type checking Intermediate code generation (์ค‘๊ฐ„ ์ฝ”๋“œ ์ƒ์„ฑ) ์ค‘๊ฐ„ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ Code optimization (์ฝ”๋“œ ์ตœ์ ํ™”) ์ค‘๊ฐ„ ์ฝ”๋“œ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋ณ€ํ™˜ Code generation (์ฝ”๋“œ ์ƒ์„ฑ) ๋ชฉ์  ์ฝ”๋“œ ์ƒ์„ฑ Lexical analysis (์–ดํœ˜ ๋ถ„์„) token : ๋ฌธ๋ฒ•์ ์œผ๋กœ ์˜๋ฏธ์žˆ๋Š” ์ตœ์†Œ ๋‹จ์œ„ FSA (Finite State Automata, ์œ ํ•œ ์ƒํƒœ ์˜คํ† ๋งˆํƒ€) token์„ ์ธ์‹ํ•˜๋Š” ๋ฐฉ๋ฒ• ์‹œ์ž‘ ์ƒํƒœ ํ•œ ๊ฐœ์™€ ๋ ์ƒํƒœ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ฐ€์ง DFA (Deterministic Finite Automata) FSA์˜ ํ•œ ์ข…๋ฅ˜ ๊ฐ ์ƒํƒœ์—์„œ ๋ป—์–ด๋‚˜๊ฐ€๋Š” edge๊ฐ€ ํ•˜๋‚˜์”ฉ๋งŒ ์กด์žฌ ฮต๊ฐ€ ๋ถ™์€ edge ์—†์Œ ๋ถ„์„ํ•œ ํ† ํฐ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• Lexeme = <ํ† ํฐ๋ฒˆํ˜ธ, ํ† ํฐ ๊ฐ’> ์˜ˆ์‹œ if X < Y … (29, 0) (1, X) (18, 0) (1, Y) … ์‹๋ณ„์ž์˜ ํ† ํฐ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ, ์ƒ์ˆ˜๋Š” 2๋ฒˆ ๋“ฑ์œผ๋กœ ๊ณ ์ • Syntax analysis (๊ตฌ๋ฌธ ๋ถ„์„) token์„ ์ฝ์–ด์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ƒ‰, parse tree๋ฅผ ๋งŒ๋“ ๋‹ค CFG (Context Free Grammer) ๊ตฌ๋ฌธ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• G = (N, T, P, S) N = nonterminal symbol ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ ํ‘œํ˜„ T = terminal symbol (token) ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž+์ˆซ์ž, ์—ฐ์‚ฐ์ž, ๊ตฌ๋ถ„์ž, ํ‚ค์›Œ๋“œ ๋“ฑ P = production rule ์˜ˆ) S -> T+T, T -> ‘0’|‘1’|‘2’ S = start symbol L(G) : ์ด ๋ฌธ๋ฒ•์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์–ธ์–ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ CFG ํ‘œํ˜„๋ฒ• BNF (Backus-Naur Form) EBNF (Extended BNF) ์œ ๋„ (derivation) ์ƒ์„ฑ ๊ทœ์น™๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฌธ์žฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ • ์œ ๋„๋ฅผ ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ•˜๋‚˜์”ฉ ๊ณจ๋ผ์„œ ๋ฐ”๊ฟˆ ์œ ๋„ ํŠธ๋ฆฌ : ์œ ๋„ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ƒํ™” ์‹œ์ผœ ํ‘œํ˜„ํ•œ ๊ฒƒ ์ขŒ์ธก ์œ ๋„(leftmost derivation) ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” nonterminal์„ ๋จผ์ € ๋Œ€์น˜ ์šฐ์ธก ์œ ๋„(rightmost derivation) ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” nonterminal์„ ๋จผ์ € ๋Œ€์น˜ ๋ชจํ˜ธ์„ฑ (ambiguity) ๋ฌธ๋ฒ• G์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ์–ด๋–ค ๋ฌธ์žฅ์ด ๋‘๊ฐœ ์ด์ƒ์˜ ์œ ๋„ํŠธ๋ฆฌ๋ฅผ ๊ฐ–๋Š”๋‹ค๋ฉด ๋ฌธ๋ฒ• G๋Š” ๋ชจํ˜ธํ•˜๋‹ค๊ณ  ํ•œ๋‹ค ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๋ฌธ๋ฒ•์€ ์ขŒ์ธก ์œ ๋„์™€ ์šฐ์ธก ์œ ๋„๊ฐ€ ๊ฐ™๋‹ค ๋ชจํ˜ธ์„ฑ ํ•ด๊ฒฐ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ๋„์ž… ๊ฒฐํ•ฉ ๋ฒ•์น™ ๋„์ž… Left Recursion์€ ์ขŒ์ธก ๊ฒฐํ•ฉ์— ์‚ฌ์šฉ ex) A -> A+a | a Right Recursion์€ ์šฐ์ธก ๊ฒฐํ•ฉ์— ์‚ฌ์šฉ ex) A -> a+A | a ๊ตฌ๋ฌธ ๋ถ„์„์˜ 2๊ฐ€์ง€ ๋ฐฉ์‹ top-down, bottom-up Top-down parsing Top-down ๋ฐฉ์‹ ์ขŒ์ธก ์œ ๋„์™€ ๊ฐ™์€ ์ˆœ์„ ์˜ ์ƒ์„ฑ ๊ทœ์น™ ์ ์šฉ backtracking : ์œ ๋„๋œ ๋ฌธ์ž์—ด๊ณผ ์ž…๋ ฅ ๋ฌธ์ž์—ด์ด ๊ฐ™์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ์ƒ์„ฑ๊ทœ์น™ ์ ์šฉ Bottom-up ๋ฐฉ์‹ ์šฐ์ธก ์œ ๋„์˜ ์—ญ์ˆœ์˜ ์ƒ์„ฑ ๊ทœ์น™ ์ ์šฉ LL ํŒŒ์‹ฑ ์™ผ์ชฝ->์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฝ์–ด์„œ ์ขŒํŒŒ์Šค ์ƒ์„ฑ backtracking X, ๋น ๋ฅด๋‹ค ๊ฒฐ์ •์ ์œผ๋กœ ํŒŒ์‹ฑ ์‚ฌ์šฉ๋œ ์ •์˜ ฮต-์ƒ์„ฑ๊ทœ์น™ Nonterminal A๊ฐ€ ฮต๋ฅผ ์œ ๋„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด A๋ฅผ nullableํ•˜๋‹ค๊ณ  ๋ถ€๋ฅธ๋‹ค lhs, rhs A->XXX์—์„œ lhs๋Š” A, rhs๋Š” XXX โŠ• (Ring Sum) A์— ฮต๊ฐ€ ์žˆ์œผ๋ฉด, AโŠ•B = (A์—์„œ ฮต๋นผ๊ณ  A ํ•ฉ์ง‘ํ•ฉ B) A์— ฮต๊ฐ€ ์—†์œผ๋ฉด, AโŠ•B = A First nonterminal A๋กœ ๋ถ€ํ„ฐ ์œ ๋„๋˜์–ด ์ฒซ๋ฒˆ์งธ๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” terminal์˜ ์ง‘ํ•ฉ X->Y1Y2Y3์ผ๋•Œ, FIRST(X) = FIRST(X) U FIRST(Y1) โŠ• FIRST(Y2) โŠ• FIRST(Y3) Follow A ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” terminal์˜ ์ง‘ํ•ฉ A->ฮฑBฮฒ, ฮฒ != ฮต ์ผ๋•Œ, FOLLOW(B) = FOLLOW(B) U (FIRST(ฮฒ)-{ฮต}) A->ฮฑB ๋˜๋Š” A->ฮฑBฮฒ, FIRST(ฮฒ)์— ฮต๊ฐ€ ์†ํ•  ๋•Œ, FOLLOW(B) = FOLLOW(B) U FOLLOW(A) LL์กฐ๊ฑด FIRST(ฮฑ)์™€ FIRST(ฮฒ)๊ฐ€ ๊ฒน์น˜๋ฉด ์•ˆ๋œ๋‹ค FIRST(ฮฑ)์— ฮต๊ฐ€ ์žˆ์œผ๋ฉด, FOLLOW(ฮฑ)์™€ FIRST(ฮฒ)๊ฐ€ ๊ฒน์น˜๋ฉด ์•ˆ๋œ๋‹ค LL ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ๋ฒ• = LL ํŒŒ์‹ฑ ๋˜๋Š” ๋ฌธ๋ฒ• LL(1) ๋ฌธ๋ฒ• ์ž„์˜์˜ ๋ฌธ๋ฒ•์— ๋Œ€ํ•˜์—ฌ LL ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” CFG 1 : LOOKAHEAD๊ฐ€ 1๊ฐœ๋ผ๋Š” ์˜๋ฏธ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ LL(1)๋ฌธ๋ฒ•์ด ๋˜์ง€ ์•Š๋Š”๋‹ค ๋ชจํ˜ธํ•œ ๋ฌธ๋ฒ• ์šฐ์„ ์ˆœ์œ„ ์ฃผ๊ธฐ, ๊ฒฐํ•ฉ๋ฒ•์น™ ๋ฐ˜์˜์œผ๋กœ ํ•ด๊ฒฐ left-factoring์ด ๋˜๋Š” ๊ฒฝ์šฐ ๊ณตํ†ต ์•ž๋ถ€๋ถ„์„ ์ƒˆ๋กœ์šด nonterminal๋กœ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐ left-recursiveํ•œ ๊ฒฝ์šฐ ์ง์ ‘ recursion : A -> Aฮต ์ธ๊ฒฝ์šฐ ๊ฐ„์ ‘ recursion : A -> B, B -> A ์ธ๊ฒฝ์šฐ LOOKAHEAD ์–ด๋–ค ๊ทœ์น™์ด ์ ์šฉ๋˜์—ˆ์„๋•Œ ๋งจ ์ฒ˜์Œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” terminal ์ง‘ํ•ฉ A->X1X2X3์ผ๋•Œ, LOOKAHEAD(A) = FIRST(X1) โŠ• FIRST(X2) … โŠ• FOLLOW(A) Strong LL(1) LL(1)๊ณผ ํ•ญ์ƒ ๋™์ผ (1์ด ์•„๋‹๋•Œ๋Š” ๋‹ค๋ฆ„) LOOKAHEAD(A->ฮฑ)์™€ LOOKAHEAD(A->ฮฒ)๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋Š” ๋ฌธ๋ฒ• LL(1) ํŒŒ์„œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• Recursive descent parser ์žฅ์  : ์ง๊ด€์  ์‰ฝ๋‹ค ๋‹จ์  : ์ƒ์„ฑ ๊ทœ์น™์ด ๋ฐ”๋€Œ๋ฉด ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค Predictive parser PDA(PushDown Automata)์— ๊ธฐ๋ฐ˜ ์ƒ์„ฑ ๊ทœ์น™์ด ๋ฐ”๋€Œ๋ฉด ํŒŒ์‹ฑ ํ…Œ์ด๋ธ”๋งŒ ์ˆ˜์ • ํŒŒ์‹ฑํ…Œ์ด๋ธ” ์˜ˆ์‹œ (?์—๋Š” ๊ทœ์น™๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค) a b S ? ? A ? ? ํŒŒ์‹ฑํ…Œ์ด๋ธ”์— ๋‘๊ฐœ ์ด์ƒ์˜ ์ƒ์„ฑ ๊ทœ์น™์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ -> NOT LL(1) Stack์˜ ์˜ˆ์‹œ Bottom-up parsing left-recursive ๋ฌธ๋ฒ•๋„ ํŒŒ์‹ฑ ๊ฐ€๋Šฅ LL(k) ์ขŒ์ธก์œ ๋„ ๊ธฐ๋ฐ˜ k๊ฐœ์˜ symbol์„ lookahead Top-down parsing, recursive descent parsing, predictive parsing, LL parser ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ pre-roder๋กœ ์ˆœํšŒ ๋ฐ ์ƒ์„ฑ LR(k) ์šฐ์ธก์œ ๋„ ๊ธฐ๋ฐ˜ k๊ฐœ์˜ symbol์„ lookahead Bottom-up parsing, shift-reduce parsing, LR parser ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ post-order๋กœ ์ˆœํšŒ ๋ฐ ์ƒ์„ฑ Reduce S=>ฮฑฮฒฯ‰์ด๊ณ  A->ฮฒ์ด๋ฉด ฮฒ๋ฅผ A๋กœ ๋Œ€์น˜ํ•˜๋Š” ๊ฒƒ : S=>ฮฑAฯ‰ ์‹œ์ž‘ symbol์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ reduce ํ•œ๋‹ค Handle S=>ฮฑฮฒฯ‰์ด๊ณ  A->ฮฒ์ด๋ฉด ฮฒ๋ฅผ ฮฑฮฒฯ‰์˜ handle์ด๋ผ๊ณ  ํ•œ๋‹ค ๋‘ ๊ฐœ ์ด์ƒ์˜ handle์ด ์กด์žฌํ• ๋•Œ -> ๋ชจํ˜ธํ•˜๋‹ค Shift์™€ Reduce๋กœ Parsing ํ•˜๊ธฐ Stack์˜ ์˜ˆ์‹œ Issue Shift์™€ Reduce ์ค‘ ์–ด๋А ๊ฒƒ์„ ํ• ๊นŒ? Stack์˜ top์—์„œ ์–ผ๋งˆ๋งŒํผ์„ handle๋กœ ๋ณผ ๊ฒƒ์ธ๊ฐ€? ํ•ด๊ฒฐ๋ฐฉ๋ฒ•: LR Parsing Table YACC LALR ํŒŒ์„œ ์ƒ์„ฑ๊ธฐ foo.y –(yacc)–> y.tab.c –(gcc)–> a.out *.y ํŒŒ์ผ ๊ตฌ์กฐ 1<์„ ์–ธ๋ถ€> 2... 3%% 4... 5exp : exp '+' term; 6factor : ident; 7... 8%% 9<์—ฌ๋Ÿฌ ํ•จ์ˆ˜> ๋ชจํ˜ธํ•œ ๋ฌธ๋ฒ•์œผ๋กœ LR Conflict ๋ฐœ์ƒ ์‹œ ์„ ์–ธ๋ถ€์—์„œ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •ํ•˜์—ฌ ํ•ด๊ฒฐ LR Parsing Table Action table : Action + Parser ์ƒํƒœ Goto table : Parser ์ƒํƒœ LR(0) ํŒŒ์‹ฑ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ LR(0) ์•„์ดํ…œ rhs์— ์ (’.’) symbol์„ ๊ฐ€์ง„ ์ƒ์„ฑ ๊ทœ์น™ ex) A->ฮฑ.ฮฒ, A->. closure ์ (’.’)๋’ค์— non-terminal์ด ์˜ค๋ฉด ์žฌ๊ท€์ ์œผ๋กœ ์ถ”๊ฐ€ S’ -> S, S -> (L)|id, L -> S | L,S closure({[S’->.S]}) = {[S’->.S], [S->.(L)], [S->.id]} goto goto(I, X)์ด๋ฉด ์ ์„ X๋’ค๋กœ ์˜ฎ๊ธฐ๊ณ  closure๋ฅผ ์ทจํ•œ๋‹ค X๊ฐ€ ์—†์œผ๋ฉด ๋„ฃ์ง€ ์•Š๋Š”๋‹ค I={[G->E=E], [E->E.+T]} ์ผ๋•Œ, goto(I, +) = closure({E->E+.T}) : ์ ์„ +๋’ค๋กœ ์˜ฎ๊น€ C0 ์ƒ์„ฑ๊ทœ์น™ S’->S์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ closure์™€ goto๋ฅผ ์ ์šฉํ•˜์—ฌ ์–ป์€ ๋ชจ๋“  ํƒ€๋‹นํ•œ LR(0)์˜ ์•„์ดํ…œ ์ง‘ํ•ฉ๋“ค Item์˜ ์ข…๋ฅ˜ [A->X.Y] : X!=ฮต์ผ๋•Œ kernel item [A->.X] : closure item [A->X.] : reduce item SLR ํŒŒ์‹ฑ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ reduce Item์ด [X->ฮฑ.]์ผ๋•Œ, FOLLOW(X)์˜ ๋ชจ๋“  terminal์—๋งŒ reduce action์„ ๋„ฃ๋Š”๋‹ค ๋‚˜๋จธ์ง€๋Š” LR(0)๊ณผ ๋˜‘๊ฐ™๋‹ค LR(0)๋ณด๋‹ค conflict๊ฐ€ ์ ์–ด, ๋” ์ •๊ตํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. LALR Parsing ์ •๊ตํ•œ ์ˆœ์„œ LR(0) < SLR < LALR(1) < LR(1) ํŒŒ์„œ ์ƒํƒœ์˜ ๊ฐœ์ˆ˜ SLR = LALR « LR(1) SDD, AST SDD (Syntax Directed Definition) SDD : semnatic action์„ ์ •์˜ํ•˜๋Š” ์ถ”์ƒ์ ์ธ ๋ช…์„ธ์„œ Semnatic Actions : ๊ทœ์น™์— ๋Œ€ํ•œ Action Yacc/Bison : $$, $1, $2, ... ์‚ฌ์šฉ ANTLR : $<name> ์‚ฌ์šฉ Type declaration Attribute ์ข…๋ฅ˜ synthesized attr. : children์— ์˜ํ•ด ๊ณ„์‚ฐ (terminal) inherited attr. : parent, sibling์— ์˜ํ•ด ๊ณ„์‚ฐ AST (Abstract Syntax Tree) ํŒŒ์ŠคํŠธ๋ฆฌ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•œ ํ˜•ํƒœ AST๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• ํŒŒ์‹ฑ๋‹จ๊ณ„์—์„œ ๋งŒ๋“ค๊ธฐ : LL, LR ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋งŒ๋“ค๊ธฐ : SDD ์‚ฌ์šฉ (Yacc etc.) evaluation : ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด์„œ ์ž‘์—…ํ•˜๋Š” ํ–‰์œ„ On-the-fly evaluation S-attributed SDD: synthesized attribute๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” SDD L-attributed SDD: synthesized attribute๋งŒ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ + ๊ฐ’์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ˜๋Ÿฌ ๊ณ„์‚ฐ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝ์šฐ IR (Intermediate Representation) IR์ด๋ž€? Tree๋‚˜ Instruction list ํ˜•ํƒœ instruction(node)๊ฐ€ ์ ์–ด์•ผ ์ตœ์ ํ™”/๋ฒˆ์—ญ์— ์ข‹์Œ High Level IR High์™€ Low๋Š” ์ƒ๋Œ€์ ์ธ ๊ฐœ๋… High level IR: ์—ฌ๊ธฐ์„œ๋Š” AST์˜ ๋ณ€ํ˜•๋งŒ ์ƒ๊ฐ ์ข…๋ฅ˜ : AST, TCOL Low Level IR ๋‹จ์ˆœํ•œ instruction์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€์ƒ๊ธฐ๊ณ„(์ฃผ๋กœ RISC)๋ฅผ emulate N-tuple ํ‘œ๊ธฐ๋ฒ• (3-address code) a = b OP c ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๊ณ„์–ด๊ฐ€ ๊ฐ€์ง€๋Š” ํ”ผ์—ฐ์‚ฐ์ž ๊ฐœ์ˆ˜ <= 3 quadruple : (์—ฐ์‚ฐ์ž, ํ”ผ์—ฐ์‚ฐ์ž1, ํ”ผ์—ฐ์‚ฐ์ž2, ๊ฒฐ๊ณผ) Stack machine code Java byte code, U-code : AST๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ์ด ์šฉ์ด Tree ํ‘œํ˜„ ๊ธฐ๊ณ„์–ด ์ƒ์„ฑ ์šฉ์ด IR ์˜ˆ์‹œ GCC - GIMPLE (3-address code) GCC์˜ ์ค‘๊ฐ„์ฝ”๋“œ : GENERIC -> GIMPLE -> RTL 1D.1954 = x*10 // D.1954๋Š” ์ž„์‹œ๋ณ€์ˆ˜ 2gimple_assign <mult_exprt, D.1954, x, 10> LLVM - bit (3-address code) LLVM IR : ์–ธ์–ด์™€ ๋จธ์‹ ์— ๋…๋ฆฝ์  1@var = global i32 14 ; ์ „์—ญ๋ณ€์ˆ˜ var์— 14 ๋Œ€์ž… 2define i32 @main() nounwind { ; i32(int) ๋ฐ˜ํ™˜ํ˜• 3 entry: 4 %a = alloca i32, align 4 ; ์ง€์—ญ๋ณ€์ˆ˜ a ์„ ์–ธ, int ํ• ๋‹น 5 %1 = load i32 * @var ; %1 ์ž„์‹œ๋ณ€์ˆ˜์— var๊ฐ’ ๋Œ€์ž… 6 ret i32 %1 ; ์ž„์‹œ๋ณ€์ˆ˜ ๊ฐ’ ๋ฐ˜ํ™˜ 7} JVM - byte code (stack machine code) ๊ฐ€์ƒ ๊ธฐ๊ณ„ ์ฝ”๋“œ (Bytecode, MSIL) ๊ฐ€์ƒ ๊ธฐ๊ณ„์—์„œ ๋™์ž‘ํ•˜๋„๋ก ํ•จ ์ด์‹์„ฑ, ํ˜ธํ™˜์„ฑ์ด ๋ชฉ์  : java bytecode๋Š” machine ํ˜ธํ™˜์„ฑ, c# msil์€ language ํ˜ธํ™˜์„ฑ 1public Employee(String strName, int num) 2{name = strName; idNumber = num; storeData(strName, num);} 3Method Employee(java.lang.String, int) 4 50 aload_0 ; 0๋ฒˆ์งธ ๋กœ์ปฌ๋ณ€์ˆ˜(this)๋ฅผ ์Šคํƒ์— push 61 invokespecial #3 <Method java.lang.Object()> ; ํ•จ์ˆ˜ ํ˜ธ์ถœ 7--- 84 aload_0 95 aload_1 ; strName์„ ์Šคํƒ์— push 106 putfield #5 <Field java.lang.String name> ; name์— strName ๋Œ€์ž… 11--- 129 aload_0 1310 iload_2 ; num์„ ์Šคํƒ์— push 1411 putfield #7 <Field int idNumber> ; idNumber์— num ๋Œ€์ž… 15--- 1614 aload_0 1715 aload_1 ; strName์„ ์Šคํƒ์— push 1816 iload_2 ; num์„ ์Šคํƒ์— push 1917 invokespecial #9 <Method void storeData(java.lang.String, int)> ; ํ•จ์ˆ˜ ํ˜ธ์ถœ 2020 return line number : ๋ช…๋ น์ด ์‹œ์ž‘ํ•˜๋Š” ๋ฐ”์ดํŠธ ์ฃผ์†Œ aload : ๊ฐ์ฒด๋ฅผ push, iload : ์ •์ˆ˜๋ฅผ push ์›๋ž˜๋Š” aload๊ฐ€ ๋ช…๋ น, ์ž์ฃผ ์“ฐ๋Š” ๋ช…๋ น aload 0์„ ๋ฌถ์–ด์„œ bind -> aload_0 CIL (Common Intermediate Language) (stack machine code) C#, VB.NET, J# ๋“ฑ์—์„œ ์‚ฌ์šฉ MSIL์€ ์˜›๋‚  ์ด๋ฆ„ 1.assembly Hello {} ; .assembly: ์–ด์…ˆ๋ธ”๋ฆฌ ์„ ์–ธ 2.assembly extern mscorlib {} 3.method static void Main() { 4 .entrypoint 5 .maxstack 1 6 ldstr "Hello, world!" ; stack์— ์ €์žฅ 7 call void [mscorlib]System.Console::WriteLine(string) 8 ret 9} GCC RTL(Register Transfer Language) (Tree๊ตฌ์กฐ ์ฝ”๋“œ) Lisp S-expression ์‚ฌ์šฉ 1(set (reg:SI 140) 2 (plus:SI (reg:SI 138) 3 (reg:SI 139))) => reg140 = reg138+reg139 IR generation 3-address Translation ๊ทœ์น™ Binary operations: t = [[el OP e2]] Unary operations: t = [[OP el]] Array access: t = [[ v[e] ]] Structure access: t = [[ v.f ]] Short-circuit OR: t = [[ el SC-OR e2]] Statement sequence: [[s1; s2; ...; sN]] Variable assignment: [[ v = e ]] Array assignment: [[ v[e1] = e2 ]] If: [[ if(e) then s ]], [[ if(e) then s1 else s2]] While: [[ while (e) s ]] Switch: [[ switch (e) case v1:s1, ..., case vN:sN ]] Function Call: [[ call f(e1, e2, ..., eN) ]] Fucntion Return: [[ return e ]] Statement Expression Statement๋„ expression ์ฒ˜๋Ÿผ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ํ™•์žฅ t = [[ S ]]๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•˜์ž Nested Expressions t = [[ (a - b) * (c + d) ]] t = [[ if c then if d then a = b ]] ๊ฐ€์žฅ ํฐ ๋ฉ์–ด๋ฆฌ๋ถ€ํ„ฐ ๋ฐ”๊พผ๋‹ค Storage Management 2๊ฐ€์ง€ Storage Register : ๋น ๋ฅธ ์ ‘๊ทผ, ๊ฐ„์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€ Memory : ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฐ ์ ‘๊ทผ, ๊ฐ„์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ 2๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹ All memory approach ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ memory์— ์ €์žฅ, ๊ฐ€๋Šฅํ•œ๊ฒƒ๋งŒ register Standard approach Global, Statics, Local(composite)๋Š” memory์— ์ €์žฅ Local(scalar)๋Š” memory ๋˜๋Š” virtual register์— ์ €์žฅ Memory์˜ 4๋Œ€ ์˜์—ญ Code space : ๋ช…๋ น์–ด๋ฅผ ์ €์žฅ read-only์ผ๋•Œ ๋น ๋ฆ„ Static data : ํ”„๋กœ๊ทธ๋žจ๊ณผ lifetime์„ ํ•จ๊ป˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ Stack : Local ๋ณ€์ˆ˜๋“ค Heap : ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ File Format Windows : PE (Portable Executable) Unix : ELF (Executable and Linkable Format) ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ environment : <๋ณ€์ˆ˜, storage location> ์ •๋ณด state: <๋ณ€์ˆ˜, ๊ฐ’> ์ •๋ณด ์–ด๋–ค ๋ณ€์ˆ˜ N์ด storage location S์— ์ง€์ •๋˜๋ฉด ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค Static Allocation ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๋ณ€ํ•˜์ง€ ์•Š๋Š” location์œผ๋กœ ๋ฐ”์ธ๋”ฉ Heap Allocation ์—ฐ์†์ ์ธ global ์˜์—ญ์˜ ์ผ๋ถ€๋ฅผ OS๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๊ฒƒ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์ค‘ ์š”์ฒญ๊ณผ ๋ฐ˜ํ™˜ Stack Management Run-time stack : ํ•œ ํ•จ์ˆ˜ call๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ๋‘๋Š” frames Activation record : ํ•จ์ˆ˜ ์ˆ˜ํ–‰์„ ์œ„ํ•œ execution env(local var, parameter, return address, etc.) Top frame : ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ ํ•จ์ˆ˜์˜ frame Stack pointers SP : Frame top FP : Frame base ๋‘ ๊ฐœ๋ฅผ ์“ฐ๋Š” ์ด์œ  ๊ฐ€๊นŒ์šด ๊ฑฐ ๊ธฐ์ค€์œผ๋กœ offset ๊ณ„์‚ฐ -> small offset ์œ ์ง€ ์ˆ˜ํ–‰ ์ค‘ top frame์˜ ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์—†์Œ Semantic Analysis - Symbol Tables Scope Identifier: ์‹๋ณ„์ž Lexical Scope: ํŠน์ • ๋ฒ”์œ„ ์‹๋ณ„์ž์˜ Scope: ๊ทธ ์‹๋ณ„์ž์˜ ์„ ์–ธ์ด ์ฐธ์กฐ๋˜๋Š” lexical scope Symbol Table Name Kind Type Attribute foo func int, int -> int extern m arg int tmp var char const ํ•˜๋‚˜์˜ lexical๋งˆ๋‹ค ํ•˜๋‚˜์˜ symbol table symbol table์€ ๊ณ„์ธต์ ์ด๋‹ค ํ˜„์žฌ scope์— ์—†์œผ๋ฉด ์ƒ์œ„ scope๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์ฐพ๋Š”๋‹ค Symbol Table Implementation AST๊ฐ€ ๋งŒ๋“ค์–ด์ ธ์•ผ ๊ฐ€๋Šฅ Local Table์€ hash table ์‚ฌ์šฉ Global Table์€ N-array tree ๊ตฌ์กฐ ์‚ฌ์šฉ ์ฝ”๋“œ๋ฅผ ์ˆœ์ฐจ๋Œ€๋กœ ์ฝ์œผ๋ฉด์„œ ๋งŒ๋“ฌ (scope ์Šคํƒ์„ ์‚ฌ์šฉ) Type Checking Type Expressions Array types: T[], T[10] Structure types : {id1: T1, id2: T2 …} Pointer types: T* Function types: T1 X T2 X … X Tn -> T_return Type Judgement A โ”œ E : T A ์ƒํ™ฉ์—์„œ E๋Š” Tํƒ€์ž…์„ ๋งŒ์กฑํ•œ๋‹ค A โ”œ if(E) S1 else S2 : T ์œ„ ์กฐ๊ฑด์€ ๋ชจ๋“  E, S1, S2, A, T์— ๋Œ€ํ•œ ๊ฐ€์ •์ด ์„ฑ๋ฆฝํ•  ๋•Œ ๊ฒฐ๋ก  T๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค Proof Tree (ํƒ€์ž… ์œ ๋„ ํŠธ๋ฆฌ) ์—ญ์‚ผ๊ฐํ˜• ๋ชจ์–‘ ๋งŒ์กฑํ•˜๋Š” proof tree๊ฐ€ ์žˆ๋‹ค -> ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์—†๋‹ค ๊ทธ ์™ธ Semantic Analyses break, continue, goto ๋ฌธ์ด ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์žˆ๋Š” ์ง€ ๋“ฑ ์ปดํŒŒ์ผ๋Ÿฌ ํ›„๋ฐ˜๋ถ€ (๋น ๋ฅด๊ณ , ์‹ค์ œ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๊ธฐ) Instruction Selection Tree ๊ธฐ๋ฐ˜ Intermediate Representation MEM(e) : ์ฃผ์†Œ e๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ•œ word์˜ ๋‚ด์šฉ TEMP(t) : ๋ ˆ์ง€์Šคํ„ฐ t SEQ(s1, s2): ๋ฌธ์žฅ s1 ์ˆ˜ํ–‰ ํ›„ s2 ์ˆ˜ํ–‰ ESEQ(s, e): ๋ฌธ์žฅ s ์ˆ˜ํ–‰ ํ›„ (๊ฒฐ๊ณผ ์—†์Œ) e๊ฐ€ ์ถ”๊ฐ€ ์ˆ˜ํ–‰ BINOP(o, e1, e2) : ์—ฐ์‚ฐ์ž o, ํ”ผ์—ฐ์‚ฐ์ž e1, e2, ๊ฒฐ๊ณผ ์ €์žฅ๋œ ์ฃผ์†Œ ๋ฐ˜ํ™˜ const(i): ์ •์ˆ˜ ์ƒ์ˆ˜ i Register Allocation ์ตœ์ ํ™” ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ํ•œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ Register์— ์ €์žฅ Interference ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ definition์ด live range ์—์„œ ๊ณตํ†ต operation์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ Interference Graph : ์„œ๋กœ interfere ํ•˜๋ฉด ์—ฐ๊ฒฐํ•˜๋Š” ๊ทธ๋ž˜ํ”„ Graph coloring : ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋Š” ๋‹ค๋ฅธ ์ƒ‰์œผ๋กœ ์น ํ•˜๊ธฐ Instruction Scheduling instruction์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ์–ด stall ๊ฐœ์ˆ˜ ๋“ฑ์„ ์ค„์—ฌ์„œ ์ˆ˜ํ–‰์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ stall : ๋‹ค๋ฅธ ๋ช…๋ น์–ด ์ˆ˜ํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ๋А๋ผ CPU๋ฅผ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒƒ ๋ชฉํ‘œ Wasting time์„ ์ค„์ธ๋‹ค ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ๋‚˜์™€์•ผํ•œ๋‹ค register spilling์„ ํ”ผํ•ด์•ผํ•œ๋‹ค Static scheduling ๋‹จ๊ณ„ Local basic scheduling, Loop scheduling, global scheduling Local basic scheduling List scheduling : greedy, heuristic, local technique ์‚ฌ์šฉ precedence graph๋ฅผ ๋งŒ๋“ ๋‹ค ๊ฐ ๋…ธ๋“œ์— priority function์„ ์ ์šฉํ•œ๋‹ค “ready-operation queue"๋ฅผ ์—์„œ ready operation์„ ํ•˜๋‚˜ ์„ ํƒ ํ›„ scheduling, ready operation queue๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. Longest latency-weighted path๋ฅผ ์ด์šฉํ•ด์„œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•œ๋‹ค ๊ธฐํƒ€ Optimization ๋ฐฉ๋ฒ• addr r1 1 -> inc r1 ํŠน์ˆ˜ ์„ฑ์งˆ์˜ ๋ ˆ์ง€์Šคํ„ฐ ํ™œ์šฉ ํŠน์ˆ˜ ๋ชฉ์ ์˜ ๋ช…๋ น์–ด ํ™œ์šฉ Register ๊ฐ„ mov ์ œ๊ฑฐ ์ค‘๋ณต๋œ load ์ œ๊ฑฐ Control Flow Optimizations(์ตœ์ ํ™”) ์ฃผ์–ด์ง„ ์ž…๋ ฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ข€ ๋” ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ถ„๋ฅ˜ ๋ฐฉ๋ฒ• ๋ถ„์„ : Control Flow Analysis vs Data Flow Analysis ์ตœ์ ํ™” Inner basic block(local) vs Inter basic block(global) Cyclic code opt vs Acyclic code opt Control Flow Analysis Control Flow ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ€๋Šฅํ•œ ์ˆ˜ํ–‰์ˆœ์„œ (๋ถ„๊ธฐ) Branch Execution -> dynamic control flow : ์‹คํ–‰ ํ•ด๋ด์•ผ ํ™•์ธ ๊ฐ€๋Šฅ Compiler -> static control flow : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถ„์„ํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ์Œ Analysis ์ •์  ์„ฑ์งˆ (static property): ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์—†์ด ๋„์ถœ ๋˜๋Š” ์„ฑ์งˆ CFA(Control Flow Analysis) : ์ฝ”๋“œ์˜ ๋ถ„๊ธฐ ๊ตฌ์กฐ๋ฅผ CFG ํ˜•ํƒœ๋กœ ํ‘œํ˜„ Basic Block ๋™์ผํ•œ execution condition์„ ์ ์šฉ๋ฐ›๋Š” instruction ๋ฌถ์Œ instruction ์™ธ์—๋Š” branch๊ฐ€ ์—†์Œ Maximal basic block ๊ตฌํ•˜๊ธฐ BB์˜ leader(์ฒซ๋ฒˆ์งธ instruction)๋ฅผ ์ฐพ๋Š”๋‹ค ๋‹ค์Œ leader ์ด์ „๊นŒ์ง€์˜ instruction์„ ๊ตฌํ•œ๋‹ค Weighted CFG Profiling: ๋ฐ˜๋ณตํ•ด์„œ ์ˆ˜ํ–‰ํ•ด๋ณด๋ฉด์„œ ์‹คํ–‰ํšŸ์ˆ˜๋ฅผ ์–ป์Œ ์–ป์€ weight๋ฅผ edge์— ํ‘œ์‹œ Control Flow Optimization Acyclic Code Loop๊ฐ€ ์—†๋Š” ์ฝ”๋“œ ๋ถ„์„ ๋ฐ ์ตœ์ ํ™”๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฌ์›€ ์ข…๋ฅ˜ Inner basic block opt. = Intra opt. = Local opt. Inter basic block opt. = Global opt. Inner Basic Block Optimization Commn subexpression elimination ๊ณตํ†ต๋œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Algebraic simplification ๋Œ€์ˆ˜๋ฒ•์น™์„ ์ด์šฉํ•˜์—ฌ ์‹์„ ๊ฐ„์†Œํ™” ex) x=1*y; -> x=y; Strength reduction ์—ฐ์‚ฐ์ž์˜ ๋น„์šฉ์ด ์ ์€ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ex) x=x*2; -> x=x+x; ex) y=a/4; -> y=a>>2; Constant folding / propagation folding: ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ƒ์ˆ˜์‹์„ ์ง์ ‘์‹œ๊ฐ„ propagation : ๊ณ ์ •๋œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜๋กœ ๋Œ€์ฒด Inter Basic Block Optimization Global application of inner basic block optimization Global common subexpression elimination basic block ๊ฐ„์˜ ๊ณตํ†ต ๋ถ€๋ถ„์‹์— ๋Œ€ํ•ด ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Global constant folding / propagation basic block ๊ฐ„์˜ ์ƒ์ˆ˜๋ฅผ ์ธ์‹ํ•˜์—ฌ ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Other transformation Branch to unconditional branch ๋ถˆํ•„์š”ํ•œ ๋ถ„๊ธฐ ์ œ๊ฑฐ Unconditional branch to branch ๋ถ„๊ธฐ ํ›„ ๋ฐ”๋กœ ๋ถ„๊ธฐ -> ๋ถ„๊ธฐ ํ•œ๋ฒˆ์œผ๋กœ ๋ณ€๊ฒฝ Branch to next basic block (next instr) ๋ถ„๊ธฐ ํ›„ ๋ฐ”๋กœ ๋‹ค์Œ basic block์œผ๋กœ ๋ถ„๊ธฐ ์ œ๊ฑฐ Basic block merging ๋‘ basic block์„ ํ•ฉ์นจ Branch to same target ๊ฐ™์€ basic block์œผ๋กœ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์„ ์ œ๊ฑฐ Branch target expansion ๋ถ„๊ธฐ ๋Œ€์ƒ์ด ๋˜๋Š” basic block์„ ํ•ฉ์นจ Unreachable code elimination Entry์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ‘unreachable’ block ์ œ๊ฑฐ Loop Optimization Loop๋Š” ํ•œ๋ฒˆ optimizeํ•˜๋ฉด ํšจ๊ณผ๊ฐ€ ํฌ๋‹ค Loop unrolling : ๋ฐ˜๋ณต๋ฌธ์„ ํ’€์–ด์„œ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ค„์ž„ Loop invarient : ๋งค๋ฒˆ ๋™์ผํ•œ ๊ฐ’์„ ๋‚ด๋Š” ๋ฌธ์žฅ์„ ๋ฐ˜๋ณต๋ฌธ ๋ฐ–์œผ๋กœ ๋นผ๋ƒ„ Count up to zero : i๋ฅผ ๊ฐ์†Œํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝ (i๋ฅผ 0๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด n๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฆ„) Dataflow Analysis + Optimization Dataflow Analysis ํ”„๋กœ๊ทธ๋žจ ๋‚ด์— ๊ฐ data ๊ฐ’๋“ค์ด ์ƒ์„ฑ/์†Œ๋ฉธ๋˜๋Š” ์ •๋ณด๋ฅผ ๋ชจ์œผ๋Š” ๊ฒƒ Reaching Definition Analysis definition : ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ assign๋˜๋Š” ๊ฒƒ reach : definition d๊ฐ€ ํŠน์ • ์œ„์น˜ p์— ๋„๋‹ฌํ•œ๋‹ค kill : definition d์˜ ๋‘๊ฐœ์˜ ํฌ์ธํŠธ์‚ฌ์ด์—์„œ ๋‹ค๋ฅธ definition์ด ์กด์žฌํ•œ๋‹ค GEN/KILL GEN: ๋ธ”๋ก ๋‚ด์—์„œ ์ƒ์„ฑ๋œ definition KILL: ๋ธ”๋ก ๋‚ด์—์„œ ์†Œ๋ฉธ๋œ definition IN/OUT IN : ์ด์ „ ๋ธ”๋ก์˜ OUT์˜ ํ•ฉ์ง‘ํ•ฉ OUT : IN์—์„œ GEN์„ ๋”ํ•˜๊ณ  KILL์„ ๋บ€ ๊ฒƒ
new ํ˜„๋Œ€์ธ์˜ ์ƒํ™œ๋ฌธํ™”
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๊ธ€๋กœ๋ฒŒ ๋งค๋„ˆ ๋งค๋„ˆ ์ธ๊ฐ„๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋ฐ ์žˆ์–ด ์ค‘์š”ํ•œ ์š”์†Œ ์–ด์› : Manus(์†, ํ–‰๋™, ์Šต๊ด€) + Arius(๋ฐฉ๋ฒ•, ๋ฐฉ์‹) ๋งค๋„ˆ์˜ ๊ธฐ๋ณธ(1) ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ธ๊ฒฉ์„ ์กด์ค‘ํ•˜๊ณ , ๋ฐฐ๋ คํ•˜๋Š” ๋งˆ์Œ์„ ๊ฐ€์ง€๊ณ , ํŽธ์•ˆํ•˜๊ฒŒ ํ•ด์ฃผ๊ฑฐ๋‚˜ ๊ธฐ์˜๊ฒŒ ๋งŒ๋“ค๋ ค๋Š” ํ–‰๋™๋ฐฉ์‹ ๋งค๋„ˆ์˜ ๊ธฐ๋ณธ(2) ์—ญ์ง€์‚ฌ์ง€ (ๆ˜“ๅœฐๆ€ไน‹) ๋งค๋„ˆ์˜ ๊ธฐ๋ณธ(3) ํ˜•์‹์— ์น˜์šฐ์น˜์ง€ ๋ง๊ณ , ๋ฐฐ๋ คํ•˜๋Š” ๋งˆ์Œ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ ๋งค๋„ˆ์™€ ์—ํ‹ฐ์ผ“์˜ ์ฐจ์ด ๋งค๋„ˆ(์˜ˆ์˜) : ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ ๊ฐ€๋Šฅ ์—ํ‹ฐ์ผ“(๋ฒ”์ ˆ) : ํ˜•์‹๊ณผ ์ ˆ์ฐจ๋ฅผ ์ค‘์š”์‹œ ํ•จ ๋™์–‘์˜ ๋งค๋„ˆ 5๋• ์ธ, ์˜, ์˜ˆ, ์ง€, ์‹  5๋ฅœ ๊ตฐ์‹ ์œ ์˜ : ์ž„๊ธˆ์€ ์˜๋กœ์›Œ์•ผ ํ•˜๊ณ  ์‹ ํ•˜๋Š” ์ถฉ์„ฑ์Šค๋Ÿฌ์›Œ์•ผ ํ•œ๋‹ค ๋ถ€์ž์œ ์นœ : ๋ถ€๋ชจ๋Š” ์ž๋…€์—๊ฒŒ ์ธ์žํ•˜๊ณ  ์ž๋…€๋Š” ๋ถ€๋ชจ๋ฅผ ๊ณต๊ฒฝํ•ด์•ผํ•œ๋‹ค. ๋ถ€๋ถ€์œ ๋ณ„ : ์„œ๋กœ์˜ ์—ญํ• ์„ ์นจ๋ฒ•ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค ์žฅ์œ ์œ ์„œ : ์–ด๋ฅธ๊ณผ ์–ด๋ฆฐ์•„์ด ์‚ฌ์ด์—๋Š” ์งˆ์„œ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค ๋ถ•์šฐ์œ ์‹  : ์นœ๊ตฌ ์‚ฌ์ด์—๋Š” ์‹ ๋ขฐ๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค ์„œ์–‘์˜ ๋งค๋„ˆ (๊ธฐ์› : ์„ฑ๊ฒฝ) ์ž๊ธฐ๋ฅผ ๋†’์ด๋Š” ์‚ฌ๋žŒ์€ ๋‚ฎ์•„์ง€๊ณ  ์ž๊ธฐ๋ฅผ ๋‚ฎ์ถ”๋Š” ์‚ฌ๋žŒ์€ ๋†’์•„์ง„๋‹ค ๋„ค๊ฐ€ ๋Œ€์ ‘ ๋ฐ›๊ณ ์ž ํ•˜๋Š” ๋Œ€๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ํ–‰ํ•˜๋ผ ๋„ค ์ด์›ƒ์„ ๋„ค ๋ชธ์ฒ˜๋Ÿผ ์‚ฌ๋ž‘ํ•˜๋ผ ๋™์„œ์–‘ ๋งค๋„ˆ์˜ ์ฐจ์ด ๊ณตํ†ต์  : ๋‚จ์„ ์กด์ค‘ํ•˜๊ณ  ๋ฐฐ๋ คํ•จ ์ฐจ์ด์  : ๋™์–‘ -> ๋‚จ์„ฑ์šฐ์„ , ์„œ์–‘ -> ์—ฌ์„ฑ์šฐ์„  ์†Œ๊ฐœ์™€ ์ธ์‚ฌ 1 ์ž๊ธฐ์†Œ๊ฐœ ์„ฑ๊ณผ ์ด๋ฆ„ (OOO ์ž…๋‹ˆ๋‹ค) ์„ฑ์€ O๊ฐ€, ๋ณธ๊ด€์€ OO ์ž…๋‹ˆ๋‹ค ์•„๋ฒ„์ง€ ํ•จ์ž๋Š” ํ™ ๊ธธ์ž ๋™์ž ์ž…๋‹ˆ๋‹ค ์†Œ๊ฐœ๋Š” ์ผ์–ด๋‚˜์„œ ์†๋‹˜๊ณผ ์ฃผ์ธ์˜ ์ธ์‚ฌ ์‹œ ์†๋‹˜์ด ๋จผ์ € ์ธ์‚ฌํ•œ๋‹ค ์งํ•ฉ-์ด๋ฆ„ ์ˆœ์œผ๋กœ ์ž๊ธฐ์†Œ๊ฐœ ํ•œ๋‹ค ํšŒ์‚ฌ ์ง๊ธ‰ ์‚ฌ์žฅ - ์ „๋ฌด - ์ด์‚ฌ - ๋ถ€์žฅ - ์ฐจ์žฅ - ๊ณผ์žฅ - ๋Œ€๋ฆฌ - ์ฃผ์ž„ - ์‚ฌ์› ์†Œ๊ฐœ ์ˆœ์„œ ์†์•„๋žซ์‚ฌ๋žŒ์„ ์†์œ—์‚ฌ๋žŒ์—๊ฒŒ ๋ฏธํ˜ผ์ž๋ฅผ ๊ธฐํ˜ผ์ž์—๊ฒŒ ํ•œ ์‚ฌ๋žŒ์„ ๊ทธ๋ฃน์—๊ฒŒ, ๊ทธ๋ฃน์—์„œ ๋†’์€ ์‚ฌ๋žŒ ๋ถ€ํ„ฐ (๊ทธ๋ฃน ์ขŒ์ธก ๋ถ€ํ„ฐ) ์†Œ๊ฐœ ์• ๋งคํ•œ ๊ฒฝ์šฐ “OO๋ถ€ํ„ฐ ์†Œ๊ฐœ๋“œ๋ ค๋„ ๋ ๊นŒ์š”?” ๋ฉ˜ํŠธ ์ง€์œ„, ์—ฐ๋ น, ์„ฑ๋ณ„์„ ๋ฌด์‹œํ•˜๊ณ  ์ž๊ธฐ ๊ฐ€์กฑ์„ ํƒ€์ธ์—๊ฒŒ ๋จผ์ € ์†Œ๊ฐœ ์„œ์‹  ์†Œ๊ฐœ ์†Œ๊ฐœ ๋ชฉ์ ๊ณผ ๋ณธ์ธ๊ณผ์˜ ๊ด€๊ณ„๋ฅผ ๋ฐํž˜ ๊ฐœ๋ด‰ํ•œ ์ƒํƒœ์—๋กœ ์˜๋ขฐํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ์ „๋‹ฌ : ์˜๋ขฐ์ž๋Š” ๋‚ด์šฉ์„ ํ™•์ธ ํ•  ๊ฒƒ ์†Œ๊ฐœ์žฅ์„ ์จ ์ฃผ์‹  ๋ถ„์—๊ฒŒ ์ง„ํ–‰์ƒํ™ฉ ๋ง์”€๋“œ๋ฆด ๊ฒƒ ์ธ์‚ฌ ๋งŒ๋‚ฌ์„ ๋•Œ๋‚˜ ํ—ค์–ด์งˆ ๋•Œ ์˜ˆ๋ฅผ ํ‘œํ•˜๋Š” ๋ง์ด๋‚˜ ํ–‰๋™ ์ธ์‚ฌ์˜ ๊ธฐ๋Šฅ ์ƒ๋Œ€๋ฐฉ์— ๋Œ€ํ•œ ํ™˜์˜๊ณผ ํ˜ธ์˜๋ฅผ ํ‘œ์‹œ ์ƒ๋Œ€๋ฐฉ๊ณผ์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•ด์ค€๋‹ค ์ฒ˜์Œ ๋งŒ๋‚˜๋Š” ์ƒ๋Œ€์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„์‹ฌ๊ณผ ๋ถˆ์•ˆ๊ฐ ํ•ด์†Œ ๊ณต์ˆ˜ ๋‘ ์†์„ ๋ชจ์•„ ์•ž์œผ๋กœ ์žก๋Š” ๊ฒƒ ์ ˆ์˜ ๊ธฐ๋ณธ ์ž์„ธ ์†์•„๋žซ ์‚ฌ๋žŒ์˜ ์ž์„ธ ๋‚จ์ž๋Š” ์™ผ์†์„ ์œ„, ์—ฌ์ž๋Š” ์˜ค๋ฅธ์†์„ ์œ„ (ํ‰์‚ฌ ์‹œ ๋ฐ˜๋Œ€๋กœ) ์๋ก€ (์) ๊ณต์ˆ˜ํ•œ ์†์„ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ (์ ˆ ํ•˜๊ธฐ ์ „์—) ์†Œ๊ฐœ์™€ ์ธ์‚ฌ 2 ์šฐ๋ฆฌ๋‚˜๋ผ ์ ˆ์˜ ์ข…๋ฅ˜ ํฐ์ ˆ : ๋ถ€๋ชจ๋‹˜, ์กฐ๋ถ€๋ชจ๋‹˜๊ป˜, ์˜๋ก€ํ–‰์‚ฌ์‹œ, ์žฅ๋ก€์‹๋•Œ ์˜์ „์—์„œ ํ‰์ ˆ : ์žฅ๋ก€์‹์—์„œ ์ƒ์ฃผ์™€ ํ•˜๋Š” ์ ˆ ๋ฐ˜์ ˆ : ์›ƒ์–ด๋ฅธ์ด ์•„๋žซ์‚ฌ๋žŒ์˜ ์ ˆ์— ๋Œ€ํ•ด ๋‹ต๋ฐฐ ํ•  ๋•Œ ์—ฌ์„ฑ์˜ ํฐ์ ˆ ๊ณต์ˆ˜์ž์„ธ (์˜ค๋ฅธ์†์ด ์œ„๋กœ) ๊ณต์ˆ˜ํ•œ ์†์„ ์–ด๊นจ ๋†’์ด๋กœ ์˜ฌ๋ฆฐ๋‹ค. ๊ณ ๊ฐœ๋ฅผ ์ˆ™์—ฌ์„œ ์ด๋งˆ๋ฅผ ์†๋“ฑ์— ๋ถ™์ธ๋‹ค (์†์˜ ๋†’์ด < ์–ด๊นจ) ์ฒœ์ฒœํžˆ ์•‰์œผ๋ฉด์„œ ์™ผ์ชฝ ๋ฌด๋ฆŽ์„ ๋จผ์ € ๊ฟ‡๋Š”๋‹ค ์˜ค๋ฅธ๋ฐœ์œ„์— ์™ผ๋ฐœ์„ ํฌ๊ฐ ๋‹ค (์†์ด๋ž‘ ๋ฐ˜๋Œ€) ์—‰๋ฉ์ด๋ฅผ ๋‚ด๋ ค ๊นŠ๊ฒŒ ์•‰๋Š”๋‹ค ๋ชธ์„ 45๋„ ์•ž์œผ๋กœ ๊ตฝํžŒ๋‹ค (์†๋“ฑ์„ ์ด๋งˆ์—์„œ ๋–ผ์ง€ ๋ง๊ฒƒ) ์˜ค๋ฅธ์ชฝ ๋ฌด๋ฆŽ๋ถ€ํ„ฐ ์ผ์–ด๋‚œ๋‹ค ์ ˆ์ด ๋๋‚˜๋ฉด ์†์„ ๋‚ด๋ฆฐ๋‹ค ๊ณต์ˆ˜ํ•œ ์ฑ„ ๋ชธ์„ 15๋„ ๊ตฝํ˜€ ์˜ˆ๋ฅผ ํ‘œํ˜„ (๊ตด์‹ ๋ก€) ์—ฌ์„ฑ์˜ ํ‰์ ˆ ๊ณต์ˆ˜์ž์„ธ (์˜ค๋ฅธ์†์ด ์œ„๋กœ) ๊ณต์ˆ˜ํ•œ ์†์„ ํ’€์–ด ์–‘์˜†์œผ๋กœ ๋‚ด๋ฆฐ๋‹ค ์ฒœ์ฒœํžˆ ์•‰์œผ๋ฉด์„œ ์™ผ์ชฝ ๋ฌด๋ฆŽ์„ ๋จผ์ € ๊ฟ‡๋Š”๋‹ค ์˜ค๋ฅธ๋ฐœ์œ„์— ์™ผ๋ฐœ์„ ํฌ๊ฐ ๋‹ค ์†๋์ด ๋ฐ”๊นฅ์„ ํ–ฅํ•˜๋„๋ก ํ•˜์—ฌ ๋ฐ”๋‹ฅ์— ๋Œ„๋‹ค ํ—ˆ๋ฆฌ๋ฅผ 30๋„ ๊ตฝํ˜”๋‹ค๊ฐ€ ํ—ˆ๋ฆฌ๋ฅผ ํŽด๋ฉฐ, ์–‘์†์„ ๋ฐ”๋‹ฅ์—์„œ ๋–ผ๊ณ  ์ฒœ์ฒœํžˆ ์ผ์–ด๋‚œ๋‹ค ์˜ค๋ฅธ์ชฝ ๋ฌด๋ฆŽ๋ถ€ํ„ฐ ์ผ์–ด๋‚œ๋‹ค ๊ณต์ˆ˜ํ•œ ์ฑ„ ๋ชธ์„ 30๋„ ๊ตฝํ˜€ ์˜ˆ๋ฅผ ํ‘œํ˜„ (๊ตด์‹ ๋ก€) ๋‚จ์„ฑ์˜ ํฐ์ ˆ ๊ณต์ˆ˜์ž์„ธ (์™ผ์†์ด ์œ„๋กœ) ์๋ก€ ๊ณต์ˆ˜ํ•œ ์†์„ ๋ˆˆ์น ๋†’์ด๋กœ ์˜ฌ๋ฆฐ๋‹ค ํ—ˆ๋ฆฌ์™€ ๋ฌด๋ฆŽ์„ ๊ตฝํ˜€ ๊ณต์ˆ˜ํ•œ ์†์œผ๋กœ ๋ฐ”๋‹ฅ์„ ์งš๋Š”๋‹ค ์™ผ์ชฝ ๋ฌด๋ฆŽ์„ ๋จผ์ € ๊ฟ‡๋Š”๋‹ค ์™ผ๋ฐœ์ด ์•ž์— ๋˜๊ฒŒ ๋ฐœ๋“ฑ์„ ํฌ๊ฐ ๋‹ค ํŒ”๊ฟˆ์น˜๋Š” ์—ด์ง€ ์•Š๊ณ  ๋ชธํ†ต ์ชฝ์œผ๋กœ ๋ถ™์ด๊ณ  ์ด๋งˆ๋ฅผ ๊ณต์ˆ˜ํ•œ ์†์— ๋Œ„๋‹ค ์˜ค๋ฅธ์ชฝ ๋ฌด๋ฆŽ๋ถ€ํ„ฐ ์ผ์–ด๋‚œ๋‹ค ๊ณต์ˆ˜ ๋‚จ์ž์˜ ํ‰์ ˆ ๋ชจ๋“  ๋™์ž‘์€ ํฐ์ ˆ๊ณผ ๋™์ผํ•˜๋‹ค ๋‹ค๋งŒ ์๋ก€๋ฅผ ํ•˜์ง€์•Š๊ณ , ์ด๋งˆ๊ฐ€ ์†๋“ฑ์— ๋‹ฟ์œผ๋ฉด ์ฆ‰์‹œ ์ผ์–ด๋‚œ๋‹ค ๋ฐ˜ํ‰ ์—ฌ์„ฑ : ํ‰์ ˆ ์•‰์€ ์ž์„ธ๊นŒ์ง€ ๋‚จ์„ฑ : ๋ฌด๋ฆŽ์„ ๊ฟ‡์€ ์ƒํƒœ์—์„œ ๋จธ๋ฆฌ์™€ ์—‰๋ฉ์ด๊ฐ€ ์ˆ˜ํ‰ ์ดํ›„์— ๊ณต์ˆ˜์ž์„ธ ํ•„์š” X ๊ฒฝ๋ก€ 3๋ณด ์•ž์—์„œ ๋ฉˆ์ถค, ๋ˆˆ์„ ๋งˆ์ฃผ์นจ, ์ธ์‚ฌ๋ง ๊ฑด๋„ด, ๊ฒฝ๋ก€, ๋‹ค์‹œ ๋ˆˆ์„ ๋งˆ์ฃผ์นจ ๋‚จ์ž๋Š” ์–‘์ชฝ ์†์„ ๊ฐ€๋ณ๊ฒŒ ์ฃผ๋จน์„ ์ฅ” ์ƒํƒœ์—์„œ ๋ฐ”์ง€ ์˜†์ค„์— ๋Œ€๊ณ  ๊ฒฝ๋ก€ ์—ฌ์ž๋Š” ์•ž์œผ๋กœ ๋ชจ์•„ ๊ณต์ˆ˜ํ•œ ์ƒํƒœ์—์„œ ๊ฒฝ๋ก€ ๊ฒฝ๋ก€์˜ ์ข…๋ฅ˜ ์˜๋ก€์‹ ๊ฒฝ๋ก€ (90๋„) : ๊ด€ํ˜ผ์ƒ์ œ ํฐ๊ฒฝ๋ก€ (45๋„) : ํŠน๋ณ„ํžˆ ๊ฐ์‚ฌ, ์‚ฌ๊ณผ, ์กด๊ฒฝ ํ‰๊ฒฝ๋ก€ (30๋„) : ํ‰์ƒ ์‹œ ๋ฐ˜๊ฒฝ๋ก€ (15๋„) : ์นœํ•œ ์‚ฌ์ด ๋ชฉ๋ก€ ๋ฐ˜๋ณต์ ์ธ ๋งŒ๋‚จ ๋ณดํ–‰ ์ค‘ ์ผ๋ฐ˜ ๊ฒฝ๋ก€๋ฅผ ํ•  ์ˆ˜ ์—†์„ ๋•Œ ์•…์ˆ˜ ์†์œ—์‚ฌ๋žŒ์ด ์†์•„๋žซ์‚ฌ๋žŒ์—๊ฒŒ ์ฒญํ•จ ์†์•„๋žซ์‚ฌ๋žŒ์€ ๊ฐ€๋ฒผ์šด ๋ชฉ๋ก€๋ฅผ ํ•˜๋ฉด์„œ ์•…์ˆ˜ ์ด์„ฑ ๊ฐ„์—๋Š” ์—ฌ์„ฑ์ด ๋จผ์ € ์•…์ˆ˜๋ฅผ ์ฒญํ•จ (๋ชฉ๋ก€, ๋ฏธ์†Œ๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ) ์ ์ ˆํ•œ ์ธ์‚ฌ๋ง ์†์œ—์‚ฌ๋žŒ์—๊ฒŒ ์ˆ˜๊ณ ํ•˜์‹ญ์‹œ์˜ค X ์„ธ๊ณ„ ๊ฐ ๊ตญ์˜ ์ธ์‚ฌ๋ฒ• ์ธ๋„ ๋‚˜๋งˆ์Šคํ…Œ (๋‚˜๋งˆ : ์ธ์‚ฌํ•˜๋‹ˆ๋‹ค, ์•„์Šค : ๋‚˜, ํ…Œ: ๋„ˆ) ๋‚˜๋Š” ๋‹น์‹ ํ•œํ…Œ ์ธ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์ค‘๋™ ์•—์‚ฌ๋žŒ ์•Œ๋ผ์ด์ฟฐ (์•—์‚ด๋žŒ: ํ‰ํ™”๊ฐ€, ์•Œ๋ผ์ด: ~์œ„์—, ์ฟฐ: ๋‹น์‹ ๋“ค) ์ค‘๊ตญ ์† ํ”๋“ค๊ธฐ (๋‚˜์ด์— ์ƒ๊ด€์—†์ด) ๊ณต์ˆ˜ (์†์ด ๊ฐ€์Šด์œ„์— ์œ„์น˜) ํƒœ๊ตญ ์™€์ด (Wai) : ์†์„ ํ•ฉ์žฅํ•œ ๋ชจ์Šต์ด Y์™€ ๋น„์Šท ์†์•„๋žซ์‚ฌ๋žŒ์ด ๊ณ ๊ฐœ๋ฅผ ๊นŠ์ด ์ˆ™์ด๊ณ , ์†์„ ๋†’์ด ๋“ ๋‹ค ์‚ฌ์™€๋””์บ…: ์•ˆ๋…•ํ•˜์„ธ์š” ๋ช…ํ•จ ๋งค๋„ˆ ๋ช…ํ•จ์˜ ๊ธฐ๋Šฅ ์ž๊ธฐ๋ฅผ ์†Œ๊ฐœํ•˜๊ณ  ์ƒ๋Œ€๋ฐฉ์œผ๋กœ ํ•˜์—ฌ๊ธˆ ์ž๊ธฐ๋ฅผ ๊ธฐ์–ตํ•˜๊ฒŒ ํ•จ ์ธ๊ฐ„๊ด€๊ณ„ ํ˜•์„ฑ๊ณผ ์ธ๋งฅ๊ด€๋ฆฌ์˜ ์ค‘์š”ํ•œ ๋„๊ตฌ ์นœ๋ถ„์˜ ์‹œ์ž‘ : ์ฒซ ์ธ์ƒ์„ ์ขŒ์šฐ, ์˜ˆ๋ฅผ ๋‹คํ•ด์•ผ ํ•จ ๋ช…ํ•จ์˜ ์ข…๋ฅ˜ ์‚ฌ๊ต์šฉ ๋ช…ํ•จ (์„ฑ๋ช…, ์ฃผ์†Œ) ๋ฉ”์‹œ์ง€ ์นด๋“œ๋‚˜ ์ดˆ์ฒญ์žฅ ๋Œ€์‹  ์‚ฌ์šฉ ์—…๋ฌด์šฉ ๋ช…ํ•จ (์‚ฌ์ง„, ์„ฑ๋ช…, ์ง์žฅ ์ฃผ์†Œ, ๋กœ๊ณ  ๋“ฑ) (๋ฏธ๊ตญ) ์‚ฌ์žฅ, ์ค‘์—ญ์šฉ : ๋ช…ํ•จ ์ค‘์•™์— ์ด๋ฆ„, ํ•˜๋‹จ์— ์ง์œ„์™€ ํšŒ์‚ฌ๋ช… (๋ฏธ๊ตญ) ์‚ฌ์›์šฉ : ์ค‘์•™์— ํšŒ์‚ฌ๋ช…, ์ขŒ์ธก ํ•˜๋‹จ์— ์„ฑ๋ช…, ์†Œ์†๋ถ€์„œ, ์ฃผ์†Œ ๋“ฑ ๋ช…ํ•จ ๊ตํ™˜ ๋ฐฉ๋ฒ• ์†Œ๊ฐœํ•˜๊ณ  ์„œ๋กœ ๋ช…ํ•จ๋ถ€ํ„ฐ ๊ตํ™˜ (์„œ์–‘) ํ—ค์–ด์งˆ ๋•Œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ตํ™˜ ๋ช…ํ•จ์„ ์ค„ ๋•Œ ๋ช…ํ•จ์€ ๋ช…ํ•จ ์ง€๊ฐ‘์— ๋„ฃ์–ด์„œ ์ €๊ณ ๋ฆฌ ์•ˆ์ฃผ๋จธ๋‹ˆ์— ๋ณด๊ด€ ์„ -> ๊ฐ‘ ์„  ์ž์„ธ์—์„œ ๊ตํ™˜ ํ•œ๋‹ค. ํ…Œ์ด๋ธ” ์œ„์— ๋†“๊ณ  ๋ฐ€๊ฑฐ๋‚˜, ์„œ๋ฅ˜ ๋ด‰ํˆฌ์™€ ํ•จ๊ป˜ X ์ผ์–ด์„œ์„œ, ์ •์ค‘ํ•˜๊ฒŒ ์ธ์‚ฌํ•˜๊ณ , ์ด๋ฆ„์ด๋‚˜ ์†Œ์†์„ ๋ฐํžˆ๋ฉด์„œ, ๋‘ ์†์œผ๋กœ ๊ฑด๋„จ๋‹ค ๋ช…ํ•จ ๊ธ€์ž๊ฐ€ ์ƒ๋Œ€๋ฐฉ ์ชฝ์—์„œ ๋ฐ”๋ฅด๊ฒŒ ๋ณด์ด๊ฒŒ ๊ฑด๋„จ๋‹ค ์ƒ์‚ฌ๊ฐ€ ๋จผ์ € ๊ฑด๋„ค๊ณ  ์ž๊ธฐ ๋ช…ํ•จ์„ ๊ฑด๋„ฌ ๊ฒƒ ์ƒ๋Œ€๊ฐ€ ๋‘ ์‚ฌ๋žŒ ์ด์ƒ์ด๋ฉด ์œ—์‚ฌ๋žŒ์—๊ฒŒ ๋จผ์ € ๊ฑด๋„จ๋‹ค ์ค‘๊ฐ„์— ํ…Œ์ด๋ธ” ๊ฐ™์€ ์žฅ์• ๋ฌผ์ด ์žˆ๋‹ค๋ฉด ๋‘˜ ์‚ฌ์ด์— ์žฅ์• ๋ฌผ์ด ์—†๋Š” ์ƒํƒœ์—์„œ ๋ช…ํ•จ์„ ๊ตํ™˜ํ•  ๊ฒƒ ๋ช…ํ•จ์„ ๋ฐ›์„ ๋•Œ ์ผ์–ด์„œ์„œ, ๋‘ ์†์œผ๋กœ, ๋ชจ์„œ๋ฆฌ๋ฅผ ์žก๊ณ  (๋ช…ํ•จ์„ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ ) ๋ฐ›๋Š”๋‹ค ๋ฐ›์œผ๋ฉด ์ž์‹ ์˜ ๋ช…ํ•จ์„ ์ค„ ๊ฒƒ, ํ•œ ์‚ฌ๋žŒ์”ฉ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค ์ƒ๋Œ€๋ฐฉ์˜ ๋ช…ํ•จ์„ ๋†“๊ณ  ๊ฐ€๋Š” ๊ฒƒ์€ ์‹ค๋ก€ ํšŒ์˜ ํ•  ๋•Œ ์ž๋ฆฌ์— ๋”ฐ๋ผ ํ…Œ์ด๋ธ”์— ๋ช…ํ•จ์„ ์˜ฌ๋ ค ๋†“์„ ์ˆ˜ ์žˆ์Œ ์ƒ๋Œ€๋ฐฉ์˜ ๋ช…ํ•จ์„ ์ฝ๊ณ  ์ง€๊ฐ‘์— ๋„ฃ์„ ๊ฒƒ ๋ช…ํ•จ ๋ณด๊ด€ ๋ช…ํ•จ ํ™€๋”๋‚˜ ๋ฐ”์ธ๋”์— ์ž˜ ์ •๋ฆฌ (์ง์žฅ๋ณ„, ๊ฐœ์ธ๋ณ„, ๋ชจ์ž„๋ณ„) ๋ช…ํ•จ์— ๊ธฐ์žฌ๋œ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ์—ฌ๋ฐฑ์— ๋ฉ”๋ชจ ์—ฐ 1ํšŒ ์ •๋ฆฌ ์‚ฌ๊ต๋งค๋„ˆ ๋ฐฉ๋ฌธ ์ ‘๋Œ€ ์ž„์‹  ์ถœ์‚ฐ ๋ฐฉ๋ฌธ ๋ฐฉ๋ฌธ ์‹œ ๊ธฐ๋ณธ ๋งค๋„ˆ ๋ฐฉ๋ฌธ์„ ํ• ๊ฒฝ์šฐ ๋ฐฉ๋ฌธ์— ๋Œ€ํ•œ ์•ฝ์†์ด ์„ ํ–‰ ์—…๋ฌด ๊ด€๋ จ ๋ฐฉ๋ฌธ์ด ์•„๋‹ˆ๋ผ๋ฉด, ๋ถ€๋ถ€ ๋™๋ฐ˜ ์ƒ๋Œ€๋ฐฉ์˜ ์ทจํ–ฅ ๊ณ ๋ ค ์„ ๋ฌผ ์ค€๋น„ ๋ฐฉ๋ฌธ ์‹œ๊ฐ„ : ์˜คํ›„ 3์‹œ~5์‹œ ์ ๋‹น ๋ณ‘๋ฌธ์•ˆ, ์กฐ๋ฌธ ์ œ์™ธํ•˜๊ณ ๋Š” ์˜ค์ „ ์‹œ๊ฐ„์€ ์‚ผ๊ฐ€ ๊ฐ€์ •์œผ๋กœ์˜ ๋ฐฉ๋ฌธ ์ดˆ์ธ์ข…์„ ๋ˆ„๋ฅด๊ธฐ ์ „์— ์˜ท์ฐจ๋ฆผ๊ณผ ๋ฐฉ๋ฌธ ๋ชฉ์ ์„ ์ ๊ฒ€ ์ค€๋น„ํ•œ ์„ ๋ฌผ์€ ์•ˆ์ฃผ์ธ์—๊ฒŒ ์ „๋‹ฌ ๊ฑฐ์‹ค์—์„œ๋Š” ์ž…๊ตฌ ๊ฐ€๊นŒ์šด ๊ณณ์ด ํ•˜์„, ๊ทธ ๋ฐ˜๋Œ€๊ฐ€ ์ƒ์„ ์‘์ ์‹ค์— ๊ธด ์†ŒํŒŒ์™€ ์•ˆ๋ฝ์˜์ž๊ฐ€ ์žˆ์„ ๋•Œ ๊ธด ์†ŒํŒŒ๊ฐ€ ์†๋‹˜์šฉ ์‹์‚ฌ์‹œ๊ฐ„์€ ํ”ผํ•˜๋˜ ๋ถ€๋“์ดํ•œ ๊ฒฝ์šฐ ๋„ˆ๋ฌด ์‚ฌ์–‘ํ•˜์ง€ ์•Š๋„๋ก ๋ถ€์žฌ ์‹œ๋Š” ๋ช…ํ•จ์„ ๋‚จ๊ธฐ๋„๋ก ๋ฐฉ๋ฌธ ํ›„ ๋ฐ˜๋“œ์‹œ ์ „ํ™”๋กœ ๊ฐ์‚ฌ๋ฅผ ํ‘œ์‹œ ์ง์žฅ์œผ๋กœ์˜ ๋ฐฉ๋ฌธ ๋…ธํฌ๋ฅผ ํ•œ ํ›„ ์ž…์‹คํ•  ๊ฒƒ ๊ณต์šฉ์‚ฌ๋ฌด์‹ค์ธ ๊ฒฝ์šฐ ๋™๋ฃŒ ์ง์›๋“ค์—๊ฒŒ ๊ฐ„๋‹จํ•œ ๋ชฉ๋ก€ ์ƒ๋Œ€๋ฐฉ์˜ ์ผ์ •์„ ํŒŒ์•… ๋ณ‘์›์œผ๋กœ์˜ ๋ฐฉ๋ฌธ ๋ณ‘๋ฌธ์•ˆ์€ ๋น ๋ฅผ ์ˆ˜๋ก ์ข‹์œผ๋ฉฐ ๋ฐฉ๋ฌธ์ „์— ๋ฏธ๋ฆฌ ์•Œ๋ฆด ๊ฒƒ ๋ฌธ๋ณ‘ ์‹œ๊ฐ„: 20~30๋ถ„์ด ์ ๋‹น ์‹์‚ฌ์‹œ๊ฐ„๊ณผ ์น˜๋ฃŒ์‹œ๊ฐ„์„ ํ”ผํ•ด ์˜คํ›„ 2์‹œ ~ 5์‹œ ํ™˜์ž๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์„ ๋ฌผ์–ด๋ณด์•„ ์ค€๋น„ ๊ฝƒ์€ ์‚ผ๊ฐ€ (๊ฝƒ๊ฐ€๋ฃจ) ์ ‘๋Œ€ ์ ‘๋Œ€๋งค๋„ˆ ์‘์ ‘์‹ค๋กœ ์•ˆ๋‚ดํ•˜๋ฉฐ ์ž๋ฆฌ๋ฅผ ๊ถŒํ•œ ํ›„ ์†๋‹˜์—๊ฒŒ ๊ฐ€์กฑ๋“ค์„ ์†Œ๊ฐœ ์†๋‹˜์ด ์†Œ์ง€ํ’ˆ ๋‘๋Š” ์žฅ์†Œ ๋งˆ๋ จ ์ฐจ๋Š” ์†๋‹˜ ์˜ํ–ฅ์„ ๋ฌผ์–ด ๋Œ€์ ‘ ์„ ๋ฌผ์„ ์ž๋ฆฌ์—์„œ ์—ด์–ด๋ณด์ง€ ๋ชปํ•œ๋‹ค๋ฉด ์†Œ์ค‘ํžˆ ์ทจ๊ธ‰ ์†๋‹˜์ด ๋Œ์•„๊ฐˆ ๋•Œ ์ง‘์—์„œ ์ค€๋น„ํ•œ ๊ฐ„๋‹จํ•œ ์„ ๋ฌผ๋กœ ๋‹ต๋ก€ ํ˜„๊ด€์ด๋‚˜ ์ฐจ๋ฅผ ํƒ€๋Š” ๊ณณ๊นŒ์ง€ ๋ฐฐ์›… ์†์œ—์‚ฌ๋žŒ์ธ ๊ฒฝ์šฐ ๋‚˜์ค‘์— ์ž˜ ๋„์ฐฉํ•˜์…จ๋Š”์ง€ ํ™•์ธ ์ „ํ™” ํ•„์ˆ˜ ์ ‘๋Œ€๋งค๋„ˆ (์ง์žฅ) ๊ณตํ•ญ์— ๋งˆ์ค‘์„ ๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ, ๋™๋“ฑํ•™ ์ง๊ธ‰์˜ ์‚ฌ๋žŒ์ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด ์ข‹์Œ ์ƒ๋Œ€๋ฐฉ์ด ํ˜ธํ…” ์˜ˆ์•ฝ์„ ์›ํ•œ๋‹ค๋ฉด ํ˜ธํ…”๊นŒ์ง€ ์•ˆ๋‚ด ํ•œ๋ฒˆ์ฏค ํ–ฅํ† ์Œ์‹์„ ๋Œ€์ ‘ํ•˜๊ฑฐ๋‚˜ ๋ช…์Šน์ง€๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์Œ ์†๋‹˜์ด ๊ฐˆ๋•Œ ๋ฌด๋ฆฌํ•˜๊ฒŒ ์žก์ง€ ๋ง๊ณ  ๊ฐ„๋‹จํ•œ ์ธ์‚ฌ๋ง๋กœ ์ž‘๋ณ„ ์ž„์‹  ๋ฐ ์ถœ์‚ฐ ์ž„์‹  ์ž„์‹ ์— ์ž„ํ•˜๋Š” ๋ถ€๋ชจ์˜ ๋งˆ์Œ์ž์„ธ ํฌ์ƒ์žˆ๋Š” ์‚ฌ๋ž‘์„ ์‹ค์ฒœํ•˜๊ฒ ๋‹ค ํƒœ์–ด๋‚˜๋Š” ์ƒˆ ์ƒ๋ช…์„ ์ธ๊ฒฉ์ ์œผ๋กœ ๋Œ€ํ•˜๊ฒ ๋‹ค ์ถœ์‚ฐ ์ถœ์‚ฐ : ๋ณ‘์›์—์„œ 2-3์ผ ์ž…์› ์‚ฐํ›„์กฐ๋ฆฌ : ์‚ฐํ›„์กฐ๋ฆฌ์›์„ ์ด์šฉํ•˜๊ธฐ๋„ ํ•จ ์ถœ์‚ฐํ›„ ์‚ผ์น ์ผ (21์ผ) ๋™์•ˆ ์™ธ๋ถ€์ธ์˜ ๋ฐฉ๋ฌธ์„ ์ž์ œ ์šฐ๋ฆฌ๋‚˜๋ผ๋Š” ์˜ˆ๋กœ๋ถ€ํ„ฐ ์•„์ด๋ฅผ ๋‚ณ์œผ๋ฉด ๋Œ€๋ฌธ์— ๊ธˆ์ค„์„ ์ณค์Œ ์•„๋“ค์ด๋ฉด ๊ณ ์ถ”+์ˆฏ+์†”์žŽ, ๋”ธ์ด๋ฉด ์ˆฏ+์†”์žŽ ๊ฒฝ์กฐ์‚ฌ ์ƒ์ผ ๊ฒฐํ˜ผ ์ƒ์ผ ๋ฐฑ์ผ์ž”์น˜ : ์ถœ์ƒ ๋ฐฑ์ผ ํ›„ ์•„์ด์™€ ์‚ฐ๋ชจ๋ฅผ ์ถ•ํ•˜, ๋ฐฑ์„ค๊ธฐ๋ฅผ ๋‚˜๋ˆ  ๋จน์Œ ์ฒซ๋Œ : ๋งŒ 1๋…„์ด ๋˜๋Š” ์ฒซ ํ•ด ์ƒ์ผ, ๋Œ์žก์ด ํ™˜๊ฐ‘ : 61์„ธ๊ฐ€ ๋˜๋Š” ์ƒ์ผ, ์ผ ๊ฐ‘์ž๊ฐ€ ๋Œ์•„์˜ด ์šฐ๋ฆฌ๋‚˜๋ผ ๋‚˜์ด๋กœ 60์„ธ (๋งŒ 59๋˜๋Š” 58) ์—ฐ๋ น๋ณ„ ์ƒ์ผ ๋ช…์นญ 20์„ธ (์•ฝ๊ด€), 30์„ธ (์ด๋ฆฝ), 40์„ธ (๋ถˆํ˜น), 50์„ธ (์ง€์ฒœ๋ช…), 60์„ธ (์ด์ˆœ) 61์„ธ (ํ™˜๊ฐ‘), 62์„ธ (์ง„๊ฐ‘), 70์„ธ (๊ณ ํฌ), 80์„ธ (์‚ฐ์ˆ˜), 88์„ธ (๋ฏธ์ˆ˜) 90์„ธ (์กธ์ˆ˜), 100์„ธ (์ƒ์ˆ˜) ์„ฑ๋…„์˜ ๋‚  ๋งŒ 19์„ธ๊ฐ€ ๋˜๋Š” 5์›” ์…‹์งธ์ฃผ ์›”์š”์ผ ๋‚จ์ž (๊ด€๋ก€) : ๋Œ•๊ธฐ๋จธ๋ฆฌ ์ž๋ฅด๊ณ  ์ƒํˆฌ๋ฅผ ๋งŒ๋“  ํ›„ ๊ฐ“์„ ์”Œ์šฐ๋Š” ์˜์‹ ์—ฌ์ž (๊ณ„๋ก€) : ๋จธ๋ฆฌ ์˜ฌ๋ ค ๋น„๋…€๋ฅผ ๊ฝ‚๋Š” ์˜์‹ ์ˆ˜์ˆ˜ํŒฅ๋–ก์œผ๋กœ ์•ก์„ ๋ง‰์Œ ํ˜ผ๋ก€ (๊ฒฐํ˜ผ์‹) ์ „ํ†ตํ˜ผ๋ก€์˜ ์ ˆ์ฐจ ์˜ํ˜ผ : ์–‘๊ฐ€๊ฐ€ ์ค‘๋งค์ธ์„ ํ†ตํ•ด ์„œ๋กœ์˜ ์˜์‚ฌ๋ฅผ ์กฐ์ • ์•ž๋†€์ด : ์‹ ๋ถ€์ง‘ ๋งˆ๋‹น์—์„œ ๋ถ„์œ„๊ธฐ๋ฅผ ๋ถ๋‘—์šฐ๋Š” ๊ณต์—ฐ ์‹ ๋ž‘์ž…์žฅ : ์‹ ๋ž‘์ด ๊ธฐ๋Ÿฌ๊ธฐ ์•„๋ฒ”๊ณผ ํ•จ๊ป˜ ์‹ ๋ถ€์ง‘์œผ๋กœ ๊ฐ ๊ธฐ๋Ÿฌ๊ธฐ๋ฅผ ์ „๋‹ฌ ๋ฐ›์€ ์‹ ๋ž‘์€ ์‹ ๋ถ€๋ฅผ ํ–ฅํ•ด ์˜ˆ๋ฅผ ์˜ฌ๋ฆฌ๊ณ , ๊ธฐ๋Ÿฌ๊ธฐ๋ฅผ ๋Œ€์ฒญ์— ์˜ฌ๋ ค๋†“์Œ ์ „์•ˆ๋ก€ : ์‹ ๋ถ€์–ด๋จธ๋‹˜๊ป˜ ๊ธฐ๋Ÿฌ๊ธฐ๋ฅผ ๋“œ๋ฆฌ๋Š” ์˜ˆ์‹ ์ดˆ๋ก€์ฒญ : ์‹ ๋ž‘๊ณผ ์‹ ๋ถ€ ์ž…์žฅ ๋งž์ ˆ ์ „ ๋ชธ๊ณผ ๋งˆ์Œ์„ ์ •๊ฐˆํ•˜๊ฒŒ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ์†์„ ์”ป์Œ ๊ต๋ฐฐ๋ก€ (๋งž์ ˆ) ์‹ ๋ž‘๊ณผ ์‹ ๋ถ€๋Š” ์ดˆ๋ก€์ฒญ์—์„œ ์ฒ˜์Œ์œผ๋กœ ์ธ์‚ฌ๋ฅผ ๋‚˜๋ˆ„๋ฉฐ ์„œ๋กœ์—๊ฒŒ ์ ˆ ์‹ ๋ž‘๊ณผ ์‹ ๋ถ€๋Š” ๋ฐฑ๋…„ํ•ด๋กœ๋ฅผ ์„œ์•ฝ ํ•ฉ๊ทผ๋ก€ : ์ˆ ์ž”๊ณผ ํ‘œ์ฃผ๋ฐ•์— ๊ฐ๊ฐ ์ˆ ์„ ๋ถ€์–ด ๋งˆ์‹œ๋Š” ์˜์‹ ํ•จ, ํ•จ์ง„์• ๋น„, ๋‚ฉํ, ๋ด‰์ฑ„๋–ก ํ•จ : ๊ฒฐํ˜ผ ์ „๋‚  ์‹ ๋ž‘ ์ง‘์—์„œ ์‹ ๋ถ€ ์ง‘์œผ๋กœ ๋ณด๋‚ด๋Š” ์ƒ์ž ํ•จ์ง„์• ๋น„ : ํ•˜์ธ์ด๋‚˜ ์‚ฌ๋žŒ์„ ์‚ฌ์„œ ํ•จ์„ ์ง€๊ณ  ๊ฐ ํ•จ ๋‚ด์šฉ : ์˜ค๊ณก ์ฃผ๋จธ๋‹ˆ, ์ฒญํ™์ฑ„๋‹จ, ํ˜ผ์„œ์ง€ (ํ˜ผ์ธ๋ฌธ์„œ), ๋ฌผ๋ชฉ๊ธฐ, ์˜ˆ๋ฌผ ๋“ฑ ํ•จ์ง„์• ๋น„ ์ผํ–‰์€ ์‹ ๋ถ€ ์ชฝ ์นœ์ง€๋“ค๊ณผ ์—ฌํฅ์„ ๊ฐ€์ง ๋‚ฉํ : ์‹ ๋ž‘ ์ชฝ์—์„œ ํ˜ผ์„œ์™€ ์ฑ„๋‹จ, ์˜ˆ๋ฌผ์„ ํ•จ์— ๋‹ด์•„ ๋ณด๋‚ด๋Š” ๊ฒƒ ๋ด‰์ฑ„๋–ก : ํ•จ์„ ๋ฐ›๊ธฐ์œ„ํ•ด ์‹ ๋ถ€ ์ง‘์—์„œ ์ค€๋น„ํ•˜๋Š” ์Œ์‹ ํ˜„๋Œ€์‹ ๊ฒฐํ˜ผ์‹ ํ๋ฐฑ : ์‹ ๋ถ€๊ฐ€ ์‹œ๋Œ ์–ด๋ฅธ๋“ค๊ป˜ ์ฒซ์ธ์‚ฌ ์˜ฌ๋ฆฌ๋Š” ์˜๋ก€ ์ˆœ์„œ (๋ถ€๋ชจ -> ์กฐ๋ถ€๋ชจ -> ๋ฐฑ๋ถ€๋‚ด์™ธ -> ์ˆ™๋ถ€๋‚ด์™ธ -> ํ˜•์ œ) ๋“ค๋Ÿฌ๋ฆฌ : ํ˜•์ œ ์ž๋งค, ์‹ ๋ž‘ ์‹ ๋ถ€์˜ ์นœ๊ตฌ๋“ค, ์นœ์ฒ™, ํ™”๋™ ๊ฒฝ์กฐ์‚ฌ ์žฅ๋ก€ ์„œ์–‘์˜ ์žฅ๋ก€์‹ ๊ตํšŒ์—์„œ ์กฐ์šฉํ•œ ๊ฐ€์šด๋ฐ ์—„์ˆ™ํžˆ ์ง„ํ–‰ ๋ฏธ์‚ฌ๋‚˜ ์˜ˆ๋ฐฐ๊ฐ€ ๋๋‚œ ํ›„ ๊ณต๋™๋ฌ˜์ง€๋กœ ์žฅ๋ก€ ํ–‰๋ ฌ์ด ์‹œ์ž‘ ํ–‰๋ ฌ์˜ ์„ ๋‘์—๋Š” ๋ชฉ์‚ฌ๋‹˜์ด๋‚˜ ์‹ ๋ถ€๋‹˜, ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์œ ์กฑ, ์นœ์ฒ™๊ณผ ์ง€์ธ ์ˆœ์œผ๋กœ ์ด๋™ ๋‚จ์ž ์œ ์กฑ์€ ๊ฐ์ž ์„ธ ์‚ฝ์”ฉ ํ™์„ ๊ด€์œ„๋กœ ๋˜์ง€๊ณ  ์—ฌ์ž๋“ค์€ ๊ฝƒ๊ณผ ์ž‘์€ ๊ฝƒ๋‹ค๋ฐœ์„ ๋˜์ง ์žฅ๋ก€ ์ ˆ์ฐจ ์žฅ๋ก€ ์ฒซ์งธ๋‚  ์ž„์ข…(์šด๋ช…) : ๋งˆ์ง€๋ง‰ ์ˆจ์ด ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ ์ˆ˜์‹œ : ๋ˆˆ์„ ๊ฐ๊ธฐ๊ณ  ํŒ”๋‹ค๋ฆฌ๋ฅผ ๊ฐ€์ง€๋Ÿฐํžˆ ํ•˜์—ฌ ์ฝ”์™€ ์ž…์„ ์†œ์œผ๋กœ ๋ง‰์•„์ค€๋‹ค ์‚ฌ๋ง์ฆ๋ช…์„œ : ์˜์‚ฌ ๋˜๋Š” ์‹œ, ๊ตฐ ๊ฒ€์‚ฌ๊ด€์ด ์‚ฌ๋งํ•œ์ง€ 24์‹œ๊ฐ„ ์ด๋‚ด์— ๋ฐœ๊ธ‰ํ•œ๋‹ค ๋ฐœ์ƒ : ์ดˆ์ƒ์ด ๋‚ฌ์Œ์„ ์™ธ๋ถ€์— ์•Œ๋ฆฌ๊ณ  ์ƒ๋ก€๋ฅผ ์‹œ์ž‘ํ•จ์„ ๋งํ•œ๋‹ค ๋ถ€๊ณ  : ๊ณ ์ธ๊ณผ ์œ ์กฑ์˜ ๊ฐ€๊นŒ์šด ์นœ์ธ์ฒ™, ์ง€์ธ, ํšŒ์‚ฌ ๋“ฑ์— ๋ถ€๊ณ ๋ฅผ ๋‚ธ๋‹ค ์žฅ๋ก€ ๋‘˜์งธ๋‚  ์—ผ์Šต : ์†Œ๋…๋œ ์†œ์ด๋‚˜ ๊ฑฐ์ฆˆ๋กœ ์‹œ์‹ ์„ ์”ป๊ธฐ๋ฉฐ(์—ผ), ์ˆ˜์˜๋ฅผ ์ž…ํžŒ๋‹ค(์Šต) ์ž…๊ด€ : ์‹œ์‹ ์„ ๊ด€์— ๋ชจ์‹ ๋‹ค ์˜์ขŒ ์„ค์น˜ : ์˜์ •์‚ฌ์ง„์„ ์ œ์ƒ ์œ„์— ๋ชจ์‹œ๊ณ  ์˜์ • ์–‘ ์˜†์œผ๋กœ ์ด›๋ถˆ์„ ๋ฐํžŒ๋‹ค ์„ฑ๋ณต : ์ƒ์ œ๋Š” ์ƒ๋ณต์„ ์ž…๋Š”๋‹ค ์กฐ๋ฌธ : ์„ฑ๋ณต์ด ๋๋‚˜๋ฉด ์กฐ๋ฌธ์„ ๋ฐ›๋Š”๋‹ค ์กฐ๋ฌธ : ๋Œ์•„๊ฐ€์‹  ๋ง์ž์˜ ๋ณต์„ ๋นŒ๊ณ , ์Šฌํ””์„ ์œ„๋กœํ•˜๊ธฐ ์œ„ํ•ด ์žฅ๋ก€์‹์žฅ์— ๊ฐ€๋Š” ํ–‰์œ„ ์žฅ๋ก€ ์…‹์งธ๋‚  ๋ฐœ์ธ : ์˜๊ตฌ๊ฐ€ ์ง‘์„ ๋– ๋‚˜๋Š” ์ ˆ์ฐจ์ด๋ฉฐ ๋ฐœ์ธ์ œ๋ฅผ ์ง€๋‚ธ๋‹ค ์šด๊ตฌ : ์˜๊ตฌ๋ฅผ ์žฅ์ง€(ํ™”์žฅ์ง€)๊นŒ์ง€ ์žฅ์˜์ฐจ๋‚˜ ์ƒ์—ฌ๋กœ ์šด๋ฐ˜ ํ•˜๊ด€ : ์žฅ์ง€์—์„œ ์˜๊ตฌ(๊ด€)์„ ๊ด‘์ค‘(๊ตฌ๋ฉ์ด)์— ๋„ฃ๋Š”๋‹ค ์„ฑ๋ถ„(๋ด‰๋ถ„) : ๊ด€์„ ์™„์ „ํžˆ ๋ฎ์€ ํ›„, ํ™์„ ์Œ“์•„ ์˜ฌ๋ ค ์ž”๋””๋ฅผ ์ž…ํžŒ๋‹ค ์œ„๋ น์ œ(์„ฑ๋ถ„์ œ) : ๋ฌ˜์†Œ ์•ž์— ์˜์ขŒ๋ฅผ ๋ชจ์‹œ๊ณ  ์ œ์‚ฌ๋ฅผ ์˜ฌ๋ฆฐ๋‹ค ์žฅ๋ก€ ํ›„ ์ œ์˜ ๋ฐ˜์šฐ์ œ : ์ง‘์œผ๋กœ ๋Œ์•„์™€ ์˜ํ˜ผ์„ ์ง‘์— ๋งž์•„๋“ค์ด๋Š” ์ œ์‚ฌ ์‚ผ์šฐ์ œ : ๋ฌ˜์†Œ์—์„œ ์žฅ๋ก€๋ฅผ ์น˜๋ฅธ์ง€ 3์ผ์งธ ๋˜๋Š” ๋‚ ์— ๋“œ๋ฆฌ๋Š” ์ œ์‚ฌ ์‚ฌ์‹ญ๊ตฌ์ œ : ์žฅ๋ก€์ผ๋กœ๋ถ€ํ„ฐ 49์ผ์งธ ๋˜๋Š” ๋‚ ์— ์ง€๋‚ด๋Š” ์ œ์‚ฌ ๋ฐฑ์ผ์ œ : ์žฅ๋ก€ ํ›„ ๋ฐฑ์ผ์งธ ๋˜๋Š” ๋‚ ์— ์ง€๋‚ด๋Š” ์ œ์‚ฌ ์กฐ๋ฌธ ์˜ˆ์ ˆ ๋ฐฉ๋ช…๋ก ์„œ๋ช… -> ๋ถ„ํ–ฅ๊ณผ ํ—Œํ™” -> ์žฌ๋ฐฐ(ํฐ์ ˆ2) -> ์กฐ๋ฌธ(ํ‰์ ˆ1) -> ๋ถ€์˜๊ธˆ ์ „๋‹ฌ ๊ฐ€๊นŒ์šด ์‚ฌ๋žŒ์ด๋ผ๋ฉด ์ฆ‰์‹œ ์ฐพ์•„๊ฐ€์„œ ์• ๋„์˜ ๋œป์„ ์ „ํ•˜๊ณ  ์žฅ๋ก€ ์ ˆ์ฐจ๋ฅผ ๋„์™€์คŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์—ผ์ด ๋๋‚˜๊ณ  ์ค€๋น„๊ฐ€ ๋œ ์ž„์ข…์ผ ๋‹ค์Œ๋‚  ์กฐ๋ฌธ์„ ๊ฐ„๋‹ค ๋ฌธ์ƒ ์‹œ ๋ณต์žฅ ๊ฒ€์€์ƒ‰, ๋‹จ์ •ํ•˜๊ฒŒ, ํ™”๋ คํ•œ ์•ก์„ธ์„œ๋ฆฌX, ์ง„ํ•œ ๋ฉ”์ดํฌ์—…X ์กฐ๋ฌธ ์‹œ ์ธ์‚ฌ๋ง “์–ผ๋งˆ๋‚˜ ์ƒ์‹ฌ์ด ํฌ์‹ ์ง€์š””, “์œ„๋กœ์˜ ๋ง์”€์„ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค” ์กฐ๋ฌธ์‹œ ์˜์ „์— ๋ถ„ํ–ฅํ•˜๋Š” ๋ฐฉ๋ฒ• ์œ ๊ต์‹ : ์˜์ „์— ๋ถ„ํ–ฅ ํ›„ ํฐ์ ˆ์„ ๋‘ ๋ฒˆํ•˜๊ณ  ๋‚œ ํ›„, ์ƒ์ฃผ์™€ ํ‰์ ˆ ๊ธฐ๋…๊ต์‹ : ๊ฝƒ์„ ์˜ฌ๋ฆฌ๊ณ  (๊ฝƒ๋ด‰์˜ค๋ฆฌ๊ฐ€ ์กฐ๋ฌธ๊ฐ ์ชฝ์œผ๋กœ), ๊ธฐ๋„(๋ฌต๋…)์„ ํ•œ ํ›„ ์ƒ์ฃผ์™€ ํ‰์ ˆ ์กฐ์˜๊ธˆ ์ „๋‹ฌ ๋ฌธ์ƒ์„ ๋งˆ์นœ ํ›„ ๋ฌผ๋Ÿฌ๋‚˜์™€ ๋ถ€์˜ํ•จ์— ์ง์ ‘ ๋„ฃ์Œ ์ƒ์ฃผ์—๊ฒŒ ์ง์ ‘ ๊ฑด๋„ค๋Š” ๊ฒƒ์„ ๊ฒฐ๋ก€ ๋ด‰ํˆฌ์— ๋ถ€์˜, ๊ทผ์กฐ, ์กฐ์˜ ๋“ฑ์ด๋ผ ์”€ ๊ฒฝ์กฐ์‚ฌ ์ œ๋ก€ ์ œ๋ก€์˜ ์ข…๋ฅ˜ ๊ธฐ์ œ์‚ฌ ๋Œ์•„๊ฐ€์‹  ๋ถ€๋ชจ๋‹˜๊ณผ ์กฐ๋ถ€๋ชจ๋‹˜์„ ๊ธฐ๋ฆฌ๋Š” ์ œ์‚ฌ ์˜๋ฏธ : ๋Œ์•„๊ฐ€์‹  ๋ถ€๋ชจ, ์กฐ๋ถ€๋ชจ๋‹˜์„ ์ƒ๊ฐํ•˜๋ฉฐ ๋ฟŒ๋ฆฌ์˜์‹๊ณผ ์ •์ฒด์„ฑ ์ฐพ๊ธฐ ์‹œ๊ฐ„ : ๋Œ์•„๊ฐ€์‹  ๋‚ ์˜ ์ž์‹œ (๋ฐค 11์‹œ ~ ์ƒˆ๋ฒฝ 1์‹œ)์— ์‹œ์ž‘ ๊ธฐ๋…๊ต, ์ฒœ์ฃผ๊ต๋„์ธ : ๊ฐ€์กฑ ์˜ˆ๋ฐฐ, ์ถ”๋„์‹์œผ๋กœ ๋Œ€์‹ ํ•จ ์ฐจ๋ก€ ๋ช…์ ˆ๋‚  ์•„์นจ์— ์ง€๋ƒ„ ์ž”์„ ํ•œ ๋ฒˆ ์˜ฌ๋ฆฌ๊ณ , ์ถ•๋ฌธ์„ ์ฝ์ง€ ์•Š์Œ ์ด›๋ถˆ์„ ํ‚ค์ง€ ์•Š์Œ ์‹œ์ œ์‚ฌ (์‹œํ–ฅ) ๊ธฐ์ œ๋ฅผ ๋ชจ์‹œ์ง€ ์•Š์€ ์กฐ์ƒ์„ ๋ชจ์‹œ๋Š” ์ œ์‚ฌ ์Œ๋ ฅ 10์›”์— ์‹ค์‹œ ์ง๊ณ„์ž์†, ๋ฐฉ๊ณ„์ž์†์€ ๋ˆ„๊ตฌ๋‚˜ ์ฐธ์—ฌ ๋‚ฎ์— ์•ผ์™ธ์—์„œ ์ง€๋‚ด๋ฉฐ ๊ธฐ์ œ์ ˆ์ฐจ์™€ ๊ฐ™์Œ ์ฐจ๋ก€์ƒ ๋ฐ”๋ผ๋ดค์„ ๋•Œ ์˜ค๋ฅธ์ชฝ ๋™์ชฝ, ์™ผ์ชฝ ์„œ์ชฝ 1์—ด (์ˆ˜์ €, ์ž”, ๋–ก๊ตญ, ์‹œ๋ฃจ๋–ก) 2์—ด (์ „, ์œก์ , ์†Œ์ , ์ „, ์–ด์ ) 3์—ด (์œกํƒ•, ์†Œํƒ•, ์–ดํƒ•) 4์—ด (ํฌ, ๋‚˜๋ฌผ, ๊ฐ„์žฅ, ๋‚˜๋ฐ•๊น€์น˜, ์‹ํ˜œ) 5์—ด (๊ณผ์ผ, ํ•œ๊ณผ) ์ขŒํฌ์šฐํ˜œ : ์ขŒ์ธก์— ํฌ, ์šฐ์ธก์— ์‹ํ˜œ ์–ด๋™์œก์„œ : ๋™์ชฝ์— ์–ด๋ฅ˜, ์„œ์ชฝ์— ์œก๋ฅ˜ ๋‘๋™๋ฏธ์„œ : ์ƒ์„ ์˜ ๋จธ๋ฆฌ๋Š” ๋™์ชฝ ๊ผฌ๋ฆฌ๋Š” ์„œ์ชฝ ์กฐ์œจ์ด์‹œ : ๋Œ€์ถ”, ๋ฐค, ๋ฐฐ, ๊ฐ ์ œ์‚ฌ์Œ์‹๊ณผ ๊ธฐ๋ณธ ์ƒ์‹ ๋ณต์ˆญ์•„, ‘์น˜’์ž ์ƒ์„  (๊ฝ์น˜, ์ฐธ์น˜, ๊ฐˆ์น˜)๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค ๊ณ ์ถง๊ฐ€๋ฃจ, ๋งˆ๋Š˜ ์–‘๋…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค ์ง„์„ค์˜ ์ˆœ์„œ๋Š” ์‹œ์ ‘(์ˆ˜์ € ๋‹ด์•„ ๋†“๋Š” ๊ทธ๋ฆ‡)๊ณผ ์ž”๋ฐ˜์„ ๋จผ์ € ์˜ฌ๋ฆฐ๋’ค์— 1์—ด ๋ถ€ํ„ฐ ๋†“๋Š”๋‹ค ์„ค์—๋Š” ๋–ก๊ตญ, ์ถ”์„์—๋Š” ์†กํŽธ, ๊ธฐ์ œ์‚ฌ๋Š” ๋ฉ”(๋ฐฅ)์„ ์˜ฌ๋ฆฐ๋‹ค ์‹ํ˜œ, ํƒ•, ๋ฉด์€ ๊ฑด๋”๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค ์‹ ์ฃผ (์‹ ์œ„) ํ˜„ (๋‚˜ํƒ€๋‚  ํ˜„) ๊ด€๊ณ„ (์•„๋ฒ„์ง€ : ๊ณ , ์–ด๋จธ๋‹ˆ : ๋น„, ํ• ์•„๋ฒ„์ง€ : ์กฐ๊ณ , ํ• ๋จธ๋‹ˆ : ์กฐ๋น„) ์ด๋ฆ„ ์‹ ์œ„ ์ฒญํƒ๊ธˆ์ง€๋ฒ• ์ฒญํƒ๊ธˆ์ง€๋ฒ• (๊น€์˜๋ž€๋ฒ•) ์šฐ๋ฆฌ๋‚˜๋ผ ๊ณต์ง์ž ๋“ฑ์—๊ฒŒ ๋ถ€์ •์ฒญํƒ ๋ฐ ๊ธˆํ’ˆ์ˆ˜์ˆ˜๋ฅผ ๊ธˆ์ง€ํ•จ ์ ์šฉ : 2๋…„ ์ดํ•˜ ์ง•์—ญ ๋˜๋Š” 2000๋งŒ์› ์ดํ•˜ ๊ณผํƒœ๋ฃŒ 1. ๋ถ€์ •์ฒญํƒ ๊ธˆ์ง€ ์ฒญํƒ๋Œ€์ƒ ๊ตญ๊ฐ€/์ง€๋ฐฉ, ๊ณต์ง ์œ ๊ด€๋‹จ์ฒด, ๊ณต๊ณต๊ธฐ๊ด€๊ณผ ๊ณต๋ฌด์›๊ณผ ๋ฐฐ์šฐ์ž ๊ตญ/๊ณต/์‚ฌ๋ฆผ ํ•™๊ต ๊ต์ง์›, ํ•™๊ต๋ฒ•์ธ์˜ ์ž„์ง์›, ๋ฐฐ์šฐ์ž ์–ธ๋ก ์‚ฌ ์ข…์‚ฌ์ž์™€ ๋ฐฐ์šฐ์ž ์˜ˆ์™ธ ์กฐํ•ญ :๊ณต์ต์ ์ธ ๋ชฉ์ ์œผ๋กœ ๊ณ ์ถฉ ๋ฏผ์›์„ ์ „๋‹ฌํ•˜๋Š” ํ–‰์œ„ ๋“ฑ ์‹ ๊ณ  ๋ฐฉ๋ฒ• ๋ฐ›์€ ๊ธˆํ’ˆ์„ ๋Œ๋ ค์ฃผ๊ณ  ๊ฑฐ๋ถ€ ์˜์‚ฌ๋ฅผ ํ‘œํ˜„ ์กฐ์น˜ ์ดํ›„์—๋„ ๋‹ค์‹œ ๋ฐ›๋Š”๋‹ค๋ฉด ์†Œ์† ๊ธฐ๊ด€์žฅ์—๊ฒŒ ์„œ๋ฉด(์ „์ž๋ฌธ์„œ ํฌํ•จ)์œผ๋กœ ์‹ ๊ณ  2. ๊ธˆํ’ˆ์ˆ˜์ˆ˜ ๊ธˆ์ง€ ๋Œ€์ƒ ๋™์ผ์ธ์œผ๋กœ๋ถ€ํ„ฐ 1ํšŒ 100๋งŒ์›์ดˆ๊ณผ ๋งค ํšŒ๊ณ„์—ฐ๋„ 300๋งŒ์› ์ดˆ๊ณผ ๊ธˆํ’ˆ ๋“ฑ ์ˆ˜์ˆ˜ ์ง๋ฌด์™€ ๊ด€๋ จํ•˜์—ฌ 1ํšŒ 100๋งŒ์› ์ดํ•˜ ๊ธˆํ’ˆ ๋“ฑ ์ˆ˜์ˆ˜ ๋ฐฐ์šฐ์ž๊ฐ€ ์ˆ˜์ˆ˜ ๊ธˆ์ง€ ๊ธˆํ’ˆ ๋“ฑ์„ ๋ฐ›์€ ๊ฒฝ์šฐ ์™ธ๋ถ€ ๊ฐ•์˜์‹œ ๋Œ€ํ†ต๋ น๋ น์œผ๋กœ ์ •ํ•˜๋Š” ๊ธˆ์•ก์„ ์ดˆ๊ณผํ•˜๋Š” ์‚ฌ๋ก€๊ธˆ ์ˆ˜์ˆ˜ ์‹์‚ฌ๋น„ (3๋งŒ์›), ์„ ๋ฌผ (5๋งŒ์›), ๊ฒฝ์กฐ์‚ฌ๋น„ (5๋งŒ์›) (๊ฒฐํ˜ผ, ์žฅ๋ก€๋งŒ), ๊ธˆํ’ˆ (100๋งŒ์›) ์ฒ˜๋ฒŒ ๊ณผํƒœ๋ฃŒ : ๊ธˆํ’ˆ์ˆ˜์ˆ˜ (์ˆ˜์ˆ˜๊ธˆ์•ก 2๋ฐฐ ์ด์ƒ 5๋ฐฐ์ดํ•˜), ๊ฐ•์˜ ์‚ฌ๋ก€๊ธˆ(500๋งŒ์› ์ดํ•˜) ํ˜•์‚ฌ ์ฒ˜๋ฒŒ : ๋™์ผ์ธ์œผ๋กœ๋ถ€ํ„ฐ … (3๋…„์ดํ•˜ ์ง•์—ญ 3์ฒœ๋งŒ์›์ดํ•˜ ๋ฒŒ๊ธˆ) ์—ฐ์Šต๋ฌธ์ œ ๊ณต์ง์ž ์ž๋…€ ๋Œ์ž”์น˜์— ์ฐธ์—ฌํ•˜๋ฉฐ ์ถ•ํ•˜๊ธˆ์œผ๋กœ 5๋งŒ์›์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ -> ์œ„๋ฐ˜ (๋Œ์ž”์น˜๋Š” ๊ฒฝ์กฐ์‚ฌ๋น„ X) ๊ณต์ง์ž๊ฐ€ ๊ฒฐํ˜ผ์‹ ํ•˜๊ฐ์œผ๋กœ ์ฐธ์„ํ•˜์—ฌ 3๋งŒ์› ์ด์ƒ์˜ ์‹์‚ฌ๋ฅผ ์ œ๊ณต๋ฐ›์€ ํ–‰์œ„ -> ์œ„๋ฐ˜X (๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋Œ€์ ‘ํ–ˆ์œผ๋ฏ€๋กœ) ๊ณต์ง์ž ๋ถ€์นœ์˜ ์žฅ๋ก€์‹์— ๋ถ€์˜๊ธˆ 5๋งŒ์›๊ณผ ๋ณ„๋„์˜ ํ™”ํ™˜์„ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ -> ๋ถ€์˜๊ธˆ + ํ™”ํ™˜ 10๋งŒ์› ์ดํ•˜์ผ ๊ฒฝ์šฐ ์œ„๋ฐ˜ X ์ €์ž‘๊ถŒ๋ฒ• ์ €์ž‘๊ถŒ ์ €์ž‘๊ถŒ : ์ฐฝ์ž‘์ž๊ฐ€ ๊ฐ€์ง€๋Š” ๊ถŒ๋ฆฌ ์ €์ž‘๋ฌผ : ์‚ฌ๋žŒ์˜ ์‚ฌ์ƒ์ด๋‚˜ ๊ฐ์ •์„ ์ผ์ •ํ•œ ํ˜•์‹์— ๋‹ด์•„, ์ด๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋А๋ผ๊ณ  ๊นจ๋‹ฌ์„ ์ˆ˜ ์žˆ๋„๋ก ํ‘œํ˜„ํ•œ ๊ฒƒ. ์ €์ž‘๊ถŒ๋ฒ•์˜ ๋ชฉ์  ์ €์ž‘์ž์˜ ๊ถŒ๋ฆฌ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ์ €์ž‘๋ฌผ์˜ ๊ณต์ •ํ•œ ์ด์šฉ์„ ๋„๋ชจํ•จ์œผ๋กœ์จ ๋ฌธํ™”์‚ฐ์—…์„ ๋ฐœ์ „์‹œํ‚ค๋Š”๋ฐ ์žˆ๋‹ค. ์ €์ž‘๊ถŒ์˜ ํ‘œ์‹œ Copyright ยฉ2022 Apple Inc. ์ €์ž‘๊ถŒ๋ฒ• ์ œ์ • ๋ฐฐ๊ฒฝ 15์„ธ๊ธฐ ์ถœํŒ์ธ์‡„์ˆ ์˜ ๋ฐœ๋ช…์œผ๋กœ ๋ฌธ์„œ์˜ ๋Œ€๋Ÿ‰๋ณต์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง ์šฐ๋ฆฌ๋‚˜๋ผ์˜ ์ €์ž‘๊ถŒ๋ฒ• 1957๋…„ ์ €์ž‘๊ถŒ๋ฒ• ์ œ์ • (์ผ๋ณธ ์ €์ž‘๊ถŒ๋ฒ• ์ œ์ •์—… 1987๋…„ ๊ตญ์ œ์‹œ๋Œ€์˜ ๋น„๋‚œ์œผ๋กœ ์ €์ž‘๊ถŒ๋ฒ• ๊ฐœ์ • 1996๋…„ ๋ฒ ๋ฅธ ํ˜‘์•ฝ ๊ฐ€์ž… ๋ฌดํ–‰๋™ ๋ฐฉ์‹ ์ฃผ์˜ (์šฐ๋ฆฌ๋‚˜๋ผ์˜ ์ €์ž‘๊ถŒ๋ฒ•) => ์ €์ž‘๋ฌผ์„ ์ฐฝ์ž‘ํ•˜๋Š” ๋™์‹œ์— ์ž๋™์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ด„ => ์ €์ž‘๊ถŒ์˜ ๋ฐœ์ƒ์€ ์–ด๋– ํ•œ ์ ˆ์ฐจ๋‚˜ ํ–‰๋™๋ฐฉ์‹์„ ์š”ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ ์กฐ๊ฑด : ์ž์‹ ๋งŒ์˜ ํ‘œํ˜„ ๋ฐฉ์‹์œผ๋กœ ๋…์ž์ ์œผ๋กœ ํ‘œํ˜„ํ•  ๊ฒƒ ๋ฐฉ์‹์ฃผ์˜ (์šฐ๋ฆฌ๋‚˜๋ผ์˜ ํŠนํ—ˆ๊ถŒ) => ๊ธฐ์ˆ  ๊ณต๊ฐœ์˜ ๋Œ€๊ฐ€๋กœ ๋…์ ๊ถŒ์„ ๋ถ€์—ฌํ•จ์œผ๋กœ์จ ๋ฐœ๋ช…์˜์š•์„ ๊ณ ์ทจํ•จ ์กฐ๊ฑด : ์ด๋ฏธ ์•Œ๋ ค์ง„ ๊ธฐ์ˆ ์ด ์•„๋‹ˆ์–ด์•ผํ•˜๊ณ  ์‚ฐ์—…์— ์ด์šฉ ๊ฐ€๋Šฅ ํ•œ ๊ธฐ์ˆ ์ผ ๊ฒƒ ๋ฒ•์  ๋ณดํ˜ธ๋ฅผ ๋ฐ›๋Š” ์ €์ž‘๋ฌผ์ด ๋˜๋Š” ์š”๊ฑด ๋…์ฐฝ์„ฑ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋А๊ปด์„œ ์•Œ ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์™ธ๋ถ€์— ํ‘œํ˜„๋˜์–ด์•ผ ํ•œ๋‹ค ์ €์ž‘ ์ธ๊ฒฉ๊ถŒ ์ €์ž‘์ž์˜ ๋ช…์˜ˆ์™€ ์ธ๊ฒฉ์  ์ด์ต์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ๊ถŒ๋ฆฌ ๊ณตํ‘œ๊ถŒ, ์„ฑ๋ช…ํ‘œ์‹œ๊ถŒ, ๋™์ผ์„ฑ ์œ ์ง€๊ถŒ (๋‹จํŽธ์†Œ์„ค -> ๋งŒํ™” ์ œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ) ์ €์ž‘์žฌ์‚ฐ๊ถŒ => ์ €์ž‘๋ฌผ์„ ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ ์ด์šฉํ•˜๋А๋ƒ์— ๋”ฐ๋ฅธ ๊ถŒ๋ฆฌ ๋ณต์ œ๊ถŒ : ๋ณต์‚ฌ, ์ธ์‡„, ์‚ฌ์ง„, ๋…น์Œ, ๋…นํ™” ๋“ฑ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์‹œ ์ œ์ž‘ํ•˜๋Š” ๊ฒƒ ๊ณต์—ฐ๊ถŒ, ๊ณต์ค‘์†ก์‹ ๊ถŒ, ์ „์‹œ๊ถŒ, ๋ฐฐํฌ๊ถŒ, ๋Œ€์—ฌ๊ถŒ, 2์ฐจ์  ์ €์ž‘๋ฌผ ์ž‘์„ฑ๊ถŒ ์ €์ž‘์ธ์ ‘๊ถŒ ์ €์ž‘๋ฌผ์˜ ์ „๋‹ฌ์ž๋กœ์„œ์˜ ์—ญํ• ์„ ํ•˜๋Š” ์ž์—๊ฒŒ ๋ถ€์—ฌ๋˜๋Š” ๊ถŒ๋ฆฌ ์ง์žฅ๋งค๋„ˆ ํ˜ธ์นญ ์ƒ๊ธ‰์ž : ์„ฑ์”จ+์ง์œ„+๋‹˜, ์ง์œ„+๋‹˜ ๋™๊ธ‰์ž ์„ฑ์”จ+์ง์œ„, ์„ฑ์”จ+์ง์œ„+๋‹˜ (์•ˆ ์นœํ•˜๊ฑฐ๋‚˜ ๋‚˜์ด๊ฐ€ ๋งŽ์„ ๋•Œ) ์„ฑ๋ช…+์”จ (์—ฐํ•˜์ด๊ฑฐ๋‚˜ ์ง๊ธ‰์ด ์—†์„ ๋•Œ) ํ•˜๊ธ‰์ž : ์„ฑ๋ช…+์”จ, ์„ ๋ฐฐ๋‹˜(์—ฐ์žฅ์ž) ์ง์žฅ ์ƒ์‚ฌ์˜ ๊ฐ€์กฑ : ๋‚จํŽธ(์„ฑ+์„ ์ƒ๋‹˜), ๋ถ€์ธ(์‚ฌ๋ชจ๋‹˜), ์ž๋…€(์„ฑ๋ช…+์”จ) ๋™๋ฃŒ์˜ ๊ฐ€์กฑ : ๋‚จํŽธ (๋ถ€๊ตฐ, ๋ฐ”๊นฅ์„ ์ƒ๋‹˜), ์•„๋‚ด(๋ถ€์ธ, ์•ˆ์ฃผ์ธ) ์ธ์‚ฌ๋ง ์†์œ„์‚ฌ๋žŒ์—๊ฒŒ : ๊ณ ์ƒํ•˜์‹ญ์‹œ์˜คX, ์ˆ˜๊ณ ํ•˜์‹ญ์‹œ์˜คX ๋ฐ”๋ฅด๊ฒŒ ์•‰๋Š” ์ž์„ธ ์˜์ž ์™ผํŽธ์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ ๊นŠ์ˆ™ํžˆ ์•‰๋Š”๋‹ค ํ—ˆ๋ฆฌ์™€ ๊ฐ€์ŠดํŽด๊ณ  ๋“ฑ๋ฐ›์ด์— ๊ธฐ๋Œ„๋‹ค, ๋‹ค๋ฆฌ๋ฅผ ๊ผฌ์ง€ ์•Š๊ณ  ๋ฌด๋ฆŽ์„ ๋ถ™์—ฌ ์•‰๋Š”๋‹ค ์ง€์‹œ ๋ฐ›์„ ๋•Œ 5W 2H (When Where Who What Why, How How much) ๊ด€์  20๋Œ€ ์ž์‚ฐํ˜•์„ฑ ์ข…์žฃ๋ˆ ๋ชจ์œผ๊ธฐ ์ข…์žฃ๋ˆ : ๋ณธ๊ฒฉ์ ์ธ ํˆฌ์ž๋ฅผ ์‹œ์ž‘ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ดˆ๊ธฐ์ž๊ธˆ ๊ฐ€์‹œ์ ์ธ ๋ชฉํ‘œ๋ฅผ ์„ธ์šฐ์ž (ex ์ด๋ฒˆ๋…„์— 500๋งŒ์›์„ ๋ชจ์œผ์ž) ๊ธˆ์•ก : ๊ธฐ์กด ์ €์ถ•๊ธˆ์•ก์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ธˆ์•ก ๊ธฐ๊ฐ„ : 1~2๋…„์˜ ๋‹จ๊ธฐ๊ณ„ํš, ์•ˆ์ „ํ•œ ์ ๊ธˆ์ด๋‚˜ ์ฑ„๊ถŒํ˜• ํŽ€๋“œ ๊ธˆ์œต ์ƒํ’ˆ ์„ ํƒ ์ฃผํƒ์ž๊ธˆ : ์ฃผํƒ์ฒญ์•ฝ์ €์ถ•, ๋…ธํ›„์ž๊ธˆ : ์—ฐ๊ธˆ์ €์ถ• ๊ฒฐํ˜ผ์ž๊ธˆ : ํ˜ผํ•ฉํ˜• ํŽ€๋“œ, ๋น„์ƒ๊ธˆ : CMA์ƒํ’ˆ, ์ข…์žฃ๋ˆ : ์ ๊ธˆ/์ฑ„๊ถŒํ˜• ํŽ€๋“œ ์ฃผํƒ์ฒญ์•ฝ์ €์ถ• ์ƒˆ๋กœ ์ง€์€ ์•„ํŒŒํŠธ๋ฅผ ๋ถ„์–‘ ๋ฐ›์œผ๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ฐœ์„ค 1์ธ 1๊ณ„์ขŒ, ์ฃผํƒ ์†Œ์œ  ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๊ฐ€์ž… ๊ฐ€๋Šฅ ๊ณต๊ณต๋ถ„์–‘ (์ฃผํƒ๊ณต์‚ฌ) : ์ ๊ธˆํ˜•ํƒœ (2~10) ์ฒญ์•ฝ๊ธˆ์•ก์ด ํด์ˆ˜๋ก ์œ ๋ฆฌ ๋ฏผ๊ฐ„๋ถ„์–‘ (๋ฏผ๊ฐ„๊ฑด์„คํšŒ์‚ฌ) : ๊ฐ€์ ์ œ, ์ถ”์ฒจ์ œ ๋ฌด์ฃผํƒ ๊ธฐ๊ฐ„ ๊ธธ์ˆ˜๋ก, ๋ถ€์–‘๊ฐ€์กฑ ๋งŽ์„์ˆ˜๋ก ์œ ๋ฆฌ ๊ตญ๋ฏผ ์—ฐ๊ธˆ๋ณดํ—˜ ์ฃฝ์„๋•Œ ๊นŒ์ง€ ์ง€๊ธ‰๋˜๋Š” ์—ฐ๊ธˆ์ƒํ’ˆ, ์†Œ๋“์ด ์žˆ๋Š” ๊ตญ๋ฏผ์ด๋ผ๋ฉด ์˜๋ฌด ๊ฐ€์ž… ์—ฐ๊ธ‰์ง€๊ธ‰ ์‹œ์ž‘ (61~65์„ธ) ๋ณดํ—˜๋ฃŒ๋Š” ์†Œ๋“์˜ 9% ์ง์žฅ์ธ์€ ์ ˆ๋ฐ˜์„ ๊ณ ์šฉ์ฃผ๊ฐ€ ๋ถ€๋‹ด ๊ฐœ์ธ์‚ฌ์—…์ž๋‚˜ ์ฃผ๋ถ€๋Š” ์ „์•ก์„ ์ž์‹ ์ด ๋ถ€๋‹ด ํ‡ด์ง ์—ฐ๊ธˆ ์ œ๋„ ํ‡ด์ง๊ธˆ : ๊ทผ๋ฌด๊ธฐ๊ฐ„ 1๋…„์„ ์ฑ„์šธ ๋•Œ๋งˆ๋‹ค ํ•œ ๋‹ฌ์น˜์˜ ์›”๊ธ‰์„ ๋ชจ์•„๋†จ๋‹ค๊ฐ€ ํ•œ๋ฒˆ์— ์ฃผ๋Š” ๋ˆ ์ผ์‹œ๊ธˆ/์—ฐ๊ธˆ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค ํ‡ด์ง๊ธˆ ์ œ๋„ (ํšŒ์‚ฌ๊ฐ€ ํŒŒ์‚ฐ -> ๋ชป ๋Œ๋ ค๋ฐ›์Œ)์„ ๊ฐœ์„  ํ•˜์—ฌ ํ‡ด์ง์—ฐ๊ธˆ ์ œ๋„ DBํ˜• (ํšŒ์‚ฌ๊ฐ€ ์šด์šฉ์ง€์‹œ) : ์€ํ–‰ ์˜ˆ๊ธˆ ๋ฐฉ์‹, ๊ทผ๋กœ์ž๊ฐ€ ๋ฏธ๋ฆฌ ๊ธˆ์•ก์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. DCํ˜• (๊ทผ๋กœ์ž๊ฐ€ ์šด์šฉ์ง€์‹œ) : ์ฃผ๋กœ ์ฃผ์‹์ด๋‚˜ ์ฑ„๊ถŒ ํˆฌ์ž, ๊ธˆ์•ก์„ ์•Œ ์ˆ˜ ์—†๋‹ค ์ฃผํƒ ์—ฐ๊ธˆ ์ œ๋„ (์—ญ๋ชจ๊ธฐ์ง€๋ก ) ๋งŒ 55์„ธ ์ด์ƒ์˜ ๊ณ ๋ น์ž๊ฐ€ ๊ธˆ์œต๊ธฐ๊ด€์— ์ž์‹ ์ด ์‚ด๊ณ  ์žˆ๋Š” ์ฃผํƒ์„ ๋‹ด๋ณด๋กœ ์ œ๊ณตํ•œ ๋’ค, ๋งค๋‹ฌ ๊ณ ์ •์ ์ธ ์ƒํ™œ์ž๊ธˆ์„ ์—ฐ๊ธˆ์‹์œผ๋กœ ๋ฐ›๋Š” ์žฅ๊ธฐ์ฃผํƒ์ €๋‹น๋Œ€์ถœ ๊ธˆ์œต์ •๋ณด : 20๋Œ€์— ๊ธˆ์œต์ง€์‹์„ ์Œ“๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค ์žฌ๋ฌด๋ชฉํ‘œ ์„ค์ • ๋ฐฉ๋ฒ• ํ˜„๋ช…ํ•œ ์†Œ๋น„ ์ƒํ™œ ๊ฑด์ „ํ•œ ๊ฐ€์น˜๊ด€์„ ๊ฐ€์ง€๊ณ , ์˜ˆ์‚ฐ ์ƒํ™œ์„ ์‹ค์ฒœํ•˜๋Š” ์ƒํ™œ ์˜ˆ์‚ฐ ์ƒํ™œ ํฌ์†Œ์„ฑ์˜ ์›์น™ : ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์žฌํ™”๋Š” ๋ฌดํ•œํ•˜์ง€ ์•Š๋‹ค ์†Œ๋น„๊ฐ€์น˜๊ด€ : ์†Œ๋น„์˜ ์šฐ์„ ์ˆœ์œ„์—์„œ ์–ด๋–ค ํ’ˆ๋ชฉ์„ ์šฐ์„ ์‹œํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๊ฐ์ž์˜ ์‹ ๋… ๊ฐ€์ฒ˜๋ถ„ ์†Œ๋“ = ์ด ์†Œ๋“ - ๋น„์†Œ๋น„์ง€์ถœ (์„ธ๊ธˆ, ๊ตญ๋ฏผ์—ฐ๊ธˆ, ๊ฑด๊ฐ•๋ณดํ—˜) ์˜ˆ์‚ฐ : ์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ์˜ ๊ธฐ๋Œ€ ์ˆ˜์ž…์— ๊ธฐ์ดˆํ•œ ์ง€์ถœ ๊ณ„ํš ์˜ˆ์‚ฐ ์ƒํ™œ์˜ ์žฅ์  ์ž์‹ ์ด ์ถ”๊ตฌํ•ด์•ผํ•  ์žฌ๋ฌด์š•๊ตฌ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ž์‹ ์˜ ์ˆ˜์ž…๊ธˆ์•ก, ์ง€์ถœ๊ธˆ์•ก ์žฌ๋ฌด์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์†Œ๋“์„ ๋Š˜๋ฆด ๋ฐฉ์•ˆ์ด๋‚˜ ์†Œ๋น„์˜ ์–ด๋–ค ๋ถ€๋ถ„์„ ์ค„์—ฌ์•ผ ํ•˜๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ํ‰๊ฐ€ํ•จ์œผ๋กœ์จ ๋ฌธ์ œ์ ์„ ์ฐพ๊ณ  ๊ฐœ์„ ํ•ด ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์žฌ๋ฌด ๋ชฉํ‘œ์˜ ์š”๊ฑด ํ˜„์‹ค์„ฑ ์žˆ๋Š” ๋ชฉํ‘œ ์„ค์ • ๊ตฌ์ฒด์ ์ด๋ฉด์„œ ์ธก์ • ๊ฐ€๋Šฅํ•œ ๋ชฉํ‘œ ์„ค์ • ๋ธ”๋ž™ ์ปจ์Šˆ๋จธ ์†Œ๋น„์ž ๊ถŒ์ต ์†Œ๋น„์ž๋ณดํ˜ธ๋ฒ•์€ ์ œ์ •๋œ ์ด๋ž˜๋กœ 40๋…„๊ฐ„ ์†Œ๋น„์ž ๊ถŒ์ต์„ ์ฆ์ง„์‹œํ‚ด ๋ธ”๋ž™์ปจ์Šˆ๋จธ ๊ธฐ์—… ๋“ฑ์„ ์ƒ๋Œ€๋กœ ๋ถ€๋‹นํ•œ ์ด์ต์„ ์ทจํ•˜๊ณ ์ž ์ œํ’ˆ์„ ๊ตฌ๋งคํ•œ ํ›„ ๊ณ ์˜์ ์œผ๋กœ ์•…์„ฑ ๋ฏผ์›์„ ์ƒ์Šต์ ์œผ๋กœ ์ œ๊ธฐํ•˜๋Š” ์ž ๋น„๋งค๋„ˆ ์ปจ์Šˆ๋จธ ๊ทผ๋กœ์ž์—๊ฒŒ ‘๊ฐ‘์งˆ’ํ•˜๋Š” ์†Œ๋น„์ž ๋ธ”๋ž™์ปจ์Šˆ๋จธ๋ฅผ ํฌํ•จ => ‘๊ฐ‘์งˆ’์˜ ํ”ผํ•ด๋ฅผ ๋‹นํ•˜๋Š” ๊ทผ๋กœ์ž๊ฐ€ ๋งŽ์•„์ง์— ๋”ฐ๋ผ ‘์‚ฐ์—…์•ˆ์ „๋ณด๊ฑด์ •’ ๊ฐœ์ • ์œค๋ฆฌ์  ์†Œ๋น„ ์†Œ๋น„์ž๊ฐ€ ๋ฌผ๊ฑด์„ ๊ตฌ์ž…ํ• ๋•Œ, ๊ฐ€๊ฒฉ๊ณผ ํ’ˆ์งˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌํšŒ์™€ ํ™˜๊ฒฝ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ ์นœํ™˜๊ฒฝ ์†Œ๋น„ ์ƒ๊ฑฐ๋ž˜ ์†Œ๋น„์œค๋ฆฌ ์‚ฌ์—…์ž์™€ ๊ฑฐ๋ž˜ํ•  ๋•Œ ์ •ํ•ด์ง„ ๊ณ„์•ฝ์˜ ์˜๋ฌด๋ฅผ ์ง€ํ‚ค๋Š” ์ผ ๋ฐ”์ด์ฝง : ์œค๋ฆฌ์ ์œผ๋กœ ๋ฐ”๋žŒ์งํ•œ ์ œํ’ˆ์„ ๊ตฌ์ž…ํ•˜๋Š” ๊ตฌ๋งค์šด๋™ ๋กœ์ปฌํ‘ธ๋“œ ์†Œ๋น„ ๊ณต์ •๋ฌด์—ญ ์ƒํ’ˆ ๊ตฌ๋งค ๊ธฐ๋ถ€์™€ ๋‚˜๋ˆ” ํฌ๋ผ์šฐ๋“œ ํŽ€๋”ฉ ์˜จ๋ผ์ธ์„ ํ†ตํ•ด ๋‹ค์ˆ˜์˜ ์†Œ์•กํˆฌ์ž์ž๋กœ๋ถ€ํ„ฐ ์ž๊ธˆ์„ ์กฐ๋‹ฌํ•˜๋Š” ๊ฒƒ ์ข…๋ฅ˜ ๋ฆฌ์›Œ๋“œํ˜• : ์ œํ’ˆ์„ ์ƒ์‚ฐ์ž๊ฐ€ ๋งŒ๋“ค์–ด๋‚ด๋ฉด ์ผ๋ฐ˜์ธ์ด ์„ ์ฃผ๋ฌธํ•ด์„œ ๊ตฌ๋งคํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ถ€ํ˜• : ๊ณต์ต์ ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ชจ์œผ๋Š” ๊ฒฝ์šฐ ๋Œ€์ถœํ˜• : ๊ฐœ์ธ๋“ค ์‚ฌ์ด์—์„œ P2P ๋Œ€์ถœ์ด ์ด๋ฃจ์–ด์ง€๊ณ , ๋ฆฌ์›Œ๋“œ๋กœ ์ด์ž๊ฐ€ ์ œ๊ณต ํˆฌ์žํ˜• : ํˆฌ์ž์ž๊ธˆ์„ ์ง€์›ํ•˜๊ณ  ์ฃผ์‹ ๋ฐ ์ฑ„๊ถŒ ๋“ฑ์˜ ๋ณด์ƒ์„ ๋ฐ›์Œ ํŽ€๋”ฉ ๊ธฐํ•œ ๋‚ด์— ๋ชฉํ‘œ๊ธˆ์•ก์„ ๋ชจ์œผ์ง€ ๋ชปํ•˜๋ฉด ์ž๊ธˆ์„ ๋‹ค์‹œ ๋˜๋Œ๋ ค ์ค€๋‹ค ๋ฐœ์ „ ๋ฐฐ๊ฒฝ ์ค‘๊ฐœ ํ”Œ๋žซํผ๋“ฑ์žฅ, SNSํ™œ์„œ์˜คํ•˜, ๋Œ€์•ˆ์  ๊ธฐ์—…๊ธˆ์œต, ํฌ๋ผ์šฐ๋“œํŽ€๋”ฉ๋ฒ• ์‚ฌํšŒ์  ๊ธฐ์—… ์‚ฌํšŒ์  ๊ธฐ์—… ์˜๋ฆฌ ๊ธฐ์—…๊ณผ ๋น„์˜๋ฆฌ๊ธฐ์—…์˜ ์ค‘๊ฐ„ ํ˜•ํƒœ ์‚ฌํšŒ์  ๋ชฉ์ ์„ ์šฐ์„ ์ ์œผ๋กœ ์ถ”๊ตฌํ•˜๋ฉด์„œ, ์žฌํ™”์™€ ์„œ๋น„์Šค์˜ ์ƒ์‚ฐํŒ๋งค ๋“ฑ ์˜์—… ํ–‰๋™์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ์—… ๊ณต๊ณต์„ฑ๊ณผ ์ˆ˜์ต์„ฑ (๊ณต๊ณต์„ฑ) ์ž์›๋ด‰์‚ฌ <- NGO <- ์‚ฌํšŒ์ ๊ธฐ์—… -> ํ˜‘๋™์กฐํ•ฉ -> ์ผ๋ฐ˜๊ธฐ์—… (์ˆ˜์ต์„ฑ) ์„ฑ๊ณต๋ฐฉ์•ˆ ์˜๋ฆฌ๊ธฐ์—…๊ณผ ์‚ฌํšŒ์  ๊ธฐ์—…๊ฐ„์˜ ํŒŒํŠธ๋„ˆ์‹ญ์„ ๋ชจ์ƒ‰ํ•  ๊ฒƒ ์ข…๋ฅ˜ ์ผ์ž๋ฆฌ์ œ๊ณตํ˜• : ์ทจ์•ฝ๊ณ„์ธต์—๊ฒŒ ์ผ์ž๋ฆฌ๋ฅผ 30% ์ด์ƒ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌํšŒ์„œ๋น„์Šค์ œ๊ณตํ˜• : ์ทจ์•ฝ๊ณ„์ธต์˜ 30% ์ด์ƒ์—๊ฒŒ ์‚ฌํšŒ์„œ๋น„์Šค๋ฅผ ์ˆ˜ํ˜œํ•œ ๊ฒฝ์šฐ ํ˜ผํ•ฉํ˜• : ์ทจ์•ฝ๊ณ„์ธต์—๊ฒŒ ์ผ์ž๋ฆฌ๋‚˜ ์‚ฌํšŒ ์„œ๋น„์Šค๋ฅผ ๊ฐ™์ด ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์ง€์—ญ์‚ฌํšŒ๊ณตํ—Œํ˜• : ๋งˆ์„์˜ ๊ฒฝ์ œ์ , ์‚ฌํšŒ์ , ๋ฌธํ™”์  ํ™œ์„ฑํ™”์— ๊ณตํ—Œํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐํƒ€ํ˜• : ์ฐฝ์˜์ , ํ˜์‹ ์  ๋ฐฉ์‹์œผ๋กœ ์‚ฌํšŒ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ๋…ธ๋ ฅํ•œ ๊ฒฝ์šฐ ์†Œ์…œ๋ฒค์ฒ˜ ๊ฒฝ์—ฐ๋Œ€ํšŒ ์‚ฌํšŒ์  ๊ธฐ์—…์˜ ์ฐฝ์—… ์•„์ด๋””์–ด๋ฅผ ๋ฐœ๊ตดํ•˜๊ณ  ์‚ฌ์—…ํ™”๋ฅผ ์ง€์›ํ•˜๋Š” ๋Œ€ํšŒ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋งค๋„ˆ ๋‚˜ ์ „๋‹ฌ๋ฒ• (I-Message) ๋‚˜๋ฅผ ์ฃผ์–ด๋กœ ์ž์‹ ์˜ ๊ฐ์ •์ด๋‚˜ ์ƒ๊ฐ์„ ํ‘œํ˜„ํ•˜๋Š” ์ „๋‹ฌ๋ฒ• ๋Œ€ํ™”์˜ ํ˜‘๋ ฅ์„ฑ ๋™์–‘์  ์‚ฌ๊ณ  : ์นจ๋ฌต์€ ๊ธˆ์ด๋‹ค, ์ผ๋ฐฉํ†ตํ–‰ํ˜• ์„œ์–‘์  ์‚ฌ๊ณ  : ๋Œ€ํ™”๋Š” ์–‘๋ฐฉํ–ฅ, ๋ฆฌ์•ก์…˜ ์ค‘์š” ๋‚จ์„ฑ์˜ ๊ฒฐํ˜ผ ํ›„ ๊ฐ€์กฑ๊ฐ„์˜ ํ˜ธ์นญ ๊ตฌ๋ถ„ ํ˜ธ์นญ (์ง์ ‘) ์ง€์นญ(3์ž) ์•„๋‚ด์˜ ์•„๋ฒ„์ง€ ์žฅ์ธ์–ด๋ฅธ, ์•„๋ฒ„๋‹˜ ์žฅ์ธ์–ด๋ฅธ, OO ์™ธํ• ์•„๋ฒ„์ง€ ์•„๋‚ด์˜ ์–ด๋จธ๋‹ˆ ์žฅ๋ชจ๋‹˜, ์–ด๋จธ๋‹˜ ์žฅ๋ชจ๋‹˜, OO ์™ธํ• ๋จธ๋‹ˆ ์•„๋‚ด ์—ฌ๋ณด, OO์—„๋งˆ, ์ž„์ž, ๋‹น์‹  ์ง‘์‚ฌ๋žŒ, ์•ˆ์‚ฌ๋žŒ, OO์—„๋งˆ, ์•„๋‚ด ์•„๋‚ด์˜ ์˜ค๋น  ํ˜•๋‹˜ ์ขŒ๋™ ์•„๋‚ด์˜ ๋‚จ๋™์ƒ ์ฒ˜๋‚จ, ์ž๋„ค ์ขŒ๋™ ์•„๋‚ด์˜ ์–ธ๋‹ˆ ์ฒ˜ํ˜• ์ขŒ๋™ ์•„๋‚ด์˜ ์—ฌ๋™์ƒ ์ฒ˜์ œ ์ขŒ๋™ ๋”ธ์˜ ๋‚จํŽธ O์„œ๋ฐฉ ์šฐ๋ฆฌ ์‚ฌ์œ„ ์—ฌ์„ฑ์˜ ๊ฒฐํ˜ผ ํ›„ ๊ฐ€์กฑ๊ฐ„์˜ ํ˜ธ์นญ ๊ตฌ๋ถ„ ํ˜ธ์นญ (์ง์ ‘) ์ง€์นญ(3์ž) ๋‚จํŽธ์˜ ์•„๋ฒ„์ง€ ์•„๋ฒ„๋‹˜ ์‹œ์•„๋ฒ„์ง€, OO ํ• ์•„๋ฒ„์ง€ ๋‚จํŽธ์˜ ์–ด๋จธ๋‹ˆ ์–ด๋จธ๋‹˜ ์‹œ์–ด๋จธ๋‹ˆ, OO ํ• ๋จธ๋‹ˆ ๋‚จํŽธ ์—ฌ๋ณด, OO์•„๋น , ๋‹น์‹ , ์˜๊ฐ ๋‚จํŽธ, ์•„๋ฒ”, ๊ทธ ์ด ๋‚จํŽธ์˜ ํ˜• ์•„์ฃผ๋ฒ„๋‹˜ ์•„์ฃผ๋ฒ„๋‹˜, ์‹œ์ˆ™ ๋‚จํŽธ์˜ ๋‚จ๋™์ƒ ๋„๋ จ๋‹˜(๊ธฐํ˜ผ), ์„œ๋ฐฉ๋‹˜(๊ธฐํ˜ผ) ์‹œ๋™์ƒ ๋‚จํŽธ์˜ ๋ˆ„๋‚˜ ํ˜•๋‹˜ ์‹œ๋ˆ„์ด ๋‚จํŽธ์˜ ์—ฌ๋™์ƒ ์•„๊ฐ€์”จ ์‹œ๋ˆ„์ด ์•„๋“ค์˜ ์•„๋‚ด ์•„๊ฐ€, ์ƒˆ์•„๊ฐ€ ์šฐ๋ฆฌ ๋ฉฐ๋Š˜์•  ํ† ๋ก  ์‹œ ๊ฒฝ์ฒญ์ž์˜ ๋งค๋„ˆ SMART ๊ฒฝ์ฒญ๋ฒ• Subject (ํ† ๋ก ์˜ ์ฃผ์ œ ์ƒ๊ฐ) Materials (์ธ์šฉํ•˜๋Š” ์ž๋ฃŒ์˜ ์ถœ์ฒ˜ ์œ ์˜) Assertion (์ฃผ์žฅ์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…) Reaction (๋ฐ˜์‘[๋™์˜/๋ฐ˜๋Œ€]์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ์ƒ๊ฐ) Trademark (๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฃผ์žฅ๊ณผ ๊ตฌ๋ณ„๋˜๋Š” ํŠน์ƒ‰์ด ๋ฌด์—‡์ธ์ง€ ์ฐพ์•„๋ณธ๋‹ค) ํ†ต์‹  ๋งค๋„ˆ (ํŽธ์ง€) ์•ˆ๋ถ€ ํŽธ์ง€ : ๊ฒฉ์‹์„ ์ฐจ๋ฆด ํ•„์š” ์—†์Œ ๊ฐ์‚ฌ ํŽธ์ง€ : ํ–‰์‚ฌ ํ›„ 2~3์ผ ์ด๋‚ด ์‹ ์†ํ•˜๊ฒŒ ๋ณด๋‚ผ ๊ฒƒ ์ดˆ์ฒญํŽธ์ง€ : 2์ฃผ~4์ฃผ ์ „์— ์œกํ•˜์›์น™์— ๋งž์ถ”์–ด ๋ณด๋‚ผ ๊ฒƒ ์œ„๋กœํŽธ์ง€ : ํ• ๊นŒ ๋ง๊นŒ ๊ณ ๋ฏผ๋˜๋ฉด ์“ฐ์ž, ์ง„์ •์„ฑ๊ณผ ๋”ฐ๋œปํ•œ ๋งˆ์Œ์„ ํ‘œํ˜„ํ•  ๊ฒƒ ์Œ์ฃผ๋งค๋„ˆ(1) ์ ํฌ๋„์ฃผ 12-13๋„ ์œก๋ฅ˜์š”๋ฆฌ์— ์ ํ•ฉ ๋ฐฑํฌ๋„์ฃผ 10-13๋„, ์ƒ์„ ์š”๋ฆฌ์— ์ ํ•ฉ ๋กœ์ œ 6-8๋„, ์ƒ์„ , ํ•ด๋ฌผ๋ฅ˜, ๋‹ญ๊ณ ๊ธฐ์™€ ์–ด์šธ๋ฆผ ์•„์ด์Šค์™€์ธ ๋‹น๋„๊ฐ€ ๋†’๊ณ  ๊ณผ์ผ ํ–ฅ์ด ์ง„ํ•จ ๋””์ €ํŠธ ์™€์ธ 18๋„ ์ „ํ›„ ์ŠคํŒŒํด๋ง ์™€์ธ 10-14๋„, ํŒŒํ‹ฐ์šฉ ํฌ๋„์ฃผ ๋ผ๋ฒจ ์™€์ธ์ด๋ฆ„ ์ƒ์‚ฐ์ง€ ์™€์ด๋„ˆ๋ฆฌ(์–‘์กฐ์žฅ) ์ด๋ฆ„ ์–‘์กฐ์žฅ ์„ค๋ฆฝ๋…„๋„ ๋‹น๋„ ์™€์ธ์˜ ๋‹น๋„ ์ดํƒˆ๋ฆฌ์•„ : (dry) <- ์„ธ์ฝ” <- ์•„๋ณด์นดํ†  <-> ์•„๋งˆ๋นŒ๋ ˆ -> ๋Œ์ฒด -> (sweet) ํ”„๋ž‘์Šค : (dry) <- ๋ธŒ๋ฆฌ <- ์„ธํฌ <-> ๋‘์Šค -> (๋ฏ€์™ˆ๋ ˆ, ๋ฆฌํ€˜๋ฅด) -> (sweet) ์™€์ธ์ž”์˜ ์ข…๋ฅ˜ (์‚ฌ์ง„์ž๋ฃŒ) ๋ณด๋ฅด๋„ (๋ ˆ๋“œ์™€์ธ ์ž”), ๋ถ€๋ฅด๊ณ ๋‰ด(๋ ˆ๋“œ์™€์ธ ์ž”) ํ™”์ดํŠธ์™€์ธ ์ž”, ์ŠคํŒŒํด๋ง ์™€์ธ ์ž” (์ƒดํŽ˜์ธ ์ž”) ์™€์ธ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ• ๋ผ๋ฒจ์„ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ฒŒ ์žก๋Š”๋‹ค ๋ ˆ๋“œ์™€์ธ์€ ์ž”์˜ 1/3 ์ฑ„์›€, ์ŠคํŒŒํด๋ฆฌ์™€์ธ์€ 2/3 ์ฑ„์›€ ์™€์ธ์˜ ์–‘์ด ์ ์–ด์ง€๋ฉด ์™€์ธ์˜ ์˜จ๋„๊ฐ€ ์˜ฌ๋ผ๊ฐ€์„œ ๋ง›์ด ๋œํ•จ, ์ƒ๋Œ€๋ฐฉ ์˜ํ–ฅ์„ ๋ฌผ์–ด๋ณด๊ณ  ์ฒจ์ž” ์™€์ธ ๋ฐ›๋Š” ๋ฐฉ๋ฒ• ์ž”์„ ํ…Œ์ด๋ธ”์— ๋†“์€ ์ฑ„ ์ž”์˜ ๋ฐœ ๋ถ€๋ถ„์— ์†์„ ๋Œ„ ์ฑ„ ๋ฐ›๋Š”๋‹ค ์Šค์›”๋ง : ์ž”์˜ ์Šคํ…œ์„ ์žก๊ณ  ํ•œ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ -> ํ–ฅ์„ ํ’๋ถ€ํ•˜๊ฒŒ ์Œ์ฃผ๋งค๋„ˆ(2) ํŒŒํ‹ฐ์—์„œ ์™€์ธ์„ ๋”ฐ๋ฅด๋Š” ๋งค๋„ˆ ๋‚จ์„ฑ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋จผ์ € ํ…Œ์ด์ŠคํŒ… -> ์ƒ์„์— ์•‰์€ ์—ฌ์„ฑ -> ์‹œ๊ณ„๋ฐฉํ–ฅ ์—ฌ์„ฑ๋งŒ -> ๋‚จ์„ฑ -> ์ฃผ์ธ ์ˆœ์œผ๋กœ ๋”ฐ๋ฆ„ ๋‚จ์€ ์ˆ  ๋ณด๊ด€ ๋ฐฉ๋ฒ• ์ผ๋ฐ˜์  : ์„œ๋Š˜ํ•œ ๊ณณ์— ๋ณ‘์„ ๋‰˜์–ด์„œ ์ „๋ฌธ์  : ์™€์ธ๋ณ‘ ์•ˆ์˜ ๊ณต๊ธฐ๋ฅผ ์ตœ์†Œํ™” ์–‘์ฃผ์˜ ์ข…๋ฅ˜ ๋ธŒ๋žœ๋”” : ์ฆ๋ฅ˜ํ•œ ํฌ๋„์ฃผ, 40~42๋„ ์œ„์Šคํ‚ค : ๊ณก์ฃผ๋ฅผ ์ฆ๋ฅ˜ํ•œ ์ˆ  ๋ณด๋“œ์นด : 3 ็„ก (๋ฌด์ƒ‰, ๋ฌด์ทจ, ๋ฌด๋ฏธ), ์•„์ฃผ ์ฐจ๊ฒŒํ•˜์—ฌ ํ•œ๋ฒˆ์— ๋งˆ์‹ฌ ๋ฐํ‚ฌ๋ผ : ์šฉ์„ค๋ž€์˜ ์ฆ™์— ์„คํƒ• ๋„ฃ๊ณ  ๋ฐœํšจ, 40๋„~60๋„ ์ค‘๊ตญ ์†๋‹˜์„ ์ดˆ์ฒญํ•œ ๊ฒฝ์šฐ ๋งŽ์ด ๋งˆ์‹œ๋„๋ก ๊ถŒํ•จ, ์ฒจ์ž”๋ฌธํ™” ์ผ๋ณธ ์ด์ž์นด์•ผ, ์ž๊ธฐ ์ฃผ๋Ÿ‰๋งŒํผ ๋งˆ์‹ฌ, ์ฒจ์ž” ๋ฐฉ์‹, ํ•œ์†์œผ๋กœ ๋”ฐ๋ฅด๊ณ  ๋ฐ›์Œ, ์™€๋ฆฌ๊นก (๊ฐ์ž ๋ถ€๋‹ด) ํ”„๋ž‘์Šค ์‹์ „ ์ฃผ๋ฅผ ์ž‘์€ ์ž”์— ๋งˆ์‹ฌ ๋ฐฑํฌ๋„์ฃผ, ์•™ํŠธ๋ ˆ (์ „์ฑ„์š”๋ฆฌ) ์ œ๊ณต ์ ํฌ๋„์ฃผ, ๋ณธ์‹์‚ฌ ์ œ๊ณต ์ˆ  ์ข…๋ฅ˜๋งˆ๋‹ค ์ž”์ด ๋‹ค๋ฆ„ ์‹์‚ฌ ๋๋‚˜๋ฉด ์ปคํ”ผ, ์ฝ”๋ƒ‘ ๋…์ผ ์Œ์ฃผ๊ฐ€ ์ƒํ™œ์˜ ์ผ๋ถ€, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์ˆ ์„ ๊ถŒํ•˜์ง€ ์•Š์Œ ์˜๊ตญ ์Šค์ฝ”ํ‹€๋žœ๋“œ ์œ„์Šคํ‚ค(์Šค์นด์น˜) ์œ ๋ช… ๋ฏธ๊ตญ ์˜ฅ์™ธ์—์„œ ์Œ์ฃผ ๊ธˆ์ง€, ์ผ์š”์ผ์—๋Š” ์ˆ ์„ ํŒ”์ง€ ์•Š์Œ ๋Ÿฌ์‹œ์•„ ๋ณด๋“œ์นด๋ฅผ ์ข‹์•„ํ•จ ๋ณตํ†ต->(๋ณด๋“œ์นด+์†Œ๊ธˆ), ๊ฐ๊ธฐ->(๋ณด๋“œ์นด+ํ›„์ถ”), ์ปจ๋””์…˜์ €ํ•˜(๋ณด๋“œ์นด+ ๋งˆ๋Š˜ ๋˜๋Š” ์–‘ํŒŒ) ํก์—ฐ๋งค๋„ˆ ๋‹ด๋ฐฐ ์† ์œ ํ•ด๋ฌผ์งˆ ์ผ์‚ฐํ™”ํƒ„์†Œ : ํ—ค๋ชจ๊ธ€๋กœ๋นˆ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ, ์‚ฐ์†Œ๊ณต๊ธ‰์„ ์ €ํ•˜์‹œํ‚ด -> ์‚ฐ์†Œ์‡ผํฌ ๋‹ˆ์ฝ”ํ‹ด : ๋„ํŒŒ๋ฏผ ๋ถ„๋น„ -> ์•ˆ์ •๊ฐ, ๊ธด์žฅ๊ฐ ํ•ด์†Œ ํƒ€๋ฅด : ํ‘œํ”ผ์„ธํฌ ๋“ฑ์„ ํŒŒ๊ดดํ•˜๊ฑฐ๋‚˜ ์—ผ์ฆ์„ ์ผ์œผํ‚ด ํ•œ๊ตญ ์Œ์‹ ํŠน์ง• ์ฃผ์‹๊ณผ ๋ถ€์‹์˜ ๊ตฌ๋ถ„ (์ฃผ์‹ : ๋ฐฅ) ๊ณก๋ฅ˜์˜ ๋‹ค์–‘ํ•œ ์กฐ๋ฆฌ๋ฒ• ๋ฐœํšจ ๋ฐ ์ €์žฅ ์‹ํ’ˆ์˜ ๋ฐœ๋‹ฌ ์šฐ๋ฆฌ๋‚˜๋ผ 5๋Œ€ ๋ฐœํšจ์‹ํ’ˆ : ์žฅ๋ฅ˜, ๊น€์น˜, ์‹์ดˆ๋ฅ˜, ํ•ด๋ฅ˜, ์ฃผ๋ฅ˜ ์ ˆ์‹(๋ช…์ ˆ์Œ์‹)๊ณผ ์‹œ์‹(๊ณ„์ ˆ์Œ์‹) ์ž๊ทน์ ์ธ ๋ง› : ๋ถ€์‹์— ๊ณ ์ถง๊ฐ€๋ฃจ, ๋งˆ๋Š˜, ์ƒ๊ฐ• ๋“ฑ ์‚ฌ์šฉ ๊ณต๊ฐ„์ „๊ฐœํ˜• ์ƒ์ฐจ๋ฆผ : ์‹ํƒ์œ„์— ํ•œ๋ฒˆ์— ์ „๋ถ€ ์ฐจ๋ ค๋ƒ„ ๊น€์น˜์˜ ๋ฐœํšจ ์›๋ฆฌ ๋ฌด, ๋ฐฐ์ถ”์˜ ํšจ์†Œ๊ฐ€ ๋‹น๊ณผ ์•„๋ฏธ๋…ธ์‚ฐ์„ ๋งŒ๋“ฌ ์ –์‚ฐ๊ท  (๋ฏธ์ƒ๋ฌผ์˜ ํ•œ ์ข…๋ฅ˜) ์ƒ๊น€ ์ –์‚ฐ๊ณผ ์†Œ๊ธˆ์ด ๋งŒ๋‚˜ ์ –์‚ฐ์„ ์ƒ์„ฑ ์ –์‚ฐ๊ท ์ด ๋‹ค๋ฅธ ๋ฏธ์ƒ๋ฌผ์„ ์ œ๊ฑฐ ๊น€์น˜๋Š” ์ –์‚ฐ์— ์˜ํ•ด ๋ฐœํšจ๋จ ์šฐ๋ฆฌ๋‚˜๋ผ ์ง€์—ญ๋ณ„ ๊น€์น˜ ์ข…๋ฅ˜ ์ง€์—ญ ๊น€์น˜ ์ข…๋ฅ˜ ํŠน์ง• ํ‰์•ˆ๋„ ๋ฐฑ๊น€์น˜, ๊ฐ€์ง€๊น€์น˜ ์†Œ๊ณ ๊ธฐ ์œก์ˆ˜ ์‚ฌ์šฉ ๊ฐ•์›๋„ ์˜ค์ง•์–ด๊น€์น˜, ๋”๋•๊น€์น˜ ์ฑ„์†Œ์™€ ํ•ด๋ฌผ ์‚ฌ์šฉ ์„œ์šธ, ๊ฒฝ๊ธฐ๋„ ๋ณด์Œˆ๊น€์น˜, ์˜ค์ด์†Œ๋ฐ•์ด ์ƒˆ์šฐ์ “, ์กฐ๊ธฐ์ “ ์‚ฌ์šฉ ์ถฉ์ฒญ๋„ ๋‚˜๋ฐ•๊น€์น˜, ํ˜ธ๋ฐ•๊น€์น˜ ์ˆœํ•˜๊ณ  ๊ตฌ์ˆ˜ํ•œ ๋ง› ๊ฒฝ์ƒ๋„ ๋ถ€์ถ”๊น€์น˜, ๊นป์žŽ ๊น€์น˜ ์ง„ํ•œ ์ “๊ฐˆ ๋ง›, ์ž๊ทน์ ์ด๊ณ  ๋งค์›€ ์ „๋ผ๋„ ๊ณ ๋“ค๋นผ๊ธฐ, ๋‚˜์ฃผ๋™์น˜๋ฏธ ๋‹ค์–‘ํ•œ ์ “๊ฐˆ๊ณผ ํ•ด์‚ฐ๋ฌผ๋กœ ๊นŠ์€ ๋ง› ์ œ์ฃผ๋„ ์ „๋ณต๊น€์น˜ ์ ์€ ์–‘๋…์œผ๋กœ ์žฌ๋ฃŒ์˜ ์›๋ž˜ ๋ง›์„ ์‚ด๋ฆผ ์„œ์–‘ ์Œ์‹๊ณผ ๋น„๊ต ํ•œ๊ตญ ์Œ์‹ : ์Šต์—ด์กฐ๋ฆฌ (steaming) ๋ฐฉ์‹์„ ์จ์„œ ์ˆŸ๊ฐ€๋ฝ ๋ƒ„๋น„ ์‚ฌ์šฉ ์„œ์–‘ ์Œ์‹ : ๊ฑด์—ด์กฐ๋ฆฌ (roasting) ๋ฐฉ์‹์„ ์œ„ํ•ด ํŒฌ๊ณผ ์˜ค๋ธ ์‚ฌ์šฉ, ํฌํฌ ๋‚˜์ดํ”„ ์‚ฌ์šฉ ๊ธ€๋กœ๋ฒŒ์ „ํ†ต์Œ์‹ : ๋ธŒ๋ผ์งˆ, ์ค‘๊ตญ ํ•œ๊ตญ, ์ผ๋ณธ, ์ค‘๊ตญ์˜ ์ “๊ฐ€๋ฝ ๋น„๊ต ํ•œ๊ตญ ์ผ๋ณธ ์ค‘๊ตญ ๋ช…์นญ ์ “๊ฐ€๋ฝ ํ•˜์‹œ ์ฝฐ์ด์ฆˆ ์žฌ์งˆ ๊ธˆ์† ๋‚˜๋ฌด ํ”Œ๋ผ์Šคํ‹ฑ, ๋Œ€๋‚˜๋ฌด ํ˜•ํƒœ ๋‚ฉ์ž‘ํ•˜๊ณ , ๊ตต๊ธฐ ์ฐจ์ด๊ฐ€ ์ ๋‹ค ๋์ด ๋พฐ์กฑํ•˜๊ณ  ๊ธธ์ด๊ฐ€ ์งง๋‹ค, ๊ตต๊ธฐ ์ฐจ์ด๊ฐ€ ํฌ๋‹ค ๊ธธ์ด๊ฐ€ ๊ธธ๋‹ค, ๊ตต๊ธฐ ์ฐจ์ด๊ฐ€ ํฌ๋‹ค ์ค‘๊ตญ์˜ ์‹์‚ฌ ์˜ˆ์ ˆ ํฐ ์ ‘์‹œ์˜ ์Œ์‹์„ ๋‚˜๋ˆ„์–ด ๋จน๋Š”๋‹ค ์ขŒ์„๋ฐฐ์น˜ : ์ฃผ๋นˆ์ด ๋˜๋Š” ์†๋‹˜์ด ์ƒ์„(์•ˆ์ชฝ)์— ์•‰๊ณ  ์ฃผ์ธ์€ ํ•˜์„ (๋ฐ”๊นฅ์ชฝ)์— ์•‰๋Š”๋‹ค ์ฃผ๋นˆ ์šฐ์„  : ์Œ์‹์ด ๋‚˜์˜ค๋ฉด ์ฃผ๋นˆ ์•ž์— ๋†“๊ณ , ์ˆ ์˜ ์ข…๋ฅ˜๋„ ๋ฌผ์–ด์„œ ์ •ํ•œ๋‹ค ์Šคํ‘ผ์€ ํƒ•์„ ๋จน์„ ๋•Œ๋งŒ ์‚ฌ์šฉ, ๋ฐฅ์ด๋‚˜ ํƒ•์ด ๋‹ด๊ธด ๊ทธ๋ฆ‡์€ ๋“ค๊ณ  ๋จน๋Š”๋‹ค. ์‚ฌ์šฉํ•œ ์ˆŸ๊ฐ€๋ฝ์€ ๋’ค์ง‘์–ด ๋†“๋Š”๋‹ค ํšŒ์ ์‹ํƒ : ์˜ˆ์˜์ƒ ๊ฐ™์ด ๋Œ๋ ค์ค€๋‹ค. ๊ฐœ์ธ ์ ‘์‹œ๋‚˜ ์ปต์„ ๋†“์ง€ ์•Š๋Š”๋‹ค. ๊ธ€๋กœ๋ฒŒ ์ „ํ†ต์Œ์‹ : ํ”„๋ž‘์Šค ํ”„๋ž‘์Šค์—์„œ ๊ธˆ๊ธฐ์‹œ ๋˜๋Š” ํ–‰๋™ ์‚ฌ๋žŒ ์•ž์—์„œ ์ฝ”๋ฅผ ํ›Œ์ฉ ๊ฑฐ๋ฆฌ๋Š” ํ–‰๋™ ๋ฐ–์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ๋ชธ์ด ๋‹ฟ์•˜์„ ๋•Œ ์‚ฌ๊ณผ๋ฅผ ํ•˜์ง€ ์•Š๋Š” ํ–‰๋™ ์‹๋‹น์—์„œ ์ง์›์„ ๋ถ€๋ฅด๋Š” ํ–‰๋™ (๋ˆˆ์ด ๋งˆ์ฃผ์น˜๋ฉด ๋ˆˆ์ง“์œผ๋กœ ํ˜ธ์ถœ) ์™ธ๋ชจ (๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ๊ฒƒ)์— ๋Œ€ํ•œ ์–˜๊ธฐ (์นœํ•œ ์‚ฌ์ด๋ผ๋„) ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๊ณผ ๋ˆˆ์ด ๋งˆ์ฃผ์น˜๋Š” ๊ฒƒ ํ”„๋ž‘์Šค ์ฝ”์Šค ์š”๋ฆฌ ์ˆœ์„œ ์•„ํŽ˜๋ฆฌํ‹ฐํ”„(์‹์ „์ฃผ) ์•™ํŠธ๋ ˆ / ์˜คํ ๋˜๋ธŒํ ์ ๋ผ (์ƒ์„  ์š”๋ฆฌ / ์œก๋ฅ˜ ์š”๋ฆฌ) ํ”„๋กœ๋งˆ์ฅฌ (์น˜์ฆˆ) ๋””์ €ํŠธ ์ปคํ”ผ / ์ฐจ ํ…Œ์ด๋ธ” ๋งค๋„ˆ ์ดˆ๋Œ€์ž์—๊ฒŒ ๊ฐ์‚ฌ์˜ ํ‘œ์‹œ๋กœ ๊ฝƒ์ด๋‚˜ ํฌ๋„์ฃผ, ํ™”์ดˆ ๋“ฑ์˜ ๊ฐ€๋ฒผ์šด ์„ ๋ฌผ์„ ํ•˜๊ณ , ์„ ๋ฌผ์€ ์•ˆ์ฃผ์ธ์—๊ฒŒ ๊ฑด๋‚ธ๋‹ค ๋ฏธ๋ฆฌ ์ด์•ผ๊ธฐ ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉด, ์Œ์‹์€ ์„ ๋ฌผํ•˜์ง€ ๋ง์ž, ๊ณผ์ž๋‚˜ ์ผ€์žŒ์ด ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค ์Œ์‹์€ ์ ˆ๋Œ€ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค (๋ง› ์—†์–ด์„œ ๋‚จ๊ธด๊ฑธ๋กœ ๊ฐ„์ฃผ) ์Œ์‹์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค “๋ง›์žˆ๋‹ค"๋Š” ์นญ์ฐฌ์„ ๋นผ๋†“์•„์„œ๋Š” ์•ˆ๋œ๋‹ค ํ”„๋ž‘์Šค ์™€์ธ ์ถ•์ œ ๋ณด๋ฅด๋„ ์™€์ธ ํŽ˜์Šคํ‹ฐ๋ฒŒ ๋ณด์กธ๋ ˆ ๋ˆ„๋ณด ์ถ•์ œ ํ”„๋ž‘์Šค ๋Œ€ํ‘œ ์Œ์‹ ๋ฐ”๊ฒŒํŠธ : ๋ฐ€๊ฐ€๋ฃจ + ๋ฌผ + ์†Œ๊ธˆ + ์ด์ŠคํŠธ ํฌ๋กœ์™€์ƒ : ๋ฐ”๊ฒŒํŠธ ์žฌ๋ฃŒ + ์„คํƒ• + ๋ฒ„ํ„ฐ + ๋ถ„์œ  ์—์Šค๊นŒ๋ฅด๊ณ  : ์‹์šฉ ๋‹ฌํŒฝ์ด ํ‘ธ์•„๊ทธ๋ผ : ์ง€๋ฐฉ์ด ๋งŽ์€ ๊ฑฐ์œ„์˜ ๊ฐ„ ํฌ๋ ˆํ”„ : ๋ฐ€๊ฐ€๋ฃจ๋‚˜ ๋ฉ”๋ฐ€๊ฐ€๋ฃจ ๋ฐ˜์ฃฝ์„ ์–‡๊ฒŒ ๋ถ€์น˜๊ณ  ๊ทธ ์œ„์— ๋‹ค์–‘ํ•œ ์†์žฌ๋ฃŒ๋ฅผ ์–น์–ด ์‹ธ๋จน๋Š” ๋ฐฉ์‹
new ๋ฐฑ์ค€ - 20125 : ์ฟ ํ‚ค์˜ ์‹ ์ฒด ์ธก์ • (S4)
๐Ÿง  Algorithm
1#include <bits/stdc++.h> 2using namespace std; 3 4char board[1000][1000] = { NULL }; 5int n; 6 7tuple<int, int, int> getlength(int sx, int sy, int dx, int dy) { 8 int cnt = 0; 9 int x = sx; 10 int y = sy; 11 12 while (true) { 13 x += dx; 14 y += dy; 15 if (y < 0 || y >= n || x < 0 || x >= n || board[x][y] != '*') { 16 return { cnt, x-dx, y-dy }; 17 } 18 cnt++; 19 } 20} 21 22int main() { 23 cin.tie(0)->sync_with_stdio(false); 24 cin >> n; 25 26 pair<int, int> heart = { 0, 0 }; 27 tuple<int, int, int> ass = { 0, 0, 0 }; 28 29 for (int i = 0; i < n; i++) { 30 for (int j = 0; j < n; j++) { 31 cin >> board[i][j]; 32 if (board[i][j] == '*' && heart.first == 0) 33 heart = { j, i + 1 }; 34 } 35 } 36 37 ass = getlength(heart.second, heart.first, 1, 0); 38 39 cout << heart.second+1 << " " << heart.first+1 << "\n"; 40 cout << get<0>(getlength(heart.second, heart.first, 0, -1)) << " " 41 << get<0>(getlength(heart.second, heart.first, 0, 1)) << " " 42 << get<0>(ass) << " " 43 << get<0>(getlength(get<1>(ass), get<2>(ass)-1, 1, 0)) << " " 44 << get<0>(getlength(get<1>(ass), get<2>(ass)+1, 1, 0)); 45 46 return 0; 47} ๋ฌธ์ œ ์ •์‚ฌ๊ฐํ˜• ํŒ์˜ ํฌ๊ธฐ N๊ณผ ์ฟ ํ‚ค์˜ ์‹ ์ฒด ๋ชจ์–‘์ด 2์ฐจ์› ๋ฌธ์ž๋กœ ์ฃผ์–ด์ง„๋‹ค. 1๋ฒˆ์งธ ์ค„์—๋Š” ์‹ฌ์žฅ์˜ ์œ„์น˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. 2๋ฒˆ์งธ ์ค„์—๋Š” ์™ผํŒ”, ์˜ค๋ฅธํŒ”, ํ—ˆ๋ฆฌ, ์™ผ๋‹ค๋ฆฌ, ์˜ค๋ฅธ๋‹ค๋ฆฌ์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๊ธ€๋กœ ์„ค๋ช…ํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š๋‹ค. ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ž…๋ ฅ ๋ฐ›์œผ๋ฉด์„œ ์‹ฌ์žฅ์˜ ์œ„์น˜๋ฅผ ๋”ด๋‹ค. ์‹ฌ์žฅ์˜ ์œ„์น˜๋ฅผ ํ†ตํ•ด ํ—ˆ๋ฆฌ์˜ ๋์„ ๋”ด๋‹ค. ์™ผํŒ”, ์˜ค๋ฅธํŒ”, ํ—ˆ๋ฆฌ์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ํ—ˆ๋ฆฌ์˜ ๋์„ ์ด์šฉํ•ด ์™ผ๋‹ค๋ฆฌ, ์˜ค๋ฅธ๋‹ค๋ฆฌ์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. getlength() ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ๊ฐ ๊ธธ์ด๋ฅผ ๊ตฌํ–ˆ๋‹ค. ๋ง‰ํ˜”๋˜ ๋ถ€๋ถ„ x, y๊ฐ€ ํ˜ผ๋™๋˜์–ด์„œ ๊ณ ์น˜๋Š”๋ฐ ์‹œ๊ฐ„์„ ๋งŽ์ด ์žก์•„ ๋จน์ž c++๋กœ 2์ฐจ์› ๋ฐฐ์—ด ๋‹ค๋ฃจ๋Š” ๋ฌธ์ œ๋ฅผ ์—ด์‹ฌํžˆ ํ’€์–ด๋ณด์ž!
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋งˆ๋ฒ•์˜ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ (L2)
๐Ÿง  Algorithm
์ฒซ๋ฒˆ์งธ BFS ํ’€์ด 1from collections import deque 2 3def solution(storey): 4 answer = 0 5 q = deque() 6 q.append((storey, 0)) 7 visited = [False] * (10**8+1) 8 9 while q: 10 cur, cnt = q.popleft() 11 12 13 visited[cur] = True 14 while cur != 0 and cur%10 == 0: 15 cur = cur // 10 16 if cur == 0: 17 answer = cnt 18 break 19 for j in [-1, 1]: 20 dest = cur + j 21 if 0 <= dest <= 10**8 and not visited[dest]: 22 q.append((dest, cnt+1)) 23 24 return answer ๊ฐœ์„ ํ•œ DFS ํ’€์ด 1answer = 10**8 2def dfs(cur, cnt): 3 global answer 4 if cur == 0: 5 answer = min(answer, cnt) 6 return 7 while cur % 10 == 0: 8 cur /= 10 9 10 if cur%10 < 5: 11 dfs(cur//10, cnt+(cur%10)) 12 elif cur%10 > 5: 13 dfs(cur//10+1, cnt+(10-cur%10)) 14 else: 15 dfs(cur//10, cnt+(cur%10)) 16 dfs(cur//10+1, cnt+(10-cur%10)) 17 18def solution(storey): 19 dfs(storey, 0) 20 return answer ๋ฌธ์ œ ์ฃผ์ธ๊ณต ๋ฏผ์ˆ˜๋Š” ํ•œ๋ฒˆ ์—˜๋ ˆ๋ฒ ์ดํ„ฐ๋ฅผ ํƒ€๋ฉด -1, +1, -10, +10 ๋“ฑ ์ ˆ๋Œ“๊ฐ’์ด $10^c$ (c>=0์ธ ์ •์ˆ˜) ๋งŒํผ ์ด๋™ ํ•  ์ˆ˜ ์žˆ๋‹ค 0์ธต๊นŒ์ง€ ๊ฐˆ๋ ค๋ฉด ์ตœ์†Œ ๋ช‡ ๋ฒˆ ๋งŒ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋ผ 1 <= storey <= 100,000,000 TC input 16 ouput 6 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ฒ˜์Œ์—๋Š” bfs๋ฅผ ์ด์šฉํ•ด์„œ +1, -1 ํ•œ๋ฒˆ์”ฉํ•˜๋ฉฐ ๋น„ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€๋‹ค ๋‘๋ฒˆ์งธ dfsํ’€์ด์—์„œ๋Š” ์ผ์˜ ์ž๋ฆฌ์— ๋”ฐ๋ผ ์ž๋ฆฟ์ˆ˜๋ฅผ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ๋‚ด๋ฆฌ๊ณ , ์ผ์˜ ์ž๋ฆฌ๋ฅผ ํ•œ๋ฒˆ์— ๊ณ„์‚ฐํ•˜์—ฌ ๋” ๋‚˜์€ ํ’€์ด๋กœ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค
new ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ ํ•„๊ธฐ ์ค€๋น„
๐ŸŽธ ๊ธฐํƒ€
1๊ณผ๋ชฉ : ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ๊ฒฐํ•ฉ๋„ ์ž๋ฃŒ ๊ฒฐํ•ฉ๋„ : ๋ชจ๋“ˆ ๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž๋ฃŒ ์š”์†Œ๋กœ๋งŒ ๊ตฌ์„ฑ๋  ๋•Œ์˜ ๊ฒฐํ•ฉ๋„ ์Šคํƒฌํ”„ ๊ฒฐํ•ฉ๋„ : ๋ชจ๋“ˆ ๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฐฐ์—ด์ด๋‚˜ ๋ ˆ์ฝ”๋“œ ๋“ฑ์˜ ์ž๋ฃŒ ๊ตฌ์กฐ๊ฐ€ ์ „๋‹ฌ๋  ๋•Œ์˜ ๊ฒฐํ•ฉ๋„ ์ œ์–ด ๊ฒฐํ•ฉ๋„ : ํ•œ ๋ชจ๋“ˆ์ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ ์ œ์–ด ์‹ ํ˜ธ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ†ต์‹ ํ•˜๊ณ , ๊ณต์œ ๋˜๋Š” ๊ณตํ†ต ๋ฐ์ดํ„ฐ ์˜์—ญ์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๊ฒฐํ•ฉ๋„ ์™ธ๋ถ€ ๊ฒฐํ•ฉ๋„ : ์–ด๋–ค ๋ชจ๋“ˆ์—์„œ ์„ ์–ธํ•œ ๋ฐ์ดํ„ฐ(๋ณ€์ˆ˜)๋ฅผ ์™ธ๋ถ€์˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ฐธ์กฐํ•  ๋•Œ์˜ ๊ฒฐํ•ฉ๋„ ๊ณต์œ  ๊ฒฐํ•ฉ๋„ : ๊ณต์œ ๋˜๋Š” ๊ณตํ†ต ๋ฐ์ดํ„ฐ ์˜์—ญ์„ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์ด ์‚ฌ์šฉํ•  ๋•Œ์˜ ๊ฒฐํ•ฉ๋„ ๋‚ด์šฉ ๊ฒฐํ•ฉ๋„ : ํ•œ ๋ชจ๋“ˆ์ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ๋‚ด๋ถ€ ๊ธฐ๋Šฅ ๋ฐ ๊ทธ ๋‚ด๋ถ€ ์ž๋ฃŒ๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ์˜ ๊ฒฐํ•ฉ๋„ ์‘์ง‘๋„ ์ˆœ์ฐจ์  ์‘์ง‘๋„ (Sequential Cohesion) ๊ตํ™˜์  ์‘์ง‘๋„ (Communicational Cohesion) ์ ˆ์ฐจ์  ์‘์ง‘๋„ (Procedural Cohesion) ์‹œ๊ฐ„์  ์‘์ง‘๋„ (Temporal Cohesion) ๋…ผ๋ฆฌ์  ์‘์ง‘๋„ (Logical Cohesion) ์šฐ์—ฐ์  ์‘์ง‘๋„ (Coincidental Cohesion) ์œ ์Šค์ผ€์ด์Šค(Use Case)์˜ ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ๊ด€๊ณ„ ์—ฐ๊ด€ ๊ด€๊ณ„ ํฌํ•จ ๊ด€๊ณ„ ํ™•์žฅ ๊ด€๊ณ„ ์ผ๋ฐ˜ํ™” ๊ด€๊ณ„ ์ž๋ฃŒํ๋ฆ„๋„์˜ ๊ฐ ์š”์†Œ๋ณ„ ํ‘œ๊ธฐ ํ˜•ํƒœ Process : ์› Data Flow : ํ™”์‚ดํ‘œ Data Store : ํ‰ํ–‰์„  Terminator : ์‚ฌ๊ฐํ˜• ์ถ”์ƒํ™”์˜ ์ข…๋ฅ˜ ์ž๋ฃŒ ์ถ”์ƒํ™” ๊ณผ์ • ์ถ”์ƒํ™” ์ œ์–ด ์ถ”์ƒํ™” UML ๋ชจ๋ธ์—์„œ์˜ ๊ด€๊ณ„ Aggregation : ์ง‘ํ•ฉ ๊ด€๊ณ„ Generalization : ์ผ๋ฐ˜ํ™” ๊ด€๊ณ„ Composition : ํฌํ•จ ๊ด€๊ณ„ Dependency : ์˜์กด ๊ด€๊ณ„ Realization : ์‹ค์ฒดํ™” ๊ด€๊ณ„ 2๊ณผ๋ชฉ : ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฒ•์น™ ํŒŒ๋ ˆํ†  ๋ฒ•์น™ : ์˜ค๋ฅ˜์˜ 80%๋Š” ์ „์ฒด ๋ชจ๋“ˆ์˜ 20% ๋‚ด์—์„œ ๋ฐœ๊ฒฌ๋œ๋‹ค๋Š” ๋ฒ•์น™ ํ•ด์‹ฑํ•จ์ˆ˜ ์ข…๋ฅ˜ ์ œ์‚ฐ๋ฒ•, ์ œ๊ณฑ๋ฒ•, ํด๋”ฉ๋ฒ•, ๊ธฐ์ˆ˜ ๋ณ€ํ™˜๋ฒ•, ๋Œ€์ˆ˜์  ์ฝ”๋”ฉ๋ฒ•, ๊ณ„์ˆ˜ ๋ถ„์„๋ฒ•(์ˆซ์ž ๋ถ„์„๋ฒ•), ๋ฌด์ž‘์œ„๋ฒ• ํ…Œ์ŠคํŠธ ์ข…๋ฅ˜ ์•ŒํŒŒ ํ…Œ์ŠคํŠธ : ๊ฐœ๋ฐœ์ž์— ์˜ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฒ ํƒ€ ํ…Œ์ŠคํŠธ : ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ํ…Œ์ŠคํŠธ 3๊ณผ๋ชฉ : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์ถ• ์Šคํ‚ค๋งˆ ์ข…๋ฅ˜ ๊ฐœ๋… ์Šคํ‚ค๋งˆ : ๊ฐœ์ฒด, ์†์„ฑ, ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ์Šคํ‚ค๋งˆ ๋‚ด๋ถ€ ์Šคํ‚ค๋งˆ : ๋ฌผ๋ฆฌ์  ์ €์žฅ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋Š” ์Šคํ‚ค๋งˆ ์™ธ๋ถ€ ์Šคํ‚ค๋งˆ : ์‚ฌ์šฉ์ž ๋ทฐ๋ฅผ ์ •์˜ํ•˜๋Š” ์Šคํ‚ค๋งˆ ์ด์ƒํ˜„์ƒ ์‚ฝ์ž… ์ด์ƒ, ์‚ญ์ œ ์ด์ƒ, ๊ฐฑ์‹  ์ด์ƒ ๋กœํ‚น ๋กœํ‚น ๋‹จ์œ„ โฌ‡๏ธ -> ๋ณ‘ํ–‰์„ฑ ์ˆ˜์ค€ โฌ†๏ธ 4๊ณผ๋ชฉ : ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ดํ™œ์šฉ ๊ต์ฐฉ ์ƒํƒœ์˜ ์กฐ๊ฑด Mutual Exclusion Hold and Wait No Preemption Circular Wait 5๊ณผ๋ชฉ : ์ •๋ณด์‹œ์Šคํ…œ๊ตฌ์ถ• ๊ด€๋ฆฌ ๋ธŒ๋ผ์šฐํ„ฐ : ๋ธŒ๋ฆฌ์ง€์™€ ๋ผ์šฐํ„ฐ์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ฐ–์ถ”๊ณ  ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ์žฅ๋น„ Cocomo ๋ชจํ˜• ์กฐ์งํ˜• (Organic Mode) : 5๋งŒ ๋ผ์ธ ์ดํ•˜์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์œ ํ˜• ๋ฐ˜๋ถ„๋ฆฌํ˜• (Semi-detached Mode) : 30๋งŒ ๋ผ์ธ ์ดํ•˜์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์œ ํ˜• ๋‚ด์žฅํ˜• (Embedded Mode) : ์ดˆ๋Œ€ํ˜• ๊ทœ๋ชจ์˜ ์†Œํ”„ํŠธ์›จ์–ด, 30๋งŒ๋ผ์ธ ์ด์ƒ
new [๋ชจ๊ฐ์ฝ”24ํ•˜๊ณ„] 06 : ๊ฒฐ๊ณผ
๐Ÿ‘จโ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ”
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„ ์ตœ์ข…๋ฐœํ‘œ ์ „๋‚ ์ด๋‹ค. gpt ํ”„๋กฌํ”„ํŠธ ๋ถ€๋ถ„ ์ˆ˜์ •์„ main ๋ธŒ๋žœ์น˜์— ๋ฐ˜์˜ํ•˜๊ณ , EC2 ์„œ๋ฒ„์— ๋ฐฐํฌํ–ˆ๋‹ค. ๋ฌธ์ œ ๋ฐฐํฌํ•œ ์„œ๋ฒ„์—์„œ websocket ์—ฐ๊ฒฐ์ด 404 ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (๋‚ด์ผ์ด ์ตœ์ข… ๋ฐœํ‘œ์ธ๋ฐ,,,) ๋‹ค๋ฅธ http ์š”์ฒญ์€ ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€๋งŒ ์›น์†Œ์ผ“๋งŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. nginx์˜ log 1{IP์ฃผ์†Œ} - - [02/Aug/2024:10:59:04 +0000] "GET /ws/chatrooms/294?user_id=296 HTTP/1.1" 404 22 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15" 2{IP์ฃผ์†Œ} - - [02/Aug/2024:10:59:05 +0000] "GET /ws/chatrooms/294?user_id=296 HTTP/1.1" 404 22 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15" ์‚ฌ๊ณ ํ๋ฆ„ nginx ์„ค์ • ๋ฌธ์ œ์ธ๊ฐ€? X nginx ์„ค์ •์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค. ๋ฐฐํฌํ™˜๊ฒฝ์˜ ๋ฌธ์ œ์ธ๊ฐ€? X ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•œ ์„œ๋ฒ„์—์„œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. ์ด๋ฒˆ ๋ฐฐํฌ์—์„œ ๋ณ€๊ฒฝ๋œ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๋ฌธ์ œ์ธ๊ฐ€? X ์œก์•ˆ์œผ๋กœ ํ™•์ธํ–ˆ์„ ๋•Œ๋Š”, ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์ด ์›น์†Œ์ผ“๊ณผ ๊ด€๋ จ์ด ์—†๋‹ค. ๋กœ์ปฌ์—์„œ ์ด์ „ ๋ฒ„์ „์œผ๋กœ reset ํ›„ ์‹œ๋„ ํ•ด๋ณด์•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค. Docker image ๋ฌธ์ œ์ธ๊ฐ€? X ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” python:slim ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์ด๋ฏธ์ง€๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋กœ์ปฌ์—์„œ docker image๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‹คํ–‰ํ•ด๋ณด์•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค. ์ด๋•Œ, ๋กœ๊ทธ์—์„œ warning ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ–ˆ๋‹ค. WARNING: No supported WebSocket library detected. Please use "pip install 'uvicorn[standard]'", or install 'websockets' or 'wsproto' manually. ์›์ธ ๋ชจ์ข…์˜ ์ด์œ ๋กœ, ์ด์ „์— ๊ฐœ๋ฐœ/๋ฐฐํฌํ• ๋•Œ์—๋Š” ์กด์žฌํ–ˆ๋˜ ์›น์†Œ์ผ“ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‚ฌ๋ผ์ง„ ๊ฒƒ์ด๋‹ค. ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์กฐ์‚ฌํ•ด๋ณธ ๊ฒฐ๊ณผ fastapi ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— 6์‹œ๊ฐ„ ์ „ merge๋œ PR์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. (https://github.com/fastapi/fastapi/pull/11935) ํ•ด๋‹น PR์—์„œ๋Š” pip install fastapi[standard] ๋ฅผ ํ†ตํ•ด ํ‘œ์ค€ ์ข…์† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ์ด๋กœ ์ธํ•ด, uvicorn[standard] ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ, ์›น์†Œ์ผ“ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€๋‹ค. ํ•ด๊ฒฐ requirements.txt์— websockets๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฐฐ์šด ์  ์ค‘์š”ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ requirements.txt์— ํ•ญ์ƒ ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฒ„์ „์„ ๋ช…์‹œํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ด๋ฒˆ์—๋„ ๋ฒ„์ „์„ ๋ช…์‹œํ–ˆ๋‹ค๋ฉด, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋”๋ผ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ, ๋กœ๊ทธ๋ฅผ ์ž˜ ํ™•์ธํ•˜๊ณ , warning ๋ฉ”์‹œ์ง€๋ฅผ ๋†“์น˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ๊ฒ ๋‹ค.
new Fastapi - ํ†ตํ•ฉํ…Œ์ŠคํŠธ In-Memory DB์—์„œ ํ…Œ์ด๋ธ”์ด ์—†๋‹ค๋Š” ๋ฌธ์ œ
๐Ÿ Python
์ƒํ™ฉ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„์—์„œ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค. ๋‹จ์œ„ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์ž‘์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ๊ณ , ํ†ตํ•ฉํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ์ค‘์ด๋‹ค. sqlite in-memory db๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ์ค‘์ธ๋ฐ, ํ…Œ์ด๋ธ”์ด ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ „์— ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ธ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ๋ฌธ์ œ์˜ ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฝ”๋“œ 1from database import Base, engine 2from fastapi.testclient import TestClient 3 4from main import app 5from models import * 6 7# ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค 8Base.metadata.create_all(bind=engine) 9 10client = TestClient(app) 11 12 13class TestUserApi: 14 15 def test_create_user(self): 16 test_nickname = "test_nickname" 17 # ์•„๋ž˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค 18 response = client.post( 19 "/api/users", 20 json={"nickname": test_nickname}, 21 ) 22 assert response.status_code == 200 23 assert response.json()["nickname"] == test_nickname ์›์ธ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ• ๋•Œ ๋งŒ๋“ค์–ด์ง€๋Š” ์„ธ์…˜๊ณผ TestClient๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์„ธ์…˜์ด ๋‹ค๋ฅด๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• TestClient๋‚ด์— get_db() ํ•จ์ˆ˜๋ฅผ ์ž„์˜๋กœ ์ฃผ์ž…ํ•œ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ• ๋•Œ, ๋‹จ์ผ ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค. 1from database import Base, engine, get_db 2from sqlalchemy.orm import sessionmaker 3from fastapi.testclient import TestClient 4 5from main import app 6from models import * 7 8Base.metadata.create_all(bind=engine) 9 10client = TestClient(app) 11 12# ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ์„ธ์…˜์„ ์ƒ์„ฑํ•œ๋‹ค 13TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) 14 15 16Base.metadata.create_all(bind=engine) 17 18# get_db() ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•œ๋‹ค 19def override_get_db(): 20 try: 21 db = TestingSessionLocal() 22 yield db 23 finally: 24 db.close() 25 26# get_db() ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค 27app.dependency_overrides[get_db] = override_get_db 28 29 30class TestUserApi: 31 32 def test_create_user(self): 33 test_nickname = "test_nickname" 34 response = client.post( 35 "/api/users", 36 json={"nickname": test_nickname}, 37 ) 38 assert response.status_code == 201 39 assert response.json()["nickname"] == test_nickname 1engine = create_engine( 2 os.getenv("DATABASE_URL"), 3 # sqlite๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค 4 connect_args={"check_same_thread": False}, 5 # ๋‹จ์ผ ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค 6 poolclass=StaticPool, 7)
new 221207 SYSP
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
09-process1 ์˜ˆ์™ธ์ ์ธ ์ œ์–ด ํ๋ฆ„ ํ•˜์œ„ ๋งค์ปค๋‹ˆ์ฆ˜ ์˜ˆ์™ธ (Exception) ์ƒ์œ„ ๋งค์ปค๋‹ˆ์ฆ˜ ํ”„๋กœ์„ธ์Šค ์ปจํ…์ŠคํŠธ ์ „ํ™˜ OS ์†Œํ”„ํŠธ์›จ์–ด์™€ ํ•˜๋“œ์›จ์–ด ํƒ€์ด๋จธ๋กœ ๊ตฌํ˜„ ์‹œ๊ทธ๋„ OS ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌํ˜„ nolocal ์ ํ”„ ์˜ˆ์™ธ ํ…Œ์ด๋ธ” (Exception Tables) ๊ฐ ์ด๋ฒคํŠธ ํƒ€์ž…์€ ์˜ˆ์™ธ๋ฒˆํ˜ธ k๋ฅผ ๊ฐ–๋Š”๋‹ค ๋น„๋™๊ธฐํ˜• ์˜ˆ์™ธ (Interrupt) ์ž…์ถœ๋ ฅ ์ธํ„ฐ๋ŸฝํŠธ (ctrl + c) ํ•˜๋“œ ๋ฆฌ์…‹ ์ธํ„ฐ๋ŸฌํŠธ ์†Œํ”„ํŠธ ๋ฆฌ์…‹ ์ธํ„ฐ๋ŸฝํŠธ ๋™๊ธฐํ˜• ์˜ˆ์™ธ Traps : ๋ช…๋ น์–ด์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์˜๋„์ ์ธ ์˜ˆ์™ธ (syscall) Faults : ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ •์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์—๋Ÿฌ์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐœ์ƒ (page faults) Aborts : ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ์˜ ๊ฒฐ๊ณผ๋กœ ๋ฐœ์ƒ Page Fault ์‚ฌ์šฉ์ž ๋ฉ”๋ชจ๋ฆฌ์˜ ํŠน์ • ํŽ˜์ด์ง€๊ฐ€ ํ˜„์žฌ ํ•˜๋“œ๋””์Šคํฌ์— ์œ„์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌํ›„์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ๋ช…๋ น์–ด๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค 1int a [1000]; 2int main () { 3a[500] = 13; 4} Process ํ”„๋กœ์„ธ์Šค : ์šด์˜์ฒด์ œ๊ฐ€ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ํ•œ ์‹คํ–‰ ์˜ˆ ํ”„๋กœ๊ทธ๋žจ์— 2๊ฐœ์˜ ์ค‘์š”ํ•œ ์ถ”์ƒํ™” ์ œ๊ณต ๋…ผ๋ฆฌ์ ์ธ ์ œ์–ด ํ๋ฆ„ : ๊ฐ ํ”„๋กœ๊ทธ๋žจ์ด CPU๋ฅผ ๋…์ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•œ๋‹ค ์‚ฌ์ ์ธ ์ฃผ์†Œ ๊ณต๊ฐ„ : ๊ฐ ํ”„๋กœ๊ทธ๋žจ์ด ์ฃผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋…์ ํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ํ•œ๋‹ค ์–ด๋–ป๊ฒŒ? ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰์ด ์„œ๋กœ ๊ต๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค ์ฃผ์†Œ๊ณต๊ฐ„์˜ ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์— ์˜ํ•ด ๊ด€๋ฆฌ Multiprocessing (๊ณผ๊ฑฐ) ํ˜„์žฌ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์Šค์ผ€์ฅด๋ง ๋ณด๊ด€๋œ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์„ ๊ฐ€์ ธ์˜ค๊ณ  ์ฃผ์†Œ๊ณต๊ฐ„์„ ์ „ํ™˜ (context switch) Multiprocessing (ํ˜„๋Œ€) ๋ฉ€ํ‹ฐ์ฝ”์–ด ํ”„๋กœ์„ธ์„œ ๊ฐ ์ฝ”์–ด๋Š” ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅ ๋™์‹œ์„ฑ ํ”„๋กœ์„ธ์Šค ๋‘ ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰์‹œ๊ฐ„์ด ์„œ๋กœ ์ค‘์ฒฉ๋˜๋ฉด -> concurrent ์ค‘์ฒฉ๋˜์ง€ ์•Š๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๋ฉด -> sequential fork 1int fork(void) ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์™€ ๋™์ผํ•œ ์ƒˆ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” 0์„ ๋ฆฌํ„ด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ pid ๋ฆฌํ„ด exit 1void exit(int status) ์ข…๋ฃŒ ์ƒํƒœ status ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ข…๋ฃŒ (์ •์ƒ์ด๋ฉด 0) atexit() ํ•จ์ˆ˜๋Š” exit ํ•  ๋•Œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋ก ์ข€๋น„ (Zombies) ์ข…๋ฃŒ๋˜์—ˆ์ง€๋งŒ, ์•„์ง ์ •๋ฆฌ๋˜์ง€ ์•Š์€ ํ”„๋กœ์„ธ์Šค 1void fork8() { 2if (fork() == 0) { 3 printf("Running child, PID = %d\n", getpid()); 4 while (1) 5 ; 6} 7else { 8 printf("Terminating Parent, PID = %d\n", getpid()); 9 exit(0); 10} 11} 10-process2 wait 1int wait (int *child_status) ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž์‹ ์˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋“ค ์ค‘์— ํ•˜๋‚˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ •์ง€์‹œํ‚จ๋‹ค ๋ฆฌํ„ด๊ฐ’์€ ์ข…๋ฃŒํ•œ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ PID child_status != NULL์ธ ๊ฒฝ์šฐ, ์ž์‹ ํ”„๋กœ๊ทธ๋žจ์˜ ์ข…๋ฃŒ ์ด์œ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ์ •๋ณด๋ฅผ ๊ฐ–๋Š”๋‹ค example 1pid_t wpid = wait(&child_status); 2if (WIFEXITED(child_status)) 3 printf("Child %d terminated with exit status %d\n", wpid, WEXITSTATUS(child_status)); 4else 5 printf("Child %d terminate abnormally\n", wpid); waitpid 1waitpid(pid, &status, options) pid : ํŠน์ • pid์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. -1์ด๋ฉด wait()๊ณผ ๋™์ผ options : 0 (์ข…๋ฃŒ๋œ ์ž์‹์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค), WNOHANG(==1 ํ•œ๋ฒˆ๋งŒ ์ฒดํฌ), WUNTRACED(==2, ์ •์ง€๋˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ๋œ ์ž์‹์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค) sleep 1// ์ž๊ธฐ ์ž์‹ ์„ secs์ดˆ ๋™์•ˆ ์ •์ง€ 2unsigned int sleep(unsigned int secs) 3// ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ๊ทธ๋„ ๋ฐ›์„ ๋•Œ ๊นŒ์ง€ ์ž ์žฌ์šด๋‹ค 4int pause(void) execve 1int execve(char *filename, char *argv[], char *envp[]) ์‹คํ–‰ ํŒŒ์ผ filename์„ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด์„œ argv๋กœ ํ˜„์žฌ์˜ code, data, stack์„ ๋ฎ์–ด ์”Œ์›€ example 1if ((pid = fork()) == 0) { 2 if (execve(myargv[0], myargv, environ) < 0) { 3 printf("%s: Command not found.\n", myargv[0]); 4 exit(1); 5 } 6} shell ์‚ฌ์šฉ์ž์˜ ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ Utility : file๋กœ ๊ตฌํ˜„๋œ ๋ช…๋ น์–ด Built-in : ์ฝ”๋“œ๋กœ ๊ตฌํ˜„๋œ ๋ช…๋ น์–ด eval 1void eval(char *cmdline) { 2 char *argv[MAXARGS]; 3 int bg; 4 pid_t pid; 5 6 bg = parseline(cmdline, argv); 7 if (!builtin_command(argv)) { 8 if ((pid = fork()) == 0) { 9 if (execve(argv[0], argv, environ) < 0) { 10 printf("%s: Command not found.\n", argv[0]); 11 exit(0); 12 } 13 } 14 15 if (!bg) { 16 int status; 17 if (waitpid(pid, &status, 0) < 0 ) 18 unix_error("waitfg: waitpid error"); 19 } 20 else 21 printf("%d %s", pid, cmdline); 22 } 23} -> ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ์ข…๋ฃŒ๋˜๋ฉด zombie๊ฐ€ ๋œ๋‹ค ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : signal 11-signal Signal ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์Šคํ…œ์— ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์งง์€ ๋ฉ”์‹œ์ง€ Receiving a signal ๋ชฉ์ ์ง€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ๊ทธ๋„์„ ๋ฐ›์„ ๋•Œ, ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ๋ฐ˜์‘์„ ํ•˜๋„๋ก ์ปค๋„์— ์˜ํ•ด ์š”๊ตฌ๋ ๋•Œ, ์‹œ๊ทธ๋„์„ ๋ฐ›๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. 3๊ฐ€์ง€ ๋ฐ˜์‘ ๋ฌด์‹œ ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ signal handler๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์œ ์ €๋ ˆ๋ฒจ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‹œ๊ทธ๋„์„ ์žก๋Š”๋‹ค ์‹œ๊ทธ๋„์˜ ํŠน์ง• ํ”„๋กœ์„ธ์Šค๋Š” ํŠน์ • ์‹œ๊ทธ๋„์˜ ์ˆ˜์‹ ์„ ๋ธ”๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ทธ๋„์€ ์ตœ๋Œ€ ํ•œ๋ฒˆ๋งŒ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปค๋„์ด context์— ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋น„ํŠธ๋ฒกํ„ฐ pending : ๋Œ€๊ธฐ ์‹œ๊ทธ๋„๋“ค์„ ํ‘œ์‹œ ๋„์ฐฉํ• ๋•Œ๋งˆ๋‹ค pending๊ฐ’์˜ k๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ 1๋กœ ์„ค์ • ์ˆ˜์‹ ํ• ๋•Œ๋งˆ๋‹ค pending๊ฐ’์˜ k๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ 0์œผ๋กœ ์„ค์ • blocked : ๋ธ”๋ก๋œ ์‹œ๊ทธ๋„๋“ค์„ ํ‘œ์‹œ sigprocmask ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด 1๋˜๋Š” 0๋กœ ์„ค์ • ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน์— ์†ํ•œ๋‹ค ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž์‹์€ ๋ถ€๋ชจ์™€ ๊ฐ™์€ ๊ทธ๋ฃน์— ์†ํ•œ๋‹ค ์‰˜์€ ๊ฐ job๋งˆ๋‹ค ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน์„ ๋งŒ๋“ ๋‹ค getpgrp() : ํ”„๋กœ์„ธ์Šค์˜ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน์„ ๋ฆฌํ„ด setpgid() : ํ”„๋กœ์„ธ์Šค์˜ ๊ทธ๋ฃน์„ ๋ณ€๊ฒฝ kill kill -9 24818 : SIGKILL์„ pid 24818๋กœ ๋ณด๋ƒ„ kill -9 -24817 : pgid 24871์˜ ๊ฐ ํ”„๋กœ์„ธ์Šค์— SIGKILL์„ ๋ณด๋ƒ„ ํ‚ค๋ณด๋“œ๋กœ๋ถ€ํ„ฐ ์‹œ๊ทธ๋„ ๋ณด๋‚ด๊ธฐ ํ‚ค๋ณด๋“œ๋กœ ctrl+c (ctrl+z)๋ฅผ ๋ˆ„๋ฅด๋ฉด SIGINT(SIGTSTP) ์‹œ๊ทธ๋„์ด ํฌ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน์˜ ๋ชจ๋“  ์ž‘์—…์œผ๋กœ ์ „์†ก๋œ๋‹ค SIGINT : ๊ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ชจ๋‘ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค. SIGTSTP : ๊ธฐ๋ณธ ๋™์ž‘์€ ๊ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ •์ง€์‹œํ‚จ๋‹ค. ์‹œ๊ทธ๋„ ๋ฐ›๊ธฐ ์ปค๋„์€ pnb = pending & ~blocked ๋ฅผ ๊ณ„์‚ฐ ๊ฐ ์‹œ๊ทธ๋„ ํƒ€์ž…์€ ์‚ฌ์ „์— ์ •์˜๋œ ๊ธฐ๋ณธ ๋™์ž‘์„ ๊ฐ€์ง„๋‹ค. ๊ธฐ๋ณธ ๋™์ž‘์€ signalํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ๋‹ค (SIGSTOP๊ณผ SIGKILL์€ ์˜ˆ์™ธ) ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์˜ ์„ค์น˜ 1handler_t *signal(int signum, handler_t *handler) handler์˜ ๊ฐ’ SIG_IGN : signum ํƒ€์ž… ์‹œ๊ทธ๋„ ๋ฌด์‹œ SIG_DFL : signum์˜ ๊ธฐ๋ณธ๋™์ž‘์œผ๋กœ ๋ณต๊ท€ ์ด์™ธ์˜ ๊ฒฝ์šฐ : signal handler์˜ ์ฃผ์†Œ ์‹œ๊ทธ๋„ ๋ธ”๋กํ•˜๊ธฐ์™€ ํ•ด์ œํ•˜๊ธฐ sigprocmask ์ด์šฉ 1int sigprocmask(int how, const sigset_t *set, sigset_t *oldest); how๊ฐ’์— ๋”ฐ๋ผ ๋™์ž‘์ด ๊ฒฐ์ •๋œ๋‹ค SIG_BLOCK : blocked = (blocked | set) SIG_UNBLOCK : blocked = blocked & ~set SIG_SETMASK : blocked = set set ๊ด€๋ จ ์ง€์› ํ•จ์ˆ˜ sigemptyset : ๋ชจ๋“  ์‹œ๊ทธ๋„์ด ๋น„์–ด์žˆ๋Š” ์ง‘ํ•ฉ ์ƒ์„ฑ sigfillset : ๋ชจ๋“  ์‹œ๊ทธ๋„ ๋ฒˆํ˜ธ๋ฅผ 1๋กœ ์„ค์ • sigaddset : ํŠน์ • ์‹œ๊ทธ๋„ ๋ฒˆํ˜ธ๋ฅผ 1๋กœ ์„ค์ • sigdelset : ํŠน์ • ์‹œ๊ทธ๋„ ๋ฒˆํ˜ธ๋ฅผ 0์œผ๋กœ ์„ค์ • ๊ฒฝ์ฃผ Race ํ˜„์ƒ์œผ๋กœ ์ธํ•œ ๋™๊ธฐํ™”์˜ ๋ฌธ์ œ 1void handler(int sig) { 2 int olderrno = errno; 3 sigset_t mask_all, prev_all; 4 pid_t pid; 5 6 sigfillset(&mask_all); 7 while ((pid = waitpid(-1, NULL, 0)) > 0 ) { 8 sigprocmask(SIG_BLOCK, &mask_all, &prev_all); 9 deletejob(pid); 10 sigprocmask(SIG_SETMASK, &prev_all, NULL); 11 } 12 if (errno != ECHILD) 13 sio_error("waitpid error"); 14 errno = olderno; 15} 16 17int main(int argc, char **argv) { 18 int pid; 19 sigset_t mask_all, prev_all; 20 int n = N; // N = 5 21 sigfillset(&mask_all); 22 signal(SIGCHLD, handler); 23 initjobs(); 24 25 while (n--) { 26 if ((pid = fork()) == 0) { 27 execve("/bin/date", argv, NULL); 28 } 29 // !! ์—ฌ๊ธฐ์„œ SIGCHLD๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์˜ค๋ฅ˜ 30 31 // ํ•ธ๋“ค๋Ÿฌ์—์„œ job์„ accessํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ชจ๋“  signal block 32 sigprocmask(SIG_BLOCK, &mask_all, &prev_all)๋ฅ˜ 33 addjob(pid); 34 sigprocmask(SIG_SETMASK, &prev_all, NULL); 35 } 36 exit(0); 37} ๋ถ€๋ชจ๊ฐ€ ๋จผ์ € SIGCHLD ์‹œ๊ทธ๋„์ด ํ„ฐ์ง€๊ธฐ ์ „์— SIG_BLOCKํ•˜๊ณ  addjob์„ ํ•˜๋Š” ๊ฒฝ์šฐ -> OK ๋ถ€๋ชจ๊ฐ€ SIG_BLOCKํ•˜๊ธฐ ์ „์— ์ž์‹์ด ๋๋‚˜๋Š” ๊ฒฝ์šฐ handler๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค addjobํ•˜๊ธฐ์ „์— deletejob ์ˆ˜ํ–‰ ๋ฌดํ•œ ๋ฃจํ”„ ๋ฐœ์ƒ ๊ฒฝ์ฃผํ˜„์ƒ์„ ํšŒํ”ผํ•˜๋Š” ๋™๊ธฐํ™” ๋ฐฉ๋ฒ• 1int main(int argc, char **argv) { 2 int pid; 3 sigset_t mask_all, mask_one, prev_one; 4 int n = N; // N = 5 5 sigfillset(&mask_all); 6 sigemptyset(&mask_one); 7 sigaddset(&mask_one, SIGCHLD); 8 signal(SIGCHLD, handler); 9 initjobs(); 10 11 while (n--) { 12 sigprocmask(SIG_BLOCK, &mask_one, &prev_one); // block SIGCHILD 13 if ((pid = fork()) == 0) { 14 // ์ž์‹์€ SIGCHLD๋ฅผ blockํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋‹ค์‹œ unblock 15 sigprocmask(SIG_SETMASK, &prev_one, NULL); // unblock SIGCHLD 16 execve("/bin/date", argv, NULL); 17 } 18 sigprocmask(SIG_BLOCK, &mask_all, NULL); 19 addjob(pid); 20 sigprocmask(SIG_SETMASK, &prev_one, NULL); 21 } 22 exit(0); 23} ๋ถ€๋ชจ์ž…์žฅ์—์„œ fork๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋‚˜์„œ SIGCHLD๊ฐ€ unblock ๋˜๋Š” ์ˆœ๊ฐ„์ด ๋‹จ ํ•œ๋ฒˆ๋„ ์กด์žฌ ํ•˜์ง€ ์•Š์Œ. ํ•ญ์ƒ addjob์ด ๋จผ์ € ์‹คํ–‰๋จ -> ์˜ค๋ฅ˜ X ๋ช…์‹œ์ ์œผ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ์‹ 1volatile sig_atomic_t pid; // pid๋Š” ์ „์—ญ๋ณ€์ˆ˜๋กœ ์„ ์–ธ 2void sigchld_handler(int s) { 3 int orderrno = errno; 4 // sigchld_handler์—์„œ waitpid ํ•˜๋Š” ๋ฐฉ์‹ 5 pid = waitpid(-1, NULL, 0); 6 errno = olderrno; 7} 8void sigint_handler(int s) {} 9 10int main(int argc, char **argv) { 11 sigset_t mask, prev; 12 int n = N; // N = 10 13 signal(SIGCHLD, sigchld_handler); 14 signal(SIGINT, sigint_handler); 15 sigemptyset(&mask); 16 sigaddset(&mask, SIGCHLD); 17 18 while (n--) { 19 sigprocmask(SIG_BLOCK, &mask, &prev); // block SIGCHILD 20 if (fork() == 0) 21 exit(0); 22 23 pid = 0; 24 sigprocmask(SIG_SETMASK, &prev, NULL); 25 26 // Wait for SIGCHLD to be recieved 27 while (!pid) 28 ; 29 30 // Do some work after receiving SIGCHLD 31 printf("."); 32 33 printf("\n"); 34 exit(0); 35} sigsuspend๋ฅผ ์‚ฌ์šฉํ•œ ์‹œ๊ทธ๋„ ๋™๊ธฐํ™” 1int sigsuspend(const sigset_t *mask); 2// ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ๊ณผ ๋™์ผ 3sigprocmask(SIG_SETMASK, &mask, &prev); 4pause(); 5sigprocmask(SIG_SETMASK, &prev, NULL); sigsuspend๋ฅผ ์ด์šฉํ•œ ์‹œ๊ทธ๋„ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ 1int main(int argc, char **argv) { 2sigset_t mask, prev; 3int n = N; // N = 10 4signal(SIGCHLD, sigchld_handler); 5signal(SIGINT, sigint_handler); 6sigemptyset(&mask); 7sigaddset(&mask, SIGCHLD); 8 9while (n--) { 10 sigprocmask(SIG_BLOCK, &mask, &prev); // block SIGCHILD 11 if (fork() == 0) 12 exit(0); 13 14 pid = 0; 15 // Wait for SIGCHLD to be recieved 16 while (!pid) 17 sigsuspend(&prev); 18 19 // Optionally unblock SIGCHILD 20 sigprocmask(SIG_SETMASK, &prev, NULL); 21 22 // Do some work after receiving SIGCHLD 23 printf("."); 24} 25printf("\n"); 26exit(0); 27}
new Spring - JPA : getReferenceById vs findById
๐Ÿƒ Spring
๋ฐฐ๊ฒฝ Service layer์—์„œ createPost ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ค‘ ์ด์—ˆ๋‹ค Post entity๋Š” User entity์™€ ManyToOne ๊ด€๊ณ„์ด๋‹ค User entity๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์˜ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค ๋‘ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ์„ ํŒŒ์•…ํ•ด๋ณด์•˜๋‹ค getReferenceById ์‚ฌ์šฉ 1public Post createPost(PostDTO.Request postDTO, int userId) { 2 // ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค 3 User user = userRepository.getReferenceById(userId); 4 5 Post post = Post.builder() 6 .title(postDTO.getTitle()) 7 .content(postDTO.getContent()) 8 .created_at(LocalDateTime.now().truncatedTo(ChronoUnit.MILLIS)) 9 .author(user) 10 .build(); 11 12 try { 13 return postRepository.save(post); 14 } catch (DataIntegrityViolationException e) { 15 throw new EntityNotFoundException("ํ•ด๋‹น ์œ ์ €๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); 16 } 17} ์žฅ์  : ์ฟผ๋ฆฌ ํ•œ๋ฒˆ์œผ๋กœ Post entity๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค ๋‹จ์  : insert ์ฟผ๋ฆฌ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์žก๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์ ์ด์ง€ ์•Š๋‹ค findById ์‚ฌ์šฉ 1public Post createPost(PostDTO.Request postDTO, int userId) { 2 // ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค 3 Optional<User> user = userRepository.findById(userId); 4 5 if (user.isEmpty()) 6 throw new EntityNotFoundException("ํ•ด๋‹น ์œ ์ €๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); 7 8 Post post = Post.builder() 9 .title(postDTO.getTitle()) 10 .content(postDTO.getContent()) 11 .created_at(LocalDateTime.now().truncatedTo(ChronoUnit.MILLIS)) 12 .author(user.get()) 13 .build(); 14 15 return postRepository.save(post); 16} ์žฅ์ : insert ์ฟผ๋ฆฌ ์‹คํ–‰ ์ „์— ๋ฏธ๋ฆฌ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์ ์ด๋‹ค ๋‹จ์ : ์ฟผ๋ฆฌ ๋‘๋ฒˆ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค ๊ฒฐ๋ก  ์ฟผ๋ฆฌ๋ฅผ ๋‘ ๋ฒˆ ๋‚ ๋ฆฌ๋”๋ผ๋„ findById ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ •์ ์ด๋ผ์„œ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค
new Spring - ResponseEntity ์ •๋ฆฌ
๐Ÿƒ Spring
ResponseEntity Spring์—์„œ HttpEntity๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค HttpEntity๋ฅผ ์ƒ์†๋ฐ›๋Š” ๋‘ ํด๋ž˜์Šค๊ฐ€ RequestEntity์™€ ResponseEntity์ด๋‹ค RequestEntity๋Š” http์š”์ฒญ์„ ๋ณด๋‚ผ๋•Œ ์‚ฌ์šฉํ•˜๊ณ  ResponseEntity๋Š” http์‘๋‹ต์„ ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค ์ •์˜ body, header, status๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค 1public class ResponseEntity<T> extends HttpEntity<T> { 2 public ResponseEntity(HttpStatusCode status) {...} 3 4 public ResponseEntity(@Nullable T body, HttpStatusCode status) {...} 5 6 public ResponseEntity(MultiValueMap<String, String> headers, HttpStatusCode status) {...} 7 8 public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatusCode status) {...} 9 10 public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, int rawStatus) {...} 11} ์˜ˆ์ œ - ResponseEntity ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜ builder ํŒจํ„ด์„ ํ™œ์šฉํ•ด์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค 1return new ResponseEntity<>(object, HttpStatus.valueOf(200)); 2/* ๋˜๋Š” */ 3return ResponseEntity.status(HttpStatus.valueOf(200)).body(object);
new MVC 2 : Messages, Validate command object
๐Ÿƒ Spring
Messages label.properties member.register=ํšŒ์›๊ฐ€์ž… 1<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 2<head> 3 <title><spring:message code="member.register" /></title> 4</head> ์‚ฌ์ดํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ด์•ผํ•  ๋•Œ label_ko.properties, label_en.properties์™€ ๊ฐ™์ด ๋งŒ๋“ ๋‹ค๊ณ  ํ•œ๋‹ค httpํ—ค๋”์˜ Accept-Launguage๋ฅผ ์ž๋™์œผ๋กœ ์ธ์‹ํ•œ๋‹ค๊ณ  ํ•˜๋‹ˆ๊นŒ ํŽธํ•  ๊ฒƒ ๊ฐ™๋‹ค Validate command object Validation RegisterRequestValidator 1@Override 2public void validate(Object target, Errors errors) { 3 RegisterRequest regReq = (RegisterRequest) target; 4 5 if(regReq.getEmail() == null | regReq.getEmail().trim().isEmpty()) { 6 errors.rejectValue("email", "bad"); 7 } 8 else { 9 Matcher matcher = pattern.matcher(regReq.getEmail()); 10 if(!matcher.matches()) { 11 errors.rejectValue("email", "bad"); 12 } 13 } 14 15 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required"); 16 ValidationUtils.rejectIfEmpty(errors, "password", "required"); 17 ValidationUtils.rejectIfEmpty(errors, "confirmPassword", "required"); 18 if (!regReq.getPassword().isEmpty()) { 19 if (!regReq.isPasswordEqualToConfirmPassword()) { 20 errors.rejectValue("confirmPassword", "nomatch"); 21 } 22 } 23} Print Error Message 1<form:errors path="email" /> ๋งŒ์•ฝ errors.rejectValue(“email”, “requireed”) ์ฝ”๋“œ๋กœ ์—๋Ÿฌ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ณ  ์ปค๋งจ๋“œ ๊ฐ์ฒด๊ฐ€ registerRequest์ธ ๊ฒฝ์šฐ, required.registerRequest.eail required.email required.String required ์œ„์™€ ๊ฐ™์€ ์ˆœ์„œ๋Œ€๋กœ ๋ฉ”์‹œ์ง€ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค. Global scoped validate MvcConfig.java 1@Override 2public Validator getValidator() { 3 return new RegisterRequestValidator(); 4} RegisterController.java 1@PostMapping("/register/step3") 2public String handleStep3(@Valid RegisterRequest regReq, Errors errors) { 3 if (errors.hasErrors()) 4 return "register/step2"; global ๋ฒ”์œ„ validator๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Controller scoped validate RegisterController.java 1@InitBinder 2protected void initBinder(WebDataBinder binder) { 3 binder.setValidator(new RegisterRequestValidator()); 4} ์šฐ์„ ์ˆœ์œ„ setValidator() : controller scoped validator ์ ์šฉ addValidator() : global scoped validator ์ ์šฉ ํ›„ controller scoped validator ์ ์šฉ Bean validation RegisterRequest.java 1import javax.validation.constraints.Size; 2 3import org.hibernate.validator.constraints.Email; 4import org.hibernate.validator.constraints.NotBlank; 5import org.hibernate.validator.constraints.NotEmpty; 6 7public class RegisterRequest { 8 @NotBlank 9 @Email 10 private String email; 11 @Size(min = 6) 12 private String password; 13 @NotEmpty 14 private String confirmPassword; 15 @NotEmpty 16 private String name; bean validation์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด org.hiberante dependency๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค ๊ธฐ์กด์— ์žˆ๋˜ Validator๋ฅผ ์—†์• ๋‘์–ด์•ผํ•œ๋‹ค ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ด๊ฑฐ ์จ์„œ validator ์ง์ ‘ ์งค ์ผ์€ ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.
new Generics
โ˜• Java
ํšจ๊ณผ : ํƒ€์ž…์•ˆ์ •์„ฑ, ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ Generic class 1public class Box<M, I> { 2 private M material; 3 private I item; 4 ... 5} 6 7Box<Paper, String> box = new Box<Paper, String>(); Generic Function 1public class CoffeeMachine { 2 public <T> Coffee makeCoffee(T capsule) { 3 return new Coffee(capsule); 4 } 5} 6CoffeeMachine coffeeMachine = new CoffeeMachine(); 7Colombian capsule = new Colombian(); 8coffeeMachine.<Colombian>makeCoffee(capsule); 9coffeeMachine.makeCoffee(capsule); Restrictions on Generics 1// BoxMaterial์„ ์ƒ์† ๋ฐ›์•˜์œผ๋ฉด์„œ Hard(์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋งŒ ๊ฐ€๋Šฅ 2public class Box<M extends BoxMaterial & Hard> 3// BoxMaterial์˜ ์กฐ์ƒ ํด๋ž˜์Šค๋งŒ ๊ฐ€๋Šฅ 4public class Box<T super BoxMaterial> Whild Card 1// T์™€ ๊ทธ ์ž์†๋งŒ ๊ฐ€๋Šฅ 2<? extends T> 3// T์™€ ๊ทธ ์กฐ์ƒ๋งŒ ๊ฐ€๋Šฅ 4<? super T> 5// ๋ชจ๋‘ ๊ฐ€๋Šฅ 6<?>
new MVC 3 : Session, Interceptor, Cookies
๐Ÿƒ Spring
Session ๋กœ๊ทธ์ธ ํ•  ๋•Œ ์„ธ์…˜์— ๋“ฑ๋ก LoginController.java 1@PostMapping 2public String submit(LoginCommand loginCommand, Errors errors, HttpSession session) { 3new LoginCommandValidator().validate(loginCommand, errors); 4if (errors.hasErrors()) { 5 return "login/loginForm"; 6} 7 8try { 9 AuthInfo authInfo = authService.authenticate(loginCommand.getEmail(), loginCommand.getPassword()); 10 11 session.setAttribute("authInfo", authInfo); 12 return "login/loginSuccess"; 13} 14catch (WrongIdPasswordException e) { 15 errors.reject("idPasswordNotMatching"); 16 return "login/loginForm"; 17} 18} ๋กœ๊ทธ์•„์›ƒ ํ• ๋•Œ ์„ธ์…˜์—์„œ ์‚ญ์ œ LogoutController.java 1@RequestMapping("/logout") 2public String logout(HttpSession session) { 3 session.invalidate(); 4 return "redirect:/main"; 5} ๋กœ๊ทธ์ธ ์ƒํƒœ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ 1<c:if test="${ empty authInfo }"> 2<p>ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.</p> 3<p> 4 <a href="<c:url value="/register/step1" />">[ํšŒ์› ๊ฐ€์ž…ํ•˜๊ธฐ]</a> 5 <a href="<c:url value="/login" />">[๋กœ๊ทธ์ธ]</a> 6</p> 7</c:if> 8 9<c:if test="${! empty authInfo }"> 10<p>${authInfo.name}๋‹˜, ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.</p> 11<p> 12 <a href="<c:url value="/edit/changePassword" />">[๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ]</a> 13 <a href="<c:url value="/logout" />">[๋กœ๊ทธ์•„์›ƒ]</a> 14</p> 15</c:if> Interceptor ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ ‘๊ทผํ•˜๋ฉด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ํ•ด์ค˜์•ผํ•˜๋Š” ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ ํ•˜์ž HttpSession์— ํŠน์ • ๊ฐœ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•ด์„œ ์žˆ๋‹ค๋ฉด redirectํ•  ์ˆ˜ ์žˆ๋‹ค. ChnagePwdController.java > public String form() 1AuthInfo authInfo = (AuthInfo) session.getAttribute("authInfo"); 2if (authInfo == null) { 3 return "redirect:/login"; 4} 5return "edit/changePwdForm"; ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์—์„œ ์ด๋Ÿฐ ๋กœ์ง์„ ์ผ์ผ์ด ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํŽธํ•˜๋‹ค ์ด๋•Œ HandlerInterceptor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค AuthCheckInterceptor.java 1public class AuthCheckInterceptor implements HandlerInterceptor { 2 @Override 3 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 4 HttpSession session = request.getSession(false); 5 if(session != null) { 6 Object authInfo = session.getAttribute("authInfo"); 7 if (authInfo != null) { 8 return true; 9 } 10 } 11 response.sendRedirect(request.getContextPath() + "/login"); 12 return false; 13 } 14} MvcConfig.java 1@Bean 2public AuthCheckInterceptor authCheckInterceptor() { 3 return new AuthCheckInterceptor(); 4} 5 6@Override 7public void addInterceptors(InterceptorRegistry registry) { 8 registry.addInterceptor(authCheckInterceptor()) 9 .addPathPatterns("/edit/**"); 10} /edit/** ํŒจํ„ด์œผ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด authCheckInterceptor๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Cookie org.springframework.beans.NotReadablePropertyException: Invalid property ‘rememberEmail’ of bean class [controller.LoginCommand] LoginCommand.java ์† setRemberEmail(boolean rememberEmail)ํ•จ์ˆ˜ ์ด๋ฆ„์— ์˜คํƒ€๊ฐ€ ์žˆ์—ˆ๋‹ค getter๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ด์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์ด๋‹ค
new ์ž๋ฃŒ๊ตฌ์กฐ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
์ œ 1์žฅ : ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•œ ์ค€๋น„ (230302) ๋ฐฐ์—ด ๋ฐฐ์—ด(Array): ๋™์ผํ•œ ํƒ€์ž…์˜ ์›์†Œ๋“ค์ด ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๊ธฐ์ดˆ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ ์ถ”์ƒ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ถ”์ƒ๋ฐ์ดํ„ฐํƒ€์ž…(ADT:Abstract Data Type) : ๋ฐ์ดํ„ฐ์™€ ๊ทธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ถ”์ƒ์ ์ธ ์—ฐ์‚ฐ๋“ค๋กœ์จ ๊ตฌ์„ฑ ADT =~ ์ž๋ฐ”์˜ interface, ์ž๋ฃŒ๊ตฌ์กฐ =~ ์ž๋ฐ”์˜ class ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์ถ”์ƒ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ 1-2 ์ˆ˜ํ–‰์‹œ๊ฐ„์˜ ๋ถ„์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ: ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” **์‹œ๊ฐ„๋ณต์žก๋„(Time Complexity)**์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ˆ˜ํ–‰๋˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” **๊ณต๊ฐ„๋ณต์žก๋„(Space Complexity)**์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋ถ„์„ ์‹œ๊ฐ„ ๋ณต์žก๋„ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜(์—ฐ์‚ฐ)์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ณธ์ ์ธ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅ ํฌ๊ธฐ์˜ ํ•จ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ธฐ๋ณธ ์—ฐ์‚ฐ(Elementary Operation)์ด๋ž€ ๋ฐ์ดํ„ฐ ๊ฐ„ ํฌ๊ธฐ ๋น„๊ต, ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ๋ฐ ๊ฐฑ์‹ , ์ˆซ์ž ๊ณ„์‚ฐ ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์—ฐ์‚ฐ์„ ์˜๋ฏธ 4๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋ถ„์„ ์ตœ์•…๊ฒฝ์šฐ ๋ถ„์„(Worst-case Analysis) : ์ƒํ•œ์„ ์˜ ์˜๋ฏธ ํ‰๊ท ๊ฒฝ์šฐ ๋ถ„์„(Average-case Analysis) ์ตœ์„ ๊ฒฝ์šฐ ๋ถ„์„(Best-case Analysis) : ๊ฐ€์žฅ ๋น ๋ฅธ ์ˆ˜ํ–‰์‹œ๊ฐ„ ์ƒ๊ฐ๋ถ„์„(Amortized Analysis) : ์ด ์—ฐ์‚ฐํšŸ์ˆ˜๋ฅผ ํ•ฉํ•˜๊ณ  ์—ฐ์‚ฐ ํšŸ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ๋ถ„์„ 1-3 ์ˆ˜ํ–‰์‹œ๊ฐ„์˜ ์ ๊ทผํ‘œ๊ธฐ๋ฒ• O (Big-Oh)-ํ‘œ๊ธฐ๋ฒ• ฮฉ (Big-Omega)-ํ‘œ๊ธฐ๋ฒ• ฮ˜ (Theta)-ํ‘œ๊ธฐ๋ฒ• O (Big-Oh) ํ‘œ๊ธฐ๋ฒ• ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ f(N) โ‰ค cg(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c์™€N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = O(g(N))์ด๋‹ค. ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ f(N) โ‰ค cg(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c์™€ N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = O(g(N)) f(N) = O(g(N))์€ N0 ๋ณด๋‹ค ํฐ ๋ชจ๋“  N ๋Œ€ํ•ด์„œ f(N)์ด ์–‘์˜ ์ƒ์ˆ˜๋ฅผ ๊ณฑํ•œ g(N)์— ๋ฏธ์น˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋œป g(N)์€ f(N)์˜ ์ƒํ•œ(Upper Bound) ์ด๋ผ๊ณ  ํ•œ๋‹ค ฮฉ (Big-Omega) ํ‘œ๊ธฐ๋ฒ• ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ f(N) โ‰ฅ cg(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c์™€ N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = ฮฉ(g(N)) f(N) = ฮฉ(g(N))์€ ์–‘์˜ ์ƒ์ˆ˜๋ฅผ ๊ณฑํ•œ g(N)์ด f(N)์— ๋ฏธ์น˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋œป g(N)์„ f(N)์˜ ํ•˜ํ•œ(Lower Bound) ์ด๋ผ๊ณ  ํ•œ๋‹ค ฮ˜ (Theta) ํ‘œ๊ธฐ๋ฒ• ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ c1g(N) โ‰ฅ f(N) โ‰ฅ c2g(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c1, c2, N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = ฮ˜(g(N)) ฮ˜-ํ‘œ๊ธฐ๋Š” ์ˆ˜ํ–‰์‹œ๊ฐ„์˜ O-ํ‘œ๊ธฐ์™€ ฮฉ-ํ‘œ๊ธฐ๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์˜ O-ํ‘œ๊ธฐ์™€ ์ด๋ฆ„ O(1), O(logN), O(N), O(NlogN), O(N2), O(N3), O(2N) 1-5 ์ˆœํ™˜ (Recursion) ์ˆœํ™˜์œผ๋กœ ๊ตฌํ˜„๋œ ๋ฉ”์†Œ๋“œ์˜ ๊ตฌ์„ฑ์š”์†Œ ๊ธฐ๋ณธ(Base) case : ์Šค์Šค๋กœ๋ฅผ ๋” ์ด์ƒ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์ˆœํ™˜ case : ์Šค์Šค๋กœ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„ ๊ผฌ๋ฆฌ ์ˆœํ™˜ (Tail Recursion) ๋ฉ”์†Œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์—์„œ ์ˆœํ™˜ (ํ˜ธ์ถœ ํ›„ ๋˜๋Œ์•„ ์™”์„๋•Œ ์ˆ˜ํ–‰ํ•  ์—ฐ์‚ฐ์ด ์—†๋Š” ๊ฒฝ์šฐ) ๊ผฌ๋ฆฌ ์ˆœํ™˜์€ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค 1public class TailRecursion { 2 public static int factorial(int n, int fact) { 3 if (n==1) 4 return fact; 5 return factorial( ,); 6 } 7} ์ œ 2์žฅ : ๋ฆฌ์ŠคํŠธ ๋ฆฌ์ŠคํŠธ ์ผ๋ จ์˜ ๋™์ผํ•œ ํƒ€์ž…์˜ ํ•ญ๋ชฉ๋“ค์ด ๋‚˜์—ด๋œ ๊ฒƒ ๋ฐฐ์—ด ๋™์ผํ•œ ํƒ€์ž…์˜ ์›์†Œ๋“ค์ด ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ํ• ๋‹น๋˜์–ด ๊ฐ ํ•ญ๋ชฉ์ด ํ•˜๋‚˜์˜ ์›์†Œ์— ์ €์žฅ๋˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ ์ ‘๊ทผ : O(1), ์‚ฝ์ž…/์‚ญ์ œ : O(n) ๋ฐฐ์—ด๋กœ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ (ArrList) peek, insert, resize, delete ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Singly Linked List) print, search, insertFront, insertAfter ์ž๊ธฐ์ฐธ์กฐ๋ณ€์ˆ˜ 1public class Node <E> { 2 private Node<E> next; // ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜ 3 ... 4} ์ˆ˜ํ–‰์‹œ๊ฐ„ search : O(n) insert, delete : O(1), p๊ฐ€ ์•ˆ์ฃผ์–ด์ง€๋ฉด O(n) ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (Doubly Linked List) head, tail, item insertBefore, insertAfter, delete, ์ˆ˜ํ–‰์‹œ๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐ : O(1) ํƒ์ƒ‰ ์—ฐ์‚ฐ : O(n) ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Circular Linked List) ์ˆ˜ํ–‰์‹œ๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐ : O(1) ํƒ์ƒ‰ ์—ฐ์‚ฐ : O(n) ์ œ 3์žฅ : ์Šคํƒ๊ณผ ํ ์Šคํƒ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ / LinkedList๋กœ ๊ตฌํ˜„ ํ›„์œ„ ํ‘œ๊ธฐ <-> ์ค‘์œ„ ํ‘œ๊ธฐ ์ˆ˜ํ–‰์‹œ๊ฐ„ push, pop : O(1) ๋ฐฐ์—ด ํฌ๊ธฐ์˜ ํ™•๋Œ€/์ถ•์†Œ : O(n) ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ pop, push : O(1) ์ œ 4์žฅ : ํŠธ๋ฆฌ ์šฉ์–ด root, parent, child leaf, sibling, ancesto๋ฆฌ(์กฐ์ƒ), descendant(ํ›„์†) subtree(๋…ธ๋“œ ์ž์‹ ๊ณผ ํ›„์†์œผ๋กœ ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ) degree(์ฐจ์ˆ˜ : ์ž์‹ ์ˆ˜) level (๊นŠ์ด์™€ ๋™์ผ, 0 ๋˜๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘) height (ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ level) key (ํƒ์ƒ‰์— ์‚ฌ์šฉ๋˜๋Š” ๋…ธ๋“œ์— ์ €์žฅ๋œ ์ •๋ณด) ์™ผ์ชฝ ์ž์‹-์˜ค๋ฅธ์ชฝ ํ˜•์ œ (Left Child-Right Sibling) ํ‘œํ˜„ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹๊ณผ ์˜ค๋ฅธ์ชฝ ํ˜•์ œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” 2๊ฐœ์˜ ๋ ˆํผ๋Ÿฐ์Šค๋งŒ ์‚ฌ์šฉ ์ด์ง„ ํŠธ๋ฆฌ (Binary Tree) ๊ฐ ๋…ธ๋“œ์˜ ์ž์‹ ์ˆ˜๊ฐ€ 2 ์ดํ•˜์ธ ํŠธ๋ฆฌ ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ์ด์ง„ํŠธ๋ฆฌ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ(Perfect Binary Tree) ๊ฐ ๋‚ด๋ถ€ ๋…ธ๋“œ๊ฐ€ 2๊ฐœ์˜ ์ž์‹์„ ๊ฐ€์ง€๊ณ  ๋ชจ๋“  ์ดํŒŒ๋ฆฌ๊ฐ€ ๊ฐ™์€ ์ธต์— ์žˆ๋Š” ํŠธ๋ฆฌ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(Complete Binary Tree) ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•œ ๊ฐ ๋ ˆ๋ฒจ์ด ๋…ธ๋“œ๋“ค๋กœ ๊ฝ‰ ์ฐจ์žˆ๊ณ , ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์—๋Š” ๋…ธ๋“œ๋“ค์ด ์™ผ์ชฝ๋ถ€ํ„ฐ ๋น ์ง์—†์ด ์ฑ„์›Œ์ง„ ํŠธ๋ฆฌ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์†์„ฑ ๋ ˆ๋ฒจ k์— ์žˆ๋Š” ์ตœ๋Œ€ ๋…ธ๋“œ ์ˆ˜ = $2^{k-1}$ ๋†’์ด๊ฐ€ h์ธ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ ์ˆ˜ = $2^{h}-1$ n๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋†’์ด = $log_{2}(n+1)$ ๋†’์ด๊ฐ€ h์ธ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์— ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ์ˆ˜ n ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์ด์ง„ ํŠธ๋ฆฌ ํŠธ๋ฆฌ 1A 2โ”œโ”€โ”€ B 3โ”‚ โ”œ-โ”€ D 4โ”‚ โ”‚ โ”œโ”€โ”€ H 5โ”‚ โ”‚ โ””โ”€โ”€ I 6โ”‚ โ””-โ”€ E 7โ”‚ โ”œโ”€โ”€ J 8โ”‚ โ””โ”€โ”€ K 9โ””โ”€โ”€ C 10 โ”œโ”€โ”€ F 11 โ””โ”€โ”€ G ์œ„ ํŠธ๋ฆฌ๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋ฉด (์ธ๋ฑ์Šค 1๋ถ€ํ„ฐ ์‹œ์ž‘) 1A = [A, B, C, D, E, F, G, H, I, J, K] a[i]์˜ ๋ถ€๋ชจ๋Š” a[i/2], ๋‹จ i>1 a[i]์˜ ์™ผ์ชฝ ์ž์‹์€ a[2i], ๋‹จ 2i <= n a[i]์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์€ a[2i+1], ๋‹จ 2i+1 <= n ํŽธํ–ฅ(skewed) ์ด์ง„ ํŠธ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•˜๋‹ค ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ˆœํšŒ preorder ; root - left - right inorder : left - root - right postorder : left - right - root levelorder : left -> right (from top level) ์ˆ˜ํ–‰ ์‹œ๊ฐ„ O(n) ์‹œ๊ฐ„์ด ์†Œ์š” ์ง‘ํ•ฉ์˜ ํ‘œํ˜„ ๋ฐฐ์—ด index 0 1 2 3 4 5 6 7 8 9 value 4 2 7 7 4 4 2 7 7 4 ์ง‘ํ•ฉ 1 17 2โ”œโ”€โ”€ 2 3โ”‚ โ”œ-โ”€ 1 4โ”‚ โ””-โ”€ 6 5โ”œโ”€โ”€ 8 6โ””โ”€โ”€ 3 ์ง‘ํ•ฉ2 14 2โ”œโ”€โ”€ 0 3โ”œโ”€โ”€ 5 4โ””โ”€โ”€ 9 ์ˆ˜ํ–‰ ์‹œ๊ฐ„ union : O(N) find : O(N) ์ œ 5์žฅ : ํƒ์ƒ‰ ํŠธ๋ฆฌ 5.1 ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ min ํ•จ์ˆ˜ deleteMin ํ•จ์ˆ˜ delete ํ•จ์ˆ˜ CASE 1 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ๋‘ ์ž์‹์ด ๋ชจ๋‘ null CASE 2 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹๋งŒ null CASE 3 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹๋งŒ null CASE 4 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์ž์‹์ด ๋‘˜๋‹ค ์กด์žฌ ์‹œ๊ฐ„ ๋ณต์žก๋„ O($logn$) 5.2 AVL ํŠธ๋ฆฌ AVLํŠธ๋ฆฌ์˜ ์ •์˜ ์ž„์˜์˜ ๋…ธ๋“œ x์— ๋Œ€ํ•ด x์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์™€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด ์ฐจ์ด๊ฐ€ 1์„ ๋„˜์ง€ ์•Š๋Š” ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ AVLํŠธ๋ฆฌ์˜ ํšŒ์ „ ์—ฐ์‚ฐ LL ํšŒ์ „ : ์™ผ์ชฝ์œผ๋กœ ์น˜์šฐ์นœ ๊ฒฝ์šฐ rotateRight(n)๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ RR ํšŒ์ „ : ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์น˜์šฐ์นœ ๊ฒฝ์šฐ rotateLeft(n)๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ LR ํšŒ์ „ : rotateLeft(n.left) -> rotateRight(n)๋กœ ํ•ด๊ฒฐ RL ํšŒ์ „ : rotateRight(n.right) -> rotateLeft(n)๋กœ ํ•ด๊ฒฐ 4๊ฐ€์ง€ ํšŒ์ „์˜ ๊ณตํ†ต์  ํšŒ์ „ ํ›„์˜ ํŠธ๋ฆฌ๋“ค์ด ๋ชจ๋‘ ๊ฐ™๋‹ค, ๋ชจ๋‘ O(1) AVLํŠธ๋ฆฌ์˜ ์—ฐ์‚ฐ ์‚ฝ์ž… ์—ฐ์‚ฐ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์‚ฝ์ž…๊ณผ ๋™์ผํ•˜๊ฒŒ ์ƒˆ ๋…ธ๋“œ ์‚ฝ์ž… ์ƒˆ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๋ฃจํŠธ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๋ถˆ๊ท ํ˜•์ด ๋ฐœ์ƒํ•˜๋ฉด ์ ์ ˆํ•˜๊ฒŒ ํšŒ์ „ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ์‚ญ์ œ ์—ฐ์‚ฐ 5.3 2-3 ํŠธ๋ฆฌ 2-3 ํŠธ๋ฆฌ์˜ ์ •์˜ ์ž„์˜์˜ ๋…ธ๋“œ๊ฐ€ 2๊ฐœ ๋˜๋Š” 3๊ฐœ์˜ ์ž์‹์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ๋กœ, ๋ชจ๋“  ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋ ˆ๋ฒจ์— ์žˆ๋‹ค. 2-3 ํŠธ๋ฆฌ์˜ ์—ฐ์‚ฐ ํƒ์ƒ‰ ์—ฐ์‚ฐ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์™€ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํƒ์ƒ‰ ๋ถ„๋ฆฌ ์—ฐ์‚ฐ ํ‚ค๋ฅผ ๋ถ€๋ชจ๋กœ ์˜ฌ๋ ค ๋ณด๋ƒ„ ๋ถ€๋ชจ๊ฐ€ 3-๋…ธ๋“œ์ด๋ฉด ๋‹ค์‹œ ๋ถ„๋ฆฌ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ๋ฃจํŠธ์—์„œ ์ผ์–ด๋‚˜๋ฉด ํŠธ๋ฆฌ์˜ ๋†’์ด 1 ์ฆ๊ฐ€ ์‚ฝ์ž… ์—ฐ์‚ฐ ์‚ฝ์ž… ํ›„ ๋ถ„๋ฆฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ ์‚ญ์ œ ์—ฐ์‚ฐ ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ์ด๋ฉด ๊ทธ๋ƒฅ ์‚ญ์ œ ์‚ญ์ œํ•œ ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ตํ™˜ ํ›„ ์‚ญ์ œ ์ด๋™ ์—ฐ์‚ฐ, ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ฌ์šฉ ์ด๋™ ์—ฐ์‚ฐ ๋นˆ ์ž๋ฆฌ๋ฅผ ํ˜•์ œ์™€ ๋ฐ”๊พผ๋‹ค ์ด๋™์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด ํ†ตํ•ฉ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ญ์ œํ•œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ์™€ ํ˜•์ œ๋ฅผ ํ†ตํ•ฉํ•œ๋‹ค 2-3 ํŠธ๋ฆฌ์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„ ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ -> O($logn$) -> ํŠธ๋ฆฌ์˜ ๋†’์ด์— ๋น„๋ก€ ๋ถ„๋ฆฌ ์—ฐ์‚ฐ, ํ†ตํ•ฉ ์—ฐ์‚ฐ -> O(1) 2-3ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ฒฝ์šฐ ๋ชจ๋“  ๋…ธ๋‘๊ฐ€ 2-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ๋†’์ด : $ log_2(n+1) $ 2-3ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฒฝ์šฐ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ 3-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ๋†’์ด : $ log_3(n) $ 5.4 2-3-4 ํŠธ๋ฆฌ 2-3ํŠธ๋ฆฌ๋ฅผ ํ™•์žฅํ•œ 2-3-4 ํŠธ๋ฆฌ๋Š” ๋…ธ๋“œ๊ฐ€ ์ž์‹์„ 4๊ฐœ๊นŒ์ง€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์™„์ „๊ท ํ˜•ํŠธ๋ฆฌ ์ด๋ก ์ ์œผ๋กœ๋Š” 2-3ํŠธ๋ฆฌ์™€ ๋™์ผํ•˜๋‹ค ์‹ค์ œ๋กœ๋Š” ๋” ๋น ๋ฆ„ 5.5 B-ํŠธ๋ฆฌ B-ํŠธ๋ฆฌ์˜ ์ •์˜ ๋‹ค์ˆ˜์˜ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๋‹ค๋ฐฉํ–ฅ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•œ ๊ท ํ˜„ํŠธ๋ฆฌ B-ํŠธ๋ฆฌ์˜ ์—ฐ์‚ฐ ํƒ์ƒ‰ ์—ฐ์‚ฐ ๋ฃจํŠธ ๋ถ€ํ„ฐ ์‹œ์ž‘ ๊ฐ ๋…ธ๋“œ์—์„œ ์ด์ง„ ํƒ์ƒ‰ ์ˆ˜ํ–‰ ์‚ฝ์ž… ์—ฐ์‚ฐ ์ดํŒŒ๋ฆฌ์— ์ƒˆ ํ‚ค๋ฅผ ์ˆ˜์šฉํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด, ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์‚ฝ์ž… ์ด๋ฏธ M-1๊ฐœ์˜ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด, ๋ถ„๋ฆฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ ์‚ญ์ œ ์—ฐ์‚ฐ ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ์ด๋ฉด ๊ทธ๋ƒฅ ์‚ญ์ œ ์‚ญ์ œํ•œ ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ตํ™˜ ํ›„ ์‚ญ์ œ ์ด๋™ ์—ฐ์‚ฐ, ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ฌ์šฉ ์ด๋™ ์—ฐ์‚ฐ ํ‚ค์˜ ์ˆ˜๊ฐ€ M/2-1๋ณด๋‹ค ์ž‘์œผ๋ฉด(underflow) ํ˜•์ œ, ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ์ด๋Šฅ ์ด๋™ ์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด ํ†ตํ•ฉ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ญ์ œํ•œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ์™€ ํ˜•์ œ๋ฅผ ํ†ตํ•ฉํ•œ๋‹ค B-ํŠธ๋ฆฌ์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„ ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ -> O($log_{M/2}n$) -> ํŠธ๋ฆฌ์˜ ๋†’์ด์— ๋น„๋ก€ ์ œ 6์žฅ : ํ•ด์‹œ ํ…Œ์ด๋ธ” ๋Œ€ํ‘œ์ ์ธ ํ•ด์‹œ ํ•จ์ˆ˜ ์ค‘๊ฐ„ ์ œ๊ณฑ ํ•จ์ˆ˜ : ํ‚ค๋ฅผ ์ œ๊ณฑํ•œ ํ›„, ์ ์ ˆํ•œ ํฌ๊ธฐ์˜ ์ค‘๊ฐ„ ๋ถ€๋ถ„์„ ์‚ฌ์šฉ ์ ‘๊ธฐ ํ•จ์ˆ˜ : ํ‚ค๋ฅผ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ ํ›„, ์ด๋“ค์„ ๋”ํ•œ ๊ฐ’์„ ์‚ฌ์šฉ ์ž๋ฐ”์˜ hashCode() 1private int hash(Key k) { 2 return (k.hashCode() & 0x7fffffff) % M; 3} ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ €์žฅ ๋ฐฉ์‹ ๊ฐœ๋ฐฉ ์ฃผ์†Œ ๋ฐฉ์‹ : ์ถฉ๋Œ๋œ ํ‚ค๋ฅผ ์ผ์ •ํ•œ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ฐพ์•„๋‚ธ empty์›์†Œ์— ์ €์žฅ ์„ ํ˜• ์กฐ์‚ฌ, ์ด์ฐจ์กฐ์‚ฌ, ์ด์ค‘ํ•ด์‹ฑ ์„ ํ˜• ์กฐ์‚ฌ : ์ถฉ๋Œ์ด ์ผ์–ด๋‚œ ๊ณณ์œผ๋กœ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ 1์ฐจ ๊ตฐ์ง‘ํ™” (ํ‚ค๋“ค์ด ๋ญ‰์ณ์ง€๋Š” ํ˜„์ƒ) ๋ฐœ์ƒ ๊ตฐ์ง‘ํ™”๋Š” ๊ตฐ์ง‘๋œ ํ‚ค๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ ์„ ์ผ์œผํ‚จ๋‹ค ์ œ 7์žฅ : ์šฐ์„ ์ˆœ์œ„ ํ ์šฐ์„ ์ˆœ์œ„ ํ (Priority Queue) ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ํ•ญ๋ชฉ์— ์ ‘๊ทผ๊ณผ ์‚ญ์ œ, ์ž„์˜์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ํ•ญ๋ชฉ์˜ ์‚ฝ์ž…์„ ์ง€์›ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ํž™ (Heap) ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋กœ์„œ ๋ถ€๋ชจ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ž์‹์˜ ์šฐ์„ ์ˆœ์œ„๋ณด๋‹ค ๋†’์€ ์ž๋ฃŒ๊ตฌ์กฐ ์ตœ์†Œ ํž™, ์ตœ๋Œ€ ํž™ ํž™์˜ ์—ฐ์‚ฐ ์ตœ์†Ÿ๊ฐ’ ์‚ญ์ œ ๋ฃจํŠธ ์‚ญ์ œ ํ›„, ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ์ด๋™ downheap ์ˆ˜ํ–‰ : ๋ฃจํŠธ๋ถ€ํ„ฐ ๋น„๊ตํ•˜๋ฉด์„œ ๋‚ด๋ ค๊ฐ ์‚ฝ์ž… ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์˜ ๋‹ค์Œ์— ์‚ฝ์ž… upheap ์ˆ˜ํ–‰ : ๋ฃจํŠธ๋กœ ๋น„๊ตํ•˜๋ฉด์„œ ์˜ฌ๋ผ๊ฐ ์ƒํ–ฅ์‹ ํž™ 1public void createHeap() { 2 for (int i = N/2; i>0; i--) { 3 downheap(i); 4 } 5} O(n) ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ์ ‘๊ทผ, ์‚ฝ์ž…, ์‚ญ์ œ : O(logn) ์ œ 8์žฅ : ์ •๋ ฌ ์„ ํƒ ์ •๋ ฌ (Selection Sort) ํ•ญ์ƒ O(n^2) ์‚ฝ์ž… ์ •๋ ฌ (Insertion Sort) ์ตœ์•… : O(n^2) ์ตœ์„  : O(n) : ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ ํž™ ์ •๋ ฌ (Heap Sort) ํ•ญ์ƒ : O(nlogn) ํ•ฉ๋ณ‘ ์ •๋ ฌ (Merge Sort) ํ•ญ์ƒ : O(nlogn) Stable Sort : ๊ฐ™์€ ๊ฐ’์˜ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๋ ˆ์ฝ”๋“œ์˜ ์ˆœ์„œ๊ฐ€ ์ •๋ ฌ ํ›„์—๋„ ์œ ์ง€๋˜๋Š” ์ •๋ ฌ ํ€ต ์ •๋ ฌ (Quick Sort) ์ตœ์•… : O(n^2) ์ตœ์„  : O(nlogn) ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฐฉ๋ฒ• Median of Three : ์ฒซ๋ฒˆ์งธ, ๋งˆ์ง€๋ง‰, ์ค‘๊ฐ„๊ฐ’ ์ค‘์—์„œ ์ค‘๊ฐ„๊ฐ’์„ ํ”ผ๋ฒ—์œผ๋กœ ์„ ํƒ ์ž…๋ ฅ์ด ์ž‘์€ ํฌ๊ธฐ๊ฐ€ ๋˜์—ˆ์„๋•Œ ์‚ฝ์ž… ์ •๋ ฌ์„ ์‚ฌ์šฉ
new ์šด์˜์ฒด์ œ - ์ค‘๊ฐ„๋ฒ”์œ„
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
์šด์˜์ฒด์ œ ๊ฐœ์š” ์šด์˜์ฒด์ œ์˜ ์—ญํ•  Program execution Access to computer resources (I/O device, Data…) Error detection and response Accounting (ex: task manager) ์šด์˜์ฒด์ œ์˜ ๋ฐœ์ „ Serial Processing : No OS, No Job scheduling Simple batch system OS๊ฐ€ job์„ ํ• ๋‹น Controlled by monitor Uni-programming ๋‹ค ์‹คํ–‰๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ bad utilization Multiprogramming The processor can switch to the other job better utilization, needs more memory Time sharing proceess์—๊ฒŒ ์ •ํ•ด์ง„ time slice (time quantum)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. better utilization, bad throughput Symmetric multiprocessing (SMP) ์—ฌ๋Ÿฌ processors๊ฐ€ main memory, I/O ์žฅ์น˜๋“ค์„ ๊ณต์œ  ์—ฌ๋Ÿฌ processors๊ฐ€ ๋™์ผํ•œ function ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ ์šด์˜์ฒด์ œ์˜ ๊ตฌ์„ฑ ์š”์†Œ Distributed Systems (๋ถ„์‚ฐ์‹œ์Šคํ…œ) ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด ์‚ฌ์šฉ ๋น ๋ฅธ ์†๋„, ๋†’์€ ๋ฐ์ดํ„ฐ ๊ฐ€์šฉ์„ฑ Command-Interpreter System user๊ฐ€ ์ง์ ‘ OS์—๊ฒŒ ์ผ์„ ์‹œํ‚จ๋‹ค OS Architecture Monolithic kernel ๋ชจ๋“  OS์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ kernel์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋‹ค ํ•˜๋‚˜ ์ˆ˜์ •ํ•˜๋ฉด ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผ ํ•ด์•ผ ํ•œ๋‹ค Microkernel kernel kernel ๋‚ด์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ Address space management, Interprocess communication, ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœ์„ธ์Šค scheduling ๊ธฐ๋Šฅ kernel๊ฐ„ ํ†ต์‹ ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค Process Process๋ž€ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๊ฐ์ฒด register ์ค‘ PC๊ฐ€ context๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค Context๋Š” data์™€ code๋กœ ๊ตฌ์„ฑ Trace of Processes A -> time out -> B -> I/O request -> A ์‚ฌ์ด์‚ฌ์ด์— dispatcher๊ฐ€ processor์— process๋ฅผ ๊ต์ฒดํ•œ๋‹ค Process state model Process suspension์˜ ์ด์œ  Swapping : memory ๊ณต๊ฐ„ ํ™•๋ณด๋ฅผ ์œ„ํ•ด Timing : ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ Interactive user request : user์˜ ์š”์ฒญ Parent process request : parent process์˜ ์š”์ฒญ Process Control block ๊ตฌ์„ฑ์š”์†Œ : Identifier, State, Priority, PC, Memory pointers, Address of memory context, I/O state info, Accounting info Process 1๊ฐœ ๋‹น PCB 1๊ฐœ Process Context User Context : code, data, user stack System Context : kernel stack, PCB Virtual Address Space ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์„œ ์ ‘๊ทผ(access, reference) ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ๋“ค์˜ ๋ฒ”์œ„ 32bit address computer : $2^{32}$ = 4G ๋ฒˆ์ง€, 3G~4G๋ฒˆ์ง€์—๋Š” ์ปค๋„์ด ๋“ค์–ด๊ฐ„๋‹ค ๋ณด์กฐ๊ธฐ์–ต์žฅ์น˜์˜ VAS๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐœ์ˆ˜๋งŒํผ ์กด์žฌ ๊ตฌ์„ฑ | kernel | stack (local var) | bss (๋งŒ๋“ค๋•Œ ์ดˆ๊ธฐํ™” ์•ˆ ํ•œ global var) | data (๋งŒ๋“ค๋•Œ ์ดˆ๊ธฐํ™” ํ•œ global var) | code Process Creation Process๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ OS๊ฐ€ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ ์ค‘์ธ process๊ฐ€ ์ž์‹์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ User command fork() ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ memory infotable์ด ๋ถ€๋ชจ์˜ context๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค memory๋‚ด์—์„œ ๋ถ€๋ชจ์˜ data, stack์„ ๋ณต์ œํ•œ๋‹ค ์ž์‹์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์„ ๋ณต์ œ๋œ context๋กœ ๋ฐ”๊พผ๋‹ค COW(Copy on write) : ๋ณต์‚ฌ๋ฅผ ๋Šฆ์ถค์œผ๋กœ์„œ ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ Process switch Mode change : Memory ๋‚ด์—์„œ user mode <-> system mode Context change : ๋‹ค๋ฅธ process๋กœ switch Context change๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ Process์˜ ์†Œ๋ฉธ : Running -> Release Process์˜ block (I/O request, file open, page fault) : Running -> Blocked Expiration of time slice : Running -> Ready I/O interrupt : Blocked -> Ready Steps of context switch Save context(pc, other register) of processor Update the PCB Move PCB to appropriate queue Select another process to execute Update the PCB Update memory-management data structures Restore context of the selected process Process Termination Process๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ Normal ompletion Parent request Protection error : ๋น„์ •์ƒ์ ์ธ ์ ‘๊ทผ์„ ํ• ๋•Œ OS๊ฐ€ ๊ฐ•์ œ ์ข…๋ฃŒ Arithmetic Error, Invalid instruction… terminated ์ƒํƒœ : Computer resource๋Š” ๋บ๊ฒผ์ง€๋งŒ, PCB๋Š” ๋‚จ์•„์žˆ๋Š” ์ƒํƒœ ํ•ด๋‹น ํ”„๋กœ์„ธ์„œ์˜ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ wait syscall์„ ํ˜ธ์ถœํ•˜๋ฉด ์™„์ „ํžˆ ์‚ญ์ œ ์ง€์›Œ์ง€๋Š” ๋ถ€๋ชจ ๋ฐ‘์— ์ž์‹์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด ์ž์‹๋“ค์„ init ํ”„๋กœ์„ธ์Šค์˜ ์–‘์ž๋กœ ๋ณด๋‚ธ๋‹ค Inter-Process Communication (IPC) Message Passing : kernel๋‚ด mailbox๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ๋ฒ• user mode -> kernel mode -> user mode ๊ตฌํ˜„์ด ์‰ฝ๋‹ค, ๋А๋ฆฌ๋‹ค Shared Memory VAD์— shared memory๋ฒ• ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ณ ์žˆ๋‹ค ๋น ๋ฅด๋‹ค, ๊ตฌํ˜„์ด ์–ด๋ ต๋‹ค Message / Signal Threads Process์™€ Thread์˜ ์ฐจ์ด Thread๋ž€ A unit of execution of in a process has an execution state ๊ตฌ์„ฑ ์š”์†Œ Stack Memory for registers context : thread control block multithread Thread์˜ ์žฅ์  Process ๋งŒ๋“œ๋Š”๊ฑฐ ๋ณด๋‹ค Thread ๋งŒ๋“œ๋Š”๊ฒŒ ๋น ๋ฅด๋‹ค Process ์—†์• ๋Š”๊ฑฐ ๋ณด๋‹ค Thread ์—†์• ๋Š”๊ฒŒ ๋น ๋ฅด๋‹ค Process๋ผ๋ฆฌ ํ†ต์‹ ํ•˜๋Š”๊ฑฐ๋ณด๋‹ค Thread๋ผ๋ฆฌ ํ†ต์‹ ์ด ๋” ๋น ๋ฅด๋‹ค (data ๊ณต์œ ) User-Level Threads mode change๊ฐ€ ํ•„์š”์—†๋‹ค user๊ฐ€ control ํ•  ์ˆ˜ ์žˆ๋‹ค ํ•˜๋‚˜๊ฐ€ block๋˜๋ฉด ๋‚˜๋จธ์ง€๋„ block (kernel ์ž…์žฅ์—์„œ 1๊ฐœ์˜ thread) Kernel-Level Threads kernel์— ์ข…์†์ ์ด๋‹ค kernel์ด ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค Mutual Exclusion and Synchronization Key terms in Concurrency Race condition : ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ๋•Œ Mutual exclusion : ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ ๋œ data๋ฅผ accessํ• ๋•Œ, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฑด๋“œ๋ฆฌ๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์„ฑ์งˆ Critical section : ๊ณต์œ ๋œ resource๋ฅผ accessํ•˜๋Š” ๋ถ€๋ถ„์˜ ์ฝ”๋“œ Starvation : Process์—๊ฒŒ ์ž์›์ด ๋ฐฐ์ •๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Deadlock : Starvation for infinite duration Producer/Consumer : Finite Buffer producer 1item v; 2 3 4while (1) { 5 while (counter == BUFFER_SIZE) ; // busy waiting 6 /* produce item v */ 7 b[in] = v; 8 in = (in + 1) % BUFFER_SIZE; 9 counter++; 10} consumer 1item w; 2while (1) { 3 while (counter == 0) ; // busy waiting 4 w = b[out]; 5 out = (out + 1) % BUFFER_SIZE; 6 counter--; 7 /* consume item w */ 8} => Race condition ๋ฐœ์ƒ ๊ฐ€๋Šฅ Race Condition in a Uniprocessor counter++, counter–์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์€ assembly๋กœ ๋ฐ”๋€Œ๋ฉด 1๊ฐœ์ด์ƒ์˜ instruction์ด๋‹ค. ์ค‘๊ฐ„์— interrupt๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด race condition์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ atomicํ•˜๊ฒŒ ์‹คํ–‰๋˜์–ด์•ผํ•œ๋‹ค. Race Condition in one Process Multithreading์—์„œ๋„ race condition์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. Prevent Race Condition (SW solution) ์กฐ๊ฑด Mutual Exclusion : critical section์— ํ•˜๋‚˜๊ฐ€ ์ ‘๊ทผ ์ค‘์ด๋ฉด ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€ Progress : ์•„๋ฌด๋„ ์—†์œผ๋ฉด ์ ‘๊ทผ ๊ฐ€๋Šฅ Bounded Waiting : ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐ ํ•œ๊ณ„ ์กด์žฌ (P1 -> P3 -> P1 -> P3 .., P2๋Š”?) ๋ฐฉ๋ฒ• 1 P0 1do { 2 while (turn != 0) ; 3 /* critical section */ 4 turn = 1; 5 /* remainder section */ 6} while (true); P1 1do { 2 while (turn != 1) ; 3 /* critical section */ 4 turn = 0; 5 /* remainder section */ 6} while (true); P0์—์„œ turn = 1์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— interrupt๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, P1๋„ ์ ‘๊ทผ ๋ถˆ๊ฐ€ -> progress ์„ฑ์งˆ ๋งŒ์กฑ X ๋ฐฉ๋ฒ• 2 (Peterson’s Algorithm) P0 1do { 2 flag[0] = true; 3 turn = 1; 4 while (flag [1] && turn == 1) ; 5 /* critical section */ 6 flag[0] = false; 7 /* remainder section */ 8} while (true); P1 1do { 2 flag[1] = true; 3 turn = 0; 4 while (flag [0] && turn == 0) ; 5 /* critical section */ 6 flag[1] = false; 7 /* remainder section */ 8} while (true); ๋ชจ๋“  ์กฐ๊ฑด ๋งŒ์กฑ ํ”„๋กœ์„ธ์Šค 2๊ฐœ์ผ๋•Œ๋งŒ ์ ์šฉ ๊ฐ€์—ฌ ๋ฐฉ๋ฒ• 3 (Bakery Algorithm) 1do { 2 // number๋ฅผ ๋ถ€์—ฌ๋ฐ›๋Š” ๊ณผ์ •์€ atomic ํ•˜์ง€ ์•Š๋‹ค 3 choosing[i] = true 4 // ๊ฐ€์žฅ ํฐ ๋ฒˆํ˜ธ + 1์„ ๋ถ€์—ฌ 5 number[i] = max(number[0], number[1], ..., number[n-1])+1; 6 choosing[i] = false; 7 8 for (j=0; j<n; j++) { 9 // ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ choosing ์ค‘์ธ์ง€ ์ฒดํฌ 10 while (choosing[i]); 11 12 // ์ž์‹ ์ด ๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์•˜๋Š”์ง€, ๋ฐœ๊ธ‰ ๋ฐ›์€ ๋ฒˆํ˜ธ๊ฐ€ 1์ˆœ์œ„์ธ์ง€ ์ฒดํฌ 13 while ((number[i] != 0) && (number[j], j) < (number[i], i)) ; 14 } 15 16 /* critical section */ 17 18 number[i] = 0 19 20 /* remainder section */ 21 } while (true); ๋ชจ๋“  ์กฐ๊ฑด์„ ๋งŒ์กฑ Overhead๊ฐ€ ๋„ˆ๋ฌด ํฌ๋‹ค Test and Set Instruction (HW solution) testset function 1boolean testset (i) { 2 if (i == 0) { 3 // ๋“ค์–ด๊ฐ€์‹œ์˜ค 4 i = 1; 5 return true; 6 } 7 else { 8 // ๋“ค์–ด๊ฐ€์ง€ ๋งˆ์‹œ์˜ค 9 return false; 10 } 11} example 1const int n = /* number of processes */; 2int bolt; 3void P(int i) { 4 while (true) { 5 while (! testset(bolt)); 6 /* critical section */ 7 bolt = 0; 8 /* remainder section*/ 9 } 10} 11void main() { 12 bolt = 0; 13 parbegin (P(1), P(2), ... , P(n)) 14} Semaphore (HW solution) ๊ธฐ๋ณธ ์š”์†Œ 1struct semaphore { 2 int count; 3 queueType queue; 4} 5 6void semWait (semaphore s) { 7 s.count --; 8 if (s.count < 0) { 9 // place this process in s.queue; 10 // block this process 11 } 12} 13 14void semSignal (semaphore s) { 15 s.count++; 16 if (s.count <= 0) { 17 // remove a process P from s.queue; 18 // place process P on ready_list 19 } 20} basic example 1const int n = /* number of processes */ 2semaphore s = 1; 3void P (int i) { 4 while (true) { 5 semWait(s); 6 /* critical section */ 7 semSignal(s); 8 /* remainder section */ 9 } 10} 11void main() { 12 parbegin (P(1), P(2), ... , P(n)); 13} producer/consumer example producer 1semaphore count = 0; 2semaphore empty = BUFFER_SIZE; 3semaphore mut_ex = 1; 4void producer() { 5 while (true) { 6 produce(); 7 semWait(empty); 8 semWait(mut_ex); 9 append(); // put the produced item into buffer 10 semSignal(mut_ex); 11 semSignal(counter); 12 } 13} consumer 1void consumer() { 2 while (true) { 3 semWait(counter): 4 semWait(mut_ex); 5 take(); 6 semSignal(mut_ex); 7 semSignal(empty); 8 consume(); 9 } 10} 11void main() { 12 parbegin (producer1, producer2, ... , consumer); 13} reader/writer example writer process 1 void writer() { 2 while(true) { 3 semWait(wsem); 4 WRITEUNIT(); 5 semSignal(wsem); 6 } 7 } reader process 1 void reader() { 2 while (true) { 3 semWait(rsem); // ๋‹ค๋ฅธ reader ์ ‘๊ทผ ๋ถˆ๊ฐ€ 4 readcount++; 5 if (readcount == 1) // ์ฒซ๋ฒˆ์งธ ๋“ค์–ด๊ฐ€๋Š” reader 6 semWait(wsem) // writer ์ ‘๊ทผ ๋ถˆ๋Šฅ 7 semSignal(rsem); // ๋‹ค๋ฅธ reader ์ ‘๊ทผ ๊ฐ€๋Šฅ 8 9 READUNIT(); 10 11 semWait(rsem); // ๋‹ค๋ฅธ reader ์ ‘๊ทผ ๋ถˆ๊ฐ€ 12 readcount--; 13 if (readcount == 0) // ๋งˆ์ง€๋ง‰ ๋‚˜์˜ค๋Š” reader 14 semSignal(wsem); // writer ์ ‘๊ทผ ๊ฐ€๋Šฅ 15 semSignal(rsem); // ๋‹ค๋ฅธ reader ์ ‘๊ทผ ๊ฐ€๋Šฅ 16 } 17 } binary semaphore semaphore์˜ ๊ฐ’์ด 0๊ณผ 1๋กœ ์ œํ•œ ๊ฐ’์ด 1๋กœ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ,๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ ready state๋กœ ๋ณ€ํ™˜ Lock binary semaphore๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„๋œ ๋™๊ธฐํ™” ๋ฐฉ์‹ Deadlock Deadlock์ด๋ž€ Starvation : ์–ด๋–ค ์ž์›์„ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด๋ฏธ ์ ์œ ํ•˜๊ณ  ์žˆ์–ด์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ Deadlock : 2๊ฐœ ์ด์ƒ์˜ process๋“ค์ด ์„œ๋กœ starvation์ธ ์ƒํƒœ Deadlock์˜ ์กฐ๊ฑด์„ ํ•˜๋‚˜์”ฉ ๊นจ๋ณด์ž Mutual exclusion : OS์˜ ํ•„์ˆ˜ ๊ธฐ๋Šฅ Hold and wait : ์‹œ์ž‘๋ถ€ํ„ฐ ๋ชจ๋“  ์ž์›์„ ๋ฐ›๋„๋ก ๊ตฌํ˜„ -> ๋น„ํšจ์œจ์  No Preemption : ์ž์›์„ ์„œ๋กœ ๋บ์–ด๊ฐ -> ๋น„ํšจ์œจ์  Circular Wait : ์ž์›์„ ๋จผ์ € ๋ฐ›์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์กด์žฌ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ตœ์„ ์˜ ๋ฐฉ๋ฒ• : deadlock์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ•œ ๊ฐœ์”ฉ ์ฃฝ์—ฌ๋ณด๊ธฐ File Management FCB File Control block, ๋ณด์กฐ๊ธฐ์–ต์žฅ์น˜์— ์ €์žฅ ๊ตฌ์„ฑ file name, file size, uid, gid, file operation, creation time, last modified, last access time, address of file data… Device file ๋ธ”๋กํ˜• ํŒŒ์ผ (๋‹จ์œ„ : 4096byte) file size ๋Œ€์‹  major number, minor number ์กด์žฌ Device I/O๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น Device File๊ณผ I/O ํ•˜๋“ฏ์ด ์ž‘๋™
new Git ํŠน๊ฐ• - ๋„ค์ด๋ฒ„ ์ •๋‹คํ˜„ ์„ ๋ฐฐ๋‹˜
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์ค‘์•™์ง‘์ค‘์‹ ๋ฒ„์ „ ๊ด€๋ฆฌ(CVCS) Centralized Version Control System CVCS์˜ ์ข…๋ฅ˜ : SVN, Perforce, CVS ๋ฌธ์ œ ์ค‘์•™ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๊ฐ€ ํผ ์˜คํ”„๋ผ์ธ์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅ ๋ถ„์‚ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ (DVCS) Decentralized Version Control System DVCS์˜ ์ข…๋ฅ˜ : Git, Mercurial, Bazaar Git command gst : git status git log –oneline : commit์„ ํ•œ์ค„๋กœ ์ถœ๋ ฅ git log –all –graph : ๊ทธ๋ž˜ํ”„๋กœ ์ถœ๋ ฅ merge์˜ 3๊ฐ€์ง€ ์ข…๋ฅ˜ merge : ๋ชจ๋“  commit๋“ค์ด merge commit๊ณผ ํ•จ๊ป˜ merge squash and merge : ๋ชจ๋“  commit๋“ค์„ ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด commit์œผ๋กœ ์š”์•ฝํ•˜์—ฌ merge rebase and merge : ๋ถ„๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ธฐ์ค€์ด ๋˜๋Š” base๋ฅผ ๋ณ€๊ฒฝ ํŠน์ • commit์œผ๋กœ ๋กค๋ฐฑํ•˜๋Š” ๋ฐฉ๋ฒ• reset : commit ์ด๋ ฅ์„ ๋‚จ๊ธฐ์ง€ ์•Š๊ณ  ๋˜๋Œ๋ฆฌ๊ธฐ revert : commit ์ด๋ ฅ์„ ๋‚จ๊ธฐ๊ณ  ๋˜๋Œ๋ฆฐ๋‹ค ํ˜„์—…์—์„œ๋Š” revert๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉ reset git reset HEAD~ ์˜ต์…˜ –soft : HEAD ์œ„์น˜ ๋ณ€๊ฒฝ, ํŒŒ์ผ ๋ณ€ํ™” ์—†์Œ, commit ์ง์ „์˜ ์ƒํ™ฉ –mixed (default) : addํ•˜๊ธฐ ์ „์œผ๋กœ ๋˜๋Œ๋ ค ์ค€๋‹ค, unstaged๋กœ ๋˜๋Œ๋ ค์ค€๋‹ค –hard : ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด ๋ชจ๋‘ ์‚ฌ๋ผ์ง –merge : merge ํ›„์— ๋˜๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ revert git revert HEAD cherry-pick git cherry pick <commit id> ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ํŠน์ • commit ๋งŒ์„ ๊ฐ€์ ธ ์˜ฌ ๋•Œ ์‚ฌ์šฉ Markdown ๊ธ€์ž ํ•˜์ด๋ผ์ดํŠธ *๊ธ€์ž ๊ธฐ์šธ์ด๊ธฐ* **๊ตต์€ ๊ธ€์”จ** ~~์ทจ์†Œ ์„ ~~ ์ˆ˜ํ‰์„  ---
new ๋ฐ์ดํ„ฐํ†ต์‹ 
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๋ฉ”์‹œ์ง€(ํŒจํ‚ท, ํ”„๋ ˆ์ž„), ๊ณ„์ธต OSI 7 Model Physical Data Link Network Transport Session Presentation Application TCP/IP ๊ณ„์ธต ๊ณ„์ธต ์ด๋ฆ„ ๋ฉ”์‹œ์ง€ ํ˜•ํƒœ ๋‚ด์šฉ 1 Phisical Bits Bits 2 Data Link Ethernet Frame Ethernet ์ฃผ์†Œ 3 Network IP packet, Datagram IP ์ฃผ์†Œ 4 Transport TCP Segment, UDP Datagram Port ๋ฒˆํ˜ธ 5 Application HTTP ๋ฉ”์‹œ์ง€, Email ๋ฉ”์‹œ์ง€ URL, Email ์ฃผ์†Œ Protocol Suite HTTP - TCP - IP - ARP ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ - ์‚ฌ์ธ ํ•จ์ˆ˜ $$ y(t) = A sin(2\pi ft + \varphi) $$ A = ํฌ๊ธฐ(amplitude) f = ์ฃผํŒŒ์ˆ˜(frequency) $\varphi$ = ์œ„์ƒ(phase) ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ - ์šฉ์–ด ์ฃผ๊ธฐ(Period) : ์‹ ํ˜ธ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ์‹œ๊ฐ„ ์ฃผํŒŒ์ˆ˜ (Frequency) : ์‹œ๊ฐ„๋‹น ๋ฐ˜๋ณต๋˜๋Š” ์‹ ํ˜ธ ๊ฐœ์ˆ˜ ๋Œ€์—ญํญ (Bandwidth) : ์•„๋‚ ๋กœ๊ทธ -> ์ฃผํŒŒ์ˆ˜ ๋ฒ”์œ„ (Hz), ๋””์ง€ํ„ธ -> ๋น„ํŠธ ์ „์†ก๋ฅ (bps) ๊ด€๋ จ ํ•จ์ˆ˜ 1# start์—์„œ end๊นŒ์ง€ step ์ฆ๊ฐ€ 2numpy.arange(start, stop, step) 3# start์—์„œ end๊นŒ์ง€ step๊ฐœ๋กœ ๋‚˜๋ˆ” 4numpy.linspace(start, stop, step) Analog -> Digital PCM (Pulse-code modulation, ํŽ„์Šค ๋ถ€ํ˜ธ ๋ณ€์กฐ) ์•„๋‚ ๋กœ๊ทธ ์‹ ํ˜ธ์˜ ๋””์ง€ํ„ธ ํ‘œํ˜„, ๋””์ง€ํ„ธ ๋น„๋””์˜ค์˜ ํ‘œ์ค€ ๊ณผ์ • : Sampling(ํ‘œ๋ณธํ™”), Quantization(์–‘์žํ™”), Encoding(๋ถ€ํ˜ธํ™”) Nyquist sampling theorem ์‹ ํ˜ธ์— ํฌํ•จ๋œ ๊ฐ€์žฅ ๋†’์€ ์ง„๋™์ˆ˜์˜ 2๋ฐฐ์— ํ•ด๋‹นํ•˜๋Š” ๋นˆ๋„๋กœ ์ผ์ •ํ•˜๊ฒŒ ์ƒ˜ํ”Œ๋งํ•˜๋ฉด ์›๋ž˜์˜ ์‹ ํ˜ธ๋กœ ๋ณต์›ํ•  ์ˆ˜ ์žˆ๋‹ค. Nyquist bit rate - ๋ฌด์žก์Œ ์ฑ„๋„ $$ Bit Rate = 2 \times bandwidth \times log_2(L)$$ bandwidth : ๋Œ€์—ญํญ L : ์‹ ํ˜ธ ๋ ˆ๋ฒจ Bit rate : ์ดˆ๋‹น๋น„ํŠธ์ˆ˜ ์„€๋„Œ ์šฉ๋Ÿ‰ (Shannon Capacity) - ์žก์Œ์ฑ„๋„ $$ Capacity = bandwidth \times log_2(1+SNR) $$ SNR์€ ์‹ ํ˜ธ์— ๋Œ€ํ•œ ์žก์Œ ๋น„์œจ Capacity : ์ฑ„๋„ ์šฉ๋Ÿ‰ (bps) SNR์ด ๋ฐ์‹œ๋ฒจ(dB)๋กœ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ $$ SNR = 10^{\frac{SNR(dB)}{10}} $$ Digital -> Analog ASK (Amplitude Shift Keying) ๋””์ง€ํ„ธ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ ํ˜ธ ํฌ๊ธฐ๋กœ ์ „์†ก FSK (Frequency Shift Keying) ๋””์ง€ํ„ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผํŒŒ์ˆ˜๋กœ ์ „์†ก PSK (Phase Shift Keying) ๋””์ง€ํ„ธ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„์ƒ์œผ๋กœ ์ „์†ก QAM (Quadrature Amplitude Modulation) ๋””์ง€ํ„ธ ๋ฐ์ดํ„ฐ๋ฅผ ํฌ๊ธฐ์™€ ๊ฐ๋„๋กœ ์ „์†ก Fourier Transfer ์‹œ๊ฐ„์ด๋‚˜ ๊ณต๊ฐ„์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋ฅผ ์ฃผํŒŒ์ˆ˜ ์„ฑ๋ถ„์œผ๋กœ ๋ถ„ํ•ดํ•˜๋Š” ๋ณ€ํ™˜ Reed-Solomon(RS) Code n = k(์›๋ž˜ ๋ฐ์ดํ„ฐ) + n-k(์˜ค๋ฅ˜ ์ •์ • ์ฝ”๋“œ) (n-k)/2 = t, t๊ฐœ ์ดํ•˜ symbol ์˜ค๋ฅ˜ ์ •์ • ๊ฐ€๋Šฅ Line coding Unipolar NRZ (Non return to Zero) 0 or 1 Polar NRZ-L -1 or 1 Polar NRZ-I -1 or 1, 1์ด ๋‚˜์˜ค๋ฉด transition RZ (Return to Zero) 0 or 5 Manchester ์‹ ํ˜ธ ๋ณ€ํ™” -> ์‹ ํ˜ธ์˜ ๋™๊ธฐํ™” Differential Manchester Manchester ๋ฐ˜๋Œ€ Cable ์ „์†ก ๋งค์ฒด (Transmission media) Guided(wired) Twisted-pair cable Coaxial cable Fiber-optic cable Unguided(wireless) Radio wave Microwave Infrared Ethernet cable (์ด๋”๋„ท ์ผ€์ด๋ธ”) Twisted-pair cable์˜ ํ•œ ์ข…๋ฅ˜ ์‹ฌ์„ ์„ ๊ผฌ์•„๋†“๋Š” ์ด์œ  : ๋…ธ์ด์ฆˆ ๋ฐฉ์ง€ ์ด๋”๋„ท ์ „์†ก ํ”„๋กœํ† ์ฝœ์˜ ๋งค์ฒด ์ ‘๊ทผ ๋ฐฉ์‹ = CSMA/CD ์ „ํ™”์„ , ์ด๋”๋„ท์— ํ™œ์šฉ Coaxial Cable (๋™์ถ• ์ผ€์ด๋ธ”) TV, ์ด๋”๋„ท์— ํ™œ์šฉ ๋‚ด๋ถ€์˜ ๋‹จ์ผ ๊ตฌ๋ฆฌ์„ , ์™ธ๋ถ€ ๋„์ฒด๋กœ ๊ตฌ์„ฑ ๊ณ ์ฃผํŒŒ์˜ ์‹ ํ˜ธ๋ฅผ ๋ฉ€๋ฆฌ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค Fiber-optic cable (๊ด‘ ์ผ€์ด๋ธ”) ๋ชจ๋“œ ๊ตฌ๋ถ„ Single mode, Multi mode > Step index, Graded index Single mode : ๋น ๋ฅด๊ณ , ๋ฉ€๋ฆฌ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. Multi mode : ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋กœ ์ „๋‹ฌ, ๊ฐ€๊ฒฉ์ด ์‹ธ๊ณ  ์ทจ๊ธ‰์ด ์šฉ์ดํ•˜๋‹ค ๋ฌด์„  ํ†ต์‹  ๊ธฐ์ˆ  ์ „ํŒŒ : CDMA, LTE, 5G, Bluetooth, Wifi, Zigbee(์ง๋น„, ์ €๊ฐ€ ์ €์ „๋ ฅ ๋„คํŠธ์›Œํฌ์˜ ํ‘œ์ค€) ๋น› : Li-fi ์†Œ๋ฆฌ : Pied-Piper ๋‹ค์ค‘ํ™” ๊ธฐ์ˆ  Multiplexing ์„  1๊ฐœ์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์‹ ํ˜ธ๋ฅผ ์ „์†กํ•˜๋Š” ๊ธฐ์ˆ  ์†ก์‹ ์ž -> ์‹ ํ˜ธ -> MUX -> 1 link, n channels -> DEMUX -> ์ˆ˜์‹ ์ž ์ข…๋ฅ˜ FDM, WDM, TDM FDM (์ฃผํŒŒ์ˆ˜๋ถ„ํ• ๋‹ค์ค‘ํ™”: Frequency-division multiplexing) ์•„๋‚ ๋กœ๊ทธ ๊ธฐ์ˆ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‹ ํ˜ธ๋ฅผ ๊ฐ๊ฐ์˜ ๋ฐ˜์†ก ์ฃผํŒŒ์ˆ˜์— ์‹ค์–ด๋ณด๋‚ด๋Š”(๋ณ€์กฐ) ๊ธฐ์ˆ  TDM(์‹œ๊ฐ„๋ถ„ํ• ๋‹ค์ค‘ํ™”) ๋””์ง€ํ„ธ ๊ธฐ์ˆ  ์‹œ๊ฐ„์„ ์ „์†ก ๋‹จ๋ง๊ธฐ์— ๋‚˜๋ˆ„์–ด ์ฃผ๋Š”๊ฒƒ ์ „์†ก ๋‹จ์œ„ input slot์˜ duration output slot์˜ duration output bit rate output frame rate = ์ดˆ๋‹น ํ”„๋ ˆ์ž„ ์ˆ˜ frame duration = 1 / frame rate ํ™œ์šฉ : T1, T3… T1 ๋‹ค์ค‘ํ™” 1.544 Mbps๋กœ ์Œ์„ฑ 24์ฑ„๋„ (์ „ํ™”ํšŒ์„ )์„ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๋‹ค์ค‘ํ™” ์ „์†ก Switching ํšŒ์„  ๊ตํ™˜๋ง (Circuit-switched Network) ํšŒ์„ ์˜ ์„ค์ •, ๋ฐ์ดํ„ฐ์˜ ์ด๋™, ํšŒ์„ ์˜ ๋‹จ์ ˆ 3๊ฐ€์ง€๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค ๊ณต๊ฐ„ ๋ถ„ํ•  ๋ฐฉ์‹, ์‹œ๋ถ„ํ•  ๋ฐฉ์‹ ์กด์žฌ ํšŒ์„ ์ด ๋‹จ์ ˆ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋…์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์ ์ด๋‹ค ์ง€์—ฐ์‹œ๊ฐ„์ด ์งง๋‹ค ํŒจํ‚ท ๊ตํ™˜๋ง (Packet-switched Network) ๊ณ ์ •๋œ ๊ฒฝ๋กœ๊ฐ€ ๋ฏธ๋ฆฌ ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค ๋ฐ์ดํ„ฐ๊ทธ๋žจ ๋ฐฉ์‹, ๊ฐ€์ƒ ํšŒ์„  ๋ฐฉ์‹ ์กด์žฌ ํšจ์œจ์ (ํšŒ์„  ๋‹ค์ค‘ํ™”)์ด๊ณ  ์‹ ๋ขฐ๋„๊ฐ€ ๋†’๋‹ค(์šฐํšŒ ๊ฐ€๋Šฅ) ๋Œ€๊ธฐ์ง€์—ฐ์‹œ๊ฐ„(ํ์ž‰) : ๊ตํ™˜๊ธฐ(๋ผ์šฐํ„ฐ)์—์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ํ›„ ๋ชฉ์ ์ง€ ์ฃผ์†Œ ๊ฒ€์ƒ‰ ํ†ต์‹ ์—์„œ 4๊ฐ€์ง€ ์ง€์—ฐ์‹œ๊ฐ„ : ์ „ํŒŒ์‹œ๊ฐ„, ์ „์†ก์‹œ๊ฐ„, ํ์ž‰์‹œ๊ฐ„, ์ฒ˜๋ฆฌ์‹œ๊ฐ„ ํŒจํ‚ท ๊ตํ™˜๊ธฐ (๋ผ์šฐํ„ฐ) web ๋˜๋Š” ssh๋กœ ์ ‘์† ๊ฐ€๋Šฅ ํŒจํ‚ท ๊ตํ™˜์˜ ํŠน์ง• ๋‹ค์ค‘ํ™”: ํŒจํ‚ท์„ ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋กœ ๊ฒฝ์œ  ์ฑ„๋„ : ๊ฐ€์ƒ ํšŒ์„  ํ˜น์€ ๋ฐ์ดํ„ฐ๊ทธ๋žจ ๊ตํ™˜ ์ฑ„๋„์„ ์‚ฌ์šฉ ๊ฒฝ๋กœ ์„ ํƒ : ํŒจํ‚ท๋งˆ๋‹ค ์ตœ์ ์˜ ๊ฒฝ๋กœ ์„ค์ • ์ˆœ์„œ ์ œ์–ด : ํŒจํ‚ท์˜ ์ˆœ์„œ๋ฅผ ์ •ํ•œ๋‹ค (์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ) ํŠธ๋ž˜ํ”ฝ ์ œ์–ด : ์ „์†ก ์†๋„ ๋ฐ ํ๋ฆ„์„ ์ œ์–ด ์—๋Ÿฌ ์ œ์–ด : ์—๋Ÿฌ๋ฅผ ํƒ์ง€ํ•˜๊ณ  ์žฌ์ „์†ก ๊ด€๋ จ ๋ช…๋ น์–ด 1# ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”, ์—ฐ๊ฒฐ๋œ ํฌํŠธ๋ฒˆํ˜ธ ํ™•์ธ 2netstat -rn 3# ํ™œ์„ฑํ™”๋œ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์„ธ๋ถ€์‚ฌํ•ญ ํ‘œ์‹œ 4ifconfig 5# NATํ…Œ์ด๋ธ”์—์„œ vn์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ฒด์ธ์— ๋Œ€ํ•œ ๊ทœ์น™ ์กฐํšŒ 6iptables -t nat -L -vn 7 8# Router view ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ˜ธ์ŠคํŠธ์— ์ ‘์† 9telnet route-views.routeviews.org 10# ํ˜„์žฌ ์žฅ๋น„์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํ•œ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์˜ ์š”์•ฝ ์ •๋ณด ์ถœ๋ ฅ 11show interface summary 12# BGP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ์žฅ๋น„์˜ ์š”์•ฝ ์ •๋ณด ์ถœ๋ ฅ 13show ip bgp summary 14# ์™ธ๊ตญ ๋ผ์šฐํ„ฐ์—์„œ ์ถฉ๋‚จ๋Œ€๊นŒ์ง€ ๊ฐ€๋Šฅํ•œ ๊ธธ 15show ip bgp 168.188.0.0/16 NAT (Network Address Translation : ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ ๋ณ€ํ™˜) IP ํŒจํ‚ท์—์žˆ๋Š” ์ถœ๋ฐœ์ง€ ๋ฐ ๋ชฉ์ ์ง€์˜ IP์ฃผ์†Œ์™€ TCP/UDP ํฌํŠธ ์ˆซ์ž ๋“ฑ์„ ๋ฐ”๊ฟ” ์žฌ๊ธฐ๋กํ•˜๋ฉด์„œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ฃผ๊ณ  ๋ฐ›๊ฒŒํ•˜๋Š” ๊ธฐ์ˆ  BGP (Border Gateway Protocol) ์„œ๋กœ ๋‹ค๋ฅธ ์กฐ์ง์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์šฐํŒ… ํ”„๋กœํ† ์ฝœ ํ†ต์‹  ์†๋„ ์ฒ˜๋ฆฌ์œจ (Throughput) A -> B๋กœ ์ „์†กํ•˜๋Š” ๋‹จ์œ„ ์‹œ๊ฐ„๋‹น ๋””์ง€ํ„ธ ์ „์†ก๋ฅ  1# ์„œ๋ฒ„ networks.cnu.ac.kr:8080 ์œผ๋กœ ์‹œํ—˜ ํŒจํ‚ท์„ ์ „์†ก 2iperf3 -c networks.cnu.ac.kr -p 8080 ๊ฐ์ข… ์ „์†ก ๋น„ํŠธ ์ „์†ก๋ฅ  ๊ณ„์‚ฐ (๊ฐ•์˜ ์ž๋ฃŒ ์ฐธ๊ณ ) ํ†ต์‹  ์ง€์—ฐ ์‹œ๊ฐ„ d(nodal) : nodal delay (์ „์ฒด ๋…ธ๋“œ ์ง€์—ฐ) d(nodal) = d(proc) + d(queue) + d(trans) + d(prop) d(proc) : nodal processing delay (๋…ธ๋“œ ์ฒ˜๋ฆฌ ์ง€์—ฐ) ํŒจํ‚ท ํ—ค๋”๋ฅผ ์กฐ์‚ฌํ•˜๊ณ  ๊ทธ ํŒจํ‚ท์„ ์–ด๋””๋กœ ๋ณด๋‚ผ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์‹œ๊ฐ„ d(queue) : queueing delay (ํ์ž‰ ์ง€์—ฐ) ํŒจํ‚ท์ด ํ์—์„œ ๋งํฌ๋กœ ์ „์†ก๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„ d(trans) : transmission delay (์ „์†ก ์ง€์—ฐ) ํŒจํ‚ท์˜ ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ๋งํฌ๋กœ ๋ฐ€์–ด๋‚ด๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„ d(prop) : propagation delay (์ „๋‹ฌ ์ง€์—ฐ/์ „ํŒŒ ์ง€์—ฐ) ๋น„ํŠธ๊ฐ€ ๋ผ์šฐํ„ฐ A ์ƒ์—์„œ์˜ ๋งํฌ์—์„œ ๋ผ์šฐํ„ฐ B๊นŒ์ง€์˜ ์ „ํŒŒ์— ํ•„์š”ํ•œ ์‹œ๊ฐ„ ํ…Œ์ŠคํŠธ ๋ช…๋ น์–ด 1ping www.google.com 2traceroute www.eurecom.fr Decibel, dB ์‹ ํ˜ธ ์„ธ๊ธฐ์˜ ์ธก์ • ๋‹จ์œ„ $$ L_b = 10log {B \over A} |dB| $$ ๋‘ ์‹ ํ˜ธ(A, B) ๊ฐ’์— ๋Œ€ํ•œ ์ƒ๋Œ€์  ํฌ๊ธฐ ์ฐจ์ด ์ „๋ ฅ, ๋ฌด์„ ์‹ ํ˜ธ ์‹ ํ˜ธ๋ฅผ ๋ฐฉํ•ดํ•˜๋Š” ์š”์†Œ ์•ฝํ™” (attenuation) ์™œ๊ณก (distortion) ์žก์Œ (noise) (SNR:Signal-to-noise ratio : ์‹ ํ˜ธ ๋Œ€ ์žก์Œ ๋น„์œจ) ์ง€ํ„ฐ ์ง€์—ฐ๊ฐ’์ด ๋‹ค์–‘ํ•˜๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ (๋“ค์ญ‰๋‚ ์ญ‰) ๋ฐ์ดํ„ฐ ๋งํฌ ๊ณ„์ธต ๋ฐ์ดํ„ฐ ๋งํฌ ๊ณ„์ธต ๋ฌผ๋ฆฌ ๊ณ„์ธต์„ ์ด์šฉํ•˜์—ฌ ์ „์†ก ์žฅ๋น„ : ๋ธŒ๋ฆฌ์ง€, L2 switch(ethernet address) ์„œ๋ธŒ ๊ณ„์ธต 2๊ฐœ ๋…ผ๋ฆฌ์  ๋งํฌ ์ œ์–ด ๋งค์ฒด ์ ‘๊ทผ ์ œ์–ด Mac Address Network interface card(NIC) identifier ๋Œ€๋ถ€๋ถ„ ๊ณ ์ •, ์ผ๋ถ€๋Š” ๊ฐ€๋ณ€ 48๋น„ํŠธ 6๋ฐ”์ดํŠธ (MAC-48) IP Address IPv4 : 32bit (4bytes) IPv6 : 128bit (16bytes) Class ๊ตฌ๋ถ„ ์‹œ์ž‘(2์ง„์ˆ˜) ์‹œ์ž‘ (10์ง„์ˆ˜) ๊ตฌ์„ฑ host ๋ฒ”์œ„ A 0 1~126 network 7, host 24 $2^7-1$ B 10 128.0~191.255 network 14, host 16 $2^{14}$ C 110 192.0.0~223.255.255 network 21, host 8 $2^ {22}$ ์˜ˆ) 192.168.1.132, subnet mask = 255.255.255.192 ํ•ด๋‹น ์ฃผ์†Œ 192.168.1.128 (132 & 192) ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ์™€, ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ œ์™ธํ•œ ํ˜ธ์ŠคํŠธ ๊ฐœ์ˆ˜ $2^6-2 = 62๊ฐœ$ CIDR (Classless Inter-Domain Routing) ์˜ˆ) 143.7.65.203/24 ์ฃผ์†Œ ๊ณต๊ฐ„ ์•ž์—์„œ 24๋น„ํŠธ ๋นผ๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅ : 143.7.65.0 ~ 143.7.65.255 ์„œ๋ธŒ๋„ท ๋งˆ์Šคํฌ ์•ž 24์ž๋ฆฌ๊ฐ€ 1์ด๋‹ค : 255.255.255.0 ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ์ฃผ์†Œ ์ฃผ์†Œ๊ณต๊ฐ„์˜ ๋งˆ์ง€๋ง‰ ์ฃผ์†Œ : 143.7.65.255 ARP, PPP ARP (Address Resolution Protocol) IP ์ฃผ์†Œ (๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ฃผ์†Œ) -> MAC ์ฃผ์†Œ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” L2 ํ”„๋กœํ† ์ฝœ Reverse ARP : MAC ์ฃผ์†Œ -> IP ์ฃผ์†Œ Gratuitous ARP : ์ž์‹ ์˜ IP ์ฃผ์†Œ๋ฅผ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ARP ํ…Œ์ด๋ธ” IP ์ฃผ์†Œ, MAC ์ฃผ์†Œ, TTL(Time To Live) TTL : ARP ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ์ฃผ์†Œ์˜ ์œ ํšจ๊ธฐ๊ฐ„ ARP ํ…Œ์ด๋ธ”์— ์—†๋Š” ๊ฒฝ์šฐ, ARP Request๋ฅผ ๋ณด๋‚ธ๋‹ค Proxy ARP : ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ์˜ ํ˜ธ์ŠคํŠธ์˜ IP ์ฃผ์†Œ๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋ผ์šฐํ„ฐ (์ฃผ๋กœ ๊ณต์œ ๊ธฐ) ARP Spoofing : ARP ํ…Œ์ด๋ธ”์„ ์œ„์กฐํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• PPP (Point-to-Point Protocol) ์ปดํ“จํ„ฐ/๋ผ์šฐํ„ฐ ๊ฐ„ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•œ L2 ํ”„๋กœํ† ์ฝœ PPP ๊ธฐ๋Šฅ : ์ธ์ฆ, ์ „์†ก, ์•”ํ˜ธํ™”, ๋ฐ์ดํ„ฐ ์••์ถ• ์„ธ๋ถ€ ํ”„๋กœํ† ์ฝœ : LCP, NCP NCP (Network Control Protocol) IP, IPX, AppleTalk ๋“ฑ์˜ ํ”„๋กœํ† ์ฝœ์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ PPP ํ”„๋ ˆ์ž„์˜ ํ”„๋กœํ† ์ฝœ ํ•„๋“œ์— ์‚ฌ์šฉ๋จ PPTP (Point-to-Point Tunneling Protocol) PPP๋ฅผ ์ด์šฉํ•œ VPN (Virtual Private Network) ๊ตฌํ˜„ ํ”„๋กœํ† ์ฝœ Tunneling packets : ํŒจํ‚ท ์•ˆ์— ํŒจํ‚ท์„ ๋„ฃ์–ด์„œ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ณต์œ ๊ธฐ์˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜ NAT, ๊ณต์œ ๊ธฐ ๊ณต์œ ๊ธฐ (Network Address Translator) IP ์ฃผ์†Œ ๋ณ€ํ™˜ : public IP <-> private IP NAT๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์„ค IP ์ฃผ์†Œ RFC1918 name CIDR Host size Mask bits Classful description 24-bit block 10.0.0.0/8 24 bits 8 bits single class A network 20-bit block 172.16.0.0/12 20 bits 12 bits 16 contiguous class B networks 16-bit block 192.168.0.0/16 16 bits 16 bits 256 contiguous class C networks ์ฃผ์†Œ๋ฒˆ์—ญ IP์ฃผ์†Œ, Port๋ฒˆํ˜ธ ๋‘˜๋‹ค ๋ณ€ํ•œ๋‹ค NAT์˜ ์‚ฌ์šฉ : IP ๊ณต์œ ๊ธฐ, ํ…Œ๋”๋ง, Docker, VirtualBox, ์ด๋™ํ†ต์‹ ๋ง, Cloud ๊ณต์œ ๊ธฐ = ํ”„๋กœํ† ์ฝœ์˜ ์ง‘ํ•ฉ DNS Server (L7) IP Router + NAT + DHCP (L3) Bridge, Ethernet Switch, Ethernet, Wifi (L2) Modem (L1) ๋น„ํŠธ์˜ค๋ฅ˜ ํƒ์ง€ ๋ฐ ์ˆ˜์ • ์šฉ์–ด ๋ฐ์ดํ„ฐ ์›Œ๋“œ : ์›๋ž˜ ๋ฐ์ดํ„ฐ k bits ์ฝ”๋“œ์›Œ๋“œ : ๋ฐ์ดํ„ฐ ์›Œ๋“œ + r bits์˜ ์˜ค๋ฅ˜ํƒ์ง€ ์ฝ”๋“œ ๋น„์‹ ๋ขฐ์„ฑ ์ฑ„๋„ (์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ ๊ฐ€๋Šฅ) ์ด๋ผ๊ณ  ๊ฐ€์ • ํ•ด๋ฐ ๊ฑฐ๋ฆฌ (Hamming distance) : ๋‘ ์ฝ”๋“œ์›Œ๋“œ์˜ ๋น„ํŠธ๊ฐ€ ๋‹ค๋ฅธ ๊ฐœ์ˆ˜ ์ตœ์†Œ ํ•ด๋ฐ ๊ฑฐ๋ฆฌ : ์ฝ”๋“œ์›Œ๋“œ ๊ฐ„์˜ ์ตœ์†Œ ํ•ด๋ฐ ๊ฑฐ๋ฆฌ ์ฝ”๋“œ์›Œ๋“œ ๋น„ํŠธ ์—๋Ÿฌ ํƒ์ง€ s๊ฐœ์˜ ์˜ค๋ฅ˜๋ฅผ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. $$ d_{min} = s + 1$$ t๊ฐœ์˜ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. $$ d_{min} = 2t + 1$$ ์˜ค๋ฅ˜๋ฅผ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• Parity bit Even or Odd, ์˜ค๋ฅ˜ ํƒ์ง€ ๋Šฅ๋ ฅ CRC (Cyclic Redundancy Check) ๋ฐ์ดํ„ฐ ์›Œ๋“œ๋ฅผ x๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ฝ”๋“œ์›Œ๋“œ์— ์ถ”๊ฐ€ Checksum ๋ฐ์ดํ„ฐ ์›Œ๋“œ์˜ ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ๋”ํ•œ ๊ฐ’์˜ ๋ณด์ˆ˜๋ฅผ ์ฝ”๋“œ์›Œ๋“œ์— ์ถ”๊ฐ€ ์“ฐ์ด๋Š” ๊ณณ : IPํ—ค๋”, UDP ํ—ค๋”, TCPํ—ค๋” ์˜ค๋ฅ˜๋ฅผ ํƒ์ง€ ๋น› ๋ณต๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ• FEC Reed Solomon Code (n-k)/2 = t๊ฐœ ์ดํ•˜ symbol ์˜ค๋ฅ˜ ์ •์ • ๊ฐ€๋Šฅ (k๋Š” ๋ฐ์ดํ„ฐ์›Œ๋“œ ๊ธธ์ด, n์€ ์ฝ”๋“œ ์›Œ๋“œ ๊ธธ์ด) ์˜ค๋ฅ˜์ œ์–ด : ์žฌ์ „์†ก Stop-and-Wait ARQ ์ „์†ก ํ›„, ACK๋ฅผ ๋ฐ›์•„์•ผ ๋‹ค์Œ ํŒจํ‚ท์„ ์ „์†ก Go-Back-N ARQ N๊ฐœ์˜ ํŒจํ‚ท์„ ์ „์†กํ•˜๊ณ , ACK๋ฅผ ๋ฐ›์œผ๋ฉด ๋‹ค์Œ N๊ฐœ๋ฅผ ์ „์†ก ํŒจํ‚ท 1,2,3,4,5 ์ค‘ 3์ด ๋ถ„์‹ค๋˜๋ฉด 4,5์— ๋Œ€ํ•œ ACK๋„ 2 -> ์ˆœ์„œ๊ฐ€ ํ‹€๋ฆฌ๋ฉด ๋’ค์˜ ๊ฒƒ์€ ๋‹ค ๋ฒ„๋ฆฐ๋‹ค -> ๋น„ํšจ์œจ์  ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ : ACK๊ฐ€ ๋ชจ๋‘ ๋ถ„์‹ค๋˜๋Š” ๊ฒฝ์šฐ Selective Repeat ARQ ํŒจํ‚ท 1,2,3,4,5 ์ค‘ 3์ด ๋ถ„์‹ค๋˜๋ฉด 4,5์— ๋Œ€ํ•œ ACK๋Š” ๊ฐ๊ฐ 4, 5 -> ์ˆœ์„œ๊ฐ€ ํ‹€๋ ค๋„ ๋’ค์˜ ๊ฒƒ์€ ๋ฒ„ํผ์— ์ €์žฅ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ : ACK๊ฐ€ ๋ชจ๋‘ ๋ถ„์‹ค๋˜๋Š” ๊ฒฝ์šฐ ์œˆ๋„์šฐ ํฌ๊ธฐ ARQ ์†ก์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ ์ˆ˜์‹ ์ž SW 0 or 1 1 GN $2^m-1$ 1 SR $2^{m-1}$ $2^{m-1}$ RTT (Round Trip Time) $$ U_{sender} = {L/R \over RTT+L/R} $$ ์ด๋”๋„ท๊ณผ ๋žœ ์ด๋”๋„ท ์ตœ์†Œํฌ๊ธฐ : 64bytes ๋น„ํŠธ ์ „ํŒŒ ์†๋„ : 2.8$\mu$s ์ „์†ก ์ง€์—ฐ์‹œ๊ฐ„ : 64byte / 10Mbps = 51.2$\mu$s ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ : 2*10^8m/s * 51.2/2 = 5.12km 2500m ์ด๋‚ด์˜ ์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜๊ธฐ์œ„ํ•ด์„œ 64byte๋กœ ์„ค๊ณ„ (2๋ฐฐ ๋ฒ„ํผ) Mac์ฃผ์†Œ 6byte (48bit) ํ‘œ์ค€ ์ด๋”๋„ท MAC IEEE 802.3 (CSMA/CD) 1-persistent : ์‹ ํ˜ธ ๊ฐ์ง€ ํ”„๋กœํ† ์ฝœ ์ „ํŒŒ์ง€์—ฐ = ์ „์†ก๊ฑฐ๋ฆฌ / ์ „ํŒŒ์†๋„ ์ „์†ก์ง€์—ฐ = ํŒจํ‚ทํฌ๊ธฐ / ๋Œ€์—ญํญ a = ์ „ํŒŒ์ง€์—ฐ / ์ „์†ก์ง€์—ฐ Efficiency $$ 1 \over (1 + 6.4 \times a) $$ ํ˜„๋Œ€ ์ด๋”๋„ท ์Šค์œ„์น˜, ์ด๋”๋„ท : ์ถฉ๋ŒX, CSMA/CD -> CSMA/CA ๊ฐ€์ƒ ๋žœ ์—๋Ÿฌ์ œ์–ด : GE : FEC, 10GE : ITU G.975 Reed Solomon Code, ์žฌ์ „์†กX Virtual LAN (VLAN) ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋–จ์–ด์ง„ LAN์„ ๊ฐ™์€ LAN์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ์ˆ  VirtualBox, Docker์—์„œ ํ™œ์šฉ LAN์—์„œ์˜ ์‚ฌ์ดํด ๋ฌธ์ œ ์ด๋”๋„ท์€ TTLํ•„๋“œ๊ฐ€ ์—†์Œ -> ๋ฃจํ”„ ๋ฐœ์ƒ์‹œ ํŠธ๋ž˜ํ”ฝ์ด ํญ์ฃผ Spanning Tree Protocol (STP) ์‚ฌ์šฉ MAC - CSMA/CD (IEEE 802.3) ๋งค์ฒด์ ‘๊ทผ์ œ์–ด ๊ธฐ์ˆ  ์—ฌ๋Ÿฌ ์†ก์‹ ์ž - ์—ฌ๋Ÿฌ ์ˆ˜์‹ ์ž์—์„œ ๊ณต์œ  ๋งค์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ  Aloha ๊ทธ๋ƒฅ ๋ณด๋‚ธ๋‹ค -> ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ์žฌ์ „์†ก Slotter aloha : ์Šฌ๋กฏ์„ ๋‚˜๋ˆ ์„œ ๋ณด๋‚ธ๋‹ค ์ดํ›„์— ์ด๋”๋„ท์œผ๋กœ ๋ฐœ์ „ํ•˜๋Š”๋ฐ ๊ธฐ์—ฌ G = ํ”„๋ ˆ์ž„ 1๊ฐœ ์ „์†กํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ (ms) slotted aloha์˜ ์ฒ˜๋ฆฌ์œจ $$ S = G \times e^{-G} $$ aloha์˜ ์ฒ˜๋ฆฌ์œจ $$ S = G \times e^{-2G} $$ CSMA/CD (Carrier Sense Multiple Access with Collision Detection) ์ „์†ก ํ”„๋ ˆ์ž„ ์ค€๋น„ ๋งค์ฒด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ• ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ (carrier sensing) ์ „์†ก ์‹œ์ž‘ (multiple access) ์ถฉ๋Œ์ด ์ผ์–ด๋‚ฌ๋‹ค๋ฉด ์ถฉ๋Œ ํƒ์ง€ ์ ˆ์ฐจ๋กœ ์ด๋™ (collision detection ์žฌ์ „์†ก ์นด์šดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ํ”„๋ ˆ์ž„ ์ „์†ก ์ข…๋ฃŒ ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ์žผ ์‹ ํ˜ธ๋ฅผ ๋ชจ๋‘์—๊ฒŒ ์ „๋‹ฌ๋˜๋„๋ก ์ตœ์†Œ ํŒจํ‚ท ์ „์†ก ์‹œ๊ฐ„๊นŒ์ง€ ๊ณ„์† ์ „์†ก ์žฌ์ „์†ก ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค ์ž„์˜์˜ ์‹œ๊ฐ„ ๋™์•ˆ ๋Œ€๊ธฐ (backoff) (์ถฉ๋Œํ• ๋•Œ๋งˆ๋‹ค 2๋ฐฐ์”ฉ ์ฆ๊ฐ€) ํ˜„๋Œ€์˜ Ethernet ์Šค์œ„์น˜(์‹ ํ˜ธ๊ฐ€ ์ง€๋‚˜๋Š” ๊ธธ์„ ๋‚˜๋ˆˆ๋‹ค) ํ™˜๊ฒฝ : ์ถฉ๋ŒX Full Duplex CSMA/CD ์‚ฌ์šฉ X Carrier Sensing Nonpersistent : ๋งค์ฒด๊ฐ€ ์‚ฌ์šฉ์ค‘์ด๋ฉด, ์ž„์˜์˜ ์‹œ๊ฐ„ ํ›„ ๋‹ค์‹œ ์„ผ์‹ฑ, ์‚ฌ์šฉ์ค‘์ด์ง€ ์•Š์œผ๋ฉด ๋ฐ”๋กœ ์ „์†ก Persistent : ์„ผ์‹ฑ์„ ์ง€์†์ ์œผ๋กœ, ๋†€๊ณ ์žˆ์–ด๋„ ๋ฐ”๋กœ ์ „์†กํ•˜์ง€ ์•Š๋Š”๋‹ค p-persistent : pํ™•๋ฅ ๋กœ ๋ณด๋‚ด๊ธฐ (1-persistent : ๋ฐ”๋กœ ๋ณด๋‚ด๊ธฐ) CSMA/CA CSMA/CD -> ๋ฌด์„ ์—์„œ๋Š” ์ ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค ๋™์‹œ ์†ก์ˆ˜์‹ ์€ ๋งŽ์€ ์—๋„ˆ์ง€๋ฅผ ์†Œ๋ชจ Hidden station problem ๋ฐœ์ƒ ๊ฐ€๋Šฅ (๋ฌด์„ ์—์„œ๋งŒ ๋ฐœ์ƒ) ์‹ ํ˜ธ ๊ฐ์‡„ -> ์ถฉ๋Œ ๊ฐ์ง€๊ฐ€ ์–ด๋ ค์›€ CSMA/CA (Carrier Sense Multiple Access with Collision Avoidance) Idle ์ƒํƒœ์—์„œ IFS(Inter Frame Space)๋งŒํผ ๋Œ€๊ธฐ IFS ๊ธฐ๋‹ค๋ฆฐ ๋’ค์—๋„ idle ์ƒํƒœ๋ผ๋ฉด Contention Window ๋‚ด slot time๋งŒํผ ๋Œ€๊ธฐ RTS/CTS ๋„์ž… (ํ˜„์žฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋„ ๋˜๋Š”์ง€ ํ™•์ธ) -> Hidden station problem ํ•ด๊ฒฐ NAV (Network Allocation Vector) ๋งค์ฒด๋ฅผ ์–ผ๋งˆ๋‚˜ ์‚ฌ์šฉํ• ์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฐ’ -> ์ถฉ๋ŒํšŒํ”ผ๋ฅผ ๋•๋Š”๋‹ค Exposed Station Problem ๋‹ค๋ฅธ ๋…ธ๋“œ ์Œ์˜ ์ „์†ก์œผ๋กœ ์ธํ•ด ์ „์†ก์„ ํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ Wifi Wifi IEEE 802.11 ํ‘œ์ค€์— ๊ทผ๊ฑฐํ•œ Wireless LAN AlohaNet -> Ethernet -> Wifi ๊ตฌ์„ฑ๋ฐฉ๋ฒ• AP (Access Point) ์ด์šฉ Ad-hoc (Peer-to-Peer) ๋ฐฉ์‹ ์ธ์ฆ ๋ฐฉ์‹ : WPA, WPA2, EAP MAC ๊ธฐ์ˆ  : CSMA/CA, RTS/CTS, NAV ํ”„๋ ˆ์ž„ : IEEE 802.11 IEEE 802.11 ํ”„๋ ˆ์ž„ FC D Addr1 Addr2 Addr3 SC Addr4 Frame body CRC FC (Frame Control) Protocol version Type Subtype To DS From DS More frag Retry Pwr mgt More Data WEP Rsvd Subtype : 1011 (RTS), 1100 (CTS), 1101 (ACK) AP๊ฐ€ ๊ฐœ์ž…๋˜๋Š” ํ™˜๊ฒฝ ๋“ฑ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์„ ๊ณ ๋ ค -> ์ฃผ์†Œ ํ•„๋“œ๊ฐ€ 4๊ฐœ Wifi ์‘์šฉ ๊ธฐ์ˆ  MIMO (Multiple Input Multiple Output) : ์•ˆํ…Œ๋‚˜ ๊ฐœ์ˆ˜ ์ฆ๊ฐ€ -> ์„ฑ๋Šฅ ์ฆ๊ฐ€ ์ „ํ™”๋ง, ์ผ€์ด๋ธ”๋ง, ๊ด‘ํ…Œ์›Œํฌ ์ „ํ™”๋ง SS7(Signaling System 7) ์ „ํ™”๋ง์˜ ์ œ์–ด๋ฅผ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ DSL ์ „ํ™”๋งํฌ ์ด์šฉํ•œ ๊ณ ์† ํ†ต์‹  ๊ธฐ์ˆ  ์ผ€์ด๋ธ”๋ง HFC ๊ด‘์ผ€์ด๋ธ” + ๋™์ถ•์ผ€์ด๋ธ” ๊ด‘๋„คํŠธ์›Œํฌ SONET (Synchronous Optical Network) ๊ด‘์ผ€์ด๋ธ”์„ ์ด์šฉํ•œ ๋„คํŠธ์›Œํฌ ATM (Asynchronous Transfer Mode) ๊ฐ€์ƒํšŒ์„  ์ด์šฉ ๋น„๋™๊ธฐ ํ†ต์‹  ๊ธฐ์ˆ  : ํšŒ์„  + ํŒจํ‚ท ๊ตํ™˜๋ง ๊ธฐ์ˆ  ํŒจํ‚ท(์…€) : ๊ณ ์ • 53Byte ์ด๋™ํ†ต์‹  ๋ธ”๋ฃจํˆฌ์Šค 2.4Ghz ๋ฌด์„  ์ฑ„๋„ ์‚ฌ์šฉ FHSS RTLS (Real Time Location System) : ์‹ค์‹œ๊ฐ„ ์œ„์น˜ ์ถ”์  ์‹œ์Šคํ…œ Zigbee ์†Œํ˜•, ์ €์ „๋ ฅ ๋ฌด์„  ๋„คํŠธ์›Œํฌ๋ฅผ ์œ„ํ•œ ๊ธฐ์ˆ  ์ด๋™ํ†ต์‹ ๋ง ์ฝ”์–ด๋„คํŠธ์›Œํฌ + ์•ก์„ธ์Šค ๋„คํŠธ์›Œํฌ 3G ๋„คํŠธ์›Œํฌ GGSN (Gateway GPRS Support Node) GPRS ๋„คํŠธ์›Œํฌ์™€ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ผ์šฐํ„ฐ
new Spring Boot Framework - KAKAO ๊น€๊ฐ€์—ฐ ์„ ๋ฐฐ๋‹˜
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
REST API REprensentational State Transfer ์›น์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜ Layered Architecture Presentation Layer ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ๋ถ„๋ฆฌ @Controller๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๊ฐ€ ์ด์— ํ•ด๋‹น Service Layer ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„ @Service๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๊ฐ€ ์ด์— ํ•ด๋‹น Data Access Layer ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ, ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ @Repository๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๊ฐ€ ์ด์— ํ•ด๋‹น IoC Inversion of Control : ์ œ์–ด์˜ ์—ญ์ „ ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์ด ๋ฐ”๋€Œ์—ˆ์Œ์„ ์˜๋ฏธ ๊ฐ์ฒด์˜ ์ฃผ์ธ์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ Spring application DI Constructor Injection @RequiredArgsConstructor : ์ƒ์„ฑ์ž ์ž๋™ ์ƒ์„ฑ Method Injection @Autowired : ์ง€์–‘ํ•  ๊ฒƒ Setter Injection @Setter Was Web Application Server ์›น ์ปจํ…Œ์ด๋„ˆ ํ˜น์€ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ์† ์š”์ฒญ ๋ณ„๋กœ thread๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ Tomcat, JBoss ๋“ฑ Dispatcher Servlet Servlet Container์—์„œ HTTP ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต์˜ ์ œ์ผ ์•ž์— ๋‘ฌ์„œ ์ค‘์•™์ง‘์ค‘์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ„๋‹จํžˆ ์„œ๋น„์Šค ๋ฐฐํฌํ•˜๊ธฐ Tasks > build > bootJar์„ ํ†ตํ•ด jarํŒŒ์ผ ์ƒ์„ฑ ๋ฐฐํฌํ•  ์„œ๋ฒ„์—์„œ java -jar project-0.0.1-SNAPSHOT.jar
new JS - Arguments object ๊ด€๋ จ ์ด์Šˆ
๐ŸŒ Javascript
์ƒํ™ฉ ๋‚˜์˜ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ์™€ Google Analytics๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด tag๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ์ž‘์—… ์ค‘ ์ด์—ˆ๋‹ค. ๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•˜๋Š” ํƒœ๊ทธ ์†Œ์Šค ์ค‘ ์ผ๋ถ€์ด๋‹ค. 1function gtag() { 2 dataLayer.push(arguments); 3} ๋‚˜๋Š” function ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๊ฒŒ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์•„. ์•„๋ž˜์™€ ๊ฐ™์ด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ์–ด ์ž‘์—…ํ•˜์˜€๋‹ค. 1const gtag = (...args) => { 2 dataLayer.push(args); 3}; ํ•˜์ง€๋งŒ ๋‚ด ์ฝ”๋“œ๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๊ณ  ๊ตฌ๊ธ€์˜ ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•ด์•ผ๋งŒ google analytics๊ฐ€ ๋™์ž‘ํ•˜์˜€๋‹ค. ์ด์œ ๋Š” ๋‘ ๋ฐฉ์‹์˜ ์ฐจ์ด์ ์— ์žˆ์—ˆ๋Š”๋ฐ, ์–ด๋–ค ์ ์ด ๋‹ค๋ฅธ๊ฑด์ง€ ์•Œ์•„๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค. Arguments object Arguments ๊ฐ์ฒด๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ์œ ์‚ฌ Array ํ˜•ํƒœ์ด๋‹ค. ํ•จ์ˆ˜ parameter์— ์–ด๋–ป๊ฒŒ ๋ช…์‹œ๋˜์–ด์žˆ๊ฑด ์ƒ๊ด€์—†์ด ๋™์ž‘ํ•œ๋‹ค. 1function func1(a, b, c) { 2 console.log(arguments[0]); 3 console.log(arguments[1]); 4 console.log(arguments[2]); 5} arguments ๊ฐ์ฒด๋Š” 3๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํ•จ์ˆ˜์— ๋„˜๊ฒจ์ง„ ์ธ์ž (index๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค) length : ์ธ์ž์˜ ๊ฐœ์ˆ˜ callee : ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜์˜ ์ฐธ์กฐ๊ฐ’ Arrow function์—์„œ๋Š”? arrow function์—์„œ๋Š” arguments ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๋Œ€์‹  …args์™€ ๊ฐ™์€ ๋ฌธ๋ฒ•์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Arguments ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ์ง„์งœ Array๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. 1const func2 = (...args) => { 2 console.log(args[0]); 3}; ์ •๋ฆฌ Google analytics๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” dataLayer์— Arguments object๊ฐ€ push ๋˜์—ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ๋‚ด๊ฐ€ ์ž„์˜๋กœ ๋ฐ”๊พธ์–ด์„œ Array๊ฐ€ push ๋˜์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
new ์šด์˜์ฒด์ œ - ๊ธฐ๋ง๋ฒ”์œ„
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
06-File-Management Directory File Directory Directory๋„ ์ผ์ข…์˜ ํŒŒ์ผ์ด๋‹ค ํ•ด๋‹น ํŒŒ์ผ FCB์˜ ์‹๋ณ„์ž๋งŒ ์ €์žฅํ•œ๋‹ค inode (index node) Unix์—์„œ๋Š” FCB์™€ inode๊ฐ€ ๊ฐ™๋‹ค ๋ชจ๋“  ํŒŒ์ผ, ํด๋”๊ฐ€ Uniqueํ•œ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. (root๋Š” 2๋กœ ๊ณ ์ •) File Systems ํŒŒํ‹ฐ์…˜์˜ ๊ตฌ์กฐ boot block, super block, FCB list, data blocks Partition Control block (Super block) blocks ๊ฐœ์ˆ˜, free data blocks ๊ฐœ์ˆ˜, free data blocks list ์ €์žฅ inode table, free inode ๊ฐœ์ˆ˜, free inode list ์ €์žฅ File Control Block (FCB) UNIX์—์„œ 128byte์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„๋‹ค ํŒŒ์ผ ์ด๋ฆ„, ํŒŒ์ผ ํฌ๊ธฐ, uid, gid, ํŒŒ์ผ ์ฃผ์†Œ ๋“ฑ๋“ฑ ์ €์žฅ Management of Data Blocks Contiguous Allocation ๊ฐ๊ฐ์˜ ํŒŒ์ผ์„ ์—ฐ์†์ ์œผ๋กœ ์ €์žฅ Direct Access File grow problem ์กด์žฌ External fragmentation, Internal fragmentation ๋ฐœ์ƒ Chained Allocation Direct acess File grow problem X External fragmentation X Poor data safety (์•ž ๋ธ”๋ก์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋’ค ๋ธ”๋ก๋„ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ) Indexed Allocation (ํ˜„๋Œ€์— ์‚ฌ์šฉ) Direct access File grow problem X External fragmentation X Medium level data safety (index block๋งŒ ๊ดœ์ฐฎ์œผ๋ฉด ๋œ๋‹ค) Index block์ด ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•˜๋‹ค Free-Space Management Counting N-M… N๋ฒˆ๋ถ€ํ„ฐ M๊ฐœ์˜ ๋ธ”๋ก์ด ๋น„์–ด์žˆ๋‹ค. Linked List ๋น„์–ด์žˆ๋Š” ๋ธ”๋ก๋“ค์„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. Grouping ๋น„์–ด์žˆ๋Š” ๋ธ”๋ก๋“ค์„ ๊ทธ๋ฃน์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. Bit Vector ๋ชจ๋“  ๋ธ”๋ก๋“ค์„ ๋น„ํŠธ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. (0์ด๋ฉด ์‚ฌ์šฉ ์ค‘, 1์ด๋ฉด ๋น„์–ด์žˆ์Œ) ๋‹จ์  : ์šฉ๋Ÿ‰์„ ๋งŽ์ด ์ฐจ์ง€ํ•œ๋‹ค. File System Example (UNIX) Addresses of Data Blocks Index ๋ธ”๋ก ํ•˜๋‚˜๋Š” 4096 byte 4096 / 4 = 1024๊ฐœ์˜ ๋ธ”๋ก ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. 10๊ฐœ์˜ data blocks๋Š” inode๋‚ด(direct block field)์— ์ €์žฅํ•œ๋‹ค Data Block Addressing direct block 10๊ฐœ : 40KB (10 X 4 X 2^10 bytes) single indirect block 1๊ฐœ : 4MB (4KB X 2^10 = 2^22 bytes) double indirect block 1๊ฐœ : 4GB (4KB X 2^10 X 2^10 = 2^32 bytes) triple indirect block 1๊ฐœ : 4TB File System Example (Linux) Virtual File System ์ ์šฉ Linux Inode Inode์˜ ํฌ๊ธฐ : 128 bytes (ext2, ext3), 256 bytes (ext4) Direct block 12๊ฐœ, Indirect block 3๊ฐœ 07-IO-Management-Disk-Scheduling Kernel Modules for IO Management Kernel I/O Management Device Scheduling Error handling Buffering (copy semantics๋ฅผ ์œ ์ง€) Caching : ๋น ๋ฅธ ์†๋„๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ Spooling : ๋ณด์กฐ ๊ธฐ์–ต ์žฅ์น˜์— ์ž„์‹œ๋กœ ์ €์žฅ (์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ) Interrupt handling Interrupt ์ฃผ๋ณ€ ์žฅ์น˜ -> OS : ๋น„๋™๊ธฐ์  ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ์•Œ๋ฆผ IDT (Interrupt Descriptor Table = IVT) : ์ธํ„ฐ๋ŸฝํŠธ ๋ฒˆํ˜ธ์™€ ISR์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅ ISR (Interrupt Service Routine) : ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜ Interrupt ์ฒ˜๋ฆฌ ๊ณผ์ • Mode change IDT์—์„œ ISR์˜ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„์„œ ์‹คํ–‰ ISR์—์„œ ๊ธ‰ํ•œ ์ผ ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ, ํ•„์š”ํ•˜๋ฉด ๋ฏธ๋ฃฌ๋‹ค Scheduler๊ฐ€ ํ•  ์ผ์„ ๊ฒฐ์ • Trap OS์—๊ฒŒ ๋™๊ธฐ์  ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ์•Œ๋ฆผ ์˜ˆ) div_by_zero, seg_fault, protection_fault, page_fault page fault๋งŒ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ ์‹œํ‚ค์ง€ ์•Š์Œ Kernel์€ Interrupt์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ System Call Process -> OS : ๋™๊ธฐ์  ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ์•Œ๋ฆผ System call ์ฒ˜๋ฆฌ Using system call table ex) int $0x80 sysenter ๋ช…๋ น I/O Control : Polling I/O Control Polling : ์ฃผ๊ธฐ์ ์œผ๋กœ I/O ์žฅ์น˜์˜ ์ƒํƒœ๋ฅผ ํ™•์ธ Interrupt-driven I/O : I/O ์žฅ์น˜๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ DMA(Direct Memory Access) : CPU์˜ ๊ฐœ์ž… ์—†์ด ๋ฉ”๋ชจ๋ฆฌ์™€ ์ฃผ๋ณ€์žฅ์น˜ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ์ „์†ก Polling Busy-wait cycle Host๊ฐ€ busy bit๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ™•์ธ Host๊ฐ€ write bit ์„ค์ •, data-out register์— ๋ฐ์ดํ„ฐ ์ €์žฅ Host๊ฐ€ command-ready bit ์„ค์ • Controller๊ฐ€ command-ready bit ์„ค์ •์„ ํ™•์ธํ•˜๋ฉด busy bit ์„ค์ • Controller๊ฐ€ control register (write command)๋ฅผ ์ฝ๊ณ , data-out register์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค I/O๊ฐ€ ๋๋‚˜๋ฉด controller๊ฐ€ command-ready bit, busy bit ํ•ด์ œ ํŠน์ง• I/O๊ฐ€ ๋นจ๋ฆฌ ๋๋‚˜๋ฉด ํšจ์œจ์ , ๋Šฆ๊ฒŒ ๋๋‚˜๋ฉด ๋น„ํšจ์œจ์  I/O Control : Interrupt I/O, DMA Interrupt-Driven I/O 1~3์€ Polling๊ณผ ๋™์ผ 4 : Process management๋ฅผ ํ†ตํ•ด Context switch 8 : IO๊ฐ€ ๋๋‚˜๋ฉด Interrupt ReQuest(IRQ)๋ฅผ cpu์—๊ฒŒ ๋ณด๋‚ธ๋‹ค ์žฅ์  : ์ฃผ์–ด์ง„ ์‹œ๊ฐ„์•ˆ์— ๋งŽ์€ ํ”„๋กœ์„ธ์Šค ์ˆ˜์šฉ ๊ฐ€๋Šฅ, I/O๊ฐ€ ๋А๋ฆด์ˆ˜๋ก ํšจ์œจ์  ๋‹จ์  : I/O๊ฐ€ ๋น ๋ฅด๋ฉด ๋น„ํšจ์œจ์  (์žฆ์€ Context Switch, mode change) DMA (Direct Memory Access) ๊ธฐ์กด ๋ฐฉ์‹์€ ๋ฌด์กฐ๊ฑด processor๋ฅผ ๊ฑฐ์ณ๊ฐ€์•ผํ•œ๋‹ค DMA ๋ชจ๋“ˆ์ด I/O์™€ Memory ์‚ฌ์ด ์—ญํ•  ์ˆ˜ํ–‰, ๋๋‚˜๋ฉด Interrupt ๋ฐœ์ƒ ์žฅ์  : CPU๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—… ๊ฐ€๋Šฅ, ๋น ๋ฅด๋‹ค Disk Scheduling Disk Structure Sector, Track, Cylinder Disk๋Š” logical block์˜ ๋ฐฐ์—ด์ด๋‹ค Timing of a Disk I/O Transfer Seek time : ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค Rotational delay Transfer time Disk Scheduling Policies FIFO ์š”์ฒญ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ SSTF (Shortest Seek Time First) ํ˜„์žฌ ์œ„์น˜์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์š”์ฒญ์„ ์ฒ˜๋ฆฌ starvation ๋ฌธ์ œ ๋ฐœ์ƒ (์˜ˆ๋ฅผ ๋“ค์–ด ์ž‘์€ ์ˆซ์ž๋งŒ ๋‚˜์˜ค๋ฉด?) SCAN (Elevator Algorithm) ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ํ›‘์œผ๋ฉด์„œ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ๋น„๊ต SSTF > SCAN > FIFO Disk Cache Main memory์— ๋ช‡๋ช‡ ์„นํ„ฐ์˜ ๋ณต์‚ฌ๋ณธ์„ ์ €์žฅ Replacement Policy LRU (Least Recently Used) ๊ฐ€์žฅ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์„นํ„ฐ๋ฅผ ๊ต์ฒด LFU (Least Frequently Used) ๊ฐ€์žฅ ์ ๊ฒŒ ์‚ฌ์šฉ๋œ ์„นํ„ฐ๋ฅผ ๊ต์ฒด RAID RAID Redundant Array of Inexpensive Disks : ์ €๋ ดํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋””์Šคํฌ ๋ฌถ์Œ RAID 0 (non-redundant) ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋””์Šคํฌ์— ๋ถ„์‚ฐ ์ €์žฅ ์žฅ์  : ์šฉ๋Ÿ‰์ด 4๋ฐฐ ๋‹จ์  : ํ•˜๋‚˜์˜ ๋””์Šคํฌ๊ฐ€ ๊ณ ์žฅ๋‚˜๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์†์‹ค RAID 1 (mirrored) RAID 0์„ ๋ณต์ œ ์žฅ์  : ์‹ ๋ขฐ์„ฑ์ด ๋†’๋‹ค ๋‹จ์  : ๋””์Šคํฌ๊ฐ€ 2๋ฐฐ๋กœ ๋“ค์–ด๊ฐ„๋‹ค RAID 3 (bit-interleaved parity) ํ•œ ๋””์Šคํฌ์— parity bit๋ฅผ ์ €์žฅ (๊ฐ™์€ ์œ„์น˜์˜ bit๋“ค์˜ parity) ์žฅ์  : ํ•˜๋‚˜์˜ ๋””์Šคํฌ ๋ณต์› ๊ฐ€๋Šฅ ๋‹จ์  : ์–ด๋–ค ๋””์Šคํฌ๊ฐ€ ๊ณ ์žฅ๋‚ฌ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค, 5๊ฐœ๋ฅผ ๋™์‹œ์— ์ฝ์–ด์„œ ๋А๋ฆผ RAID 4 (block-level parity) ํ•œ ๋””์Šคํฌ์— parity bit๋ฅผ ์ €์žฅ (๊ฐ™์€ ์œ„์น˜์˜ block๋“ค์˜ parity) ์žฅ์  : ๋ธ”๋ก ๋‹จ์œ„ -> ๋ณ‘๋ ฌ์ ์œผ๋กœ IO ๊ฐ€๋Šฅ (RAID 3๋ณด๋‹ค ๋น ๋ฆ„) ๋‹จ์  : ์–ด๋–ค ๋””์Šคํฌ๊ฐ€ ๊ณ ์žฅ๋‚ฌ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค RAID 5 (block-level distributed parity) RAID 4์™€ ๋™์ผํ•˜๋‚˜ parity bit๋ฅผ ์—ฌ๋Ÿฌ ๋””์Šคํฌ์— ๋ถ„์‚ฐ ์ €์žฅ RAID 6 (dual redundancy) RAID 5์™€ ๋™์ผํ•˜๋‚˜ parity bit๋ฅผ 2๊ฐœ ์ €์žฅ (1๊ฐœ๋Š” odd, 1๊ฐœ๋Š” even) ์žฅ์  : RAID5 ๋ณด๋‹ค ๋†’์€ ์‹ ๋ขฐ์„ฑ RAID 01, RAID 10 RAID 0๊ณผ RAID 1์„ ํ•ฉ์นœ ๊ฒƒ RAID 01 < RAID 10 08-Memory-Management Memory Management Memory Management Requirements Memory Allocation : ํ”„๋กœ์„ธ์Šค๋ณ„๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น Memory Protection : ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ—ˆ์šฉ๋œ ์˜์—ญ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ Relocation : ํฉ์–ด์ง„ ์ž‘์€ ๊ณต๊ฐ„์„ ํ•ฉ์น˜๊ธฐ Sharing : ๋ถ€๋ชจ ์ž์‹ ํ”„๋กœ์„ธ์Šค ๊ฐ„ shared memory Memory Partitioning Fixed Partitioning : ๊ฐ™์€ ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์œผ๋กœ ๋‚˜๋ˆ ์„œ ํ• ๋‹น ์žฅ์  : ๊ฐ„๋‹จํ•˜๋‹ค ๋‹จ์  : ๋‚ด๋ถ€ ๋‹จํŽธํ™” ๋ฐœ์ƒ Dynamic Partitioning : ํ”„๋กœ์„ธ์Šค ํฌ๊ธฐ์— ๋งž๊ฒŒ ํ• ๋‹น ์žฅ์  : ๋‚ด๋ถ€ ๋‹จํŽธํ™” ๋ฐœ์ƒ X ๋‹จ์  : ์™ธ๋ถ€ ๋‹จํŽธํ™” ๋ฐœ์ƒ (compaction์„ ํ†ตํ•ด ํ•ด๊ฒฐ ๊ฐ€๋Šฅ but, overhead๊ฐ€ ํฌ๋‹ค) Dynamic Partition Placement Algorithm First-fit : ์ฒ˜์Œ์œผ๋กœ ๋งž๋Š” ๊ณต๊ฐ„์— ๋„ฃ๋Š”๋‹ค ์žฅ์  : ๋น ๋ฅด๋‹ค ๋‹จ์  : ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹์ง€ ์•Š๋‹ค Best-fit : ๋๊นŒ์ง€ ์กฐ์‚ฌํ•ด์„œ ๊ฐ€์žฅ ๋น„์Šทํ•œ ๊ณณ์— ํ• ๋‹น ์žฅ์  : ๋А๋ฆฌ๋‹ค ๋‹จ์  : ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹๋‹ค Buddy System Allocation 2^k ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์„ ํ• ๋‹น Deallocation Buddy ํ•œ ์Œ์ด ๋ชจ๋‘ free์ธ ๊ฒฝ์šฐ, ํ•ฉ์นœ๋‹ค (ํƒ์ƒ‰ Overhead๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด) ์žฅ์  : ์™ธ๋ถ€ ๋‹จํŽธํ™”๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค ๋‹จ์  : ๋‚ด๋ถ€ ๋‹จํŽธํ™” ๋ฐœ์ƒ Virtual Address Space Type of Memory Addresses Physical address : ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ Logical address : ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณด๋Š” ์ฃผ์†Œ Virtual address : Virtaul memory์˜ Logical address Relative address (์ฃผ์†Œ ๊ณ„์‚ฐ ๋ฐฉ์‹) : ์ƒ๋Œ€์ ์ธ ์ฃผ์†Œ Virtual Address Space ํฌ๊ธฐ : 4GB (32bit ์ปดํ“จํ„ฐ) : 0x00000000 ~ 0xFFFFFFFF kernel - stack - heap - bss - data - code Address Binding Address binding instruction๊ณผ ๋ฐ์ดํ„ฐ์˜ Physical address๋ฅผ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ 3๊ฐ€์ง€ ์ƒํ™ฉ์— ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค (Compile time, Load time, Execution time) Compile time binding Compileํ• ๋•Œ, base address๋ฅผ ์•Œ๋ ค์คŒ์œผ๋กœ์จ ๋ฏธ๋ฆฌ physical address๋ฅผ ๋„ฃ์–ด๋†“๋Š”๋‹ค Logical address = Physical address ๋ฌธ์ œ์  : Relocation ๋ถˆ๊ฐ€ (base address๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋‹ค์‹œ compile ํ•ด์•ผํ•จ) Load time binding Loadํ• ๋•Œ, physical address๋ฅผ ๊ณ„์‚ฐ Logical address = Physical address ๋ฌธ์ œ์  : Relocation ๋ถˆ๊ฐ€ Execution time binding ์‹คํ–‰ํ•  ๋•Œ, physical address๋ฅผ ๊ณ„์‚ฐ Logical address != Physical address Relocation ์ผ์–ด๋‚˜๋Š” ์ด์œ  : Swapping, Compaction Hardware for Execution Time Binding Base register : ์‹œ์ž‘ ์ฃผ์†Œ Bounds register (limit register) : ๋ ์ฃผ์†Œ Adder๊ฐ€ Base Register + releative address ๊ณ„์‚ฐ Comparato๊ฐ€ Bounds Register์™€ ๋น„๊ต ์˜์—ญ ๋ฐ–์ธ ๊ฒฝ์šฐ Segementation Fault(Trap) ๋ฐœ์ƒ Paging Paging ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ™์€ ํฌ๊ธฐ์˜ ํŽ˜์ด์ง€๋กœ ๋‚˜๋ˆˆ๋‹ค page size = frame size = disk block size = 4KB Internal fragmentation ๋ฐœ์ƒ (๋ฌด์‹œ ๊ฐ€๋Šฅ) Page Table PCB์— ์ €์žฅ ๋˜์–ด์„œ ๊ด€๋ฆฌ Virtual Memory ์‚ฌ์šฉ ์‹œ N๊ณผ frame number๊ฐ€ ์„ž์—ฌ์„œ ์กด์žฌ Page number and offset Logical address = Page number + offset Page size 16 Bytes (128bit), 8 bit address์ธ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ์ฃผ์†Œ ๊ฐœ์ˆ˜ = 128 / 8 = 16๊ฐœ offset = 4bit (2 ^ 4 = 16) page number = 8 - 4 = 4bit (๋‚จ๋Š” ๊ฑฐ) Address translation in Paging Logical address -> Physical address offset์€ ๊ทธ๋Œ€๋กœ, page ๋ฒˆํ˜ธ๋งŒ frame ๋ฒˆํ˜ธ๋กœ ๋ฐ”๊พผ๋‹ค Segmentation ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค๋ฅธ ํฌ๊ธฐ์˜ ๋…ผ๋ฆฌ์  ๋‹จ์œ„์ธ ์„ธ๊ทธ๋จผํŠธ๋กœ ๋‚˜๋ˆˆ๋‹ค Dynamic partitioning๊ณผ ์œ ์‚ฌ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋น„์Šทํ•œ ๊ฒƒ๋“ค์„ ๋ฌถ๋Š”๋‹ค. 09-Virtual-Memory Advantages of Virtual Memory Virtual Memory ์ „์ฒด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐˆ ํ•„์š”๊ฐ€ ์—†๋‹ค ๋” ๋งŽ์€ ํ”„๋กœ์„ธ์Šค ์ˆ˜์šฉ ๊ฐ€๋Šฅ -> swap ๋นˆ๋„ ๊ฐ์†Œ, ์ข‹์€ ๋ฐ˜์‘์„ฑ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ณด๋‹ค ํฐ ํ”„๋กœ์„ธ์Šค๋„ ์‹คํ–‰ ๊ฐ€๋Šฅ Types of Memory Real Memory address : Real address, Physical address, Absolute address Virtual Memory address : Logical address, Virtual address Execution of a Program Resident set : Main memory์— ์กด์žฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ์ง‘ํ•ฉ Main Memory์— ์—†๋Š” Page๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ -> Page fault (interrupt) ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค block -> ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ -> Disk I/O ๋๋‚˜๋ฉด ๋‹ค์‹œ ready Principle of Locality ํ”„๋กœ์„ธ์Šค์˜ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ๋ฐ์ดํ„ฐ ์ฐธ์กฐ๋Š” ๋ญ‰์นœ๋‹ค๋Š” ์„ฑ์งˆ Virtual Memory๊ฐ€ ํšจ์œจ์ ์ธ ์ด์œ  ์ค‘ ํ•œ ๊ฐ€์ง€ Demand paging Demand paging Virtual Memory์˜ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ• Demand paging Demand segmentation : ๋А๋ ค์„œ ์‚ฌ์šฉ ํ•˜์ง€ ์•Š๋Š”๋‹ค Address Translation in demand paging Page table base register์— page table ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ์ €์žฅ ๋งค๋ฒˆ 2๋ฒˆ์”ฉ Main memory๋ฅผ accessํ•  ํ•„์š” ์—†์Œ Page Table Entry P M R U W COW page frame number (p`) P : present(valid) bit : Main memory์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€ M : modified bit : ํŽ˜์ด์ง€๊ฐ€ ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€ R : referenced bit : ํŽ˜์ด์ง€๋ฅผ ์ ‘๊ทผํ•œ์  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ U : user mode : User context์— ํ•ด๋‹นํ•˜๋Š”์ง€ ์—ฌ๋ถ€ W : writable : ํŽ˜์ด์ง€๊ฐ€ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€ COW : copy-on-write : ํŽ˜์ด์ง€๋ฅผ ๋ถ€๋ชจ๋ž‘ ๊ณต์œ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€ Modify Bit in page table M bit๊ฐ€ 0์ด๋ฉด ๋””์Šคํฌ์— ๋ฐ˜์˜ํ•˜์ง€ ์•Š๊ณ  ์‚ญ์ œ ๊ฐ€๋Šฅ Sharing of Pages ๊ฐ™์€ ํŽ˜์ด์ง€๋ฅผ ๊ณต์œ ํ•ด์•ผํ•  ๋•Œ, Page table์— ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์ €์žฅ Multi-level Page Table Size of Page tabbles ํฐ ํ”„๋กœ์„ธ์Šค๋Š” 1๊ฐœ์˜ page table๋กœ ์ฒ˜๋ฆฌ๋ถˆ๊ฐ€ -> Multi-level apge table Two-Level Scheme for 32-bit address 1๊ฐœ์˜ Page Table์ด ์ˆ˜์šฉํ•˜๋Š” ํŽ˜์ด์ง€์ˆ˜๋Š” = 1K๊ฐœ 4GB User address space = 1M๊ฐœ์˜ ํŽ˜์ด์ง€ -> ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์ด ๋” ํ•„์š” Two-Level Paging Example Page number๊ฐ€ 2๊ฐœ ์กด์žฌ page number1 : 10bit page number2 : 10bit page offset : 12bit Addres-Translation Scheme Page ํฌ๊ธฐ 4096B / Page tableํฌ๊ธฐ 4B = 1024 -> page number์˜ ๊ฐœ์ˆ˜ = 10bit (2^10=1024) ํŽ˜์ด์ง€์˜ ํฌ๊ธฐ 4096B์ด๊ธฐ ๋•Œ๋ฌธ์— -> Offset bit = 12bit (2^12=4096) Translation Lookaside Buffer Translation Lookaside Buffer ๊ณ„์ธต์ด ๋งŽ์•„์ง€๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค TLB์— accessํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ TLB๋Š” ๋ณ‘๋ ฌ๋กœ ํƒ์ƒ‰, O(1)๋กœ ํƒ์ƒ‰๊ฐ€๋Šฅ TLB ํ™•์ธ -> ์—†์œผ๋ฉด Page table ํ™•์ธ -> ์—†์œผ๋ฉด Page fault Effective Access Time Memory cycle = 1์ด๋ผ๊ณ  ๊ฐ€์ • TLB ์ฝ๋Š” ์‹œ๊ฐ„ = $\varepsilon$ TLB hit ratio = $\alpha$ EAT = TLB์— ์žˆ์„ ๋•Œ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ + ์—†์„๋•Œ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ $$ EAT = (\varepsilon+1)\alpha + (\varepsilon+1+1)(1-\alpha) = 2+\varepsilon-\alpha $$ Page Replacement Replacement Policy Main Memory๊ฐ€ ๊ฝ‰์ฐจ๋ฉด page๋ฅผ swap out ์‹œ์ผœ์•ผํ•œ๋‹ค Basic Replacement Algorithms FIFO ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒด ๋น„ํšจ์œจ์  Optimal policy ๊ฐ€์žฅ ๋‚˜์ค‘์— ์‚ฌ์šฉ๋  ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒด ๋‚˜์ค‘์— ์–ด๋–ค page๊ฐ€ ํ•„์š”ํ• ์ง€ ์•„๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๊ฐ€๋Šฅ Least Recently Used (LRU) ๊ฐ€์žฅ ์˜ค๋ž˜์ „์— ์‚ฌ์šฉ๋œ ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒด ๋งˆ์ง€๋ง‰์œผ๋กœ ์–ธ์ œ ์“ฐ์˜€๋Š”์ง€ ํ•ญ์ƒ ์ฐพ์•„์•ผ ํ•œ๋‹ค -> Overhead ๋ฐœ์ƒ Clock Policy (Second change algorithm) ๋Œ์•„๊ฐ€๋ฉด์„œ user bit -= 1 user == 0์ด๋ฉด ๊ต์ฒด ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด user ๋น„ํŠธ = 1 ์„ฑ๋Šฅ ๋น„๊ต FIFO < Clock < LRU < OPT Enhanced Clock Policy U๋น„ํŠธ์™€ M๋น„ํŠธ์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„ ๋ถ€์—ฌ U = 0, M = 0 U = 0, M = 1 U = 1, M = 0 U = 1, M = 1 Performance of Demand Paging Page Fault Rate = page fault ํšŸ์ˆ˜ / page ๋ถˆ๋Ÿฌ์˜ค๋Š” ํšŸ์ˆ˜ Effective Access Time(EAT) = (1-p) x memory access + p x (page fault overhead + swap page out + swap page in + restart overhead)
  • ««
  • «
  • 3
  • 4
  • 5
  • 6
  • 7
  • »
  • »»
๐Ÿง  Algorithm (104) ๐ŸŒŠ C/CPP (2) โ˜• Java (8) ๐ŸŒ Javascript (9) ๐Ÿ Python (9) ๐Ÿƒ Spring (30) ๐Ÿ”จ ๊ฐœ๋ฐœ ๋„๊ตฌ (2) ๐ŸŽธ ๊ธฐํƒ€ (7) ๐Ÿ‘จโ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ” (38) ๐Ÿค– ์ธ๊ณต์ง€๋Šฅ (2) ๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€ (28)
๐Ÿท๏ธ boj (53) ๐Ÿท๏ธ c (5) ๐Ÿท๏ธ c++ (4) ๐Ÿท๏ธ celery (2) ๐Ÿท๏ธ cs (18) ๐Ÿท๏ธ django (3) ๐Ÿท๏ธ docker (2) ๐Ÿท๏ธ docker compose (1) ๐Ÿท๏ธ elk (1) ๐Ÿท๏ธ fastapi (4) ๐Ÿท๏ธ git (2) ๐Ÿท๏ธ github actions (5) ๐Ÿท๏ธ hackerrank (3) ๐Ÿท๏ธ https (2) ๐Ÿท๏ธ java (37) ๐Ÿท๏ธ javascript (2) ๐Ÿท๏ธ jwt (1) ๐Ÿท๏ธ kubernetes (4) ๐Ÿท๏ธ nginx (2) ๐Ÿท๏ธ ocaml (1) ๐Ÿท๏ธ open source (2) ๐Ÿท๏ธ programmers (48) ๐Ÿท๏ธ pytest (1) ๐Ÿท๏ธ python (111) ๐Ÿท๏ธ rabbitmq (2) ๐Ÿท๏ธ rag (3) ๐Ÿท๏ธ react (6) ๐Ÿท๏ธ security (3) ๐Ÿท๏ธ software-engineering (3) ๐Ÿท๏ธ spring (31) ๐Ÿท๏ธ sql (5) ๐Ÿท๏ธ ssl (1) ๐Ÿท๏ธ testing (4) ๐Ÿท๏ธ typescript (1) ๐Ÿท๏ธ vercel (1) ๐Ÿท๏ธ websocket (1)