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 09_spring_MVC
๐Ÿƒ Spring
Spring MVC ์‹œ์ž‘ํ•˜๊ธฐ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์•ž์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ๋Š” ์ข€ ๋‹ค๋ฅธ์ ์ด ์žˆ์—ˆ๋‹ค jar์ด ์•„๋‹Œ war์„ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋งŽ์•˜๋Š”๋ฐ ์ผ์ผ์ด ์ ์ง€๋Š” ์•Š์„ ๊ฒƒ์ด๋‹ค Controller 1@Controller 2public class HelloController { 3 @GetMapping("/hello") 4 public String hello(Model model, 5 @RequestParam(value="name", required=false) String name) { 6 model.addAttribute("greeting", "์•ˆ๋…•ํ•˜์„ธ์š”" + name); 7 return "hello"; 8 } 9} JSP 1<%@ page contentType="text/html; charset=utf-8" %> 2<!DOCTYPE html> 3<html> 4 <head> 5 <title>Hello</title> 6 </head> 7 <body> 8 ์ธ์‚ฌ๋ง : ${greeting} 9 </body> 10</html URL์ ‘์†ํ•ด๋„ ํ•ด๋‹น jspํŒŒ์ผ์ด ๋‚˜์˜ค์ง€ ์•Š๋Š” ๋ฌธ์ œ vscode์—์„œ community server connector๋ผ๋Š” extension์„ ํ†ตํ•ด tomcat์„ ๋„์›Œ์„œ ํ• ๋ ค๊ณ  ํ•œ๋‹ค ํŠน์ • jsp๋ฅผ ๊ฐ์ง€ํ–ˆ๋Š”์ง€, servingํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋กœ๊ทธ๊ฐ€ ์—†์–ด ๋˜๋Š”๊ฑด์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค web.xml; lineNumber: 1; columnNumber: 37; A pseudo attribute name is expected. // before <?xml version="1.0" encoding="UTF-8"> // after <?xml version="1.0" encoding="UTF-8"?> ๋ฌผ์Œํ‘œ๋ฅผ ๋นผ๋จน์–ด์„œ ์ƒ๊ธฐ๋Š” ์˜ค๋ฅ˜์ด๋‹ค 404: Not Found 1// before 2registry.jsp("/WEB-INF/view", ".jsp"); 3// after 4registry.jsp("/WEB-INF/view/", ".jsp");
new ๊ฐ์ฒด์ง€ํ–ฅ์„ค๊ณ„
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
Dynamic dispatch and Multiple inheritance Polymorphism Function overloading using compile time types of arguments Function overriding using runtime types of receiver objects virtual function for dynamic dispatch dynamic dispatch๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด ํ•จ์ˆ˜๊ฐ€ virtual keyword๋กœ ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. receiver object๊ฐ€ ํฌ์ธํ„ฐ(*), ์ฐธ์กฐ(&)๋ฅผ ํ†ตํ•ด refer๋˜์–ด์•ผ ํ•œ๋‹ค 1// from parent class : Employee 2virtual std::string GetInfo() { 3 return "Employee: " + name_ ; 4} 5// from child class : Developer 6std::string GetInfo() { 7 return "Developer: " + name_; 8} override keyword override ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ์ง๊ด€์ ์ธ ์ฝ”๋“œ ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜ ๋ฐฉ์ง€ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” compile time์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค Overriding non-virtual functions Overriding non-existing function ๋‹ค๋ฅธ ํšจ๊ณผ๋Š” ์—†๋‹ค ๋‹จ์ง€ ํ™•์ธ์„ ์œ„ํ•œ ๊ตฌ๋ฌธ dynamic dispatch์˜ ์›๋ฆฌ VTABLE์€ ํด๋ž˜์Šค๋งˆ๋‹ค ์ •์  array์˜ ํ˜•ํƒœ๋กœ ์กด์žฌํ•œ๋‹ค VPTR์€ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ถ”๊ฐ€๋œ๋‹ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด vptr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” vtable์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค Abstract class ํ•˜๋‚˜ ์ด์ƒ์˜ virtual function์„ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค abstract class๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค pure virtual functions " = 0"์œผ๋กœ ์ •์˜ ๋˜์–ด ๋ชธํ†ต์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ์ž์‹์—์„œ ๊ตฌํ˜„ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ polymorphic class ํ•œ ๊ฐœ ์ด์ƒ์˜ virtual function์„ ๊ตฌํ˜„ ๋˜๋Š” ์ •์˜ ํ•˜๋Š” ํด๋ž˜์Šค ๋ถ€๋ชจ๊ฐ€ ๋˜๋Š” ํด๋ž˜์Šค๋Š” destructor๋ฅผ virtualํ•˜๊ฒŒ ์„ ์–ธํ•ด์•ผํ•œ๋‹ค Multiple inheritance destructor ํ˜ธ์ถœ ์ˆœ์„œ ์ƒ์†๊ณผ ๋ฐ˜๋Œ€ ์ˆœ์„œ๋กœ ํ˜ธ์ถœ ๋œ๋‹ค 1class Developer : public Citizen, public Employee {} 2// ์ˆœ์„œ : Developer -> Employee -> Citizen Diamond problem in multiple inheritance ์—ฌ๋Ÿฌ ๋ถ€๋ชจ๊ฐ€ ๋˜‘๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜/ํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ ์ž์‹์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜ X ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ O ๊ฒฝ์šฐ 1. ๋‘ ๋ถ€๋ชจ๊ฐ€ pure virtualํ•œ ๊ณตํ†ต๋œ ํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ -> ์˜ค๋ฅ˜X Design Pattern Three categories of design patterns Creational : Factory method, Abstract factory, Builder, Prototype, Signleton Structural : Adapter, Bridge, Composite, Facade, Proxy Behavioral : … Singleton Builder builder ๊ฐ์ฒด ๋ถ„๋ฆฌ builder๋Š” ์›๋ž˜ ๊ฐ์ฒด์˜ friend (builder๊ฐ€ ์ž์œ ๋กญ๊ฒŒ access ๊ฐ€๋Šฅ) Prototype clone ํ•จ์ˆ˜๋Š” ๋ถ€๋ชจ์—์„œ๋Š” pure virtual, ์ž์‹์—์„œ ๊ตฌํ˜„ 1Shape* Clone() const { return new Circle(color_, radius_); } Abstract factory ๋น„์Šทํ•œ ๊ฐ์ฒด๋“ค์„ ๋งŒ๋“œ๋Š” ๊ณต์žฅ ํด๋ž˜์Šค ์ƒ์„ฑ ๋ถ€๋ชจ ๊ฐ€๊ตฌ ๊ณต์žฅ ํด๋ž˜์Šค(polymorphic) -> ์ž์‹ ๊ณต์žฅ1(ํ˜„๋Œ€์  ๋””์ž์ธ), ์ž์‹ ๊ณต์žฅ2(๊ณ ์ „ ๋””์ž์ธ) Adapter ์„œ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/๋ชจ๋“ˆ์„ ์—ฐ๊ฒฐ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ Bridge abstract class์™€ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” class๋กœ ๊ตฌ์„ฑ abstract class๋ฅผ ์ด์šฉํ•ด ๋‹ค์–‘ํ•œ ๋ณ€ํ™”์— ๋Œ€์‘ Composite ํ•˜๋‚˜์˜ ๋ถ€๋ชจ์™€ ํ•˜์œ„ ์—ฌ๋Ÿฌ ์ž์‹์„ ํ†ตํ•ด Tree๋ชจ์–‘ ํ˜•์„ฑ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ถ€๋ชจํด๋ž˜์Šค ์ž๋ฃŒํ˜•์— ์ €์žฅํ•œ๋‹ค -> ๋ชจ๋“  ์ž์‹๋“ค์— ๋Œ€ํ•ด ์ผ๊ด€์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ Facade ๋ณต์žกํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋“ค ์•ž์— ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ ์˜์กด์ ์ธ ๋ชจ๋“ˆ์— ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ๋งŒ ์—…๋ฐ์ดํŠธ ํ•˜๋„๋ก ๊ตฌํ˜„ Proxy third-party ๋ชจ๋“ˆ๊ณผ client ์‚ฌ์ด์— ์‚ฌ์šฉ third-party ๋ชจ๋“ˆ์ด ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ -> ๋ณด์•ˆ ํ–ฅ์ƒ ์ค‘๊ฐ„์—์„œ ์ž…๋ง›๋Œ€๋กœ ์กฐ์ • ๊ฐ€๋Šฅ STL STL ( Standard Template Library ) array 1#include <array> 2std::array<int, 3> arr; vector : ๋ฉ”๋ชจ๋ฆฌ ์ƒ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฐ์†์ ์ด์–ด์•ผํ•œ๋‹ค -> random access ์ง€์› push_back ๊ฐ€๋Šฅ 1#include <vector> 2std::vector<int> vec; list : linked-list ๊ฐ™์€ ๋А๋‚Œ, ๋„์—„ ๋„์—„ ์žˆ์–ด๋„ ์—ฐ๊ฒฐ์ด ๋œ๋‹ค push_front, push_back ๊ฐ€๋Šฅ begin()+4 -> XXX std::next(std::next(std::next))… -> OOO 1#include <list> 2std::list<int> lst; deque : random access ์ง€์›, ํฌ์ธํ„ฐ ์—ฐ์‚ฐ ๋ถˆ๊ฐ€ push_front ๊ฐ€๋Šฅ 1#include <deque> 2std::deque<int> deq; stack : LIFO top(), pop() ๊ฐ€๋Šฅ 1#include <stack> 2std::stack<int> std; queue : FIFO front(), pop() ๊ฐ€๋Šฅ 1#include <queue> 2std::queue<int> que; set : stores unique elements following a specific order insert() 1#inclue <set> 2std::set<int, FunctorClass> s; map : stores elements as a combination of a key value and a mapped vlaue, following a specific order 1#include <map> 2std::map<std::string, int, FunctorClass> m; Introduction to template Polymorphism Compile-time polymorphism : ex) function overloading Runtime polymorphism : ex) dynamic dispatch Template์„ ํ™œ์šฉํ•œ generic programming์€ compile-time polymorphism์˜ ์ผ์ข… Templates in C++ Class template Function template Templates enable developers to perform meta programming (ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ) Class template template <(template_type var)+> class className { … } Multiple template parameters Template parameter deduction (<= C++17) Primitive template parameter 1template <typename T, int kSize> 2class Array { ... } linking error๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค solution 1. headerํŒŒ์ผ ์•ˆ์— ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋“ค์„ ์ •์˜ํ•œ๋‹ค solution 2. ccํŒŒ์ผ ์ƒ๋‹จ์— ์ •์˜ ํ•ด์ค€๋‹ค 1template <typename T, typename N> 2Pair<T, N>::Pair(T fst, N snd) : fst_(fst), snd_(snd) {} Function Template Multiple template parameters Template parameter deduction Primitive template paramter conflict with function overloading : ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค Template function overload resolution Choose exact matched one in existing functions generate an exact matched function from function Templates ๋งŒ๋“œ๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋ฉด ์›๋ž˜ ๋ณดํ†ต์˜ overload resolution Exception handling ranges of data types 1#include <limits> 2std::number_limits<int>::lowest() 3std::number_limits<int>::min() 4std::number_limits<int>::max() lowest()์™€ min()์˜ ์ฐจ์ด์  handle overflow Wrap around : ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ƒ๊ธด ์งํ›„ ๊ฐ’์œผ๋กœ ์ œํ•œ Saturation : ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋‚˜๊ธฐ ์ง์ „๊นŒ์ง€๋กœ ์ œํ•œ Exception : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ detection for integer overflow 1if (x > 0 && y > 0) { 2 if (x > kMax - y) //overflow 3} 4if (x < 0 && y < 0) { 5 if (x < kMin - y) //overflow 6} Wrap around for overflow 1static int WrapAroundForMax(int x, int y) { 2 return kMin + (x - (kMax - y + 1)); 3} 4static int WrapAroundForMin(int x, int y) { 5 return kMax + (x - (kMin - y - 1)); 6} Saturation for overflow 1static int SaturateForOverflow(int x, int y) { 2 return kMax; 3} 4static int SaturateForUnderflow(int x, int y) { 5 return kMin; 6} Standard exception class hierarchy๋ผ๋Š” ๊ฒƒ ์ด์žˆ๋‹ค. std::exception์— ํ‘œ์ค€ ์˜ˆ์™ธ๋“ค์— ๋Œ€ํ•œ hierarchy์ธ๋ฐ catch์˜ match๋Š” ํฌํ•จ๊ด€๊ณ„์— ์˜ํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค ๋งจ์œ„์— ์žˆ๋Š” catch๋ฌธ์ด ์ œ์ผ ๋จผ์ € ์žก๋Š”๋‹ค c style : 1return -1 2if (flag == 0) 3 Normal 4else 5 Abnormal C++ style : 1throw WrapAroundForMax(x, y); 2try { 3 res = SafeMath::Add(x, 1); 4 Normal 5} 6catch (int& res_value) { 7 Abnormal 8} catch block can handle only exceptions matched to the type If matched, the thrown exception is assigned to the var and the statements in the catch block are executed If not matched, try to match exceptions to the next catch block If no catch block matched,3 jump to the next nearest catch block throw ํ•˜๋ฉด directly catch ๋ฌธ์œผ๋กœ ์ ํ”„ํ•œ๋‹ค ์˜ˆ์™ธ๋ฅผ catchํ•˜์ง€ ๋ชปํ•˜๋ฉด runtime error๋ฅผ ๋„์šด๋‹ค catch(…) : “…“์ด๋ผ๋Š” ํ‘œํ˜„์€ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์˜ˆ์™ธ๋ฅผ ์žก๋Š”๋‹ค Rethrow : catch๋ฌธ ์•ˆ์—์„œ throw;๋งŒ ํ•˜๋ฉด ๋‹ค์‹œ ์˜ˆ์™ธ๋ฅผ ๋˜์ ธ์„œ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. noexcept : noexcept๋Š” “์ด ํ•จ์ˆ˜๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์•„์š”!” ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ์ด ํ•จ์ˆ˜์˜ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค noexceptํ•จ์ˆ˜์—์„œ except๋ฅผ throwํ•˜๋ฉด program์€ ๋น„์ •์ƒ ์ข…๋ฃŒ๋ฅผ ํ•œ๋‹ค ๊ทธ ์ „์— ์ปดํŒŒ์ผ ํ• ๋•Œ warning์„ ๋„์›Œ์ฃผ๊ธฐ๋Š” ํ•œ๋‹ค ๋‹ค๋งŒ, noexcept ํ•จ์ˆ˜ ์ž์ฒด์—์„œ ๋ฐœ์ƒํ•œ exception์ด ์•„๋‹Œ noexceptํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ -> ๊ฐ„์ ‘์ ์œผ๋กœ exception์ด throw๋œ ๊ฒฝ์šฐ compile warning์„ ๋„์›Œ์ฃผ์ง€ ์•Š๋Š”๋‹ค. 1public NonExistFileException : public std::runtime_error { 2 public: 3 NonExistFileException(std::string msg) : std::runtime_error(msg) {} 4}
new Spring ๊ฐœ๋… - AOP (Aspect Oriented Programming)
๐Ÿƒ Spring
AOP (Aspect Oriented Programming) ์—ฌ๋Ÿฌ ๊ฐ์ฒด์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•ด์„œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ• ๊ธฐ๋ณธ ๊ฐœ๋… : ํ•ต์‹ฌ ๊ธฐ๋Šฅ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž… ๊ตฌํ˜„ํ•˜๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ปดํŒŒ์ผ ์‹œ์ ์— ์ฝ”๋“œ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ• ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ์ ์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ์— ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋Ÿฐํƒ€์ž„์— ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ• AOP ์ฃผ์š” ์šฉ์–ด Target ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•  ๋Œ€์ƒ Advice ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋‹ด๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ Join Point Advice๋ฅผ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ง€์  Pointcut Joinpoint์˜ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์œผ๋กœ์„œ ์‹ค์ œ Advice๊ฐ€ ์ ์šฉ๋˜๋Š” Joinpoint๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค Aspect Advice + Pointcut ์—ฌ๋Ÿฌ ๊ฐ์ฒด์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ Weaving Join Point์— Advice๋ฅผ ์ ์šฉํ•˜๋Š” ๊ณผ์ • Advice Advice์˜ ์ข…๋ฅ˜ @Before : ์กฐ์ธ ํฌ์ธํŠธ ์‹คํ–‰ ์ด์ „์— ์‹คํ–‰ @After : ์กฐ์ธ ํฌ์ธํŠธ ์‹คํ–‰ ์ดํ›„์— ๋ฌด์กฐ๊ฑด ์‹คํ–‰ @AfterReturning : ์กฐ์ธ ํฌ์ธํŠธ๊ฐ€ ์ •์ƒ ์‹คํ–‰ ํ›„ ์‹คํ–‰ @AfterThrowing : ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ @Around : ์œ„ 4๊ฐ€์ง€ Annotation์„ ํฌํ•จ, ๋ฐ˜ํ™˜๊ฐ’ ์กฐ์ž‘๊ฐ€๋Šฅ, ์˜ˆ์™ธ ์กฐ์ž‘ ๊ฐ€๋Šฅ ์˜ˆ์‹œ - @Around ์‚ฌ์šฉ 1@Around("execution(public * org.academy..*Service.*(..))") 2 3public Object log(ProceedingJoinPoint joinPoint) throws Throwable { 4 log.info("Before method called. {}", joinPoint.getSignature().toString()); 5 var result = joinPoint.proceed(); 6 log.info("After method called with result => {}", result); 7 8 return result; 9} Pointcut ์•ž์˜ ์ฝ”๋“œ์—์„œ @Around ์•ˆ์— ํฌ์ธํŠธ์ปท์„ ์ง€์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค ๋ณดํ†ต Pointcut๋ผ๋ฆฌ ๋ชจ์•„๋†“๊ณ  Around์™€ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค ์˜ˆ์‹œ - pointcut 1// PointCut ์ •์˜ 2@Pointcut("execution(public * org.academy..*Service.*(..))") 3public void servicePublicMethodPointcut() {...} 4// Advice์— ์ ์šฉ 5@Around("org.academy.springorder.aop.CommonPointcut.servicePublicMethodPointcut()") 6public ... {...} ํ”„๋ก์‹œ ์ƒ์„ฑ ๋ฐฉ์‹ 1@EnableAspectJAutoProxy(proxyTargetClass=true) 1// Before 2Calculator cal = ctx.getBean("calculator", Calculator.class); 3// After 4RecCalculator cal = ctx.getBean("calculator", RecCalculator.class); proxyTargetClass ์†์„ฑ์„ ์ง€์ •ํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค Advice ์ ์šฉ ์ˆœ์„œ 1@Aspect 2@Order(2) 3public class CacheAspect {...} @Order annotation์„ ์ด์šฉํ•˜์—ฌ ์ ์šฉ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค @Around์˜ Pointcut ์„ค์ • 1@Around("execution(public * chap07 ..*(..))") 2public Object execute(...) {...} @Pointcut publicTarget() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค @Pointcut ์žฌ์‚ฌ์šฉ 1@Around("ExeTimeAspect.publicTarget()") 2public Object execute(...) {...}
new 221208 SYSP
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
12-memory-1 ๋ฉ”๋ชจ๋ฆฌ์— ๊ด€ํ•œ ๋ถˆํŽธํ•œ ์ง„์‹ค ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฌดํ•œ์˜ ์ž์›์ด ์•„๋‹ˆ๋‹ค ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ง์ ‘(explicit) vs ๊ฐ„์ ‘(implicit) ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ธฐ ์ง์ ‘ ํ• ๋‹น : ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ํ• ๋‹นํ•˜๊ณ , ๋ฐ˜ํ™˜ํ•œ๋‹ค ex) malloc, free ๊ฐ„์ ‘ ํ• ๋‹น : ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ํ• ๋‹นํ•˜์ง€๋งŒ, ๋ฐ˜ํ™˜ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค ex) java์˜ garbage collector ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์ด๋ฏธ์ง€ ์Šคํƒ์€ ์•„๋ž˜๋กœ, ํž™์€ ์œ„๋กœ ์„ฑ์žฅํ•œ๋‹ค sbrk ํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€์ ์ธ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ์š”์ฒญํ•œ๋‹ค (brk ํฌ์ธํ„ฐ ์ด๋™) Malloc package 1#include <stdlib.h> 2void *malloc(size_t size) 3// ์„ฑ๊ณต์‹œ : ์ตœ์†Œ size ๋ฐ”์ดํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ (๋Œ€๊ฒŒ 8๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋งž์ถ”์–ด) 4// ์‹คํŒจ์‹œ : NULL๋ฆฌํ„ด, set errno 5 6void free(void *p) 7// ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ ํ’€์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ธ”๋ก ํฌ์ธํ„ฐ p ๋ฆฌํ„ด 8 9void *realloc(void *p, size_t size) 10// ๋ธ”๋ก p์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ์ƒˆ ๋ธ”๋ก์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฆฌํ„ด 11// ์ƒˆ ๋ธ”๋ก์˜ ๋‚ด์šฉ์€ ์ด์ „ ๋ธ”๋ก๊ณผ ์ƒˆ ๋ธ”๋ก ํฌ๊ธฐ ์ค‘ ์ ์€ ํฌ๊ธฐ๊นŒ์ง€๋Š” ๋ณ€ํ™” ์—†์Œ ์šฐ์ˆ˜ํ•œ malloc/free ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชฉํ‘œ ์ฃผ์š” ๋ชฉํ‘œ malloc๊ณผ free์—์„œ ์šฐ์ˆ˜ํ•œ ์‹œ๊ฐ„ ์„ฑ๋Šฅ์„ ์–ป๋Š”๋‹ค ์šฐ์ˆ˜ํ•œ ๊ณต๊ฐ„ ์ด์šฉ์œจ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค ๋‹ค๋ฅธ ๋ชฉํ‘œ ์šฐ์ˆ˜ํ•œ ์ง€์—ญ์„ฑ : ์‹œ๊ฐ„์ ์œผ๋กœ ์ธ์ ‘ (๋˜๋Š” ์œ ์‚ฌํ•œ ๊ฐ์ฒด) -> ๊ณต๊ฐ„์ƒ์œผ๋กœ ์ธ์ ‘ ๊ฒฌ๊ณ ์„ฑ : free(p1) ํ•จ์ˆ˜๊ฐ€ ์œ ํšจํ•œ ํฌ์ธํ„ฐ p1์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ฑ๋Šฅ ์ง€ํ‘œ 1 : ์ฒ˜๋ฆฌ๋Ÿ‰ (Throughput) ๋‹จ์œ„ ์‹œ๊ฐ„ ๋™์•ˆ ์™„๋ฃŒํ•œ ์š”์ฒญ์˜ ์ˆ˜ ์„ฑ๋Šฅ ์ง€ํ‘œ 2 : ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ์ด์šฉ์œจ (Utilization) k๊ฐœ์˜ ์š”์ฒญ ํ›„์—, ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ์ด์šฉ์œจ $$ U*{k} = (max*{i<=k}: P*{i}) / H*{k} $$ ๋‚ด๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” (Internal Fragmentation) ์ผ๋ถ€ ๋ธ”๋ก์—์„œ ๋ธ”๋ก ํฌ๊ธฐ์™€ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ„์˜ ์ฐจ์ด๋กœ ์ธํ•ด ๋ฐœ์ƒ ์ด์ „ ์š”์ฒญ ํŒจํ„ด์— ์˜ํ•ด์„œ๋งŒ ์˜ํ–ฅ์„ ๋ฐ›์œผ๋ฏ€๋กœ ์ธก์ •์ด ์šฉ์ด ์™ธ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” (External Fragmentation) ํž™ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ฉ์น˜๋ฉด ์ˆ˜์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฐ€์šฉ ๋ธ”๋ก์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๊ฒฝ์šฐ์— ๋ฐœ์ƒ ์™ธ๋ถ€ ๋‹จํŽธํ™”๋Š” ๋ฏธ๋ž˜์˜ ์š”์ฒญ ํŒจํ„ด์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋ฏ€๋กœ ์ธก์ •์ด ์–ด๋ ต๋‹ค Free ๋ธ”๋Ÿญ ๊ด€๋ฆฌํ•˜๊ธฐ ๊ฐ„์ ‘๋ฆฌ์ŠคํŠธ : ํฌ๊ธฐ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“  ๋ธ”๋ก์„ ์—ฐ๊ฒฐ ์ง์ ‘๋ฆฌ์ŠคํŠธ : ๊ฐ€์šฉ ๋ธ”๋ก๋‚ด์— ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉ ๊ตฌ๋ถ„ ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ : ํฌ๊ธฐ ํด๋ž˜์Šค๋งˆ๋‹ค ๋ณ„๋„์˜ ๊ฐ€์šฉ ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ ์ง€ ํฌ๊ธฐ๋กœ ์ •๋ ฌ๋œ ๋ธ”๋ก ๋ฐฉ๋ฒ• 1 : ๊ฐ„์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹ (Implicit List) 1 word = size(a) + payload + padding ์—ฐ์Šต๋ฌธ์ œ ์ œํ•œ์‚ฌํ•ญ : ํ—ค๋”๋Š” 4๋ฐ”์ดํŠธ, double-word alignment, ๋ธ”๋ก์˜ ํฌ๊ธฐ๋Š” 8์˜ ๋ฐฐ์ˆ˜ ์š”์ฒญ block size block header(hex) Malloc(1) 4+1+3 = 8 size | alloc = 0x8 | 1 = 0x9 Malloc(5) 4+5+7 = 16 size | alloc = 0x8 | 5 = 0xD Malloc(12) 4+12+0 = 16 size | alloc = 0x8 | 12 = 0x1A Malloc(13) 4+13+7 = 24 size | alloc = 0x8 | 13 = 0x1B ๊ฐ„์ ‘ ๋ฆฌ์ŠคํŠธ : Free ๋ธ”๋ก ์ฐพ๊ธฐ First fit Next fit Best fit ๊ฐ„์ ‘ ๋ฆฌ์ŠคํŠธ : ๊ฒฐํ•ฉ (Coalescing) freeํ• ๋•Œ ํ•ด๋‹น ๋ธ”๋ก์˜ ํ• ๋‹น ํ”Œ๋ž˜๊ทธ๋งŒ 0์œผ๋กœ ์„ธํŒ… -> ์ž˜๋ชป๋œ ๋‹จํŽธํ™” ๋ฐœ์ƒ freeํ•˜๋Š” ๋ธ”๋ก์˜ ์ด์ „๊ณผ ๋‹ค์Œ ๋ธ”๋ก์„ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•ด์„œ ๋” ํฐ free๋ธ”๋ก์„ ๋งŒ๋“ ๋‹ค ๊ฐ„์ ‘ ๋ฆฌ์ŠคํŠธ : ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๊ฒฝ๊ณ„ ํƒœ๊ทธ (Boundary tags) header๋ฅผ ๋ณต์ œํ•ด์„œ ๋ธ”๋ก์˜ ๋งˆ์ง€๋ง‰์— ๋„ฃ๋Š”๋‹ค (-> footer) 13-memory-2 ์ง์ ‘ ๋ฆฌ์ŠคํŠธ ๊ฐ€์šฉ ๋ธ”๋ก๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋งŒ์„ ๊ด€๋ฆฌํ•˜๋ฉด, ๋ชจ๋“  ๋ธ”๋ก์„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค ์—ฐ๊ฒฐ ๋งํฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์˜ ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•˜๋‹ค ์ง์ ‘ ๋ฆฌ์ŠคํŠธ : Free ์ƒˆ๋กญ๊ฒŒ ๋ฐ˜ํ™˜ํ•œ ๋ธ”๋ก์€ ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ์˜ ์–ด๋А ์œ„์น˜์— ๋ผ์›Œ ๋„ฃ์–ด์•ผ ํ•˜๋Š”๊ฐ€? LIFO (last in first out) ์ •์ฑ… : ๋ฐ˜ํ™˜๋ธ”๋ก์„ ๋ฆฌ์ŠคํŠธ ๋งจ ์•ž์— ๋ผ์›Œ๋„ฃ๋Š” ๋ฐฉ๋ฒ• -> ๋น ๋ฅธ ์‹œ๊ฐ„, ๋‚˜์œ ๋‹จํŽธํ™” ์„ฑ๋Šฅ ์ฃผ์†Œ์ •๋ ฌ ์ •์ฑ… : ๋ธ”๋ก๋“ค์˜ ์ฃผ์†Œ๊ฐ€ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์‚ฝ์ž… -> ๋А๋ฆฐ ์‹œ๊ฐ„, ์šฐ์ˆ˜ํ•œ ๋‹จํŽธํ™” ์„ฑ๋Šฅ ์ง์ ‘๋ฆฌ์ŠคํŠธ <-> ๊ฐ„์ ‘๋ฆฌ์ŠคํŠธ ํ• ๋‹น์‹œ๊ฐ„์ด ์ „์ฒด ๋ธ”๋ก์˜ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ€์šฉ๋ธ”๋ก ์ˆ˜์— ๋น„๋ก€ํ•œ๋‹ค ํ• ๋‹น๊ณผ ๋ฐ˜ํ™˜ ๊ณผ์ •์ด ๋ณต์žกํ•˜๋‹ค. ๋งํฌ ํฌ์ธํ„ฐ ์ €์žฅ์„ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค (๋ธ”๋ก๋งˆ๋‹ค 2์›Œ๋“œ ์ถ”๊ฐ€ ํ•„์š”) ๊ตฌ๋ถ„ ๊ฐ€์šฉ ๋ฆฌ์ŠคํŠธ (segrated free list) ๊ฐ ํฌ๊ธฐ ํด๋ž˜์Šค๋“ค์€ ํด๋ž˜์Šค๋งˆ๋‹ค์˜ ๋ธ”๋ก๋“ค์„ ๊ด€๋ฆฌํ•œ๋‹ค ํฌ๊ธฐ n์˜ ๋ธ”๋ก ํ• ๋‹น ๋ฐฉ๋ฒ• ํฌ๊ธฐ n์˜ ๋ธ”๋ก ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ธ”๋ก์„ ํ• ๋‹นํ•œ๋‹ค. ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ ํŽ˜์ด์ง€๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค (OS๋กœ๋ถ€ํ„ฐ sbrk()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ) ์ด ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ๋ธ”๋ก๋“ค๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ธ”๋ก์„ ํ• ๋‹นํ•œ๋‹ค ๋ธ”๋ก ๋ฐ˜ํ™˜ ๋ฐฉ๋ฒ• ๊ฐ€์šฉ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ ๋ธ”๋ก ์—ฐ๊ฒฐ ํ›„ ํ•ด๋‹น ํด๋ž˜์Šค ๊ฐ€์šฉ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ ์žฅ์  ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰ ์šฐ์ˆ˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ด์šฉ๋ฅ 
new 08_connect_DB
๐Ÿƒ Spring
DataSource ์„ค์ • AppCtx.java 1 @Bean(destroyMethod = "close") 2 public DataSource dataSource() { 3 DataSource ds = new DataSource(); 4 ds.setDriverClassName("com.mysql.jdbc.Driver"); 5 ds.setUrl("jdbc:mysql://localhost/spring5fs?"+ 6 "enabledTLSProtocols=TLSv1.2&"+ 7 "useSSL=false&"+ 8 "characterEncoding=utf8"); 9 ds.setUsername("spring5"); 10 ds.setPassword("spring5"); 11 ds.setInitialSize(2); 12 ds.setMaxActive(10); 13 ds.setTestWhileIdle(true); 14 ds.setMinEvictableIdleTimeMillis(60000 * 3); 15 ds.setTimeBetweenEvictionRunsMillis(10 * 1000); 16 return ds; 17 } Query ์‹คํ–‰ JdbcTemplate์„ ์ด์šฉํ•œ select 1jdbcTemplate.query( 2"select * from MEMBER where EMAIL = ?", 3new RowMapper<Member>() { 4 @Override 5 public Member mapRow(ResultSet rs, int rowNum) 6 throws SQLException { 7 Member member = new Member( 8 rs.getString("EMAIL"), 9 rs.getString("PASSWORD"), 10 rs.getString("NAME"), 11 rs.getTimestamp("REGDATE").toLocalDateTime()); 12 member.setId(rs.getLong("ID")); 13 return member; 14 } 15 }, 16 email); PreparedStatementCreater๋ฅผ ์ด์šฉํ•œ update 1jdbcTemplate.update(new PreparedStatementCreator() { 2 @Override 3 public PreparedStatement createPreparedStatement(Connection con) 4 throws SQLException { 5 PreparedStatement pstmt = con.prepareStatement( 6 "insert into MEMBER (EMAIL, PASSWORD, NAME, REGDATE) values (?, ?, ?, ?)"); 7 pstmt.setString(1, member.getEmail()); 8 pstmt.setString(2, member.getPassword()); 9 pstmt.setString(3, member.getName()); 10 pstmt.setTimestamp(4, Timestamp.valueOf(member.getRegisterDateTime())); 11 12 return pstmt; 13 } 14}) java.sql.SQLException: Unable to load class: come.mysql.jdbc.Driver from … ์˜ค๋ฅ˜๋ฅผ ์ž˜ ๋ณด์ž… come.mysql… ์˜คํƒ€๋กœ ์ธํ•œ ๋ฌธ์ œ์˜€๋‹ค java.sql.SQLException: Unable to load authentication plugin ‘caching_sha2_password’. mysql ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ ๋ฐฉ์‹์— ๋”ฐ๋ฅธ ์˜ค๋ฅ˜์ด๋‹ค ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : mysql์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ๋ฐฉ์‹์„ ๋ฐ”๊พธ์ž 1ALTER USER '์‚ฌ์šฉ์ž'@'localhost' IDENTIFIED WITH mysql_native_password BY '๋น„๋ฐ€๋ฒˆํ˜ธ'; javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) url์— enabledTLSProtocols=TLSv1.2๋ฅผ ์ง€์ •ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค urlํ˜•์‹๋•Œ๋ฌธ์— ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์กฐ๊ธˆ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ URL ํ˜•์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค ๊ธฐ์–ตํ•˜์ž jdbc:mysql://localhost/spring5fs?์†์„ฑ1=๊ฐ’1&์†์„ฑ2=๊ฐ’2…" Transaction ์ฒ˜๋ฆฌ Transaction ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ๋‹จ์œ„ ๋ฐฐ๊ฒฝ ์ฟผ๋ฆฌ ๋‘ ๊ฐœ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๋งŒ์•ฝ 2๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ 1๋ฒˆ์งธ ์ฟผ๋ฆฌ ์‹คํ–‰ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋Š” (๋กค๋ฐฑ) ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค ์ด์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ ๋‘ ๊ฐœ๋ฅผ ๋ฌถ์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— Transaction์„ ์ด์šฉํ•œ๋‹ค. rollback ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, Spring์—์„œ๋Š” @Transactional์„ ์ด์šฉํ•ด ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. AppCtx.java 1@Bean 2public PlatformTransactionManager transactionManager() { 3 DataSourceTransactionManager tm = new DataSourceTransactionManager(); 4 tm.setDataSource(dataSource()); 5 return tm; 6} ChangePasswordService.java 1@Transactional 2public void changePassword(String email, String oldPwd, String newPwd) { 3 Member member = memberDao.selectByEmail(email); 4 5 if (member == null) 6 throw new MemberNotFoundException(); 7 8 member.changePassword(oldPwd, newPwd); 9 memberDao.update(member); 10} ํŠธ๋žœ์žญ์…˜ ๊ด€๋ จ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ logback.xml 1<?xml version="1.0" encoding="UTF-8"> 2 3<configuration> 4 <appender name="stdout" class="chqos.logback.core.ConsoleAppender"> 5 <encoder> 6 <pattern>%d %5p %c{2} - %m%n</pattern> 7 </encoder> 8 </appender> 9 <root level="INFO"> 10 <appender-ref ref="stdout" /> 11 </root> 12 13 <logger name="org.springframework.jdbc" level="DEBUG" /> 14</configuration> ๋กœ๊ทธ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฐ์›Œ๋ณด์•˜๋‹ค. Transaction ์ „ํŒŒ 1public class SomeService { 2 private AnyService anyService; 3 4 @Transactional 5 public void some() { 6 anyService.any(); 7 } 8 9 public void setAnyService(AnyService as) { 10 anyService = as; 11 } 12} 13 14public class AnyService { 15 @Transactional 16 public void any() { ... } 17} some๋ฉ”์†Œ๋“œ๊ฐ€ any๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ๋Š” ๋ฉ”์†Œ๋“œ ๋‘˜ ๋‹ค @Transactional์ด ๋ถ™์–ด์žˆ์ง€๋งŒ ๋งŒ์•ฝ ๋ถ™์–ด์žˆ์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์ด๋ ‡๊ฒŒ ๋ฉ”์†Œ๋“œ ๊ฐ„ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•  ๋•Œ ํŠธ๋žœ์žญ์…˜์ด ์œ ์ง€๋˜๋Š” ๊ฒƒ์„ ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ๋ผ๊ณ  ํ•œ๋‹ค. @Transactional annotation์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ ์ค‘ propagation์ด ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒํƒ€์ž…์„ ์ง€์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’ : REQUIRED : ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์กด์žฌํ•˜๋ฉด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ, ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•œ๋‹ค
new React - column์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ
๐ŸŒ Javascript
Table์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ column๋ณ„๋กœ ์ •๋ ฌํ•ด์•ผ ํ•œ๋‹ค ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์— ๋”ฐ๋ผ comparator๋ฅผ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค 1const comparatorStr = (a, b, order) => { 2 if (order === Order.ASC) return a.localeCompare(b); 3 return b.localeCompare(a); 4}; 5 6const comparatorInt = (a, b, order) => { 7 if (order === Order.ASC) return a > b ? 1 : -1; 8 return a < b ? 1 : -1; 9}; ์ •๋ ฌํ•  ํ‚ค๋‚˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€”๋•Œ ๋งˆ๋‹ค ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค 1useEffect(() => { 2 if (sortBy === Key.NAME) 3 setStateList( 4 [...stateList].sort((a, b) => comparatorStr(a.name, b.name, sortOrder)) 5 ); 6 else if (sortBy === Key.SIZE) 7 setStateList( 8 [...stateList].sort((a, b) => comparatorInt(a.size, b.size, sortOrder)) 9 ); 10}, [sortBy, sortOrder]); ์ •๋ ฌํ•  ํ‚ค, ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •ํ•œ๋‹ค 1const sortHandle = (key) => { 2 // (ํ˜„์žฌ ์„ ํƒ ๋œ ํ‚ค๋ฅผ ๋‹ค์‹œ ๋ˆŒ๋ €์„ ๋•Œ && ํ˜„์žฌ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์ผ ๋•Œ) -> ๋‚ด๋ฆผ์ฐจ์ˆœ 3 if (sortBy === key && sortOrder === Order.ASC) setSortOrder(Order.DESC); 4 // ๋‚˜๋จธ์ง€ ๋ชจ๋“  ๊ฒฝ์šฐ -> ์˜ค๋ฆ„์ฐจ์ˆœ 5 else setSortOrder(Order.ASC); 6 // update sortBy 7 setSortBy(key); 8}; ๋А๋‚€ ์  ๋‚˜๋ฆ„ ์‹ ๊ฒฝ์ผ๋Š”๋ฐ UI์ธก๋ฉด์—์„œ ๋‚ด ๋ฐฉ์‹์ด ์ ์ ˆํ•œ ๋ฐฉ์‹์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.
new MVC 1 : Request Mapping, Command Object, Redirect, Form Tag, Model
๐Ÿƒ Spring
Request Mapping GetMapping/PostMapping์œผ๋กœ ์ฒ˜๋ฆฌํ•  method๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ RequestMapping์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Access request parameter : HttpServletRequest 1@PostMapping("/register/step2") 2public String handleStep2(HttpServletRequest request) { 3 String agreeParam = request.getParameter("agree"); 4 if (agreeParam == null || !agreeParam.equals("true")) { 5 return "register/step1"; 6 } 7 return "register/step2"; Access request parameter : RequestParam Annotation 1@PostMapping("/register/step2") 2public String handleStep2( 3@RequestParam(value="agree", defaultValue="false") Boolean agree) { 4 if (!agree) { 5 return "register/step1"; 6 } 7 return "register/step2"; Redirect 1@GetMapping("/register/step2") 2public String handleStep2Get() { 3 return "redirect:/register/step1"; Command Object Use request parameter as command object RegisterController.java 1@PostMapping("/register/step3") 2public String handleStep3(RegisterRequest regReq) {...} step3.jsp 1<p><strong>${registerRequest.name}๋‹˜</strong></p> UnsatisfiedDependencyException: Error creating bean with name ‘controllerConfig’: Unsatisfied dependency expressed through field ‘memberRegSvc’; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘spring.MemberRegisterService’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} web.xml 1<param-value> 2 config.MvcConfig 3 4 <!-- new!! --> 5 config.MemberConfig 6 7 config.ControllerConfig 8</param-value> web.xml์— MemberConfig ํด๋ž˜์Šค๊ฐ€ ๋น ์ ธ์žˆ์–ด์„œ bean์ด ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•„ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์ด๋‹ค Custom Tag : Form 1<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 2<!-- ... --> 3<form:form action="step3" modelAttribute="registerRequest"> 4 <!-- ... --> 5 <form:input path="email" 6/></form:form> Spring MVC์—์„œ ์ง€์›ํ•˜๋Š” Custom Tag๋ฅผ ์ด์šฉํ•ด Command ๊ฐ์ฒด์™€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. jsp๋กœ for๋ฌธ ์‚ฌ์šฉํ•˜๊ธฐ 1<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 2<!-- ... --> 3<c:forEach var="response" items="${ansData.responses}" varStatus="status"> 4 <li>${status.index + 1}๋ฒˆ ๋ฌธํ•ญ: ${response}</li> 5</c:forEach> jsp๋กœ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ 1@GetMapping 2public String form(Model model) { 3 List<Question> questions = createQuestions(); 4 model.addAttribute("questions", questions); 5 return "survey/surveyForm"; 6} 1<c:forEach var="q" items="${questions}" varStatus="status"></c:forEach> ModelAndView ํ™œ์šฉ 1@GetMapping 2public ModelAndView form(Model model) { 3 List<Question> questions = createQuestions(); 4 ModelAndView mav = new ModelAndView(); 5 mav.addObject("questions", questions); 6 mav.setViewName("survey/surveyForm"); 7 return mav; 8} ๋ฐ์ดํ„ฐ ์„ค์ •, ๋ทฐ์ด๋ฆ„ ๋ฆฌํ„ด ๋‘๊ฐ€์ง€๋ฅผ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค
new React - useEffect ์‚ฌ์šฉ๋ฒ•
๐ŸŒ Javascript
component๊ฐ€ rendering ๋  ๋•Œ ์‹คํ–‰ 1useEffect(()=> { 2 ... 3}); component๊ฐ€ mount ๋  ๋•Œ (์ฒ˜์Œ rendering ๋  ๋•Œ) ์‹คํ–‰ 1useEffect(()=> { 2 ... 3}, []); component๊ฐ€ update ๋  ๋•Œ (props, states๊ฐ€ ๋ฐ”๋€” ๋•Œ) ์‹คํ–‰ 1useEffect(()=> { 2 ... 3}, [{ props or states }]); component๊ฐ€ unmount ๋  ๋•Œ ๋˜๋Š” update๋˜๊ธฐ ์ง์ „์— ์‹คํ–‰ 1useEffect(()=> { 2 return () => { 3 ... 4 }; 5}, []);
new React - environment variable ์„ค์ •ํ•˜๊ธฐ
๐ŸŒ Javascript
ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐœ๋ฐœ/๋ฐฐํฌ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ณ€์ˆ˜๋ฅผ ๋‹ฌ๋ฆฌํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ react์—์„œ๋Š” .env.development , .env.production ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. react๋Š” ์•ž์— ‘REACT_APP’ ์„ ๋ถ™์—ฌ์•ผ ์ธ์‹์ด ๋œ๋‹ค๊ณ ํ•œ๋‹ค. ์„ค์ • .env.development 1REACT_APP_HOST=localhost .env.production 1REACT_APP_HOST=192.168.0.1 ์‚ฌ์šฉ 1${process.env.REACT_APP_HOST}
new React - build ์ดํ›„ ๋นˆ ํ™”๋ฉด๋งŒ ๋‚˜์˜ค๋Š” ๋ฌธ์ œ
๐ŸŒ Javascript
build ๊ฒฐ๊ณผ๋ฌผ์„ ๋Œ๋ฆฌ๋ฉด ๋นˆ ํ™”๋ฉด๋งŒ ๋‚˜์˜ค๋Š” ๋ฌธ์ œ static files ๋กœ๋”ฉ์— ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์ž ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด index.html์˜ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•˜์ž react-router๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด url์„ ํ™•์ธํ•˜์ž deployํ• ๋•Œ root url์ด ์•„๋‹ˆ๋ผ๋ฉด router์— basename์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•œ๋‹ค. 1<Router basename="/index">...</Router>
  • ««
  • «
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
  • »»
๐Ÿง  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)