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 Spring ๊ฐœ๋… - Maven
๐Ÿƒ Spring
Maven coordinates groupId : ํšŒ์‚ฌ๋‚˜ ๋‹จ์ฒด๋ช… ex) org.springframework, org.prgms artifactId : ํ”„๋กœ์ ํŠธ ๋ช… ex) spring-context, order-api version : ํ”„๋กœ์ ํŠธ ๋ฒ„์ „ ex) 5.2.15-RELEASE, 1.0-SNAPSHOT Build lifecycle validate, compile, test, package, verify, install, deploy Trnsitive Dependencies 1A 2โ”œโ”€โ”€ B 3โ”‚ โ””โ”€ C 4โ””โ”€โ”€ D C๋Š” A์˜ transitive ์˜์กด์„ฑ Dependency Scope (<scope>) compile(default) : ์ปดํŒŒ์ผ, ํ…Œ์ŠคํŠธ, ์‹คํ–‰์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ• ๋•Œ provided : JDK ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ• ๋•Œ (JSP, servlet) runtime : ์‹คํ–‰๊ณผ ํ…Œ์ŠคํŠธ์—๋งŒ ์‚ฌ์šฉ๋ ๋•Œ (JDBC driver) test : ํ…Œ์ŠคํŠธ ์ปดํŒŒ์ผ ๋ฐ ์‹คํ–‰์—๋งŒ ํ•„์š”ํ• ๋•Œ (easymock, junit) system: provided์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž๊ฐ€ jarํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์ง€์ • example 1<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>org.prgms</groupId> 6 <artifactId>academy-maven</artifactId> 7 <version>1.0-SNAPSHOT</version> 8 <packaging>jar</packaging> 9 10 <name>academy-maven</name> 11 <url>http://maven.apache.org</url> 12 13 <properties> 14 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 15 </properties> 16 17 <dependencies> 18 <dependency> 19 <groupId>junit</groupId> 20 <artifactId>junit</artifactId> 21 <version>3.8.1</version> 22 <scope>test</scope> 23 </dependency> 24 </dependencies> 25</project>
new Record
โ˜• Java
๋ ˆ์ฝ”๋“œ๋ž€ ๋ถˆ๋ณ€(immutable) ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ํด๋ž˜์Šค JDK16๋ถ€ํ„ฐ ์ง€์› ์˜ˆ์ œ Record ์ ์šฉ ์ „ 1public class Person { 2 private final String name; 3 private final int age; 4 5 public Person(String name, int age) { 6 this.name = name; 7 this.age = age; 8 } 9 10 public String getName() { 11 return name; 12 } 13 14 public int getAge() { 15 return age; 16 } 17} Record ์ ์šฉ ํ›„ 1public record Person(String name, int age) {} Record์—์„œ ์ง€์›ํ•˜๋Š” ๊ฒƒ Constructor, Getter, equals(), hashcode(), toString() Record์˜ ์ œ์•ฝ ์‚ฌํ•ญ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค, ๊ตฌํ˜„(implements)๋Š” ๊ฐ€๋Šฅ static field๋งŒ ์„ ์–ธ ๊ฐ€๋Šฅํ•˜๋‹ค (instance field ๋ถˆ๊ฐ€๋Šฅ) ๊ฐ field๋Š” private final๋กœ ์ •์˜๋œ๋‹ค Record์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ปดํŒฉํŠธ ์ƒ์„ฑ์ž : ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž, validate ์‚ฌ์šฉ์‹œ ์ ํ•ฉ 1public record Person(String name, int age) { 2 public Person { 3 Objects.requireNonNull(name); 4 Objects.requireNonNull(age); 5 } 6}
new Spring ๊ฐœ๋… - Logging
๐Ÿƒ Spring
Java Logging Framework java.util.logging Apache Commons logging Log4J Logback SLF4J SLF4J (Simple Loggin Facade for Java) Loggin Framework๋“ค์„ ์ถ”์ƒํ™”์‹œ์ผœ ๋†“์€ ๊ฒƒ Facade Pattern์„ ์ด์šฉํ•œ Logging framework Log Level trace - debug - info - warn - error Logger Logger ๋งŒ๋“ค๊ธฐ 1private static final Logger logger = LoggerFactory.getLogger(OrderTester.class); Logger ์ด๋ฆ„์€ ๋ณดํ†ต FQCN (์ƒ์œ„ ํŒจํ‚ค์ง€ + ํด๋ž˜์Šค)์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค Logger ์‚ฌ์šฉ 1logger.info("version -> {}", logger.getName()); logback logback ์„ค์ •ํŒŒ์ผ ์šฐ์„ ์ˆœ์œ„ logback-test.yml -> logback.groovy -> logback.xml -> ๊ธฐ๋ณธ ์„ค์ • logback.xml - ๊ธฐ๋ณธ ์„ค์ • 1<configuration> 2<property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{10} - %msg%n" /> 3 4<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 5 <encoder> 6 <pattern>${LOG_PATTERN}</pattern> 7 </encoder> 8</appender> 9 <root level="debug"> 10 <appender-ref ref="STDOUT" /> 11 </root> 12</configuration> FileAppender๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์— ์ €์žฅ ๊ฐ€๋Šฅ RollingFileappender๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์ž๋ณ„๋กœ ํŒŒ์ผ์— ์ €์žฅ ๊ฐ€๋Šฅ ์ด์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์„ค์ • ๊ฐ€๋Šฅ Conversion ๋กœ๊น… ํฌ๋งท์„ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค json์œผ๋กœ ํ˜•์‹์„ ๋ฐ”๊พผ๋‹ค๋˜๊ฐ€, ์ฝ˜์†”์—์„œ ๋กœ๊ทธ์— ์ƒ‰์„ ์ž…ํž์ˆ˜ ์žˆ๋‹ค. Color Converter ์‚ฌ์šฉ ์˜ˆ์ œ logback.xml ์„ค์ • 1<!-- logback.xml --> 2 <conversionRule 3 conversionWord="clr" 4 converterClass="org.springframework.boot.logging.logback.ColorConverter" /> 5 {...} 6 <pattern>%clr(%d{HH:mm:ss.SSS}){cyan} [%thread] %clr(%-5level)</pattern> Ansi๋ฌธ์ž ์ถœ๋ ฅ ์„ค์ • 1// MainClass.java 2AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
new Spring ๊ฐœ๋… - IoC (Inversion of Control)
๐Ÿƒ Spring
IoC (Inversion of Control) ์ œ์–ด์˜ ์—ญ์ „ ๋ฉ”์†Œ๋“œ๋‚˜ ๊ฐ์ฒด์˜ ํ˜ธ์ถœ ์ž‘์—…์ด, ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๋ผ, ์™ธ๋ถ€์—์„œ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ด๊ณ  ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ํ•œ๋‹ค IoC Container IoC๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ณณ, IoC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์ƒ IoC ํด๋ž˜์Šค ์˜ˆ์ œ 1 public class OrderContext { 2 public OrderRepository orderRepository() { 3 return new OrderRepository(); 4 } 5 6 public OrderService orderService() { 7 return new OrderService(voucherService(), orderRepository()); 8 } 9 } ์œ„ ์˜ˆ์ œ์—์„œ OrderContext ํด๋ž˜์Šค๊ฐ€ IoC ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค BeanFactory Spring container์˜ ์ตœ์ƒ์œ„ interface Bean์„ ์ƒ์„ฑํ•˜๊ณ  ์˜์กด๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ IoC ์ปจํ…Œ์ด๋„ˆ Lazy-loading ๋ฐฉ์‹ ์‚ฌ์šฉ : Bean์„ ์‚ฌ์šฉํ• ๋•Œ loading -> ๊ฒฝ๋Ÿ‰ ์ปจํ…Œ์ด๋„ˆ ApplicationContext BeanFactroy์˜ ๊ตฌํ˜„์ฒด Eager-loading ๋ฐฉ์‹ : Runtime์— Bean์„ loading <-> Lazy-loading AnnotationConfigApplicationContext ApplicationContext์˜ ๊ตฌํ˜„์ฒด Annotation ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹ <-> XML๋ฐฉ์‹
new Spring ๊ฐœ๋… - Environment
๐Ÿƒ Spring
application.properties ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • application.properties ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค ํŒŒ์ผ ์œ„์น˜ : reousrces/application.properties ํŒŒ์ผ ๋‚ด์šฉ ์˜ˆ์‹œ : key = value ํ˜•ํƒœ app.name = spring Configuration์— ์„ค์ •ํ•œ๋‹ค 1@Configuration 2@PropertySource("application.properties") 3public class AppConfiguration {...} ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ€์ ธ์˜ค๊ธฐ ApplicationContext ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• 1var environment = applicationContext.getEnvironment(); 2var property = environment.getProperty("app.name") @Value Annotation ํ™œ์šฉ 1@Value("${app.name}") 2private String name; ๋ณ„๋„์˜ ํด๋ž˜์Šค ์ •์˜ ํด๋ž˜์Šค ์ •์˜ 1@Component 2@PropertySource("version.properties") 3public class VersionProvider { 4 private final String version; 5 6 public VersionProvider(@Value("${version:v0.0.0}") String version) { 7 this.version = version; 8 } 9 10 public String getVersion() { 11 return version; 12 } 13} ์‚ฌ์šฉ 1private final VersionProvider versionProvider; 2versionProvider.getVersion(); application.yaml ์žฅ์  ๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์ด ์ ๊ณ , ์ง๊ด€์ ์ด๋‹ค ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • application.yml ์ž‘์„ฑ 1env: 2 version: "v1.0.0" ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ€์ ธ์˜ค๊ธฐ AppConfiguration.java 1@Component 2@ConfigurationProperties(prefix="env") 3public class AppConfiguration { 4 private String version; 5 6 public String getVersion() { 7 return version; 8 } 9 10 public void setVersion(String version) { 11 this.version = version; 12 } 13} main 1var appConfiguration = applicationContext.getBean(AppConfiguration.class); 2System.out.println(appConfiguration.getVersion());
new Spring ๊ฐœ๋… - Profile
๐Ÿƒ Spring
Profile ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ํ™˜๊ฒฝ์œผ๋กœ ๋‚˜๋ˆ ์„œ ์‹คํ–‰ํ•ด์•ผํ• ๋•Œ๊ฐ€ ์žˆ๋‹ค ํ™˜๊ฒฝ ์„ค์ •์„ ์œ„ํ•ด spring boot์—์„œ๋Š” profile์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ application.yml 1spring.config.activate.on-profile: dev 2env: 3 version: "v1.0.0 dev" 4--- 5spring.config.activate.on-profile: local 6env: 7 version: "v1.0.0 local" 8--- yml ํŒŒ์ผ์—์„œ๋Š” —๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ ๋ถ„ํ• ์ด ๊ฐ€๋Šฅํ•˜๋‹ค spring.config.active.on-profile์„ ์„ค์ •ํ•ด์„œ ํŠน์ • ํ”„๋กœํ•„์— ์ ์šฉํ•˜๊ณ  ์‹ถ์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ • ํ•  ์ˆ˜ ์žˆ๋‹ค. application-<profile>.properties .propertiesํŒŒ์ผ์—์„œ๋Š” ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์„ค์ •ํ•œ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด “dev"ํ”„๋กœํŒŒ์ผ์—์„œ ์ ์šฉ๋  ํŒŒ์ผ์€ “application-dev.properties"์ด๋‹ค. @Profile ํ”„๋กœํŒŒ์ผ๋งˆ๋‹ค Bean๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ์—์„œ๋Š” test ํ™˜๊ฒฝ์—์„œ๋งŒ TestBean์„ ๋“ฑ๋กํ•œ๋‹ค 1@Component 2@Profile("test") 3public class TestBean { ... }
new Issue - Jar ์‹คํ–‰ํ™˜๊ฒฝ์—์„œ ClassPathResource๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ
๐Ÿƒ Spring
์ƒํ™ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ClassPathResource๋ฅผ ๋ฌธ์ œ์—†์ด ๋ถˆ๋Ÿฌ์˜จ๋‹ค jar๋กœ packageํ•ด์„œ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค Caused by: java.lang.RuntimeException: Cannot read blacklist file at org.academy.springorder.blacklist.BlacklistRepository.list(BlacklistRepository.java:25) at org.academy.springorder.blacklist.BlacklistService.list(BlacklistService.java:16) at org.academy.springorder.CommandLineApplication.main(CommandLineApplication.java:66) ... 8 more ๋ฌธ์ œ์˜ ์ฝ”๋“œ 1 List<String> list = new ArrayList<String>(); 2 3 try { 4 list = Files.readAllLines(blacklist.getFile().toPath()); 5 } 6 catch (IOException e) { 7 throw new RuntimeException("Cannot read blacklist file"); 8 } ํ•ด๊ฒฐ readAllLines๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  InputStreamReader์™€ BufferedRearder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. 1List<String> list = new ArrayList<String>(); 2 3try { 4 InputStreamReader isr = new InputStreamReader(blacklist.getInputStream()); 5 BufferedReader br = new BufferedReader(isr); 6 7 String line; 8 while ((line = br.readLine()) != null) 9 list.add(line); 10 isr.close(); 11 br.close(); 12}
new Try with resources๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋ฐ˜๋‚ฉํ•˜๊ธฐ
โ˜• Java
๊ธฐ์กด ์ฝ”๋“œ - try-catch-finally ์‚ฌ์šฉ 1Connection connection = null; 2Statement statement = null; 3ResultSet resultSet = null; 4 5try { 6 connection = DriverManager.getConnection(/* SECRET */); 7 statement = connection.createStatement(); 8 9 resultSet = statement.executeQuery("select * from customers"); 10 11 while (resultSet.next()) { 12 var name = resultSet.getString("name"); 13 var customerId = UUID.nameUUIDFromBytes(resultSet.getBytes("customer_id")); 14 logger.info("Customer id:{}, name: {}", customerId, name); 15 } 16} catch (SQLException e) { 17 logger.error("Error while connecting to DB", e); 18 throw e; 19} 20finally { 21 try { 22 if (connection != null) connection.close(); 23 if (statement != null) statement.close(); 24 if (resultSet != null) resultSet.close(); 25 } catch (SQLException e) { 26 logger.error("Error while closing connection", e); 27 } 28} ๊ฐœ์„  ์ฝ”๋“œ - try with resource ์‚ฌ์šฉ 1try ( 2 var connection = DriverManager.getConnection(/* SECRET */); 3 var statement = connection.createStatement(); 4 var resultSet = statement.executeQuery("select * from customers"); 5) { 6 while (resultSet.next()) { 7 var name = resultSet.getString("name"); 8 var customerId = UUID.nameUUIDFromBytes(resultSet.getBytes("customer_id")); 9 logger.info("Customer id:{}, name: {}", customerId, name); 10 } 11} catch (SQLException e) { 12 logger.error("Error while connecting to DB", e); 13 throw e; 14} ์œ„ ์ฝ”๋“œ๋Š” JDBC๋ฅผ ์ด์šฉํ•ด DB์™€ ์—ฐ๊ฒฐํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ์ด๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. Try with resources ์‚ฌ์šฉ๋ฒ• 1try (/* ์ž์› ์ƒ์„ฑ */) { 2 /* ์ž์› ์‚ฌ์šฉ */ 3} catch (...) { 4 ... 5} 6/* ์ž์› ์ž๋™ ๋ฐ˜๋‚ฉ */ ์กฐ๊ฑด try with resources๋ฌธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ž์›์€ ๋ฐ˜๋“œ์‹œ AutoCloseble interface๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.
new Java - ์ด์ค‘ ์ค‘๊ด„ํ˜ธ์™€ Anti-Pattern
โ˜• Java
๊ธฐ์กด ์ฝ”๋“œ 1Map<String, Object> map = new HashMap<>(); 2map.put("customerId", customer.getCustomerId().toString().getBytes()); 3map.put("name", customer.getName()); 4map.put("email", customer.getEmail()); 5map.put("createdAt", Timestamp.valueOf(customer.getCreatedAt())); 6return map; Double Brace Initialization ์ ์šฉ ํ›„ 1return new HashMap<>() {{ 2 put("customerId", customer.getCustomerId().toString().getBytes()); 3 put("name", customer.getName()); 4 put("email", customer.getEmail()); 5 put("createdAt", Timestamp.valueOf(customer.getCreatedAt())); 6}}; ํšจ๊ณผ ์žฅ์  ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง„๋‹ค ๋‹จ์  ์ถ”๊ฐ€๋กœ ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค -> ๋ฉ”๋ชจ๋ฆฌ ์ถ”๊ฐ€ ์‚ฌ์šฉ ์ธ์Šคํ„ฐ์Šค ๋ฐ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ˆจ๊ฒจ์ง„ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค -> Memory Leak ์œ ๋ฐœ ๊ฐ€๋Šฅ -> ์•ˆํ‹ฐํŒจํ„ด์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค ์•ˆํ‹ฐํŒจํ„ด (Anti-pattern) ์‹ค์ œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์ด์ง€๋งŒ ๋น„ํšจ์œจ์ ์ด๊ฑฐ๋‚˜ ๋น„์ƒ์‚ฐ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€์–‘๋˜๋Š” ํŒจํ„ด ๊ฒฐ๋ก  ๋“๋ณด๋‹ค ์‹ค์ด ๋งŽ๋‹ค, ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž
new Spring ๊ฐœ๋… - Transaction (ํŠธ๋žœ์žญ์…˜)
๐Ÿƒ Spring
์ƒํ™ฉ ์†Œ๋น„์ž๊ฐ€ ํŒ๋งค์ž์˜ ๋ฌผ๊ฑด์„ ๊ตฌ๋งคํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ ์ค‘์ด๋ผ๊ณ  ํ•˜์ž ๋ฌผ๊ฑด์„ ์ƒ€์„๋•Œ, ๋ฌผ๊ฑด์˜ ๊ฐ€๊ฒฉ๋งŒํผ ํŒ๋งค์ž์˜ ๋ˆ์€ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ์†Œ๋น„์ž์˜ ๋ˆ์€ ๊ฐ์†Œ์‹œ์ผœ์•ผํ•œ๋‹ค ํŒ๋งค์ž์˜ ๋ˆ์€ ์ฆ๊ฐ€์‹œ์ผฐ๋Š”๋ฐ, ์†Œ๋น„์ž์˜ ๋ˆ์„ ๊ฐ์†Œ์‹œํ‚ค๋Š” ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค ์˜ค๋ฅ˜๊ฐ€ ๋‚œ ๊ฒฝ์šฐ, ํŒ๋งค์ž์˜ ๋ˆ์„ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ์ด์ „์œผ๋กœ Rollback ํ•ด์•ผ ํ•œ๋‹ค ์œ„์˜ ๋‘๊ฐ€์ง€ ์—ฐ์‚ฐ์€ ํ•˜๋‚˜์˜ Transaction์œผ๋กœ ๋ฌถ์—ฌ์„œ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค Transaction ๊ด€๋ฆฌ์˜ ์ข…๋ฅ˜ Programmatic transaction management (ํ”„๋กœ๊ทธ๋ž˜๋ฐ์  ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ) Transaction ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑ ์˜ˆ์ œ - TransactionManager ์‚ฌ์šฉ 1// Bean ๋“ฑ๋ก 2@Bean 3public PlatformTransactionManager platformTransactionManager(DataSource dataSource) { 4 return new DataSourceTransactionManager(dataSource); 5} 6// ์‚ฌ์šฉํ•  ๋•Œ 7// ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•œ๋‹ค 8var transaction = transactionManager.getTransaction(new DefaultTransactionDefinition()); 9try { 10 /* Business Logic */ 11 12 // Commitํ•˜์—ฌ db์— ๋ฐ˜์˜ํ•œ๋‹ค 13 transactionManager.commit(transaction); 14} catch (DataAccessException e) { 15 logger.error("Got error", e); 16 // ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ ์ด์ „ ์ƒํƒœ๋กœ Rollback ํ•œ๋‹ค 17 transactionManager.rollback(transaction); 18} Declarative transaction management (์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ) Transactino ๊ด€๋ จ ๋กœ์ง์„ Business logic๊ณผ ์™„์ „ํžˆ ๋ถ„๋ฆฌ ์˜ˆ์ œ - @Transactional ์‚ฌ์šฉ 1// configuration ํด๋ž˜์Šค์— ๋ถ™์—ฌ์ค€๋‹ค 2@EnableTransactionManagement 3 4// ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•˜๊ณ  ์‹ถ์€ ๋ฉ”์†Œ๋“œ์— ๋ถ™์—ฌ์ค€๋‹ค 5@Transactional 6public void createCustomers(List<Customer> customers) { 7 customers.forEach(customerRepository::insert); 8} Transaction Propagation (ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ) ์ถ”ํ›„ ๊ธฐ์ˆ  Transaction Isolation Level (ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€) ์ถ”ํ›„ ๊ธฐ์ˆ 
  • ««
  • «
  • 4
  • 5
  • 6
  • 7
  • 8
  • »
  • »»
๐Ÿง  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)