bong-u/til

๐Ÿ  home ๐Ÿˆ repository ๐Ÿ“ก rss
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 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 ์ปดํŒŒ์ผ๋Ÿฌ๊ฐœ๋ก 
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๊ฐœ์š” ์ปดํ“จํ„ฐ์™€ ์ธ๊ฐ„์ด ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ• ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์–ด์…ˆ๋ธ”๋ฆฌ์–ด์˜ ๋ฒˆ์—ญ๊ธฐ๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ(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 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 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 ๋ฐฑ์ค€ - 10844 : ์‰ฌ์šด ๊ณ„๋‹จ ์ˆ˜ (S1)
๐Ÿง  Algorithm
์ ‘๊ทผ์ด ์–ด๋ ค์›Œ ์ธํ„ฐ๋„ท์„ ์ฐธ๊ณ ํ–ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋ณด์ง€ ์•Š์•˜๋‹ค. ์ˆ˜์˜ ๊ธธ์ด๊ฐ€ i์ด๋ฉด์„œ ๋งˆ์ง€๋ง‰ ์ˆซ์ž๊ฐ€ j์ธ ๊ณ„๋‹จ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค. ์ ํ™”์‹์€ L[i][j] = L[i-1][j-1]+L[i-1][j+1] ์ด๋‹ค. 1N = int(input()) 2L = [[0]*12 for _ in range(100)] 3L[0] = [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] 4 5for i in range(1, N): 6 for j in range(1, 11): 7 L[i][j] = L[i-1][j-1]+L[i-1][j+1] 8 9print (sum(L[N-1])%1000000000)
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์—ฐ์† ์ˆ˜์—ด ํ•ฉ์˜ ๊ฐœ์ˆ˜ (L2)
๐Ÿง  Algorithm
์ฒซ๋ฒˆ์งธ ํ’€์ด 1def solution(elements): 2 result = set() 3 length = len(elements) 4 elements = elements*2 5 for i in range(length): 6 temp = 0 7 for j in range(length): 8 temp += elements[i+j] 9 result.add(temp) 10 11 return len(result) ๊ฐœ์„ ํ•œ ํ’€์ด 1def solution(elements): 2result = set() 3length = len(elements) 4for i in range(length): 5 temp = 0 6 for j in range(length): 7 temp += elements[(i+j)%length] 8 result.add(temp) 9 10return len(result) ๋ฌธ์ œ ์ฃผ์–ด์ง„ ์ •์ˆ˜ ๋ฐฐ์—ด๋กœ ์›ํ˜• ์ˆ˜์—ด์„ ๋งŒ๋“ ๋‹ค ์›ํ˜• ์ˆ˜์—ด์˜ ์—ฐ์†๋œ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ TC input [7,9,1,1,4] ouput 18 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ฒซ๋ฒˆ์งธ ํ’€์ด์—์„œ๋Š” ๋ฐฐ์—ด์„ 2๋ฐฐ๋กœ ๋Š˜๋ ค์„œ ์›ํ˜• ์ˆ˜์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค ๊ฐœ์„ ํ•œ ํ’€์ด์—์„œ๋Š” mod ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด์„œ ์›ํ˜• ์ˆ˜์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค set๋ฅผ ์ด์šฉํ•ด์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ์›์†Œ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์˜€๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์ด๋ชจํ‹ฐ์ฝ˜ ํ• ์ธํ–‰์‚ฌ (L2)
๐Ÿง  Algorithm
1result = [] 2 3def dfs(size, percent, users, emoticons): 4 global result 5 6 if len(percent) == size: 7 temp = [0] * len(users) 8 for i in range(size): 9 for j in range(len(users)): 10 if percent[i]*100 >= users[j][0]: 11 temp[j] += emoticons[i]*(1-percent[i]) 12 serviceNum = 0 13 income = 0 14 for i in range(len(users)): 15 if temp[i] >= users[i][1]: 16 serviceNum += 1 17 else: 18 income += temp[i] 19 result.append ((serviceNum, income)) 20 return 21 22 for i in [0.1, 0.2, 0.3, 0.4]: 23 dfs(size, percent+[i], users, emoticons) 24 25 26def solution(users, emoticons): 27 dfs(len(emoticons), [], users, emoticons) 28 result.sort(reverse=True) 29 return list(result[0]) ๋ฌธ์ œ ์นด์นด์˜คํ†ก ์‚ฌ์šฉ์ž n๋ช…์˜ ๊ตฌ๋งค ๊ธฐ์ค€์„ ๋‹ด์€ 2์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด users, ์ด๋ชจํ‹ฐ์ฝ˜ m๊ฐœ์˜ ์ •๊ฐ€๋ฅผ ๋‹ด์€ 1์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด emoticons๊ฐ€ ์ฃผ์–ด์ง„๋‹ค ๊ฐ ์‚ฌ์šฉ์ž๋Š” ์ผ์ • ๋น„์œจ ์ด์ƒ ํ• ์ธํ•˜๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์„ ๊ตฌ๋งคํ•œ๋‹ค ๊ฐ ์‚ฌ์šฉ์ž๋Š” ๊ตฌ๋งคํ•œ ์ด๋ชจํ‹ฐ์ฝ˜ ๊ฐ€๊ฒฉ์˜ ํ•ฉ์ด ์ผ์ • ๊ธฐ์ค€์„ ๋„˜์œผ๋ฉด ์ด๋ชจํ‹ฐ์ฝ˜ ๊ตฌ๋งค๋ฅผ ๋ชจ๋‘ ์ทจ์†Œํ•˜๊ณ  ์ด๋ชจํ‹ฐ์ฝ˜ ํ”Œ๋Ÿฌ์Šค ์„œ๋น„์Šค์— ๊ฐ€์ž…ํ•œ๋‹ค ํ• ์ธ์œจ์€ 10%, 20%, 30%, 40% ์ค‘ ํ•˜๋‚˜์ด๋‹ค ์ด๋ชจํ‹ฐ์ฝ˜ ํ”Œ๋Ÿฌ์Šค ์„œ๋น„์Šค์— ๊ฐ€์ž…์ž๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์„ ์ตœ์šฐ์„ ์œผ๋กœ ํ•˜๋ฉฐ, ์ด๋ชจํ‹ฐ์ฝ˜ ํŒ๋งค์•ก์„ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์„ ๋‘๋ฒˆ์งธ ๋ชฉํ‘œ๋กœ ํ–ˆ์„ ๋•Œ์˜ ์ด๋ชจํ‹ฐ์ฝ˜ ํ”Œ๋Ÿฌ์Šค ์„œ๋น„์Šค ๊ฐ€์ž…์ž ์ˆ˜์™€ ์ด๋ชจํ‹ฐ์ฝ˜ ๋งค์ถœ์•ก์„ 1์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•˜๋ผ TC input users: [[40, 10000], [25, 10000]], emoticons: [7000, 9000] ouput [1, 5400] ํ•ด๊ฒฐ๋ฐฉ๋ฒ• dfs๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์™„์ „ ํƒ์ƒ‰ํ•˜์—ฌ ํ•ด๊ฒฐํ•˜์˜€๋‹ค ํ• ์ธ์œจ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ 4๊ฐ€์ง€ ๋ฐ–์— ์—†์–ด์„œ ๊ฐ€๋Šฅํ–ˆ๋˜ ์ผ์ด๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ํ• ์ธ ํ–‰์‚ฌ (L2)
๐Ÿง  Algorithm
1from collections import deque 2 3def solution(want, number, discount): 4 want_dict = dict() 5 answer = 0 6 7 for i in range(len(want)): 8 want_dict[want[i]] = number[i] 9 10 for i in discount[:10]: 11 if i in want_dict: 12 want_dict[i] -= 1 13 14 for i in range(0, len(discount)-9): 15 if all(map(lambda x: x <= 0, want_dict.values())): 16 answer += 1 17 18 if discount[i] in want_dict: 19 want_dict[discount[i]] += 1 20 if i+10 < len(discount) and discount[i+10] in want_dict: 21 want_dict[discount[i+10]] -= 1 22 23 return answer ๋ฌธ์ œ XYZ๋งˆํŠธ์—์„œ๋Š” ํšŒ์›์— ๊ฐ€์ž…ํ•˜๋ฉด 10์ผ๋™์•ˆ ํ• ์ธํ˜œํƒ์„ ๋ฐ›๋Š”๋‹ค ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์€ ํ•˜๋ฃจ์— ํ•˜๋‚˜์”ฉ๋งŒ ๊ตฌ๋งคํ•  ์ˆ˜ ์žˆ๋‹ค ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ ๋ฆฌ์ŠคํŠธ, ์›ํ•˜๋Š” ์ œํ’ˆ์˜ ์ˆ˜๋Ÿ‰ ๋ฆฌ์ŠคํŠธ, ๋งˆํŠธ์—์„œ ํ• ์ธํ•˜๋Š” ์ œํ’ˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ์„ ๋ชจ๋‘ ํ• ์ธ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํšŒ์› ๋“ฑ๋ก ๋‚ ์งœ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ TC input want: [“banana”, “apple”, “rice”, “pork”, “pot”] number: [3, 2, 2, 2, 1] discount: [“chicken”, “apple”, “apple”, “banana”, “rice”, “apple”, “pork”, “banana”, “pork”, “rice”, “pot”, “banana”, “apple”, “banana”] ouput 5 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์›ํ•˜๋Š” ์ œํ’ˆ์„ dict๋กœ ๋งŒ๋“ ๋‹ค (key: ์ œํ’ˆ์ด๋ฆ„, value: ์ˆ˜๋Ÿ‰) ์›ํ•˜๋Š” ์ œํ’ˆ - ์ฒซ๋‚ ์— ๊ฐ€์ž…ํ–ˆ์„ ๋•Œ ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์„ ๊ณ„์‚ฐํ•œ๋‹ค ๋ฐ˜๋ณต๋ฌธ์„ ์ˆœํšŒํ•˜๋ฉด์„œ ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์„ ๋นผ๊ณ , ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์„ ๋”ํ•œ๋‹ค (์ œํ’ˆ์ด ๋” ํ•„์š”ํ•˜๋ฉด ์–‘์ˆ˜, ๋œ ํ•„์š”ํ•˜๋ฉด ์Œ์ˆ˜) 0๋ณด๋‹ค ํฐ ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด answer์— 1์„ ๋”ํ•œ๋‹ค
new ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ
๐ŸŽธ ๊ธฐํƒ€
๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ํ…Œ์ŠคํŠธ์˜ ๋ถ„๋ฅ˜ ๋ธ”๋ž™๋ฐ•์Šค ํ…Œ์ŠคํŠธ ํ™”์ดํŠธ๋ฐ•์Šค ํ…Œ์ŠคํŠธ ๋ชฉ์ ๊ณผ ๋ฒ”์œ„์— ๋”ฐ๋ฅธ ํ…Œ์ŠคํŠธ์˜ ๋ถ„๋ฅ˜ ์ˆ˜ํ–‰ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค. 1. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ (Unit Test) ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„ ์ˆ˜์ค€(๋ชจ๋“ˆ, ํ•จ์ˆ˜, ํด๋ž˜์Šค)์˜ ํ…Œ์ŠคํŠธ 2. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (Integration Test) ๋ชจ๋“ˆ์„ ํ†ตํ•ฉํ•˜๋Š” ๊ณผ์ •์—์„œ, ๊ฐ ๋ชจ๋“ˆ ๊ฐ„์˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ด€๋ จ๋œ ๊ฒฐํ•จ์ด ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธ Top-down : ์ƒ์œ„ ๋ชจ๋“ˆ๋ถ€ํ„ฐ ํ•˜์œ„ ๋ชจ๋“ˆ๋กœ ํ†ตํ•ฉํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ Bottom-up : ํ•˜์œ„ ๋ชจ๋“ˆ๋ถ€ํ„ฐ ์ƒ์œ„ ๋ชจ๋“ˆ๋กœ ํ†ตํ•ฉํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ Big-bang : ๋ชจ๋“  ๋ชจ๋“ˆ์„ ํ•œ๋ฒˆ์— ํ†ตํ•ฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ Threads : ์ค‘์š” ๋ชจ๋“ˆ์„ ๋จผ์ € ๊ตฌํ˜„ํ•˜๊ณ  ํ†ตํ•ฉํ•œ ๋’ค, ๋ณด์กฐ์ ์ธ ๋ชจ๋“ˆ์„ ๊ตฌํ˜„ ํ›„ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ์‹ 3. ์‹œ์Šคํ…œ ํ…Œ์ŠคํŠธ (System Test) ์ „์ฒด ์‹œ์Šคํ…œ์ด ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ (HW+SW) ์ฃผ์š” ๊ด€์  ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ๋น„๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ : ์„ฑ๋Šฅ, ์•ˆ์ •์„ฑ, ๋ณด์•ˆ, ์‚ฌ์šฉ์„ฑ ๋“ฑ ๊ธฐํƒ€ ๋น„๊ธฐ๋Šฅ์ ์ธ ์ธก๋ฉด์„ ํ‰๊ฐ€ E2E ํ…Œ์ŠคํŠธ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํ˜ธํ™˜์„ฑ ํ…Œ์ŠคํŠธ : ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ 4. ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ (Acceptance Test) ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ํ…Œ์ŠคํŠธ์˜ ๋ถ„๋ฅ˜ ์ •์  ํ…Œ์ŠคํŠธ ๋™์  ํ…Œ์ŠคํŠธ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ํ…Œ์ŠคํŠธ์˜ ๋ถ„๋ฅ˜ ๋ธ”๋ž™๋ฐ•์Šค ํ…Œ์ŠคํŠธ ํ™”์ดํŠธ๋ฐ•์Šค ํ…Œ์ŠคํŠธ ์ •์  ํ…Œ์ŠคํŠธ SW๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ํ…Œ์ŠคํŒ…ํ•˜๋Š” ๊ธฐ๋ฒ• ๋ฆฌ๋ทฐ ์—ฌ๋Ÿฌ ์ „๋ฌธ๊ฐ€๋“ค์ด ๋ชจ์—ฌ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•œ SW ๊ฐœ๋ฐœ ๋ฐ ์‚ฐ์ถœ๋ฌผ์„ ๊ฒ€ํ† ํ•˜๊ณ  ํ…Œ์ŠคํŒ…ํ•˜์—ฌ ๊ฒฐํ•จ์„ ๊ฒ€์ถœํ•˜๋Š” ๋ฐฉ๋ฒ• Inspection ์ „๋ฌธ์ ์ธ inspection team์ด ์ •ํ˜•ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ defect๋ฅผ ์ฐพ๋Š” ๋ฆฌ๋ทฐ ๊ธฐ๋ฒ• Planning -> Overview -> Preparation -> Meeting(Inspection) -> Rework -> Follow-up Peer Review (Technical Review) ๊ฐœ๋ฐœํŒ€์ด ์ฃผ๋„ํ•˜์—ฌ ์ง์ ‘ ๋ชจ์—ฌ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฆฌ๋ทฐ ๊ธฐ๋ฒ• PL ๋˜๋Š” TL์ด ์ฃผ๋„ํ•˜์—ฌ ๋ฆฌ๋ทฐ ๋Œ€์ƒ์„ ์„ ์ •, ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฆฌ๋ทฐ ์š”์ฒญ Walkthrough Peer Review์™€ ์œ ์‚ฌํ•˜๋‚˜ ๋ฌธ์„œ ์ž‘์„ฑ์ž๊ฐ€ ์ฃผ๋„ํ•˜๋Š” ๊ฐ€๋ฒผ์šด ๋งŒ๋‚จ ํ˜•ํƒœ ์ •์  ๋ถ„์„ (๋ฌด๊ธฐ์ฒด๊ณ„SW ๊ฐœ๋ฐœ ๋ฐ ๊ด€๋ฆฌ ๋งค๋‰ด์–ผ ๊ธฐ์ค€) ์ฝ”๋”ฉ ๊ทœ์น™ MISRA-C MISRA-C++ C# Coding conventions Code conventions for the Java Programming Language CWE(Common Weakness Enumeration) ์ ๊ฒ€ ์ผ๋ฐ˜์ ์ธ SW์™€ HW์˜ ๋ณด์•ˆ ์•ฝ์ ์„ ๋‚˜์—ดํ•œ ๊ณต์‹์ ์ธ ๋ฆฌ์ŠคํŠธ CWE-658 : C์–ธ์–ด CWE-659 : C++ CWE-660 : Java Code Metric ์ ๊ฒ€ Cyclomatic Complexity : ์ œ์–ด ํ๋ฆ„ ๊ทธ๋ž˜ํ”„์˜ ๋ณต์žก๋„ Number of call levels : ์กฐ๊ฑด๋ฌธ ์ค‘์ฒฉ์˜ ๊นŠ์ด Number of function parameters Number of calling function : ํ•จ์ˆ˜๊ฐ€ ๋ช‡ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š”๊ฐ€ Number of called functions : ํ•จ์ˆ˜๋ฅผ ๋ช‡ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š”๊ฐ€ Number of Executable code lines ๋™์  ํ…Œ์ŠคํŠธ ๋ช…์„ธ ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ (๋ธ”๋ž™๋ฐ•์Šค ๊ธฐ๋ฒ•) ๋™๋“ฑ ๋ถ„ํ•  ๊ฒฝ๊ณ„๊ฐ’ ๋ถ„์„ ๊ฒฐ์ • ํ…Œ์ด๋ธ” ํ…Œ์ŠคํŠธ ์ƒํƒœ ์ „์ด ํ…Œ์ŠคํŠธ ๋ถ„๋ฅ˜ ํŠธ๋ฆฌ ๊ธฐ๋ฒ• ์กฐํ•ฉ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ … ๊ตฌ์กฐ ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ (ํ™”์ดํŠธ๋ฐ•์Šค ๊ธฐ๋ฒ•) Statement Coverage Decision Coverage (Branch Coverage) Condition Coverage MC/DC Coverage Path Coverage Fuzzing ํ…Œ์ŠคํŠธ ์œ ํšจํ•œ, ์˜ˆ์ƒ์น˜ ์•Š์€ ๊ฐ’๋“ค์„ ๋ฌด์ž‘์œ„๋กœ ๋Œ€์ž…ํ•˜๋Š” ํ…Œ์ŠคํŠธ ๊ธฐ๋ฒ• ๋ณ€ํ˜• ๊ธฐ๋ฐ˜ Fuzzing (Dumb Fuzzing) ์ž…๋ ฅ ์ƒ˜ํ”Œ์„ Fuzzing ๋„๊ตฌ์— ์ œ๊ณต, Fuzzing ๋„๊ตฌ๊ฐ€ ์ด๋ฅผ ๋ณ€ํ˜•์‹œ์ผœ๊ฐ€๋ฉด์„œ ํ…Œ์ŠคํŠธ ์žฅ์  ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅ ์ž…๋ ฅ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋ถ„์„์„ ํ•˜์ง€ ์•Š์•„๋„ ๋จ ๋‹จ์  ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ฒดํฌ์„ฌ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ํšจํ•œ ์ž…๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์ด ์กด์žฌ ์ƒ์„ฑ ๊ธฐ๋ฐ˜ Fuzzing (Smart Fuzzing) ๋Œ€์ƒ ์‹œ์Šคํ…œ์— ์ž…๋ ฅ์‹œํ‚ฌ ๋ฐ์ดํ„ฐ๋ฅผ Fuzzing ๋„๊ตฌ๊ฐ€ ์ƒ์„ฑ ์žฅ์  ๋” ๋†’์€ Coverage๋กœ ์ด์–ด์ง€๋Š” ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ์ƒ์„ฑ ๋‹จ์  ์ž…๋ ฅ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ์„ ํ–‰๋˜์–ด์•ผ ํ•จ ๊ตฌํ˜„ ๋‚œ์ด๋„๊ฐ€ ๋†’์Œ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ (Regression Test) ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ƒˆ๋กœ์šด ๋ฒ„์ „์—์„œ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ์†์ƒ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ํšŒ๊ท€ ๋ฒ„๊ทธ(Regression Bug) : ์ด์ „์— ์กด์žฌํ•˜์ง€ ์•Š๋˜ ๋ฒ„๊ทธ๊ฐ€ ๊ธฐ๋Šฅ ์ˆ˜์ •์ด๋‚˜, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด ๋ฒ„์ „์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๊ทธ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ๋งŽ์•„ ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ์˜ ์ข…๋ฅ˜ Retest all ๊ธฐ๋ฒ• : ๊ธฐ์กด์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์—ฌ ์ „์ฒด ์‹œ์Šคํ…œ์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ• Selective retest ๊ธฐ๋ฒ• : ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋งŒ ์„ ํƒ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ• Prirority ๊ธฐ๋ฒ• : ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ• FIRST ์›์น™ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ 5์›์น™ Fast : ํ…Œ์ŠคํŠธ๋Š” ๋นจ๋ผ์•ผ ํ•œ๋‹ค. Independent : ํ…Œ์ŠคํŠธ๋Š” ์„œ๋กœ ๋…๋ฆฝ์ ์ด์–ด์•ผ ํ•œ๋‹ค. Repeatable : ํ…Œ์ŠคํŠธ๋Š” ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋„ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. Self-validating : ํ…Œ์ŠคํŠธ๋Š” ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ์—ฌ์•ผ ํ•œ๋‹ค. (bool ๊ฐ’) Timely : ํ…Œ์ŠคํŠธ๋Š” ์ ์‹œ์— ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. (์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ์ž‘์„ฑ)
new [๋ชจ๊ฐ์ฝ”23ํ•˜๊ณ„] 02 : ๊ฒฐ๊ณผ
๐Ÿ‘จโ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ”
1. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ•œ ๋ฌธ์ œ ํ’€๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋‹น๊ตฌ ์—ฐ์Šต (L2) ๐Ÿง  Algorithm <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1</span><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">solution</span>(m, n, startX, startY, balls): </span 2. Java์˜ Testing ๊ณต๋ถ€ํ•˜๊ธฐ Spring ๊ฐœ๋… - Testing ๐Ÿƒ Spring <h2 id="unit-test-๋‹จ์œ„-ํ…Œ์ŠคํŠธ">Unit Test (๋‹จ์œ„ ํ…Œ์ŠคํŠธ)</h2> <blockquote> <p>๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„ (ํด๋ž˜์Šค ๋˜๋Š” ๋ฉ”์†Œ๋“œ)๋ฅผ ๊ณ ๋ฆฝ์‹œ์ผœ์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ์‹</p> </blockquote> <h3 id="๊ด€๋ จ-์šฉ์–ด">๊ด€๋ จ ์šฉ์–ด</h3> <h4 id="sut-sytem-under-test">SUT (Sytem Under Test)</h4> <blockquote> <p>ํ…Œ์ŠคํŠธํ•˜๊ณ ์žํ•˜๋Š” ์ฃผ์š” ๋Œ€์ƒ์ด ๋˜๋Š” Unit</p> </blockquote> <h4 id="doc-depended-on-component">DOC (Depended On Component)</h4> <blockquote> <p>SUT๊ฐ€ ์˜์กดํ•˜๋Š” ๊ฐ์ฒด</p> </blockquote> <h4 id="test-double">Test double</h4> <blockquote> <p>DOC๋ฅผ ๋Œ€์‹ ํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด</p> </blockquote> <ul> <li>Test double์˜ ์ข…๋ฅ˜ : Moc
new [๋ชจ๊ฐ์ฝ”23ํ•˜๊ณ„] 02 : ๊ณ„ํš
๐Ÿ‘จโ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ”
์˜ค๋Š˜์˜ ๋ชฉํ‘œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ•œ ๋ฌธ์ œ ํ’€๊ธฐ Springboot Testing ๊ณต๋ถ€ํ•˜๊ธฐ
new [๋ชจ๊ฐ์ฝ”24ํ•˜๊ณ„] 05 : ๊ณ„ํš
๐Ÿ‘จโ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ”
์˜ค๋Š˜์˜ ๋ชฉํ‘œ Nginx์—์„œ HTTPS ์„ค์ •ํ•˜๊ธฐ
new Fastapi, RabbitMQ, Celery ์—ฐ๋™
๐Ÿ Python
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„์—์„œ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค. ์›น์†Œ์ผ“์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ gpt๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์›ํ™œํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„์‚ฐ ๋น„๋™๊ธฐ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ชฉํ‘œ Fastapi, RabbitMQ, Celery๋ฅผ ๊ฐ์ž docker ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ตฌ๋™์‹œํ‚ค๊ณ  ์—ฐ๋™ํ•œ๋‹ค. docker-compose.yml 1version: '3' 2 3services: 4 rabbitmq: 5 image: rabbitmq:3 6 ports: 7 - "5672:5672" # RabbitMQ์˜ AMQP ํฌํŠธ 8 - "15672:15672" # RabbitMQ ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค ํฌํŠธ 9 volumes: 10 - rabbitmq_data:/var/lib/rabbitmq 11 expose: 12 - "5672" 13 - "15672" 14 15 celery_worker: 16 build: 17 context: . 18 dockerfile: Dockerfile.worker 19 command: celery -A utils.celery_worker worker --loglevel=info 20 working_dir: /app 21 volumes: 22 - ./app/utils:/app/utils 23 environment: 24 - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672// 25 depends_on: 26 - rabbitmq 27 28 celery_beat: 29 image: celery:4 30 command: celery -A celery_beat beat --loglevel=info 31 working_dir: /app 32 environment: 33 - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672// 34 volumes: 35 - ./app/utils:/app 36 depends_on: 37 - rabbitmq 38 39 web: 40 image: python:slim 41 working_dir: /app 42 # interactive mode 43 stdin_open: true 44 # tty mode 45 tty: true 46 environment: 47 - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672// 48 volumes: 49 - ./app:/app 50 ports: 51 - "8000:8000" 52 depends_on: 53 - rabbitmq 54 - celery_worker 55 - celery_beat 56 57volumes: 58 rabbitmq_data: Celery worker์—๋งŒ Dockerfile.worker๋ฅผ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•œ ์ด์œ  worker์— ์ถ”๊ฐ€์ ์œผ๋กœ python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผํ•จ Celery ๊ณต์‹ ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ deprecated ๋˜์—ˆ์Œ. Fastapi๋Š” ์‹œ๊ฐ„ ๊ด€๊ณ„์ƒ ๋”ฐ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  python:slim ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. Dockerfile.worker 1FROM python:slim 2 3# ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜ 4# ffmpeg๊ฐ€ ํ•„์š”ํ•ด์„œ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค 5RUN apt-get update && \ 6apt-get install -y --no-install-recommends gcc libpq-dev ffmpeg && \ 7rm -rf /var/lib/apt/lists/* 8 9# ํ•„์š”ํ•œ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€ ์„ค์น˜ 10COPY requirements_celery_worker.txt ./ 11RUN pip install --no-cache-dir -r requirements_celery_worker.txt celery_worker.py 1import os 2from celery import Celery 3 4broker_url = os.getenv('CELERY_BROKER_URL') 5app = Celery('worker', broker=broker_url, backend="rpc://") 6 7@app.task 8def add(x, y): 9 return x + y broker_url์€ RabbitMQ์˜ AMQP ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. backend๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ๋ฐฑ์—”๋“œ๋กœ RabbitMQ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Celery worker ์‚ฌ์šฉ ๋ฐฉ๋ฒ• 1from celery_worker import add 2 3# task๋ฅผ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ 4result = add.delay(4, 4) 5 6# apply_async๋Š” delay์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰ 7# delay์™€ ๋‹ฌ๋ฆฌ ์ถ”๊ฐ€๋กœ ์—ฌ๋Ÿฌ ์˜ต์…˜์„ ์„ค์ • ๊ฐ€๋Šฅ 8result = add.apply_async((4, 4)) 9 10# ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด get()์„ ์‚ฌ์šฉ, ๋ธ”๋กœํ‚น ํ˜ธ์ถœ 11result.get() 12 13# ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์—… 14result.ready() 15 16# ์ž‘์—…์ด ์‹คํŒจํ–ˆ๋Š”์ง€ ํ™•์ธ 17result.successful() 18# or 19result.failed() 20 21# ์ž‘์—…์˜ ์ƒํƒœ ํ™•์ธ (PENDING, STARTED, SUCCESS, FAILURE) 22result.state()
new ์ธ๊ฐ„-์ปดํ“จํ„ฐ ์ƒํ˜ธ์ž‘์šฉ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
Design Techniques Contextual Inquiry ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ๊ด€์ฐฐ Design Funnel ์•„์ด๋””์–ด๋ฅผ ํ™•์žฅํ•จ๊ณผ ๋™์‹œ์— ์ถ•์†Œ ์‹œํ‚ด์œผ๋กœ์„œ ๊ฒฐ๊ณผ ๋„์ถœ Double Diamond Discover -> Define -> Develop -> Deliver Storyboarding ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ Prototyping ๋””์ž์ธ์„ ํ‘œํ˜„ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌํ˜„ ์ข…๋ฅ˜: Low-fidelity(์ถฉ์‹ค๋„๊ฐ€ ๋‚ฎ์Œ), High-fidelity(์ถฉ์‹ค๋„๊ฐ€ ๋†’์Œ) User Testing In-lab vs On-site Moderated vs Unmoderated : Exploratory vs Assessment Presentation & Communication Needfinding (์š”๊ตฌ์‚ฌํ•ญ ๋„์ถœ) ์šฉ์–ด UI (User Interface) ์ œํ’ˆ์˜ ์‹œ๊ฐ์ ์ธ ์š”์†Œ UX (User Experience) ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ๋Š” ๊ฒฝํ—˜ CX (Customer Experience) ๊ณ ๊ฐ์ด ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๋А๋ผ๋Š” ์ „๋ฐ˜์ ์ธ ๊ฒฝํ—˜, ์ƒํ’ˆ ๋˜๋Š” ์„œ๋น„์Šค์˜ ๊ตฌ๋งค, ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •์ง“๋Š” ์š”์†Œ SD (Service Design) ์„œ๋น„์Šค๋ฅผ ๋””์ž์ธํ•˜๋Š” ๊ฒƒ HCI (Human-Computer Interaction) ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ๊ณ ์˜ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ, ์ œ์ž‘, ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ SRS (Software Requirement Specification) ์†Œํ”„ํŠธ์›จ์–ด ์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ User Requirements, Functional Requirements, Interface Requirements, Performance Requirements… SRS๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ธฐ์ „์— ์‚ฌ์šฉ์ž๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ดํ•ด ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž์˜ ํŠน์„ฑ์„ ์ดํ•ด : ์—ญํ• , ๊ฐœ์„ฑ ์ดํ•ด๊ด€๊ณ„์ž(stakeholders)๋ฅผ ๊ณ ๋ ค First degree : ์ง์ ‘์ ์œผ๋กœ ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ Second degree : ์ œํ’ˆ์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์‚ฌ๋žŒ Third degree : ์„œ๋น„์Šค๋ฅผ ์„ค์น˜, ๋ฐฐํฌํ•˜๋Š” ์‚ฌ๋žŒ ๋˜๋Š” ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ์‚ฌ์šฉ์ž ๋ชฉ์  ํŒŒ์•… Identify the goals involved in the problem Decompose them into subtasks Abstract into goals Contextual Inquiry (์ƒํ™ฉ์  ์กฐ์‚ฌ) Context : ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ ๊ด€์ฐฐ, ์ถ”์ƒํ™” ๊ธˆ์ง€ Partnership : ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต๊ฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ํ–‰๋™๊ณผ ๊ทธ ์ด์œ ๋ฅผ ์งˆ๋ฌธ Interpretation : ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ํ•ด์„์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต์œ , ์‚ฌ์šฉ์ž์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์Œ Focus : ๋ชฉํ‘œ์— ์ง‘์ค‘ The master-apprentice model (๋„์ œ์‹ ๋ชจ๋ธ) : ์‚ฌ์šฉ์ž(์„ ์ƒ), ๊ด€์ฐฐ์ž(ํ•™์ƒ) Contextual Inquiry๊ฐ€ ์ ์ ˆํ•˜์ง€ ์•Š์„ ๋•Œ Longidual study : ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ์žฅ๊ธฐ๊ฐ„ ๊ด€์ฐฐํ•ด์•ผํ•  ๋•Œ Sporadic behavior : ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์ด ๋ถˆ๊ทœ์น™ํ•  ๋•Œ Large target : ์‚ฌ์šฉ์ž์˜ ๋ฒ”์œ„๊ฐ€ ๊ด‘๋ฒ”์œ„ ํ•  ๋•Œ Diary Study ์‚ฌ์šฉ์ž๊ฐ€ ์ผ์ƒ์ ์œผ๋กœ ํ•˜๋Š” ์ผ์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ ESM (Experience Sampling Method) ์ˆœ๊ฐ„์ ์ธ ํ™œ๋™๊ณผ ๊ฒฝํ—˜์— ์ดˆ์ ์„ ๋งž์ถฐ ๊ธฐ๋ก EMA (Ecological Momentary Assessment) ์‹ฌ๋ฆฌ์  ํ˜„์ƒ์˜ ๊ถค์ , ๋ถ„์‚ฐ, ๋ณ€๋™, ์—ญํ•™์— ์ดˆ์ ์„ ๋งž์ถฐ ๊ธฐ๋ก Survey Participatory Design ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋””์ž์ธ์— ์ฐธ์—ฌํ•˜๋Š” ๊ฒƒ Affinity Diagram (์œ ์‚ฌ๋„ ๋‹ค์ด์–ด๊ทธ๋žจ) ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ Persona ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๊ฐ€์ƒ์˜ ์ธ๋ฌผ Learnability ์ƒˆ๋กœ์šด UI๋ฅผ ๋ฐฐ์šฐ๋Š” ๋ฐฉ๋ฒ• Learning by Doing Learning by Watching Recognition vs Recall Recognition : ์‹œ๊ฐ์  ์š”์†Œ๋ฅผ ๋ณด๊ณ  ์ธ์ง€ํ•˜๋Š” ๊ฒƒ Recall : ๊ธฐ์–ต์„ ํ†ตํ•ด ์ธ์ง€ํ•˜๋Š” ๊ฒƒ Interaction style Command Language ์ธ๊ณต ์–ธ์–ด์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅ Self Disclosure (์ž๊ธฐ ๊ณต๊ฐœ) : ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์–ด๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ Menus and Forms Direct Manipulation ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ ์‹œ๊ฐ์  ํ‘œํ˜„์„ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉ Speech Dialog Mental Model ์‚ฌ๋žŒ๋“ค์ด ์ž๊ธฐ ์ž์‹ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ, ํ™˜๊ฒฝ, ์ž์‹ ์ด ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์‚ฌ๋ฌผ๋“ค์— ๋Œ€ํ•ด ๊ฐ–๋Š” ๋ชจํ˜• ๊ด€์ฐฐ, ์ธํ„ฐ๋ทฐ, ์ž‘์—… ๋ถ„์„์ด ํ•„์š”ํ•˜๋‹ค Conceptual Model ์ œํ’ˆ์ด ์–ด๋– ํ•œ ์›๋ฆฌ๋‚˜ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ดํ•ด Content strategy : ๊ฐ ํŽ˜์ด์ง€์— ๋‚˜ํƒ€๋‚˜๋Š” ๋‚ด์šฉ์˜ ๊ทœ์น™์ด๋‚˜ ๊ฐœ๋…์ด ์กด์žฌํ•˜๋Š”๊ฐ€? Channel starategy : ์ผ๊ด€์ ์ธ ๊ฒฝํ—˜, ์ง€์†์ ์ธ ๊ฒฝํ—˜, ์ƒํ˜ธ ๋ณด์™„์ ์ธ ๊ฒฝํ—˜์„ ๋งŒ๋“ค์–ด๋‚ด๋Š”๊ฐ€? Interaction models : ๋ณดํŽธ์ ์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ–ˆ๋Š”๊ฐ€?
new ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฐ MSA ํŠน๊ฐ• 1์ผ์ฐจ : ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ๊ฐœ๋… ๋ฐ ์—ญ์‚ฌ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
ํด๋ผ์šฐ๋“œ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ ํด๋ผ์šฐ๋“œ๋ž€ ๊ฐœ์ธ์ด ๊ฐ€์ง„ ๋‹จ๋ง๊ธฐ๋ฅผ ํ†ตํ•ด์„œ๋Š” ์ฃผ๋กœ ์ž…/์ถœ๋ ฅ ์ž‘์—…๋งŒ ์ด๋ฃจ์–ด์ง€๊ณ , ์ •๋ณด๋ถ„์„ ๋ฐ ์ฒ˜๋ฆฌ, ์ €์žฅ, ๊ด€๋ฆฌ ์œ ํ†ต ๋“ฑ์˜ ์ž‘์—…์€ ํด๋ผ์šฐ๋“œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ œ3์˜ ๊ณต๊ฐ„์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ์ปดํ“จํŒ… ์‹œ์Šคํ…œ ํ˜•ํƒœ ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ…์ด ํ•„์š”ํ•œ ์ด์œ  ๋น„์šฉ์ ˆ๊ฐ ์†๋„ํ–ฅ์ƒ ํ™•์žฅ์„ฑ ์ƒ์‚ฐ์„ฑ ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ์„œ๋น„์Šค๋ชจ๋ธ Infrastructure as a Service (IaaS) : IT๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์œ ์—ฐ์„ฑ๊ณผ ๊ด€๋ฆฌ ์ œ์–ด ๊ธฐ๋Šฅ์„ ์ œ๊ณต GCE, AWS, Azure Platform as a Service (Paas) : ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ํ™˜๊ฒฝ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต Openshift, Github, docker, kubernetes Software as a a Service (Saas) : ์™„์ „ํ•œ ์ œํ’ˆ ์ œ๊ณต GShift ๋น„๊ต On-site < Iaas < Paas < Saas ์›นํ˜ธ์ŠคํŒ… vs ์„œ๋ฒ„ํ˜ธ์ŠคํŒ… vs ํด๋ผ์šฐ๋“œ ์ฐจ์ด์  ์›นํ˜ธ์ŠคํŒ… : ํ˜ธ์ŠคํŒ… ์—…์ฒด์˜ ์„œ๋ฒ„ ์ค‘ ์ผ๋ถ€๋งŒ ์ž„๋Œ€ํ•˜์—ฌ ์‚ฌ์šฉ ํ™ˆํŽ˜์ด์ง€ ์šด์˜ ์„œ๋ฒ„ํ˜ธ์ŠคํŒ… : ํ˜ธ์ŠคํŒ… ์—…์ฒด์˜ ๋ฌผ๋ฆฌ ์„œ๋ฒ„๋ฅผ ๋‹จ๋…์œผ๋กœ ์ž„๋Œ€/๊ตฌ๋งคํ•˜์—ฌ ์‚ฌ์šฉ ERP, ์ธํŠธ๋ผ๋„ท ๋“ฑ ์šด์˜ ํด๋ผ์šฐ๋“œ ๋‹จ๊ธฐ ์ด๋ฒคํŠธ ๋“ฑ ์œ ๋™์ ์ธ ์„œ๋น„์Šค ์šด์˜ On-premise๋ž€ ์ž์ฒด์ ์œผ๋กœ ๋ณด์œ ํ•œ ์ „์‚ฐ์‹ค์— ์ง์ ‘ ์„ค์น˜ํ•ด ์šด์˜ํ•˜๋Š” ๋ฐฉ์‹ Private, Public, Hybrid Cloud ๋น„๊ต Private cloud ์ธํ”„๋ผ๊ฐ€ ์กฐ์ง ์ „์šฉ์ธ ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ๋ชจ๋ธ ํ•ด๋‹น ์‚ฌ์šฉ์ž ๋˜๋Š” ๊ทธ๋ฃน์˜ ๋ฐฉํ™”๋ฒฝ์œผ๋กœ ๋ณดํ˜ธ๋œ๋‹ค Public cloud ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•˜์ง€ ์•Š์€ IT์ธํ”„๋ผ์—์„œ ์ƒ์„ฑ๋˜๋Š” ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ Alibaba Cloud, AWS, GCP, IBM Cloud, Microsft Azure ๋“ฑ์ด ์žˆ๋‹ค Hybrid cloud ๋‹จ์ผ ITํ™˜๊ฒฝ ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์ด ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ ์—…์ฒด๋ณ„ ํด๋ผ์šฐ๋“œ ์‹œ์žฅ GCP, Azure, AWS ํด๋ผ์šฐ๋“œ ๊ด€๋ จ ์ง๊ตฐ ํด๋ผ์šฐ๋“œ ์—”์ง€๋‹ˆ์–ด ํด๋ผ์šฐ๋“œ ์‹œ์Šคํ…œ ์—”์ง€๋‹ˆ์–ด ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ ๋ณด์•ˆ ๋‹ด๋‹น์ž ๋ฐ๋ธŒ์˜ต์Šค ํด๋ผ์šฐ๋“œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž
new ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฐ MSA ํŠน๊ฐ• 3์ผ์ฐจ : ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ• ์‹ค์Šต (ELK), kubernetes
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ• ์‹ค์Šต (ELK) ELK๋ž€ ELK๋Š” Elasticsearch, Logstash ๋ฐ Kibana : ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ ์„ธ ๊ฐœ์˜ ๋จธ๋ฆฌ๊ธ€ Elasticserach๋Š” ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„ Logstash๋Š” ์—ฌ๋Ÿฌ ์†Œ์Šค์—์„œ ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ๋ณ€ํ™˜ํ•œ ํ›„ Elasticsearch ๊ฐ™์€ “stash"๋กœ ์ „์†กํ•˜๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ Kibana๋Š” ์‚ฌ์šฉ์ž๊ฐ€ Elasticsearch์—์„œ ์ฐจํŠธ์™€ ๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™” Kibana Elasticsearch์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์›น ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ ์‹œ๊ฐํ™” ํ”Œ๋žซํผ Elasticsearch์— ์žˆ๋Š” ์ธ๋ฑ์Šค์˜ ํŒจํ„ด์„ ์ฐพ์•„์„œ, ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค Logstash ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘, ๋ณ€ํ™˜, ์ „์†กํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ, Jruby(JVM ๊ธฐ๋ฐ˜ Ruby)๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ณผ์ •์€ input, filter, out์˜ ์„ธ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ๋‹ค Docker Compose Docker Compose alias ์„ค์ • 1alias dco="docker-compose" 2... Docker-Compose ํŒŒ์ผ docker-compose.yml version:‘3.2’ // docker-compose file format / ๊ฐ ๋ฒ„์ „ ๋ณ„๋กœ ์ œ๊ณต api๊ฐ€ ๋‹ค๋ฅด๋‹ค services: // container ์„œ๋น„์Šค ๊ทธ๋ฃน ports: // ํฌํŠธ ์ง€์ • Host Port : Container Port depends_on: // ์„œ๋น„์Šค๊ฐ„ ์˜์กด๊ด€๊ณ„ ์„ค์ • ELK ์‹ค์Šต docker-compose ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰ docker-compose up docker-compose ์ปจํ…Œ์ด๋„ˆ ์ •์ง€ ๋ฐ ์‚ญ์ œ docker-compose down docker-compose ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ์กฐํšŒ docker-compose ps docker-compose ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ์กฐํšŒ docker-compose logs ElasticSearch ํ™•์ธ open http://localhost:9200/_cat/indices Kibana ํ™•์ธ http://localhost:5601/app/kibana container ์ ‘์† docker-compose exec logstash sh ์ฐธ๊ณ  : PoC (Proof of Concept) ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹ค์ œ๋กœ ์‹คํ˜„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”๊ฐ€, ํšจ๊ณผ์™€ ํšจ์šฉ, ๊ธฐ์ˆ ์ ์ธ ๊ด€์ ์—์„œ๋ถ€ํ„ฐ ๊ฒ€์ฆ์„ ํ•˜๋Š” ๊ณผ์ • Kubernetes ์ดํ•ดํ•˜๊ธฐ Kubernetes๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  ๋Œ€๋ถ€๋ถ„์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ : ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋˜๋Š” ๋ช‡๊ฐœ์˜ ์„œ๋ฒ„์— ๋ถ„์‚ฐ๋œ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰๋˜๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋†€๋ฆฌ์Šค ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ์€ ๋ฆด๋ฆฌ์ฆˆ ์ฃผ๊ธฐ๊ฐ€ ๋А๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ๊ฐ€ ์ž์ฃผ ์ผ์–ด๋‚˜์ง€ ์•Š์Œ ๊ฐœ๋ฐœ์ž๋Š” ์ „์ฒด ๋ฆด๋ฆฌ์ฆˆ ์ฃผ๊ธฐ๊ฐ€ ๋๋‚ ๋•Œ ๋งˆ๋‹ค ์ „์ฒด ์‹œ์Šคํ…œ์„ ํŒจํ‚ค์ง•ํ•˜๊ณ  ์šด์˜ํŒ€์€ ์ด๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค ์šด์˜ํŒ€์€ ํ•˜๋“œ์›จ์–ด ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„๋กœ ์ง์ ‘ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•œ๋‹ค ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋†€๋ฆฌ์Šค ๋ ˆ๊ฑฐ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ ์  MSA๋กœ ๋” ์ž‘์€ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์„ธ๋ถ„ํ™” ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋Š” ์„œ๋กœ ๋ถ„๋ฆฌ๋ผ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฐœ๋ฐœ, ๋ฐฐํฌ, ์—…๋ฐ์ดํŠธ, ํ™•์žฅ ๊ฐ€๋Šฅ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋งŽ์•„์ง€๊ณ  ๋ฐ์ดํ„ฐ์„ผํ„ฐ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์ „์ฒด ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑ, ๊ด€๋ฆฌ, ์œ ์ง€ํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š์€ ์ผ ๋ฆฌ์†Œ์Šค ํ™œ์šฉ์„ ๋†’์ด๊ณ  ํ•˜๋“œ์›จ์–ด ๋น„์šฉ์„ ๋‚ฎ์ถ”๊ณ  ๊ฐ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•  ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ์— ๋„ˆ๋ฌด ์–ด๋ ค์›€ ์ˆ˜๋™์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅ ์ด๋Ÿฐ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ž๋™์œผ๋กœ ์Šค์ผ€์ฅด๋งํ•˜๊ณ  ๊ตฌ์„ฑ, ๊ด€๋ฆฌ, ์žฅ์• ์ฒ˜๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ์ž๋™ํ™”๊ฐ€ ํ•„์š” => ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ  ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋ฐฐํฌ ๋‹จ์  ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋ฐฐํฌ ์กฐํ•ฉ์˜ ์ˆ˜ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ„์˜ ์ƒํ˜ธ ์ข…์†์„ฑ ์ˆ˜๊ฐ€ ํ›จ์”ฌ ๋งŽ์•„์ง€๋ฏ€๋กœ ๋ฐฐํฌ ๊ด€๋ จ ๊ฒฐ์ •์ด ์–ด๋ ต๋‹ค ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์™€ ์‹œ์Šคํ…œ์— ๋ถ„์‚ฐ๋ผ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ํ˜ธ์ถœ์„ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต๋‹ค Kubernetes ๊ฐœ๋… ๊ตฌ๊ธ€์€ Borg๋ผ๋Š” ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž์™€ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜์ฒœ ๊ฐœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์„œ๋น„์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค ๊ตฌ๊ธ€ 10๋…„๊ฐ„ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ 2014๋…„์— kubernetes ํ”„๋กœ์ ํŠธ๋ฅผ ์˜คํ”ˆ์†Œ์Šคํ™” ํ•œ๋‹ค ๋ณ„๋ช…์€ k8s์ด๋‹ค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์“ฐ๋Š” ์ด์œ  ๊ฒฝ๋Ÿ‰, ์ด์‹์„ฑ ๋ฐ ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ, ์ตœ์‹ ํ˜• ๊ฐœ๋ฐœ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์ง€์›, ํ™œ์šฉ๋„ ํ–ฅ Kubernetes ์•„ํ‚คํ…์ฒ˜ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ : ์ „์ฒด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ์„ ์ œ์–ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์„ ์‹คํ–‰ ์›Œ์ปค ๋…ธ๋“œ : ์‹ค์ œ ๋ฐฐํฌ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ kubernetes ์‹ค์Šต 1 minikube start kubectl run ntest --image=develo0100/node --port 8080 curl localhost:8080 kubernetes pod ์†Œ๊ฐœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๊ฐœ๋ณ„ ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ , ํ•จ๊ป˜ ๋ฐฐ์น˜๋œ ๋‹ค์ˆ˜์˜ ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค kubernetes ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™์ž‘ ๋„์ปค ๋ฐ๋ชฌ์ด ์‹คํ–‰ ์ค‘์ธ ๋‹ค๋ฅธ ์›Œ์ปค ๋…ธ๋“œ์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋กœ ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋„์ปคํ—ˆ๋ธŒ์— ์ด๋ฏธ์ง€๊ฐ€ ์˜ฌ๋ ค์ ธ์žˆ์–ด์•ผ ํ•œ๋‹ค kubectl ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„๋กœ kubernetes ์›Œํฌ๋กœ๋“œ ์šฉ์–ด Daemon set Deployment Job Pod Replica set Replication controller
new 08_connect_DB
๐Ÿƒ Spring
DataSource ์„ค์ • AppCtx.java 1 @Bean(destroyMethod = "close") 2 public DataSource dataSource() { 3 DataSource ds = new DataSource(); 4 ds.setDriverClassName("com.mysql.jdbc.Driver"); 5 ds.setUrl("jdbc:mysql://localhost/spring5fs?"+ 6 "enabledTLSProtocols=TLSv1.2&"+ 7 "useSSL=false&"+ 8 "characterEncoding=utf8"); 9 ds.setUsername("spring5"); 10 ds.setPassword("spring5"); 11 ds.setInitialSize(2); 12 ds.setMaxActive(10); 13 ds.setTestWhileIdle(true); 14 ds.setMinEvictableIdleTimeMillis(60000 * 3); 15 ds.setTimeBetweenEvictionRunsMillis(10 * 1000); 16 return ds; 17 } Query ์‹คํ–‰ JdbcTemplate์„ ์ด์šฉํ•œ select 1jdbcTemplate.query( 2"select * from MEMBER where EMAIL = ?", 3new RowMapper<Member>() { 4 @Override 5 public Member mapRow(ResultSet rs, int rowNum) 6 throws SQLException { 7 Member member = new Member( 8 rs.getString("EMAIL"), 9 rs.getString("PASSWORD"), 10 rs.getString("NAME"), 11 rs.getTimestamp("REGDATE").toLocalDateTime()); 12 member.setId(rs.getLong("ID")); 13 return member; 14 } 15 }, 16 email); PreparedStatementCreater๋ฅผ ์ด์šฉํ•œ update 1jdbcTemplate.update(new PreparedStatementCreator() { 2 @Override 3 public PreparedStatement createPreparedStatement(Connection con) 4 throws SQLException { 5 PreparedStatement pstmt = con.prepareStatement( 6 "insert into MEMBER (EMAIL, PASSWORD, NAME, REGDATE) values (?, ?, ?, ?)"); 7 pstmt.setString(1, member.getEmail()); 8 pstmt.setString(2, member.getPassword()); 9 pstmt.setString(3, member.getName()); 10 pstmt.setTimestamp(4, Timestamp.valueOf(member.getRegisterDateTime())); 11 12 return pstmt; 13 } 14}) java.sql.SQLException: Unable to load class: come.mysql.jdbc.Driver from … ์˜ค๋ฅ˜๋ฅผ ์ž˜ ๋ณด์ž… come.mysql… ์˜คํƒ€๋กœ ์ธํ•œ ๋ฌธ์ œ์˜€๋‹ค java.sql.SQLException: Unable to load authentication plugin ‘caching_sha2_password’. mysql ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ ๋ฐฉ์‹์— ๋”ฐ๋ฅธ ์˜ค๋ฅ˜์ด๋‹ค ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : mysql์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ๋ฐฉ์‹์„ ๋ฐ”๊พธ์ž 1ALTER USER '์‚ฌ์šฉ์ž'@'localhost' IDENTIFIED WITH mysql_native_password BY '๋น„๋ฐ€๋ฒˆํ˜ธ'; javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) url์— enabledTLSProtocols=TLSv1.2๋ฅผ ์ง€์ •ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค urlํ˜•์‹๋•Œ๋ฌธ์— ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์กฐ๊ธˆ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ URL ํ˜•์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค ๊ธฐ์–ตํ•˜์ž jdbc:mysql://localhost/spring5fs?์†์„ฑ1=๊ฐ’1&์†์„ฑ2=๊ฐ’2…" Transaction ์ฒ˜๋ฆฌ Transaction ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ๋‹จ์œ„ ๋ฐฐ๊ฒฝ ์ฟผ๋ฆฌ ๋‘ ๊ฐœ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๋งŒ์•ฝ 2๋ฒˆ์งธ ์ฟผ๋ฆฌ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ 1๋ฒˆ์งธ ์ฟผ๋ฆฌ ์‹คํ–‰ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋Š” (๋กค๋ฐฑ) ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค ์ด์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ ๋‘ ๊ฐœ๋ฅผ ๋ฌถ์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— Transaction์„ ์ด์šฉํ•œ๋‹ค. rollback ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, Spring์—์„œ๋Š” @Transactional์„ ์ด์šฉํ•ด ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. AppCtx.java 1@Bean 2public PlatformTransactionManager transactionManager() { 3 DataSourceTransactionManager tm = new DataSourceTransactionManager(); 4 tm.setDataSource(dataSource()); 5 return tm; 6} ChangePasswordService.java 1@Transactional 2public void changePassword(String email, String oldPwd, String newPwd) { 3 Member member = memberDao.selectByEmail(email); 4 5 if (member == null) 6 throw new MemberNotFoundException(); 7 8 member.changePassword(oldPwd, newPwd); 9 memberDao.update(member); 10} ํŠธ๋žœ์žญ์…˜ ๊ด€๋ จ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ logback.xml 1<?xml version="1.0" encoding="UTF-8"> 2 3<configuration> 4 <appender name="stdout" class="chqos.logback.core.ConsoleAppender"> 5 <encoder> 6 <pattern>%d %5p %c{2} - %m%n</pattern> 7 </encoder> 8 </appender> 9 <root level="INFO"> 10 <appender-ref ref="stdout" /> 11 </root> 12 13 <logger name="org.springframework.jdbc" level="DEBUG" /> 14</configuration> ๋กœ๊ทธ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฐ์›Œ๋ณด์•˜๋‹ค. Transaction ์ „ํŒŒ 1public class SomeService { 2 private AnyService anyService; 3 4 @Transactional 5 public void some() { 6 anyService.any(); 7 } 8 9 public void setAnyService(AnyService as) { 10 anyService = as; 11 } 12} 13 14public class AnyService { 15 @Transactional 16 public void any() { ... } 17} some๋ฉ”์†Œ๋“œ๊ฐ€ any๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค. ์œ„ ์ฝ”๋“œ์—์„œ๋Š” ๋ฉ”์†Œ๋“œ ๋‘˜ ๋‹ค @Transactional์ด ๋ถ™์–ด์žˆ์ง€๋งŒ ๋งŒ์•ฝ ๋ถ™์–ด์žˆ์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์ด๋ ‡๊ฒŒ ๋ฉ”์†Œ๋“œ ๊ฐ„ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•  ๋•Œ ํŠธ๋žœ์žญ์…˜์ด ์œ ์ง€๋˜๋Š” ๊ฒƒ์„ ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ๋ผ๊ณ  ํ•œ๋‹ค. @Transactional annotation์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ ์ค‘ propagation์ด ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒํƒ€์ž…์„ ์ง€์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’ : REQUIRED : ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์ด ์กด์žฌํ•˜๋ฉด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ, ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•œ๋‹ค
new 09_spring_MVC
๐Ÿƒ Spring
Spring MVC ์‹œ์ž‘ํ•˜๊ธฐ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์•ž์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ๋Š” ์ข€ ๋‹ค๋ฅธ์ ์ด ์žˆ์—ˆ๋‹ค jar์ด ์•„๋‹Œ war์„ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋งŽ์•˜๋Š”๋ฐ ์ผ์ผ์ด ์ ์ง€๋Š” ์•Š์„ ๊ฒƒ์ด๋‹ค Controller 1@Controller 2public class HelloController { 3 @GetMapping("/hello") 4 public String hello(Model model, 5 @RequestParam(value="name", required=false) String name) { 6 model.addAttribute("greeting", "์•ˆ๋…•ํ•˜์„ธ์š”" + name); 7 return "hello"; 8 } 9} JSP 1<%@ page contentType="text/html; charset=utf-8" %> 2<!DOCTYPE html> 3<html> 4 <head> 5 <title>Hello</title> 6 </head> 7 <body> 8 ์ธ์‚ฌ๋ง : ${greeting} 9 </body> 10</html URL์ ‘์†ํ•ด๋„ ํ•ด๋‹น jspํŒŒ์ผ์ด ๋‚˜์˜ค์ง€ ์•Š๋Š” ๋ฌธ์ œ vscode์—์„œ community server connector๋ผ๋Š” extension์„ ํ†ตํ•ด tomcat์„ ๋„์›Œ์„œ ํ• ๋ ค๊ณ  ํ•œ๋‹ค ํŠน์ • jsp๋ฅผ ๊ฐ์ง€ํ–ˆ๋Š”์ง€, servingํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋กœ๊ทธ๊ฐ€ ์—†์–ด ๋˜๋Š”๊ฑด์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค web.xml; lineNumber: 1; columnNumber: 37; A pseudo attribute name is expected. // before <?xml version="1.0" encoding="UTF-8"> // after <?xml version="1.0" encoding="UTF-8"?> ๋ฌผ์Œํ‘œ๋ฅผ ๋นผ๋จน์–ด์„œ ์ƒ๊ธฐ๋Š” ์˜ค๋ฅ˜์ด๋‹ค 404: Not Found 1// before 2registry.jsp("/WEB-INF/view", ".jsp"); 3// after 4registry.jsp("/WEB-INF/view/", ".jsp");
new Spring ๊ฐœ๋… - Bean Lifecycle & Scope
๐Ÿƒ Spring
Bean ๊ฐ์ฒด์˜ Lifecycle Bean ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ ๋˜๋Š” ์†Œ๋ฉธ๋ ๋•Œ ํŠน์ • ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. @PostConstruct, @PreDestroy Annotation ์‚ฌ์šฉ 1// Bean ๊ฐ์ฒด ์ƒ์„ฑ๋  ๋•Œ ์‹คํ–‰ 2@PostConstruct 3public void postConstruct() {...} 4 5// Bean ๊ฐ์ฒด ์†Œ๋ฉธ๋  ๋•Œ ์‹คํ–‰ 6@PreDestroy 7public void preDestroy() {...} InitializingBean, DisposableBean ๊ตฌํ˜„ 1public class Client implements InitializingBean, DisposableBean { 2 // Bean ๊ฐ์ฒด ์ƒ์„ฑ๋  ๋•Œ ์‹คํ–‰ 3 @Override 4 public void afterPropertiesSet() throws Exception {...} 5 6 // Bean ๊ฐ์ฒด ์†Œ๋ฉธ๋  ๋•Œ ์‹คํ–‰ 7 @Override 8 public void destroy() throws Exception {...} 9} @Bean Annotation์—์„œ ์„ค์ • 1@Bean(initMethod = "init", destroyMethod="close") 2public class Client2{ 3 // Bean ๊ฐ์ฒด ์ƒ์„ฑ๋  ๋•Œ ์‹คํ–‰ 4 public void init() {...} 5 // Bean ๊ฐ์ฒด ์†Œ๋ฉธ๋  ๋•Œ ์‹คํ–‰ 6 public void close() {...} 7} Bean ๊ฐ์ฒด์˜ Scope ๊ธฐ๋ณธ์ ์œผ๋กœ Bean ๊ฐ์ฒด๋Š” Singleton scope๋ฅผ ๊ฐ–๋Š”๋‹ค ํ•˜์ง€๋งŒ ์ž„์˜๋กœ Prototype scope๋ฅผ ๊ฐ–๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. 1@Configuration 2public class AppCtx { 3 @Bean 4 @Scope("prototype") 5 public Client client() {} 6}
new Spring - Bean Validation : Annotation์œผ๋กœ Validationํ•˜๊ธฐ
๐Ÿƒ Spring
Bean Validation Annotation์„ ๋‹ฌ์•„์„œ Validation์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฃผ๋กœ jakarta.validation๊ณผ hibernate.validator ๋‘ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Dependency Diagram ๊ตฌ์กฐ spring-boot-starter-validation -> hibernate-validator -> jakarta.validation-api jakarta.validation์—์„œ ์ง€์›ํ•˜๋Š” annotation Annotation Description @NotNull null์ด ์•„๋‹Œ๊ฐ€ ("", " " => ํ†ต๊ณผ) @NotEmpty null์ด ์•„๋‹ˆ๊ณ , size๊ฐ€ 0์ธ๊ฐ€ (" " => ํ†ต๊ณผ) @NotBlank null์ด ์•„๋‹ˆ๊ณ , trimํ•œ ๊ฒฐ๊ณผ๊ฐ€ empty์ธ๊ฐ€ @Size ๋ฌธ์ž์—ด, ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @Min ์ˆซ์ž๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @Max ์ˆซ์ž๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @Email ์ด๋ฉ”์ผ ํ˜•์‹์— ๋งž๋Š”๊ฐ€ @Pattern Regex(์ •๊ทœ์‹)์— ๋งž๋Š”๊ฐ€ @Past ๊ณผ๊ฑฐ์˜ ๋‚ ์งœ์ธ๊ฐ€ @Future ๋ฏธ๋ž˜์˜ ๋‚ ์งœ์ธ๊ฐ€ @Digits ์ •์ˆ˜, ์†Œ์ˆ˜ ์ž๋ฆฟ์ˆ˜๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @DecimalMin, @DecimalMax ์ž๋ฆฟ์ˆ˜๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ (์†Œ์ˆ˜ ์ดํ•˜ ์ž๋ฆฟ์ˆ˜ ํฌํ•จ) @Positive, @PositiveOrZero, @Negative, @NegativeOrZero hibernate.validator์—์„œ ์ง€์›ํ•˜๋Š” annotation Annotation Description @Range ์ˆซ์ž๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ (์†Œ์ˆ˜ ์ดํ•˜ ์ž๋ฆฟ์ˆ˜ ํฌํ•จ) @Length ๋ฌธ์ž์—ด, ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @URL URL ํ˜•์‹์— ๋งž๋Š”๊ฐ€ ์–ธ๊ธ‰ํ•œ Annotation๋ง๊ณ  ๋‹ค๋ฅธ Annotation๋„ ์žˆ๋‹ค. Rest Controller์—์„œ ์‚ฌ์šฉ Controller 1public ResponseEntity<Customer> postCustomer(@RequestBody @Valid CustomerDTO customerDTO) {...} @Valid Annotation์„ ๋ถ™์—ฌ์„œ CustomerDTO ๊ฐ์ฒด์— ๋Œ€ํ•œ Validation์„ ์ˆ˜ํ–‰ํ•œ๋‹ค @Valid Annotation์„ ๋ถ™์ด๋Š” ๊ฒƒ์„ ๊นœ๋นกํ•˜์ง€ ๋ง์ž ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์œ„ ์ฝ”๋“œ์˜ Validation์—์„œ ์‹คํŒจํ•˜๋ฉด, MethodArgumentNotValidException์ด ๋ฐœ์ƒํ•œ๋‹ค ํ•ด๋‹น ์˜ˆ์™ธ๋Š” ํ•„๋“œ๋ณ„ ๋ชจ๋“  ์—๋Ÿฌ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์—„์ฒญ ๊ธธ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณดํ†ต ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์ถ”์ถœํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค 1processValidationErrors(MethodArgumentNotValidException e) { 2 List<String> errors = e.getBindingResult().getFieldErrors().stream() 3 .map(error -> error.getField() + ": " + error.getDefaultMessage()) 4 .collect(Collectors.toList()); 5 return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); 6} ์ˆ˜๋™ Validation Controller์—์„œ Validation์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ, ์ˆ˜๋™์œผ๋กœ Validation์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค ์ด๋•Œ, Validator ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„์„œ ์‚ฌ์šฉํ•œ๋‹ค 1import jakarta.validation.Validator; 2... 3@Autowired 4private Validator validator; 5... 6var violations = validator.validate(voucher); 7if (!violations.isEmpty()) 8 throw new IllegalArgumentException(violations.stream().findFirst().get().getMessage()); ์ฝ”๋“œ์—์„œ๋Š” voucher ๊ฐ์ฒด์— ๋Œ€ํ•œ Validation์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๊ฐ€ ์žˆ๋‹ค๋ฉด IllegalArgumentException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค
new ๋ฐฑ์ค€ - 2502 : ๋–ก ๋จน๋Š” ํ˜ธ๋ž‘์ด (S1)
๐Ÿง  Algorithm
1D, K = map(int, input().split()) 2L = [(1, 0), (0, 1)] 3 4for i in range(2, D): 5 L.append((L[i-2][0]+L[i-1][0], L[i-2][1]+L[i-1][1])) 6 7A = 1 8B = 2 9 10while True: 11 if A*L[D-1][0] + B*L[D-1][1] == K: 12 break 13 14 if A+1 == B: 15 B += 1 16 A = 1 17 else: 18 A += 1 19 20print (A,'\n',B, sep='') ํ•ด๊ฒฐ๋ฐฉ๋ฒ• N๋ฒˆ์งธ๋‚  ๋–ก ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ฒซ์งธ๋‚  ๋–ก, ๋‘˜์งธ๋‚  ๋–ก์„ ๊ฐ๊ฐ ๋ช‡๋ฒˆ ๋”ํ•ด์•ผํ•˜๋Š”์ง€ ๋ฆฌ์ŠคํŠธ์— ๊ตฌํ•œ๋‹ค ์ฒซ์งธ, ๋‘˜์งธ ๋‚  ๋–ก์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋„ฃ์–ด๋ณด๋ฉด์„œ ๋ธŒ๋ฃจํŠธ ํฌ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์ˆซ์ž ์นด๋“œ ๋‚˜๋ˆ„๊ธฐ (L2)
๐Ÿง  Algorithm
์ฒซ๋ฒˆ์งธ ํ†ต๊ณผํ•œ ํ’€์ด 1import math 2 3def gcd(a, b): 4 while b > 0: 5 a, b = b, a%b 6 return a 7 8def gcdOfArr(l): 9 result = l[0] 10 for i in range(1, len(l)): 11 result = gcd(result, l[i]) 12 return result 13 14def solution(arrayA, arrayB): 15 a1 = gcdOfArr(arrayA) 16 for i in arrayB: 17 if i % a1 == 0: 18 a1 = 0 19 break 20 a2 = gcdOfArr(arrayB) 21 for i in arrayA: 22 if i % a2 == 0: 23 a2 = 0 24 break 25 return max(a1, a2) ๊ฐœ์„ ํ•œ ํ’€์ด 1import math 2from functools import reduce 3 4def gcd(a, b): 5 while b > 0: 6 a, b = b, a%b 7 return a 8 9def solution(arrayA, arrayB): 10 a1 = reduce(gcd, arrayA) 11 a1 = 0 if any(i % a1 == 0 for i in arrayB) else a1 12 a2 = reduce(gcd, arrayB) 13 a2 = 0 if any(i % a2 == 0 for i in arrayA) else a2 14 return max(a1, a2) ๋ฌธ์ œ ์ฒ ์ˆ˜๊ฐ€ ๊ฐ€์ง„ ์ˆซ์ž์˜ ๋ฐฐ์—ด arrayA, ์˜ํฌ๊ฐ€ ๊ฐ€์ง„ ์ˆซ์ž์˜ ๋ฐฐ์—ด arrayB๊ฐ€ ์ฃผ์–ด์ง„๋‹ค ์ฒ ์ˆ˜๊ฐ€ ๊ฐ€์ง„ ์นด๋“œ๋“ค์˜ ๋ชจ๋“  ์ˆซ์ž๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ , ์˜ํฌ๊ฐ€ ๊ฐ€์ง„ ์ˆซ์ž๋Š” ํ•˜๋‚˜๋„ ๋‚˜๋ˆŒ ์ˆ˜ ์—†๋Š” ์–‘์˜ ์ •์ˆ˜ a ์˜ํฌ๊ฐ€ ๊ฐ€์ง„ ์นด๋“œ๋“ค์˜ ๋ชจ๋“  ์ˆซ์ž๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ณ , ์ฒ ์ˆ˜๊ฐ€ ๊ฐ€์ง„ ์ˆซ์ž๋Š” ํ•˜๋‚˜๋„ ๋‚˜๋ˆŒ ์ˆ˜ ์—†๋Š” ์–‘์˜ ์ •์ˆ˜ a ๊ฐ€์žฅ ํฐ ์–‘์˜ ์ •์ˆ˜ a๋ฅผ ๊ตฌํ•˜๋ผ, ์—†๋‹ค๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•˜๋ผ TC input [14, 35, 119] ouput 7 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์—์„œ ์ง€์›ํ•˜๋Š” ํŒŒ์ด์ฌ์ด 3.8์ด๋ผ์„œ ๋‚ด์žฅํ•จ์ˆ˜ math.gcd(3.9๋ถ€ํ„ฐ ์ง€์›)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ–ˆ๋‹ค ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ• ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์•„์„œ ์•ฝ๊ฐ„์˜ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜์˜€๋‹ค reduce์™€ anyํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ธธ์ด๋ฅผ ๋Œ€ํญ ๊ฐ์†Œ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค, ์ž์ฃผ ํ™œ์šฉํ•˜์ž
new Express&React ํ”„๋กœ์ ํŠธ์— Recaptcha v3 ์ ์šฉํ•˜๊ธฐ
๐ŸŒ Javascript
์ƒํ™ฉ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ “์•Œ๋ก"์„ ๊ฐœ๋ฐœํ•˜๋˜ ์ค‘, ์‚ฌ์šฉ์ž๊ฐ€ ์•…์˜์ ์ธ ๋ชฉ์ ์œผ๋กœ ๋ฐ˜๋ณต์ ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋ง‰์„๊นŒ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์กฐ์‚ฌ๋ฅผ ํ†ตํ•ด Google์—์„œ ์ œ๊ณต๋˜๋Š” Recaptcha๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ณต๊ฒฉ์ž์˜ ์ž…์žฅ์—์„œ ์ƒ๊ฐํ–ˆ์„ ๋•Œ, ์ง€๊ธˆ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ทจ์•ฝํ•œ ๋ถ€๋ถ„์€ ํšŒ์›๊ฐ€์ž…์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…์€ ํšŒ์›์ด ์•„๋‹Œ ์ž๊ฐ€, ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ทœ์น™๋งŒ ๋งŒ์กฑํ•œ๋‹ค๋ฉด ๋ฐ˜๋ณต์ ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ , ์ด๋Š” DB์— ๋ฐ”๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํšŒ์›๊ฐ€์ž… ๋ถ€๋ถ„์— Recaptcha๋ฅผ ์ ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. Recaptcha๋ž€? Recaptcha๋Š” ๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฌด๋ฃŒ ๋ณด์•ˆ ์„œ๋น„์Šค๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๋ด‡์ด ์•„๋‹˜์„ ์ฆ๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ง€์› ์ข…๋ฃŒ๋œ v1์„ ์ œ์™ธํ•˜๋ฉด v2, v3 ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์ด ์žˆ๋‹ค. v2๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ‘๋‚˜๋Š” ๋กœ๋ด‡์ด ์•„๋‹™๋‹ˆ๋‹ค’๋ฅผ ํด๋ฆญํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธ์ฆ์ด ์™„๋ฃŒ๋œ๋‹ค. v3๋Š” ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ ์—†์ด ์ž๋™์œผ๋กœ ์ธ์ฆ์ด ์™„๋ฃŒ๋œ๋‹ค. ํ•„์ž๋Š” ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜๊ณผ ์ด๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋‚˜์˜ ๊ณ ์ƒ์„ ๋œ๊ธฐ ์œ„ํ•ด v3๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. v3์˜ ์ž‘๋™ ๋ฐฉ์‹ ์‚ฌ์šฉ์ž์˜ ๋งˆ์šฐ์Šค ํด๋ฆญ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ, ์Šคํฌ๋กค, ์š”์ฒญ ํŒจํ„ด ๋“ฑ์„ ๋ถ„์„ํ•˜์—ฌ ์ ์ˆ˜๋ฅผ ๋งค๊ธด๋‹ค. ์ ์ˆ˜๋Š” 0.0 ~ 1.0 ์‚ฌ์ด์˜ ๊ฐ’์œผ๋กœ, 0.0์€ ๋กœ๋ด‡, 1.0์€ ์‚ฌ๋žŒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” Recaptcha๊ฐ€ ํ‰๊ฐ€ํ•œ ์ ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์ผ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€์— ์ ‘์†ํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋‹จ์—์„œ Recaptcha ํ‚ค๋ฅผ Recaptcha ํ† ํฐ์„ ๋ฐ›์•„์˜จ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์›๊ฐ€์ž… ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, Recaptcha ํ† ํฐ์„ ํ•จ๊ป˜ ์ „๋‹ฌํ•œ๋‹ค. ์„œ๋ฒ„์—์„œ Recaptcha ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ , ์ ์ˆ˜๊ฐ€ 0.5๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค. ์ ์šฉ ์‚ฌ์ „ ์„ค์ • https://www.google.com/recaptcha/์— ์ ‘์†ํ•˜์—ฌ ๋„๋ฉ”์ธ์„ ๋“ฑ๋กํ•˜๊ณ  ํ‚ค๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ž์„ธํ•œ ๊ณผ์ •์€ ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ์—๋„ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์–ด์„œ ์ƒ๋žตํ•œ๋‹ค. Server (Express) user-service.ts 1// ์„œ๋น„์Šค ๋ ˆ์ด์–ด์— ์ถ”๊ฐ€ํ•œ Recaptcha ๊ฒ€์ฆ ํ•จ์ˆ˜ 2static async verifyRecaptcha(token: string): Promise<void> { 3 // Recaptcha ๊ฒ€์ฆ 4 const response = await fetch( 5 // ํ‚ค๋Š” Recaptcha ์‚ฌ์ดํŠธ์—์„œ ๋ฐ›์€ ๊ฒƒ์ด๋ฉฐ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌ 6 `https://www.google.com/recaptcha/api/siteverify?secret=${process.env.RECAPTCHA_SECRET_KEY}&response=${token}`, 7 { 8 method: "POST", 9 } 10 ); 11 // ๊ฒฐ๊ณผ๋ฅผ JSON์œผ๋กœ ํŒŒ์‹ฑ 12 const verificationReuslt = await response.json(); 13 14 // ์ ์ˆ˜๊ฐ€ 0.5๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง 15 if (verificationReuslt.score <= 0.5) { 16 throw new RecaptchaScoreTooLowError(); 17 } 18 19 // ์„ฑ๊ณต ์—ฌ๋ถ€๊ฐ€ false์ด๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง (ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ) 20 if (!verificationReuslt.success) { 21 throw new RecaptchaTokenInvalidError(); 22 } 23} user-router.ts 1// ์ปจํŠธ๋กค๋Ÿฌ ๋ถ€๋ถ„์—์„œ ๋ถ€๋ถ„์—์„œ Recaptcha ๊ฒ€์ฆ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ, ๋ฐœ์ƒ์‹œํ‚จ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌ 2try { 3 await UserService.verifyRecaptcha(recaptchaToken); 4 await UserService.createUser(username, password); 5 res.status(201).send("User created successfully"); 6} catch (err: any) { 7 // Recaptcha ์ ์ˆ˜๊ฐ€ ๋‚ฎ์€ ๊ฒฝ์šฐ -> 403 Forbidden 8 if (err instanceof RecaptchaScoreTooLowError) { 9 res.status(403).send(err.message); 10 // Recaptcha ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ -> 400 Bad Request 11 } else if (err instanceof RecaptchaTokenInvalidError) { 12 res.status(400).send(err.message); 13 } else if (err instanceof UserAlreadyExistsError) { 14 res.status(409).send(err.message); 15 } else { 16 console.error(err); 17 res.status(500).send(err.message); 18 } 19} Client (React) App.tsx 1import { GoogleReCaptchaProvider } from "react-google-recaptcha-v3"; 2 3return ( 4 // ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— GoogleReCaptchaProvider๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Recaptcha ํ‚ค๋ฅผ ์ „๋‹ฌ 5 <GoogleReCaptchaProvider 6 reCaptchaKey={process.env.REACT_APP_RECAPTCHA_SITE_KEY || ""} 7 > 8 <Router> 9 {/* ... */} 10 </Router> 11 </GoogleReCaptchaProvider> 12); SignupPage.tsx 1import { useGoogleReCaptcha } from "react-google-recaptcha-v3"; 2 3const SignupPage: React.FC = () => { 4 // useGoogleReCaptcha ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ Recaptcha ํ† ํฐ์„ ๋ฐ›์•„์˜ด 5 const { executeRecaptcha } = useGoogleReCaptcha(); 6 7 const handleSignup = async () => { 8 // Recaptcha ํ† ํฐ์„ ๋ฐ›์•„์˜ค๊ธฐ๋„ ์ „์— ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์›๊ฐ€์ž…์„ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ 9 if (!executeRecaptcha) { 10 console.log("Execute recaptcha not yet available"); 11 return; 12 } 13 // Recaptcha ํ† ํฐ์„ ๋ฐ›์•„์˜ด (signup์€ action์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด) 14 const recaptchaToken = await executeRecaptcha("signup"); 15 16 if (password !== confirmPassword) { 17 alert("๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."); 18 return; 19 } 20 21 try { 22 const response = await api.post<SignupResponse>("/users/signup", { 23 username, 24 password, 25 // ์„œ๋ฒ„๋กœ Recaptcha ํ† ํฐ์„ ์ „๋‹ฌ 26 recaptchaToken, 27 }); 28 } catch() { 29 // ... 30 } 31 }; 32}; ๊ฒฐ๊ณผ ๊ด€๋ฆฌ์ž ์ฝ˜์†”์„ ํ†ตํ•ด Recaptcha๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆ๋œ ์š”์ฒญ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
new [๋ชจ๊ฐ์ฝ”24ํ•˜๊ณ„] 01 : ๊ฒฐ๊ณผ
๐Ÿ‘จโ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ”
django์—์„œ swagger ๋ฌธ์„œํ™” ๊ตฌํ˜„ํ•˜๊ธฐ ๊ฐœ์š” ์žฅ๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋Šฅ๊ณผ, REST API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ 1. 2โ”œโ”€โ”€ db.sqlite3 3โ”œโ”€โ”€ djtest (๋ฉ”์ธ ์•ฑ) 4โ”‚ โ”œโ”€โ”€ __init__.py 5โ”‚ โ”œโ”€โ”€ asgi.py 6โ”‚ โ”œโ”€โ”€ settings.py 7โ”‚ โ”œโ”€โ”€ urls.py 8โ”‚ โ”œโ”€โ”€ views.py 9โ”‚ โ””โ”€โ”€ wsgi.py 10โ”œโ”€โ”€ manage.py 11โ”œโ”€โ”€ paste (์ƒ์„ฑํ•œ ์•ฑ) 12โ”‚ โ”œโ”€โ”€ __init__.py 13โ”‚ โ”œโ”€โ”€ admin.py 14โ”‚ โ”œโ”€โ”€ apps.py 15โ”‚ โ”œโ”€โ”€ migrations 16โ”‚ โ”œโ”€โ”€ models.py 17โ”‚ โ”œโ”€โ”€ serializers.py 18โ”‚ โ”œโ”€โ”€ tests.py 19โ”‚ โ”œโ”€โ”€ urls.py 20โ”‚ โ””โ”€โ”€ views.py 21โ””โ”€โ”€ requirements.txt ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” Django ๋ช…๋ น์ž 1# ์ƒˆ๋กœ์šด Django ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ 2python manage.py startproject 3# ์ƒˆ๋กœ์šด Django ์•ฑ์„ ์ƒ์„ฑ 4python manage.py startapp 5# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉํ•  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ์ƒ์„ฑ 6python manage.py makemigrations 7# ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉ 8python manage.py migrate 9# ๊ด€๋ฆฌ์ž(superuser) ๊ณ„์ •์„ ์ƒ์„ฑ 10python manage.py createsuperuser 11# ํ”„๋กœ์ ํŠธ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์‹คํ–‰ 12python manage.py test 13# ํ…Œ์ŠคํŠธ์šฉ ์„œ๋ฒ„๋ฅผ ํŠน์ • ์„ค์ •์œผ๋กœ ์‹คํ–‰ 14python manage.py testserver CRUD ๊ตฌํ˜„ Paste ๋ชจ๋ธ ์ •์˜ 1from django.db import models 2 3class Paste(models.Model): 4 title = models.CharField(max_length=100) 5 content = models.TextField() 6 # auto_now_add : ๊ฐ์ฒด๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋  ๋•Œ๋งŒ ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์ž๋™์œผ๋กœ ์„ค์ • 7 created_at = models.DateTimeField(auto_now_add=True) 8 # auto_now : ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋  ๋•Œ๋งˆ๋‹ค ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ์ž๋™์œผ๋กœ ์„ค์ • 9 updated_at = models.DateTimeField(auto_now=True) 10 class Meta: 11 ordering = ['-created_at'] 12 def __str__(self): 13 return self.title Serializer ์ •์˜ 1from rest_framework import serializers 2from .models import Paste 3 4class PasteSerializer(serializers.ModelSerializer): 5 class Meta: 6 model = Paste 7 fields = '__all__' 8 # ์ง์ ‘ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• 9 # fields = ['title', 'content'] View ๊ตฌํ˜„ PasteView 1class PasteView(APIView): 2 def get(self, _): 3 pastes = Paste.objects.all() 4 serializer = PasteSerializer(pastes, many=True) 5 return Response(serializer.data, status=status.HTTP_200_OK) 6 7 def post(self, request): 8 serializer = PasteSerializer(data=request.data) 9 if serializer.is_valid(): 10 serializer.save(user=request.user) 11 return Response(serializer.data, status=status.HTTP_201_CREATED) 12 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) PasteDetailView 1class PasteDetailView(APIView): 2 def get(self, _, pk): 3 try: 4 paste = Paste.objects.get(pk=pk) 5 serializer = PasteSerializer(paste) 6 return Response(serializer.data, status=status.HTTP_200_OK) 7 except Paste.DoesNotExist: 8 return Response(status=status.HTTP_404_NOT_FOUND) 9 10 def put(self, request, pk): 11 try: 12 paste = Paste.objects.get(pk=pk) 13 except Paste.DoesNotExist: 14 return Response(status=status.HTTP_404_NOT_FOUND) 15 16 if paste.user != request.user: 17 return Response(status=status.HTTP_403_FORBIDDEN) 18 19 serializer = PasteSerializer(paste, data=request.data) 20 if serializer.is_valid(): 21 serializer.save() 22 return Response(serializer.data, status=status.HTTP_200_OK) 23 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 24 25 def delete(self, request, pk): 26 try: 27 paste = Paste.objects.get(pk=pk) 28 except Paste.DoesNotExist: 29 return Response(status=status.HTTP_404_NOT_FOUND) 30 31 paste.delete() 32 return Response(status=status.HTTP_204_NO_CONTENT) urls.py 1from django.urls import path 2from paste.views import * 3 4urlpatterns = [ 5 path('', PasteView.as_view(), name='paste_list_create'), 6 path('<int:pk>', PasteDetailView.as_view(), name='paste_get_update_delete'), 7] Swagger ์ ์šฉ PasteView PasteView 1class PasteView(APIView): 2 @swagger_auto_schema( 3 operation_description="Get list of pastes", 4 operation_summary="Get list of pastes", 5 responses={200: PasteSerializer(many=True)}, 6 ) 7 def get(self, _): 8 ... 9 10 @swagger_auto_schema( 11 operation_description="Create a new paste", 12 operation_summary="Create a new paste", 13 request_body=PasteSerializer, 14 responses={201: PasteSerializer, 400: "Bad Request"}, 15 ) 16 def post(self, request): 17 ... PasteDetailView 1class PasteDetailView(APIView): 2 @swagger_auto_schema( 3 operation_description="Get a paste by ID", 4 operation_summary="Get a paste by ID", 5 responses={200: PasteSerializer, 404: "Not Found"}, 6 ) 7 def get(self, _, pk): 8 ... 9 10 @swagger_auto_schema( 11 operation_description="Update a paste by ID", 12 operation_summary="Update a paste by ID", 13 request_body=PasteSerializer, 14 responses={ 15 200: PasteSerializer, 16 400: "Bad Request", 17 403: "Forbidden", 18 404: "Not Found", 19 }, 20 ) 21 def put(self, request, pk): 22 ... 23 24 @swagger_auto_schema( 25 operation_description="Delete a paste by ID", 26 operation_summary="Delete a paste by ID", 27 responses={204: "No Content", 404: "Not Found"}, 28 ) 29 def delete(self, request, pk): 30 ... swagger ์ ์šฉ ๊ฒฐ๊ณผ django์—์„œ JWT ์ธ์ฆ ๊ตฌํ˜„ํ•˜๊ธฐ ์žฅ๊ณ ์—์„œ๋Š” djangorestframework-simplejwt ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JWT ์ธ์ฆ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. requirements 1pip install djangorestframework-simplejwt settings.py 1INSTALLED_APPS = [ 2 ... 3 'rest_framework', 4 'rest_framework_simplejwt', 5] 1REST_FRAMEWORK = { 2 # ๊ธฐ๋ณธ ์ธ์ฆ ํด๋ž˜์Šค๋ฅผ ์„ค์ • 3 'DEFAULT_AUTHENTICATION_CLASSES': ( 4 'rest_framework_simplejwt.authentication.JWTAuthentication', 5 ), 6 # ๊ธฐ๋ณธ ์Šคํ‚ค๋งˆ ํด๋ž˜์Šค๋ฅผ ์„ค์ •, CoreAPI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ API ๋ฌธ์„œํ™”๋ฅผ ์ƒ์„ฑ 7 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema', 8 # ๊ธฐ๋ณธ ๊ถŒํ•œ ํด๋ž˜์Šค๋ฅผ ์„ค์ •, AllowAny๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์š”์ฒญ์„ ํ—ˆ์šฉ 9 'DEFAULT_PERMISSION_CLASSES': ( 10 'rest_framework.permissions.AllowAny', 11 ), 12} 1from datetime import timedelta 2 3SIMPLE_JWT = { 4 # ์•ก์„ธ์Šค ํ† ํฐ์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์„ค์ • 5 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30), 6 # ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์„ค์ • 7 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), 8 # ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ๊ฐฑ์‹ ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ • 9 'ROTATE_REFRESH_TOKENS': False, 10 # ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ๊ฐฑ์‹ ๋œ ํ›„ ์ด์ „ ํ† ํฐ์„ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ค์ • 11 'BLACKLIST_AFTER_ROTATION': True, 12 13 # JWT ํ† ํฐ์˜ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค์ • 14 'ALGORITHM': 'HS256', 15 # JWT ํ† ํฐ์„ ์„œ๋ช…ํ•  ๋•Œ ์‚ฌ์šฉํ•  ํ‚ค๋ฅผ ์„ค์ • 16 'SIGNING_KEY': SECRET_KEY, 17 # ํ† ํฐ ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•  ๊ณต๊ฐœ ํ‚ค๋ฅผ ์„ค์ • 18 'VERIFYING_KEY': None, 19 # ํ† ํฐ์˜ ๋Œ€์ƒ์ž(aud) ํด๋ ˆ์ž„์„ ์„ค์ • 20 'AUDIENCE': None, 21 # ํ† ํฐ์˜ ๋ฐœ๊ธ‰์ž(iss) ํด๋ ˆ์ž„์„ ์„ค์ • 22 'ISSUER': None, 23 24 # ์ธ์ฆ ํ—ค๋” ํƒ€์ž…์„ ์„ค์ • 25 'AUTH_HEADER_TYPES': ('Bearer',), 26 # ์ธ์ฆ ํ—ค๋”์˜ ์ด๋ฆ„์„ ์„ค์ • 27 'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION', 28 # ์‚ฌ์šฉ์ž ๋ชจ๋ธ์—์„œ ์‚ฌ์šฉ์ž ID ํ•„๋“œ๋ฅผ ์„ค์ • 29 'USER_ID_FIELD': 'id', 30 # JWT ํ† ํฐ์—์„œ ์‚ฌ์šฉ์ž ID๋ฅผ ์ €์žฅํ•  ํด๋ ˆ์ž„์„ ์„ค์ • 31 'USER_ID_CLAIM': 'user_id', 32 33 # ์ธ์ฆ์— ์‚ฌ์šฉํ•  ํ† ํฐ ํด๋ž˜์Šค๋“ค์„ ์„ค์ • 34 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), 35 # ํ† ํฐ์˜ ์œ ํ˜•์„ ์ €์žฅํ•  ํด๋ ˆ์ž„์„ ์„ค์ • 36 'TOKEN_TYPE_CLAIM': 'token_type', 37} urls.py 1from django.urls import path 2from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView 3from rest_framework_simplejwt.authentication import JWTAuthentication 4 5urlpatterns = [ 6 # JWT ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๋Š” ๋ทฐ 7 path("token/", TokenObtainPairView.as_view(), name="token_obtain_pair"), 8 # JWT ํ† ํฐ์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋ทฐ 9 path("token/refresh/", TokenRefreshView.as_view(), name="token_refresh"), 10] views.py 1from rest_framework import permissions 2from rest_framework_simplejwt.authentication import JWTAuthentication 3from drf_yasg.utils import swagger_auto_schema 4 5 6class PasteView(APIView): 7 8 def get(self, request): 9 ... 10 11 def post(self, request): 12 ... 13 14 def get_permissions(self): 15 # SAFE_METHODS : GET, HEAD, OPTIONS 16 if self.request.method in permissions.SAFE_METHODS: 17 self.permission_classes = [permissions.AllowAny] 18 else: 19 self.authentication_classes = [JWTAuthentication] 20 self.permission_classes = [permissions.IsAuthenticated] 21 return super().get_permissions() 22 23 24class PasteDetailView(APIView): 25 26 def get(self, request, pk): 27 ... 28 29 def put(self, request, pk): 30 ... 31 32 def delete(self, request, pk): 33 ... 34 35 def get_permissions(self): 36 # SAFE_METHODS : GET, HEAD, OPTIONS 37 if self.request.method in permissions.SAFE_METHODS: 38 self.permission_classes = [permissions.AllowAny] 39 else: 40 self.authentication_classes = [JWTAuthentication] 41 self.permission_classes = [permissions.IsAuthenticated] 42 return super().get_permissions() ๊ฒฐ๊ณผ TokenObtainPairView๋ฅผ ํ†ตํ•ด access token๊ณผ refresh token์„ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. TokenRefreshView๋ฅผ ํ†ตํ•ด refresh token์„ ์‚ฌ์šฉํ•˜์—ฌ access token์„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค. access token๊ณผ refresh token์€ settings.py์—์„œ ์„ค์ •ํ•œ ์œ ํšจ ๊ธฐ๊ฐ„์— ๋”ฐ๋ผ ๋งŒ๋ฃŒ๋œ๋‹ค. Blacklist ์ ์šฉ settings.py 1INSTALLED_APPS = [ 2 ... 3 'rest_framework_simplejwt.token_blacklist', 4] 1SIMPLE_JWT = { 2 ... 3 # ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ํ† ํฐ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•  ๋ชจ๋ธ์„ ์„ค์ • 4 'BLACKLIST_AFTER_ROTATION': True, 5} ๊ฒฐ๊ณผ TokenRefreshView๋ฅผ ํ†ตํ•ด ํ† ํฐ์ด ์žฌ๋ฐœ๊ธ‰๋  ๋•Œ, ์ด์ „ refresh token์„ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
new Python์˜ GIL
๐Ÿ Python
GIL(Global Interpreter Lock) ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ํŒŒ์ด์ฌ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ ํŒŒ์ด์ฌ์˜ ํ‘œ์ค€ ๊ตฌํ˜„์ธ CPython์—์„œ๋งŒ ์กด์žฌ ์žฅ์  Reference Counting ๊ธฐ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์˜ Race condition ๋ฐฉ์ง€ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ : ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ํŒŒ์ด์ฌ ๊ฐ์ฒด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ์ž‘์—…์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜๋„๋ก ๋ณด์žฅ ํŒŒ์ด์ฌ Interpreter์˜ ๊ตฌํ˜„์„ ๋‹จ์ˆœํ™” : ๋ณต์žกํ•œ ๋ฝ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”์—†์Œ C ํ™•์žฅ ๋ชจ๋“ˆ์ด Thread-Safe ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅ ํ”Œ๋žซํผ ๋…๋ฆฝ์„ฑ ์œ ์ง€ : CPU ์•„ํ‚คํ…์ฒ˜๋ณ„ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์˜์กดํ•˜์ง€ ์•Š์Œ ๋‹จ์  ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU ํ™œ์šฉ ์ œํ•œ: ๋‹จ์ผ ์ฝ”์–ด๋งŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์—†์Œ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋”ฉ ์„ฑ๋Šฅ ์ €ํ•˜ : ์“ฐ๋ ˆ๋“œ ๊ฐ„ context switching์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒ ๊ณต์ •์„ฑ ๋ฌธ์ œ : ํŠน์ • ์“ฐ๋ ˆ๋“œ๊ฐ€ GIL์„ ์žฅ์‹œ๊ฐ„ ์ ์œ ํ•˜๋ฉด starvation ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ Reference Counting ๊ฐ์ฒด๊ฐ€ ๋ช‡ ๋ฒˆ ์ฐธ์กฐ๋˜๋Š”์ง€๋ฅผ ์„ธ์–ด์„œ 0์ด ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ๋ฐฉ์‹ ํŒŒ์ด์ฌ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ์‹ ์žฅ์  : ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๊ฐ€ ์ฆ‰์‹œ ์ด๋ฃจ์–ด์ง ๋‹จ์  : Reference Counting์ด ๋ณต์žกํ•œ ๊ฐ์ฒด ์‚ฌ์ด์˜ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•จ IO Bound Task vs CPU Bound Task IO Bound Task : ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ, ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋“ฑ์˜ ์ž‘์—… CPU Bound Task : ๊ณ„์‚ฐ๋Ÿ‰์ด ๋งŽ์€ ์ž‘์—… GIL์ด ์ฃผ๋Š” ์˜ํ–ฅ IO Bound Task : I/O์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ GIL์ด ํ•ด์ œ๋˜์–ด ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Œ -> ์˜ํ–ฅ์ด ์ ์Œ CPU Bound Task : GIL์ด ํ•ด์ œ๋˜์ง€ ์•Š์•„ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์—†์Œ -> ์†ํ•ด๊ฐ€ ๋ฐœ์ƒ ๋Œ€์•ˆ multiprocessing ๋ชจ๋“ˆ ์‚ฌ์šฉ C ํ™•์žฅ ๋ชจ๋“ˆ ์‚ฌ์šฉ Jython, IronPython ๋“ฑ์˜ GIL์ด ์—†๋Š” ํŒŒ์ด์ฌ ๊ตฌํ˜„ ์‚ฌ์šฉ
new Github Actions์—์„œ pytest ์‹คํ–‰ํ•˜๊ธฐ
๐Ÿ Python
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„์—์„œ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค. ํ˜„์žฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ Unit Test๊ฐ€ ํ•„์š”ํ•˜๋‹ค. Unit Test ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , Github Actions๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ์ˆ˜ํ–‰๋˜๋„๋ก ์„ค์ •ํ•˜๊ณ ์ž ํ•œ๋‹ค. run-pytest.yml 1name: Run pytest 2 3# main ๋˜๋Š” dev ๋ธŒ๋žœ์น˜์— pull request๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‹คํ–‰ 4on: 5 pull_request: 6 branches: 7 - main 8 - dev 9 10jobs: 11 test: 12 runs-on: ubuntu-latest 13 14 steps: 15 - name: Checkout code 16 uses: actions/checkout@v2 17 18 - name: Set up Python 19 uses: actions/setup-python@v2 20 with: 21 python-version: '3.12' 22 23 - name: Install dependencies 24 run: | 25 python -m pip install --upgrade pip 26 pip install -r requirements.txt 27 28 - name: Run tests 29 run: pytest . ๊ฒฐ๊ณผ Run pytest . ============================= test session starts ============================== platform linux -- Python 3.12.4, pytest-8.2.2, pluggy-1.5.0 rootdir: /home/runner/work/Backend/Backend plugins: anyio-4.4.0 collected 13 items app/tests/test_crud_chatroom.py ... [ 23%] app/tests/test_crud_mentor.py ... [ 46%] app/tests/test_crud_prescription.py ... [ 69%] app/tests/test_crud_user.py .... [100%] ============================== 13 passed in 0.58s ============================== ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 100% ์ฐ๊ณ , CD๊นŒ์ง€ ๊ตฌํ˜„ํ•˜๋ฉด ๋”ํ•  ๋‚˜์œ„ ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.
new Python์˜ ๋™์ž‘ ์›๋ฆฌ
๐Ÿ Python
ํŒŒ์ด์ฌ์˜ ๊ตฌํ˜„์ฒด CPython ํŒŒ์ด์ฌ์˜ ํ‘œ์ค€ ๊ตฌํ˜„์ฒด์ด์ž ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์—ญํ•  ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ํŒŒ์ด์ฌ ๋ฐ”์ดํŠธ ์ฝ”๋“œ .pyc ํŒŒ์ผ์— ์ €์žฅ ํ”Œ๋žซํผ์— ๋…๋ฆฝ์  ํŒŒ์ด์ฌ ๊ฐ€์ƒ ๋จธ์‹ (PVM)์—์„œ ์‹คํ–‰ ์˜ˆ์‹œ 4 0 LOAD_GLOBAL 0 (print) 2 LOAD_CONST 1 ('hello world') 4 CALL_FUNCTION 1 6 POP_TOP 5 8 LOAD_CONST 2 (True) 10 RETURN_VALUE Jython ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜, JVM์—์„œ ์‹คํ–‰ ์žฅ์  : ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธ์ถœ, ์ž๋ฐ” ํด๋ž˜์Šค ์‚ฌ์šฉ ๊ฐ€๋Šฅ, GIL ์—†์Œ ๋‹จ์  : ํŒŒ์ด์ฌ 3.x ์ง€์›ํ•˜์ง€ ์•Š์Œ, CPython ๋Œ€๋น„ ์†๋„๊ฐ€ ๋А๋ฆผ PyPy ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ JIT ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰ RPython(Restricted Python)์œผ๋กœ ์ž‘์„ฑ๋œ ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์ ‘๊ทผ ๋ฐฉ์‹ RPython(์—„๊ฒฉํ•œ ํŒŒ์ด์ฌ)์„ ๋งŒ๋“ค์–ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์ž‘์„ฑ RPython์˜ ํšจ๊ณผ์ ์ธ ์ปดํŒŒ์ผ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ํˆด์ฒด์ธ์„ ์ œ์ž‘ Python ๊ตฌํ˜„์„ RPython ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑ 3์—์„œ ๋งŒ๋“  ๊ตฌํ˜„์„ 1, 2๋ฅผ ํ†ตํ•ด ์–ป์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ ์ปดํŒŒ์ผ 4์—์„œ ๋งŒ๋“  ํ›„๋ณด๋“ค์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ , ๊ฐœ์„  5์˜ ์‚ฐ์ถœ๋ฌผ์„ ์ถœ์‹œ, ๋‹ค์‹œ ๋ฐ˜๋ณต ์žฅ๋‹จ์  ์žฅ์  : CPython ๋Œ€๋น„ ๋น ๋ฅธ ์†๋„, ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ ์ง€์› ๋‹จ์  : ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์กด์žฌ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํผ
new Issue - fastapi์—์„œ websocket 404 ๋ฌธ์ œ
๐Ÿ Python
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„ ์ตœ์ข…๋ฐœํ‘œ ์ „๋‚ ์ด๋‹ค. 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 230315 ๊ธฐํ”„๋žฉ Design Thinking ๋ฐฉ๋ฒ•๋ก  - ๊น€์žฌ์ • ๊ต์ˆ˜๋‹˜
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๋””์ž์ธ ์”ฝํ‚น์ด๋ž€ ๊ณต๊ฐ์˜ ๊ณผ์ •์„ ํ†ตํ•ด ๋ฌธ์ œ์ ์„ ์ฐพ์•„๋‚ด๊ณ , ์•„์ด๋””์–ด๋ฅผ ๋ฐœ์‚ฐํ•˜๊ณ , ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค์–ด ๊ฒ€์ฆ ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š”, ๋ฐ˜๋ณต์  ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•๋ก  ๋ฐ ์‚ฌ๊ณ ๋ฐฉ์‹ ๋””์ž์ธ ์”ฝํ‚น ํ”„๋กœ์„ธ์Šค ๊ณต๊ฐ - ๋ฌธ์ œ ์ •์˜ - ์•„์ด๋””์–ด ๋„์ถœ - ํ”„๋กœํ† ํƒ€์ดํ•‘ - ํ…Œ์ŠคํŒ… 1. ๊ณต๊ฐ ๊ณต๊ฐ ํ”„๋กœ์„ธ์Šค ๋ฉด๋‹ดํ•˜๊ธฐ ๊ด€์ฐฐํ•˜๊ธฐ ๊ฒฝํ—˜ํ•˜๊ธฐ ๋ฉด๋‹ด์ง€ ์ค€๋น„ํ•˜๊ธฐ ์ˆœ์ฐจ์  ๊ฒฝํ—˜ ์งˆ๋ฌธ : ์–ด๋–ค ์ˆœ์„œ๋กœ ํ–‰๋™ํ•˜๊ณ  ๊ฒฝํ—˜ํ•˜๋Š”์ง€ ๋ฌผ์–ด๋ณด์ž ๊ฐ์ • ์งˆ๋ฌธ ์ด์œ  ์งˆ๋ฌธ : ํ–‰๋™ ๋˜๋Š” ๊ฐ์ •์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ๋ฌผ์–ด๋ณด์ž ๋˜ ์งˆ๋ฌธ : “๋˜…“๋ผ๋Š” ์งˆ๋ฌธ์„ ๋งŽ์ด ํ•˜์ž ๊ตฌ์ฒดํ™” ์งˆ๋ฌธ ๊ด€์ฐฐํ•˜๊ธฐ | ๋ชจ๋‹ˆํ„ฐ๋ง ํ˜„์žฅ ์ค‘์‹ฌ ๊ด€์ฐฐ : ์„ธ์ƒ์„ ๋„“๊ณ  ๊นŠ๊ฒŒ ๋ฐ”๋ผ๋ณด๊ธฐ ๊ด€์ฐฐํ•˜๊ธฐ | ์‰๋„์ž‰ ์‚ฌ๋žŒ์˜ ์ฒดํ—˜์ด๋‚˜ ํ–‰๋™์„ ๊ทธ์ž๋ฆฌ์—์„œ ๊ด€์ฐฐํ•˜๊ธฐ ๊ด€์ฐฐํ•˜๊ธฐ | ๋งฅ๋ฝ ์งˆ์˜๋ฒ• ํ˜„์žฅ์—์„œ ๊ด€์ฐฐ ๋ฐ ๋ฉด๋‹ด์„ ํ†ตํ•ด ๋Œ€์ƒ์ž์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋งฅ๋ฝ ์งˆ์˜๋ฒ•์˜ 4๊ฐ€์ง€ ์›์น™ ๋งฅ๋ฝ : ๋Œ€์ƒ์ž์˜ ์ž‘์—…ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๋””ํ…Œ์ผ์„ ๊ด€์ฐฐํ•˜๋ผ ํŒŒํŠธ๋„ˆ์‹ญ : ๋Œ€์ƒ์ž๋ฅผ ๊ณต๊ฐํ•˜๋ผ ํ•ด์„ : ์—ฐ๊ตฌ์ž๋Š” ๋Œ€์ƒ์ž์—๊ฒŒ ๋ณธ์ธ์˜ ํ•ด์„์„ ๊ณต์œ ํ•˜๋ผ ํฌ์ปค์Šค : ํ•ต์‹ฌ ๋ชฉํ‘œ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ๋งˆ๋ผ ๋งฅ๋ฝ ์งˆ์˜๋ฒ• ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ค€๋น„ํ•˜๊ธฐ, ๊ธฐ๋กํ•˜๊ธฐ ๋„์ œ๊ด€๊ณ„ ๋ชจ๋ธ (Master-apprentice Model) ๋งˆ์Šคํ„ฐ(๋Œ€์ƒ์ž)๊ฐ€ ํ•ด๋‹น ์—…๋ฌดํ™˜๊ฒฝ์—์„œ ์ž์‹ ์˜ ์ƒ๊ฐ๊ณผ ํ–‰๋™์„ ์†Œ๋ฆฌ๋‚ด์–ด ๋งํ•˜๊ฒŒ ํ•œ๋‹ค ์—ฐ๊ตฌ์ž๋Š” ๊ฒฌ์Šต์ƒ์ด ๋˜์–ด ์ค‘๊ฐ„์ค‘๊ฐ„ ๋ฌผ์–ด๋ณด๋ฉด์„œ ํ•™์Šตํ•œ๋‹ค ์†Œ๋ฆฌ๋‚ด์–ด ์ƒ๊ฐํ•˜๊ธฐ (Think Aloud) ๊ธฐ๋ฒ• ๋ณ‘ํ–‰์‹ : ๊ณผ์—…์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ด์•ผ๊ธฐ ํ•œ๋‹ค ํšŒ๊ณ ์‹ : ๋‹จ๊ณ„๋ณ„ ๊ณผ์—…์„ ๋๋‚ด๊ณ  ์ด์•ผ๊ธฐํ•œ๋‹ค ๋ณ‘ํ–‰+ํšŒ๊ณ  ํ•˜์ด๋ธŒ๋ฆฌ๋“œ 2. ๋ฌธ์ œ์ •์˜ ํŽ˜๋ฅด์†Œ๋‚˜ ๋งŒ๋“ค๋ฌผ ํŽ˜๋ฅด์†Œ๋‚˜ : ํŠน์ • ์ƒํ™ฉ์—์„œ ์–ด๋–ป๊ฒŒ ํ–‰๋™ํ•˜๊ณ  ๋ฐ˜์‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ๊ฐ€์ƒ์˜ ์ธ๋ฌผ, ์†”๋ฃจ์…˜์˜ ์ˆ˜ํ˜œ์ž POV ์ •์˜ํ•˜๊ธฐ ํŽ˜๋ฅด์†Œ๋‚˜์˜ ๊ด€์ ์—์„œ 1๊ฐœ์˜ POV๋กœ ์••์ถ•ํ•˜์ž POV(Point of View) ํŽ˜๋ฅด์†Œ๋‚˜๋Š” ๋ˆ„๊ตฌ์ธ๊ฐ€? ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์›ํ•˜๋Š”๊ฒƒ์€ ๋ฌด์—‡์ธ๊ฐ€? ํŽ˜๋ฅด์†Œ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์ด ์ค‘์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€? HMW ์ •์˜ํ•˜๊ธฐ ๊ตฌ์ฒด์ ์ธ ์•„์ด๋””์–ด๋ฅผ ๋‚ด๊ธฐ ์œ„ํ•œ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ ๊ณผ์ • POV๋กœ ๋ถ€ํ„ฐ ํŒŒ์ƒ๋˜๋ฉฐ “์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„"๋กœ ์ •์˜ ํ˜•์‹ : (์šฐ๋ฆฌ๋Š”) ์–ด๋–ป๊ฒŒ ~~~ ํ• ๊ฒƒ ์ธ๊ฐ€ ๊ณ ๊ฐ์—ฌ์ • ์ง€๋„ 3. ์•„์ด๋””์–ด ๋„์ถœ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ ์˜ค์ฆˆ๋ณธ์˜ 4์›์น™ ๋น„ํŒ๊ธˆ์ง€ ์ž์œ ๋ถ„๋ฐฉ ์งˆ๋ณด๋‹ค ์–‘ Idea ํŽธ์Šน ์–ดํ”ผ๋‹ˆํ‹ฐ ๋‹ค์ด์–ด๊ทธ๋ž˜๋ฐ (์นœํ™”๋„๋ฒ•) ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ์ดํ„ฐ์—์„œ ๊ณตํ†ต๋œ ์ด์Šˆ/๋ฌธ์ œ/ํ•„์š”์„ฑ ๋“ฑ์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ์Œ ์š”์•ฝํ•˜์—ฌ ํฌ์ŠคํŠธ์ž‡์— ๊ธฐ๋ก, ์œ ์‚ฌํ•œ ํ…Œ๋งˆ, ํ† ํ”ฝ์œผ๋กœ ๊ทธ๋ฃนํ™” ๋‹ค์–‘ํ•œ ์•„์ด๋””์–ด ๋„์ถœ ๋ฐฉ๋ฒ• ์˜์‚ฌ๊ฒฐ์ • ๊ทธ๋ฆฌ๋“œ (๊ธด๊ธ‰๋„, ์ค‘์š”๋„) 10+10 ๋ฐฉ๋ฒ• (10๊ฐœ์˜ ์•„์ด๋””์–ด, 10๊ฐœ์˜ ์†”๋ฃจ์…˜) ์•„์ด๋””์–ด ํ‰๊ฐ€ ํ…Œ์ด๋ธ” (์ ์ˆ˜ ๋งค๊ธฐ๊ธฐ) ์•„์ด๋””์–ด๋ฅผ ์ปจ์…‰์œผ๋กœ ์—ฎ๊ธฐ 4. Prototype ์Šคํ† ๋ฆฌ๋ณด๋“œ ์Šคํ† ๋ฆฌ๋ณด๋“œ๋Š” ์ œํ’ˆ ์‚ฌ์šฉ์˜ ํ™˜๊ฒฝ, ์ ˆ์ฐจ, ๋‹ˆ์ฆˆ ์ถฉ์กฑ ์š”์†Œ๊ฐ€ ํฌํ•จ๋œ๋‹ค ์Šคํ† ๋ฆฌ๋ณด๋”ฉ ์ ˆ์ฐจ ์Šคํ† ๋ฆฌ๋ผ์ธ ๋งŒ๋“ค๊ธฐ ๋ฉ”์ธ ์„ค์ •์ƒท ๊ทธ๋ฆฌ๊ธฐ ํ•ต์‹ฌ ์•„์ด๋””์–ด์˜ ์ „๋‹ฌ์„ ์œ„ํ•œ ์ ์ ˆํ•œ ์นด๋ฉ”๋ผ ๊ตฌ๋„ ์„ค์ • ๋ฐ ๊ทธ๋ฆฌ๊ธฐ ํ–‰๋™๊ณผ ์›€์ง์ž„ ๊ฐ•์กฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์‹œ์—ฐ ํ›„ ํ”ผ๋“œ๋ฐฑ ๋ฐ›๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ
new ์ž๋ฃŒ๊ตฌ์กฐ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
์ œ 1์žฅ : ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•œ ์ค€๋น„ (230302) ๋ฐฐ์—ด ๋ฐฐ์—ด(Array): ๋™์ผํ•œ ํƒ€์ž…์˜ ์›์†Œ๋“ค์ด ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๊ธฐ์ดˆ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ ์ถ”์ƒ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ถ”์ƒ๋ฐ์ดํ„ฐํƒ€์ž…(ADT:Abstract Data Type) : ๋ฐ์ดํ„ฐ์™€ ๊ทธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ถ”์ƒ์ ์ธ ์—ฐ์‚ฐ๋“ค๋กœ์จ ๊ตฌ์„ฑ ADT =~ ์ž๋ฐ”์˜ interface, ์ž๋ฃŒ๊ตฌ์กฐ =~ ์ž๋ฐ”์˜ class ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์ถ”์ƒ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ 1-2 ์ˆ˜ํ–‰์‹œ๊ฐ„์˜ ๋ถ„์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ฑ๋Šฅ: ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” **์‹œ๊ฐ„๋ณต์žก๋„(Time Complexity)**์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ˆ˜ํ–‰๋˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” **๊ณต๊ฐ„๋ณต์žก๋„(Space Complexity)**์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋ถ„์„ ์‹œ๊ฐ„ ๋ณต์žก๋„ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜(์—ฐ์‚ฐ)์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ณธ์ ์ธ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅ ํฌ๊ธฐ์˜ ํ•จ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ธฐ๋ณธ ์—ฐ์‚ฐ(Elementary Operation)์ด๋ž€ ๋ฐ์ดํ„ฐ ๊ฐ„ ํฌ๊ธฐ ๋น„๊ต, ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ๋ฐ ๊ฐฑ์‹ , ์ˆซ์ž ๊ณ„์‚ฐ ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์—ฐ์‚ฐ์„ ์˜๋ฏธ 4๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋ถ„์„ ์ตœ์•…๊ฒฝ์šฐ ๋ถ„์„(Worst-case Analysis) : ์ƒํ•œ์„ ์˜ ์˜๋ฏธ ํ‰๊ท ๊ฒฝ์šฐ ๋ถ„์„(Average-case Analysis) ์ตœ์„ ๊ฒฝ์šฐ ๋ถ„์„(Best-case Analysis) : ๊ฐ€์žฅ ๋น ๋ฅธ ์ˆ˜ํ–‰์‹œ๊ฐ„ ์ƒ๊ฐ๋ถ„์„(Amortized Analysis) : ์ด ์—ฐ์‚ฐํšŸ์ˆ˜๋ฅผ ํ•ฉํ•˜๊ณ  ์—ฐ์‚ฐ ํšŸ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ์ˆ˜ํ–‰์‹œ๊ฐ„์„ ๋ถ„์„ 1-3 ์ˆ˜ํ–‰์‹œ๊ฐ„์˜ ์ ๊ทผํ‘œ๊ธฐ๋ฒ• O (Big-Oh)-ํ‘œ๊ธฐ๋ฒ• ฮฉ (Big-Omega)-ํ‘œ๊ธฐ๋ฒ• ฮ˜ (Theta)-ํ‘œ๊ธฐ๋ฒ• O (Big-Oh) ํ‘œ๊ธฐ๋ฒ• ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ f(N) โ‰ค cg(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c์™€N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = O(g(N))์ด๋‹ค. ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ f(N) โ‰ค cg(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c์™€ N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = O(g(N)) f(N) = O(g(N))์€ N0 ๋ณด๋‹ค ํฐ ๋ชจ๋“  N ๋Œ€ํ•ด์„œ f(N)์ด ์–‘์˜ ์ƒ์ˆ˜๋ฅผ ๊ณฑํ•œ g(N)์— ๋ฏธ์น˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋œป g(N)์€ f(N)์˜ ์ƒํ•œ(Upper Bound) ์ด๋ผ๊ณ  ํ•œ๋‹ค ฮฉ (Big-Omega) ํ‘œ๊ธฐ๋ฒ• ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ f(N) โ‰ฅ cg(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c์™€ N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = ฮฉ(g(N)) f(N) = ฮฉ(g(N))์€ ์–‘์˜ ์ƒ์ˆ˜๋ฅผ ๊ณฑํ•œ g(N)์ด f(N)์— ๋ฏธ์น˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋œป g(N)์„ f(N)์˜ ํ•˜ํ•œ(Lower Bound) ์ด๋ผ๊ณ  ํ•œ๋‹ค ฮ˜ (Theta) ํ‘œ๊ธฐ๋ฒ• ๋ชจ๋“  N โ‰ฅ N0์— ๋Œ€ํ•ด์„œ c1g(N) โ‰ฅ f(N) โ‰ฅ c2g(N)์ด ์„ฑ๋ฆฝํ•˜๋Š” ์–‘์˜ ์ƒ์ˆ˜ c1, c2, N0๊ฐ€ ์กด์žฌํ•˜๋ฉด, f(N) = ฮ˜(g(N)) ฮ˜-ํ‘œ๊ธฐ๋Š” ์ˆ˜ํ–‰์‹œ๊ฐ„์˜ O-ํ‘œ๊ธฐ์™€ ฮฉ-ํ‘œ๊ธฐ๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์˜ O-ํ‘œ๊ธฐ์™€ ์ด๋ฆ„ O(1), O(logN), O(N), O(NlogN), O(N2), O(N3), O(2N) 1-5 ์ˆœํ™˜ (Recursion) ์ˆœํ™˜์œผ๋กœ ๊ตฌํ˜„๋œ ๋ฉ”์†Œ๋“œ์˜ ๊ตฌ์„ฑ์š”์†Œ ๊ธฐ๋ณธ(Base) case : ์Šค์Šค๋กœ๋ฅผ ๋” ์ด์ƒ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์ˆœํ™˜ case : ์Šค์Šค๋กœ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„ ๊ผฌ๋ฆฌ ์ˆœํ™˜ (Tail Recursion) ๋ฉ”์†Œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์—์„œ ์ˆœํ™˜ (ํ˜ธ์ถœ ํ›„ ๋˜๋Œ์•„ ์™”์„๋•Œ ์ˆ˜ํ–‰ํ•  ์—ฐ์‚ฐ์ด ์—†๋Š” ๊ฒฝ์šฐ) ๊ผฌ๋ฆฌ ์ˆœํ™˜์€ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค 1public class TailRecursion { 2 public static int factorial(int n, int fact) { 3 if (n==1) 4 return fact; 5 return factorial( ,); 6 } 7} ์ œ 2์žฅ : ๋ฆฌ์ŠคํŠธ ๋ฆฌ์ŠคํŠธ ์ผ๋ จ์˜ ๋™์ผํ•œ ํƒ€์ž…์˜ ํ•ญ๋ชฉ๋“ค์ด ๋‚˜์—ด๋œ ๊ฒƒ ๋ฐฐ์—ด ๋™์ผํ•œ ํƒ€์ž…์˜ ์›์†Œ๋“ค์ด ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ํ• ๋‹น๋˜์–ด ๊ฐ ํ•ญ๋ชฉ์ด ํ•˜๋‚˜์˜ ์›์†Œ์— ์ €์žฅ๋˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ ์ ‘๊ทผ : O(1), ์‚ฝ์ž…/์‚ญ์ œ : O(n) ๋ฐฐ์—ด๋กœ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ (ArrList) peek, insert, resize, delete ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Singly Linked List) print, search, insertFront, insertAfter ์ž๊ธฐ์ฐธ์กฐ๋ณ€์ˆ˜ 1public class Node <E> { 2 private Node<E> next; // ์ž๊ธฐ ์ฐธ์กฐ ๋ณ€์ˆ˜ 3 ... 4} ์ˆ˜ํ–‰์‹œ๊ฐ„ search : O(n) insert, delete : O(1), p๊ฐ€ ์•ˆ์ฃผ์–ด์ง€๋ฉด O(n) ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ (Doubly Linked List) head, tail, item insertBefore, insertAfter, delete, ์ˆ˜ํ–‰์‹œ๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐ : O(1) ํƒ์ƒ‰ ์—ฐ์‚ฐ : O(n) ์›ํ˜• ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Circular Linked List) ์ˆ˜ํ–‰์‹œ๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ ์—ฐ์‚ฐ : O(1) ํƒ์ƒ‰ ์—ฐ์‚ฐ : O(n) ์ œ 3์žฅ : ์Šคํƒ๊ณผ ํ ์Šคํƒ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ / LinkedList๋กœ ๊ตฌํ˜„ ํ›„์œ„ ํ‘œ๊ธฐ <-> ์ค‘์œ„ ํ‘œ๊ธฐ ์ˆ˜ํ–‰์‹œ๊ฐ„ push, pop : O(1) ๋ฐฐ์—ด ํฌ๊ธฐ์˜ ํ™•๋Œ€/์ถ•์†Œ : O(n) ๋‹จ์ˆœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ pop, push : O(1) ์ œ 4์žฅ : ํŠธ๋ฆฌ ์šฉ์–ด root, parent, child leaf, sibling, ancesto๋ฆฌ(์กฐ์ƒ), descendant(ํ›„์†) subtree(๋…ธ๋“œ ์ž์‹ ๊ณผ ํ›„์†์œผ๋กœ ๊ตฌ์„ฑ๋œ ํŠธ๋ฆฌ) degree(์ฐจ์ˆ˜ : ์ž์‹ ์ˆ˜) level (๊นŠ์ด์™€ ๋™์ผ, 0 ๋˜๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘) height (ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ level) key (ํƒ์ƒ‰์— ์‚ฌ์šฉ๋˜๋Š” ๋…ธ๋“œ์— ์ €์žฅ๋œ ์ •๋ณด) ์™ผ์ชฝ ์ž์‹-์˜ค๋ฅธ์ชฝ ํ˜•์ œ (Left Child-Right Sibling) ํ‘œํ˜„ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹๊ณผ ์˜ค๋ฅธ์ชฝ ํ˜•์ œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” 2๊ฐœ์˜ ๋ ˆํผ๋Ÿฐ์Šค๋งŒ ์‚ฌ์šฉ ์ด์ง„ ํŠธ๋ฆฌ (Binary Tree) ๊ฐ ๋…ธ๋“œ์˜ ์ž์‹ ์ˆ˜๊ฐ€ 2 ์ดํ•˜์ธ ํŠธ๋ฆฌ ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ์ด์ง„ํŠธ๋ฆฌ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ(Perfect Binary Tree) ๊ฐ ๋‚ด๋ถ€ ๋…ธ๋“œ๊ฐ€ 2๊ฐœ์˜ ์ž์‹์„ ๊ฐ€์ง€๊ณ  ๋ชจ๋“  ์ดํŒŒ๋ฆฌ๊ฐ€ ๊ฐ™์€ ์ธต์— ์žˆ๋Š” ํŠธ๋ฆฌ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ(Complete Binary Tree) ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์„ ์ œ์™ธํ•œ ๊ฐ ๋ ˆ๋ฒจ์ด ๋…ธ๋“œ๋“ค๋กœ ๊ฝ‰ ์ฐจ์žˆ๊ณ , ๋งˆ์ง€๋ง‰ ๋ ˆ๋ฒจ์—๋Š” ๋…ธ๋“œ๋“ค์ด ์™ผ์ชฝ๋ถ€ํ„ฐ ๋น ์ง์—†์ด ์ฑ„์›Œ์ง„ ํŠธ๋ฆฌ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์†์„ฑ ๋ ˆ๋ฒจ k์— ์žˆ๋Š” ์ตœ๋Œ€ ๋…ธ๋“œ ์ˆ˜ = $2^{k-1}$ ๋†’์ด๊ฐ€ h์ธ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ์— ์žˆ๋Š” ๋…ธ๋“œ ์ˆ˜ = $2^{h}-1$ n๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋†’์ด = $log_{2}(n+1)$ ๋†’์ด๊ฐ€ h์ธ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์— ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ์ˆ˜ n ๋ฐฐ์—ด์— ์ €์žฅ๋œ ์ด์ง„ ํŠธ๋ฆฌ ํŠธ๋ฆฌ 1A 2โ”œโ”€โ”€ B 3โ”‚ โ”œ-โ”€ D 4โ”‚ โ”‚ โ”œโ”€โ”€ H 5โ”‚ โ”‚ โ””โ”€โ”€ I 6โ”‚ โ””-โ”€ E 7โ”‚ โ”œโ”€โ”€ J 8โ”‚ โ””โ”€โ”€ K 9โ””โ”€โ”€ C 10 โ”œโ”€โ”€ F 11 โ””โ”€โ”€ G ์œ„ ํŠธ๋ฆฌ๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋ฉด (์ธ๋ฑ์Šค 1๋ถ€ํ„ฐ ์‹œ์ž‘) 1A = [A, B, C, D, E, F, G, H, I, J, K] a[i]์˜ ๋ถ€๋ชจ๋Š” a[i/2], ๋‹จ i>1 a[i]์˜ ์™ผ์ชฝ ์ž์‹์€ a[2i], ๋‹จ 2i <= n a[i]์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹์€ a[2i+1], ๋‹จ 2i+1 <= n ํŽธํ–ฅ(skewed) ์ด์ง„ ํŠธ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•˜๋‹ค ์ด์ง„ ํŠธ๋ฆฌ์˜ ์ˆœํšŒ preorder ; root - left - right inorder : left - root - right postorder : left - right - root levelorder : left -> right (from top level) ์ˆ˜ํ–‰ ์‹œ๊ฐ„ O(n) ์‹œ๊ฐ„์ด ์†Œ์š” ์ง‘ํ•ฉ์˜ ํ‘œํ˜„ ๋ฐฐ์—ด index 0 1 2 3 4 5 6 7 8 9 value 4 2 7 7 4 4 2 7 7 4 ์ง‘ํ•ฉ 1 17 2โ”œโ”€โ”€ 2 3โ”‚ โ”œ-โ”€ 1 4โ”‚ โ””-โ”€ 6 5โ”œโ”€โ”€ 8 6โ””โ”€โ”€ 3 ์ง‘ํ•ฉ2 14 2โ”œโ”€โ”€ 0 3โ”œโ”€โ”€ 5 4โ””โ”€โ”€ 9 ์ˆ˜ํ–‰ ์‹œ๊ฐ„ union : O(N) find : O(N) ์ œ 5์žฅ : ํƒ์ƒ‰ ํŠธ๋ฆฌ 5.1 ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ min ํ•จ์ˆ˜ deleteMin ํ•จ์ˆ˜ delete ํ•จ์ˆ˜ CASE 1 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ๋‘ ์ž์‹์ด ๋ชจ๋‘ null CASE 2 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ์ž์‹๋งŒ null CASE 3 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹๋งŒ null CASE 4 : ์‚ญ์ œํ•  ๋…ธ๋“œ์˜ ์ž์‹์ด ๋‘˜๋‹ค ์กด์žฌ ์‹œ๊ฐ„ ๋ณต์žก๋„ O($logn$) 5.2 AVL ํŠธ๋ฆฌ AVLํŠธ๋ฆฌ์˜ ์ •์˜ ์ž„์˜์˜ ๋…ธ๋“œ x์— ๋Œ€ํ•ด x์˜ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์™€ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด ์ฐจ์ด๊ฐ€ 1์„ ๋„˜์ง€ ์•Š๋Š” ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ AVLํŠธ๋ฆฌ์˜ ํšŒ์ „ ์—ฐ์‚ฐ LL ํšŒ์ „ : ์™ผ์ชฝ์œผ๋กœ ์น˜์šฐ์นœ ๊ฒฝ์šฐ rotateRight(n)๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ RR ํšŒ์ „ : ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์น˜์šฐ์นœ ๊ฒฝ์šฐ rotateLeft(n)๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ LR ํšŒ์ „ : rotateLeft(n.left) -> rotateRight(n)๋กœ ํ•ด๊ฒฐ RL ํšŒ์ „ : rotateRight(n.right) -> rotateLeft(n)๋กœ ํ•ด๊ฒฐ 4๊ฐ€์ง€ ํšŒ์ „์˜ ๊ณตํ†ต์  ํšŒ์ „ ํ›„์˜ ํŠธ๋ฆฌ๋“ค์ด ๋ชจ๋‘ ๊ฐ™๋‹ค, ๋ชจ๋‘ O(1) AVLํŠธ๋ฆฌ์˜ ์—ฐ์‚ฐ ์‚ฝ์ž… ์—ฐ์‚ฐ ์ด์ง„ ํŠธ๋ฆฌ์˜ ์‚ฝ์ž…๊ณผ ๋™์ผํ•˜๊ฒŒ ์ƒˆ ๋…ธ๋“œ ์‚ฝ์ž… ์ƒˆ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๋ฃจํŠธ๋กœ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๋ถˆ๊ท ํ˜•์ด ๋ฐœ์ƒํ•˜๋ฉด ์ ์ ˆํ•˜๊ฒŒ ํšŒ์ „ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ์‚ญ์ œ ์—ฐ์‚ฐ 5.3 2-3 ํŠธ๋ฆฌ 2-3 ํŠธ๋ฆฌ์˜ ์ •์˜ ์ž„์˜์˜ ๋…ธ๋“œ๊ฐ€ 2๊ฐœ ๋˜๋Š” 3๊ฐœ์˜ ์ž์‹์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ๋กœ, ๋ชจ๋“  ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๋ ˆ๋ฒจ์— ์žˆ๋‹ค. 2-3 ํŠธ๋ฆฌ์˜ ์—ฐ์‚ฐ ํƒ์ƒ‰ ์—ฐ์‚ฐ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์™€ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํƒ์ƒ‰ ๋ถ„๋ฆฌ ์—ฐ์‚ฐ ํ‚ค๋ฅผ ๋ถ€๋ชจ๋กœ ์˜ฌ๋ ค ๋ณด๋ƒ„ ๋ถ€๋ชจ๊ฐ€ 3-๋…ธ๋“œ์ด๋ฉด ๋‹ค์‹œ ๋ถ„๋ฆฌ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ๋ฃจํŠธ์—์„œ ์ผ์–ด๋‚˜๋ฉด ํŠธ๋ฆฌ์˜ ๋†’์ด 1 ์ฆ๊ฐ€ ์‚ฝ์ž… ์—ฐ์‚ฐ ์‚ฝ์ž… ํ›„ ๋ถ„๋ฆฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ ์‚ญ์ œ ์—ฐ์‚ฐ ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ์ด๋ฉด ๊ทธ๋ƒฅ ์‚ญ์ œ ์‚ญ์ œํ•œ ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ตํ™˜ ํ›„ ์‚ญ์ œ ์ด๋™ ์—ฐ์‚ฐ, ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ฌ์šฉ ์ด๋™ ์—ฐ์‚ฐ ๋นˆ ์ž๋ฆฌ๋ฅผ ํ˜•์ œ์™€ ๋ฐ”๊พผ๋‹ค ์ด๋™์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด ํ†ตํ•ฉ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ญ์ œํ•œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ์™€ ํ˜•์ œ๋ฅผ ํ†ตํ•ฉํ•œ๋‹ค 2-3 ํŠธ๋ฆฌ์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„ ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ -> O($logn$) -> ํŠธ๋ฆฌ์˜ ๋†’์ด์— ๋น„๋ก€ ๋ถ„๋ฆฌ ์—ฐ์‚ฐ, ํ†ตํ•ฉ ์—ฐ์‚ฐ -> O(1) 2-3ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ฒฝ์šฐ ๋ชจ๋“  ๋…ธ๋‘๊ฐ€ 2-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ๋†’์ด : $ log_2(n+1) $ 2-3ํŠธ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฒฝ์šฐ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ 3-๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ๋†’์ด : $ log_3(n) $ 5.4 2-3-4 ํŠธ๋ฆฌ 2-3ํŠธ๋ฆฌ๋ฅผ ํ™•์žฅํ•œ 2-3-4 ํŠธ๋ฆฌ๋Š” ๋…ธ๋“œ๊ฐ€ ์ž์‹์„ 4๊ฐœ๊นŒ์ง€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์™„์ „๊ท ํ˜•ํŠธ๋ฆฌ ์ด๋ก ์ ์œผ๋กœ๋Š” 2-3ํŠธ๋ฆฌ์™€ ๋™์ผํ•˜๋‹ค ์‹ค์ œ๋กœ๋Š” ๋” ๋น ๋ฆ„ 5.5 B-ํŠธ๋ฆฌ B-ํŠธ๋ฆฌ์˜ ์ •์˜ ๋‹ค์ˆ˜์˜ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๋‹ค๋ฐฉํ–ฅ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•œ ๊ท ํ˜„ํŠธ๋ฆฌ B-ํŠธ๋ฆฌ์˜ ์—ฐ์‚ฐ ํƒ์ƒ‰ ์—ฐ์‚ฐ ๋ฃจํŠธ ๋ถ€ํ„ฐ ์‹œ์ž‘ ๊ฐ ๋…ธ๋“œ์—์„œ ์ด์ง„ ํƒ์ƒ‰ ์ˆ˜ํ–‰ ์‚ฝ์ž… ์—ฐ์‚ฐ ์ดํŒŒ๋ฆฌ์— ์ƒˆ ํ‚ค๋ฅผ ์ˆ˜์šฉํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด, ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์‚ฝ์ž… ์ด๋ฏธ M-1๊ฐœ์˜ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด, ๋ถ„๋ฆฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ ์‚ญ์ œ ์—ฐ์‚ฐ ์‚ญ์ œํ•  ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ์ด๋ฉด ๊ทธ๋ƒฅ ์‚ญ์ œ ์‚ญ์ œํ•œ ๋…ธ๋“œ๊ฐ€ ์ดํŒŒ๋ฆฌ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ตํ™˜ ํ›„ ์‚ญ์ œ ์ด๋™ ์—ฐ์‚ฐ, ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ฌ์šฉ ์ด๋™ ์—ฐ์‚ฐ ํ‚ค์˜ ์ˆ˜๊ฐ€ M/2-1๋ณด๋‹ค ์ž‘์œผ๋ฉด(underflow) ํ˜•์ œ, ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ์ด๋Šฅ ์ด๋™ ์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด ํ†ตํ•ฉ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ํ†ตํ•ฉ ์—ฐ์‚ฐ ์‚ญ์ œํ•œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ์™€ ํ˜•์ œ๋ฅผ ํ†ตํ•ฉํ•œ๋‹ค B-ํŠธ๋ฆฌ์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„ ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ -> O($log_{M/2}n$) -> ํŠธ๋ฆฌ์˜ ๋†’์ด์— ๋น„๋ก€ ์ œ 6์žฅ : ํ•ด์‹œ ํ…Œ์ด๋ธ” ๋Œ€ํ‘œ์ ์ธ ํ•ด์‹œ ํ•จ์ˆ˜ ์ค‘๊ฐ„ ์ œ๊ณฑ ํ•จ์ˆ˜ : ํ‚ค๋ฅผ ์ œ๊ณฑํ•œ ํ›„, ์ ์ ˆํ•œ ํฌ๊ธฐ์˜ ์ค‘๊ฐ„ ๋ถ€๋ถ„์„ ์‚ฌ์šฉ ์ ‘๊ธฐ ํ•จ์ˆ˜ : ํ‚ค๋ฅผ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ ํ›„, ์ด๋“ค์„ ๋”ํ•œ ๊ฐ’์„ ์‚ฌ์šฉ ์ž๋ฐ”์˜ hashCode() 1private int hash(Key k) { 2 return (k.hashCode() & 0x7fffffff) % M; 3} ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ €์žฅ ๋ฐฉ์‹ ๊ฐœ๋ฐฉ ์ฃผ์†Œ ๋ฐฉ์‹ : ์ถฉ๋Œ๋œ ํ‚ค๋ฅผ ์ผ์ •ํ•œ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ฐพ์•„๋‚ธ empty์›์†Œ์— ์ €์žฅ ์„ ํ˜• ์กฐ์‚ฌ, ์ด์ฐจ์กฐ์‚ฌ, ์ด์ค‘ํ•ด์‹ฑ ์„ ํ˜• ์กฐ์‚ฌ : ์ถฉ๋Œ์ด ์ผ์–ด๋‚œ ๊ณณ์œผ๋กœ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ํƒ์ƒ‰ 1์ฐจ ๊ตฐ์ง‘ํ™” (ํ‚ค๋“ค์ด ๋ญ‰์ณ์ง€๋Š” ํ˜„์ƒ) ๋ฐœ์ƒ ๊ตฐ์ง‘ํ™”๋Š” ๊ตฐ์ง‘๋œ ํ‚ค๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ ์„ ์ผ์œผํ‚จ๋‹ค ์ œ 7์žฅ : ์šฐ์„ ์ˆœ์œ„ ํ ์šฐ์„ ์ˆœ์œ„ ํ (Priority Queue) ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ํ•ญ๋ชฉ์— ์ ‘๊ทผ๊ณผ ์‚ญ์ œ, ์ž„์˜์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ํ•ญ๋ชฉ์˜ ์‚ฝ์ž…์„ ์ง€์›ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ํž™ (Heap) ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋กœ์„œ ๋ถ€๋ชจ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ž์‹์˜ ์šฐ์„ ์ˆœ์œ„๋ณด๋‹ค ๋†’์€ ์ž๋ฃŒ๊ตฌ์กฐ ์ตœ์†Œ ํž™, ์ตœ๋Œ€ ํž™ ํž™์˜ ์—ฐ์‚ฐ ์ตœ์†Ÿ๊ฐ’ ์‚ญ์ œ ๋ฃจํŠธ ์‚ญ์ œ ํ›„, ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ์ด๋™ downheap ์ˆ˜ํ–‰ : ๋ฃจํŠธ๋ถ€ํ„ฐ ๋น„๊ตํ•˜๋ฉด์„œ ๋‚ด๋ ค๊ฐ ์‚ฝ์ž… ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์˜ ๋‹ค์Œ์— ์‚ฝ์ž… upheap ์ˆ˜ํ–‰ : ๋ฃจํŠธ๋กœ ๋น„๊ตํ•˜๋ฉด์„œ ์˜ฌ๋ผ๊ฐ ์ƒํ–ฅ์‹ ํž™ 1public void createHeap() { 2 for (int i = N/2; i>0; i--) { 3 downheap(i); 4 } 5} O(n) ์ˆ˜ํ–‰ ์‹œ๊ฐ„ ์ ‘๊ทผ, ์‚ฝ์ž…, ์‚ญ์ œ : O(logn) ์ œ 8์žฅ : ์ •๋ ฌ ์„ ํƒ ์ •๋ ฌ (Selection Sort) ํ•ญ์ƒ O(n^2) ์‚ฝ์ž… ์ •๋ ฌ (Insertion Sort) ์ตœ์•… : O(n^2) ์ตœ์„  : O(n) : ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ ํž™ ์ •๋ ฌ (Heap Sort) ํ•ญ์ƒ : O(nlogn) ํ•ฉ๋ณ‘ ์ •๋ ฌ (Merge Sort) ํ•ญ์ƒ : O(nlogn) Stable Sort : ๊ฐ™์€ ๊ฐ’์˜ ํ‚ค๋ฅผ ๊ฐ€์ง„ ๋ ˆ์ฝ”๋“œ์˜ ์ˆœ์„œ๊ฐ€ ์ •๋ ฌ ํ›„์—๋„ ์œ ์ง€๋˜๋Š” ์ •๋ ฌ ํ€ต ์ •๋ ฌ (Quick Sort) ์ตœ์•… : O(n^2) ์ตœ์„  : O(nlogn) ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฐฉ๋ฒ• Median of Three : ์ฒซ๋ฒˆ์งธ, ๋งˆ์ง€๋ง‰, ์ค‘๊ฐ„๊ฐ’ ์ค‘์—์„œ ์ค‘๊ฐ„๊ฐ’์„ ํ”ผ๋ฒ—์œผ๋กœ ์„ ํƒ ์ž…๋ ฅ์ด ์ž‘์€ ํฌ๊ธฐ๊ฐ€ ๋˜์—ˆ์„๋•Œ ์‚ฝ์ž… ์ •๋ ฌ์„ ์‚ฌ์šฉ
new ์›น ๋ณด์•ˆ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
Web Security Model Web ๋ณด์•ˆ์˜ ๋ชฉํ‘œ Integirty : ๋ฌด๊ฒฐ์„ฑ Confidentiality : ๊ธฐ๋ฐ€์„ฑ HTTP URL https:// www.example.edu :80 /lectures ?lec=80 #slides protocol + hostname + port + path + query + fragment Cookies ์„œ๋ฒ„๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ณด๋‚ด๋Š” ์ •๋ณด ์—ญํ•  : ์„ธ์…˜ ๊ด€๋ฆฌ, ์‚ฌ์šฉ์ž ์„ค์ • ์ €์žฅ, ์‚ฌ์šฉ์ž ์ถ”์  ๋“ฑ 1// ์ฟ ํ‚ค ์„ค์ • 2Set-Cookie: name=value; 3// ์ฟ ํ‚ค ์ „์†ก 4Cookie: name=value; Same Origin Policy (SOP) ๊ฐ™์€ Origin์—์„œ๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค Origin scheme://domain:port Domain Relaxation ์„œ๋ธŒ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  document.domain์„ ์ˆ˜์ •ํ•˜์—ฌ, ์„œ๋ธŒ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  ๊ฐ€๋Šฅ ์˜ˆ์‹œ 1a.domain.com -> domain.com ๊ฐ€๋Šฅ 2a.domain.com -> b.domain.com ๋ถˆ๊ฐ€๋Šฅ 3a.domain.com -> com ๋ถˆ๊ฐ€๋Šฅ ์ทจ์•ฝ์  : ์•…์˜์ ์ธ ์‚ฌ์ดํŠธ๊ฐ€ document.domain์„ ์ˆ˜์ •ํ•˜์—ฌ ์ ‘๊ทผ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : Mozilla Public Suffix List (PSL) ์‚ฌ์šฉ BroadcastChannel API ๊ฐ™์€ origin์˜ ๋‹ค๋ฅธ context ๊ฐ„์˜ ํ†ต์‹  ์‚ฌ์šฉ๋ฒ• 1const bc = new BroadcastChannel('channel'); 2bc.postMessage('message'); 3bc.onmessage = (e) => console.log(e.data); XMLHttpRequest (XHR) ์„œ๋ฒ„์™€ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฐ์ฒด CORS (Cross-Origin Resource Sharing) ๋‹ค๋ฅธ Origin์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ, ์„œ๋ฒ„์—์„œ ํ—ˆ์šฉํ•˜๋Š” ์ •์ฑ… Cookie ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด๋Š” ์ •๋ณด Cookie Scoping Domain ํ•ด๋‹น ๋„๋ฉ”์ธ์€ Subdomain ๋˜๋Š” Parent Domain์— ๋Œ€ํ•ด์„œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†ก Path ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ํ•˜์œ„ ๊ฒฝ๋กœ๊นŒ์ง€ ์ฟ ํ‚ค๋ฅผ ์ „์†ก Secure Cookies HTTPS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†ก 1Set-Cookie: name=value; Secure HTTPOnly Cookies JavaScript์—์„œ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ํ•จ 1Set-Cookie: name=value; HttpOnly CSRF (Cross Site Request Forgery) ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์—์„œ ์š”์ฒญ์„ ์œ„์กฐํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ๋ฐฐ๊ฒฝ ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ๋ผ๋ฉด, ์‚ฌ์šฉ์ž๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ์ „์†ก cross-site์—์„œ๋„ ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„๋•Œ, ์„œ๋ฒ„๊ฐ€ same-site์ธ์ง€ cross-site์ธ์ง€ ํ™•์ธ์ด ๋ถˆ๊ฐ€ํ•œ ๊ฒฝ์šฐ CSRF ๊ณต๊ฒฉ ๊ฐ€๋Šฅ ์˜ˆ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค ํ”ผํ•ด์ž๊ฐ€ ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ๋กœ Malicious Site์— ์ ‘์† Malicious site์—์„œ ํ”ผํ•ด์ž ์˜์ง€์™€ ์ƒ๊ด€์—†์ด ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ์ „์†ก GET ์˜ˆ์‹œ ์ฝ”๋“œ 1<img src="http://bank.com/transfer?to=attacker&amount=1000" /> POST ์˜ˆ์‹œ ์ฝ”๋“œ 1<form action="http://bank.com/transfer" method="post"> 2 <input type="hidden" name="to" value="attacker" /> 3 <input type="hidden" name="amount" value="1000" /> 4</form> 5<script> 6 document.forms[0].submit(); 7</script> ๋ฐฉ์–ด Referer Header ์š”์ฒญ์„ ๋ณด๋‚ธ ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” HTTP header๋ฅผ ํ™•์ธํ•˜์—ฌ, ์š”์ฒญ์„ ๋ณด๋‚ธ ํŽ˜์ด์ง€๊ฐ€ ๊ฐ™์€ ์‚ฌ์ดํŠธ์ธ์ง€ ํ™•์ธ 1Referer: http://www.example.com ํ•œ๊ณ„ ํ•ด๋‹น field๋ฅผ ์ด์šฉํ•ด์„œ ์ ‘์† ๊ธฐ๋ก์„ ํ™•์ธ ๊ฐ€๋Šฅ -> ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฌธ์ œ Same-Site Cookies ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ๋•Œ, SameSite๋ผ๋Š” ์ฟ ํ‚ค ์†์„ฑ๋ฅผ ์ „์†ก, same-site์ธ์ง€ cross-site์ธ์ง€ ํ™•์ธํ•˜์—ฌ, ์„ค์ •๊ฐ’์— ๋”ฐ๋ผ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์Œ ์„ค์ • ๊ฐ’ None (๋ชจ๋“  ์š”์ฒญ์— ์ฟ ํ‚ค ์ „์†ก) Strict (cross-site๋Š” ํ•ญ์ƒ ์ฟ ํ‚ค ์ „์†กํ•˜์ง€ ์•Š์Œ) Lax (cross-site๋Š” GET ์š”์ฒญ์‹œ์—๋งŒ ์ฟ ํ‚ค ์ „์†กํ•˜์ง€ ์•Š์Œ) Secret Token ํŠน์ • origin์˜ ์ฒซ ์š”์ฒญ๋•Œ, ํŠน์ •ํ•œ ํ† ํฐ์„ ์ƒ์„ฑ, ์ดํ›„ ์š”์ฒญ์‹œ ํ•ด๋‹น ํ† ํฐ์„ ํ•จ๊ป˜ ์ „์†กํ•˜์—ฌ, ์š”์ฒญ์ด ๊ฐ™์€ Origin์—์„œ ์˜จ ๊ฒƒ์ธ์ง€ ํ™•์ธ Bypassing with Clickjacking ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ํด๋ฆญ์„ ์œ ๋„ํ•˜์—ฌ, CSRF ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ• ๋ฐฉ์–ด X-Frame-Options Header (๊ฐ’ : DENY, SAMEORIGIN, ALLOW-FROM uri) ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ XSS(Cross Site Scripting) Attack Non-persistent (Reflected) XSS Attack ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜์—ฌ, ๊ณต๊ฒฉ์ž๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ query string์„ ์‹คํ–‰ํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌ (innerHTML) ํ”ผํ•ด์ž๊ฐ€ ํ•ด๋‹น ๋งํฌ๋ฅผ ์‹คํ–‰ => http://www.example.com/search?input=<script>alert(โ€œattackโ€);</script> ํ”ผํ•ด์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ alert๊ฐ€ ์‹คํ–‰๋จ Persistent (Stored) XSS Attack ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ DB์— ์ €์žฅํ•˜์—ฌ, ๊ณต๊ฒฉ์ž๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ ๊ฒŒ์‹œํŒ์— ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌ ํ”ผํ•ด์ž๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๊ธ€์„ ์ฝ์„ ๋•Œ, ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋จ XSS๋กœ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ํ”ผํ•ด Web defacing(์›นํŽ˜์ด์ง€ ๋ณ€์กฐ) Spoofing requests(์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ๋ณ€์กฐ) Stealing information(์ •๋ณด ํƒˆ์ทจ) Self-Propagation XSS Worm XSS ๊ณต๊ฒฉ์„ ํ†ตํ•ด, ์ž๋™์œผ๋กœ ๊ณต๊ฒฉ์„ ์ „ํŒŒํ•˜๋Š” ๊ธฐ๋ฒ• 2๊ฐ€์ง€ ์ ‘๊ทผ DOM Approach 1let jsCode = document.getElementById('worm').innerHTML; Link Approach 1let jsCode = `'<script src="http://www.example.com/worm.js"></script>'`; ๋ฐฉ์–ด ์ž…๋ ฅ๊ฐ’ ํ•„ํ„ฐ๋ง : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ํ•„ํ„ฐ๋งํ•˜์—ฌ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค Encoding : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์ถœ๋ ฅํ•  ๋•Œ, HTML Encodingํ•˜์—ฌ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค Content Security Policy (CSP) : ์›นํŽ˜์ด์ง€์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œํ•˜์—ฌ, XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•œ๋‹ค ์˜ˆ์‹œ (script ํŒŒ์ผ) 1Content-Security-Policy: script-src 'self' example.com ์˜ˆ์‹œ (inline script) 1Content-Security-Policy: script-src 'nonce-2726c7f26c' 2// allowed script 3`<script nonce=2726c7f26c> ... </script>` 4// not allowed script 5`<script nonce=42eh44jhad> ... </script>` SQL Injection SQL ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ, DB์— ๋Œ€ํ•œ ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ EID์— “EID5002’#“์„ ์‚ฝ์ž… -> PASSWORD ๊ฒ€์ฆ์„ ์šฐ์ฆ 1SELECT NAME, SALERY, SSN 2FROM EMPLOYEE 3WHERE EID='EID5002'#' AND PASSWORD='1234'; curl์„ ์ด์šฉํ•ด์„œ SQL Injection ๊ณต๊ฒฉ 1curl 'www.example.com/getdata.php?EID=a' OR 1=1&PASSWORD=' ๋ฐฉ์–ด Filtering and Encoding data SQL Injection์—์„œ ์“ฐ์ด๋Š” ํŠน์ˆ˜๋ฌธ์ž๋ฅผ Filtering, Encoding 1$mysqli->real_escape_string($input); ํ•œ๊ณ„ ํ•„์š”ํ•œ ๋ฌธ์ž์—ด์„ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Œ Prepared Statements SQL ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜์—ฌ, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๊ณ , ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ 1$stmt = $mysqli->prepare("SELECT NAME, SALARY, SSN FROM EMPLOYEE WHERE EID=? AND PASSWORD=?"); 2// ss means "string string" 3$stmt->bind_param("ss", $EID, $PASSWORD); 4$stmt->execute(); Blind SQL Injection SQL Injection ๊ณต๊ฒฉ์„ ํ†ตํ•ด, DB์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๋Š” ๊ธฐ๋ฒ• Conditional Response 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฐ์ง€ ํ™•์ธ */ 2xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'm 3/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 't'๋ณด๋‹ค ํฐ์ง€ ํ™•์ธ */ 4xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 't SQL Error - Divide by Zero 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ */ 2xyz' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 3'm') THEN 1/0 ELSE 'a' END FROM Users)='a SQL Error - Cast 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ */ 2CAST((SELECT example_column FROM example_table) AS int) Time Delay 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ๋”œ๋ ˆ์ด ๋ฐœ์ƒ */ 2'; IF (SELECT COUNT(Username) FROM Users WHERE Username = 'Administrator' AND 3SUBSTRING(Password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'- ShellShock Attack bash ์‰˜์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Set-UID Programs Set-UID root ๊ถŒํ•œ์„ ๊ฐ€์ง„ ํ”„๋กœ๊ทธ๋žจ์ด systemํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• RUID : Real User ID : ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ EUID : Effective User ID : ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๊ถŒํ•œ Set-UID Program : ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ root ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ, RUID์™€ EUID๊ฐ€ ๋‹ค๋ฆ„, Set-UID Program์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 1$ sudo chown root vul 2$ sudo chmod 4755 vul 3$ ls -l vul 4-rwsr-xr-x 1 root root 1234 Mar 11 12:00 vul # s๊ฐ€ ์กด์žฌ ์ทจ์•ฝํ•œ C ํ”„๋กœ๊ทธ๋žจ (vul : Set-UID program) 1#include <stdio.h> 2void main() { 3 setuid(geteuid()); // root ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋กœ ์„ค์ • 4 system("/bin/ls -l"); // ls -l ๋ช…๋ น์–ด ์‹คํ–‰ 5} ๊ณต๊ฒฉ ๋ช…๋ น์–ด 1$ export foo='() { echo "hello"; }; /bin/sh' 2$ ./vul CGI(Common Gateway Interface) Programs ์›น ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” CGI ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ทจ์•ฝ์  ์ทจ์•ฝํ•œ CGI ํ”„๋กœ๊ทธ๋žจ (test.cgi) 1#!/bin/bash 2echo "Content-type: text/plain" 3echo 4echo "Hello, World!" ๊ณต๊ฒฉ ๋ช…๋ น์–ด 1$ curl http://10.0.2.69/cgi-bin/test.cgi 2Hello, World! ๊ณต๊ฒฉ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์„ค์ • ํŒŒ์ผ์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ db password ํƒˆ์ทจ reverse shell ์‹คํ–‰ Environment Variables & Attacks ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ• fork() : ์ž์‹์„ ์ƒ์„ฑ, ์ž์‹์ด ๋ถ€๋ชจ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ƒ์† execve() : ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์ž์‹์œผ๋กœ ์‹คํ–‰, ์ƒˆ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ • Attacks via Dynamic Linker ๋งํฌ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์›๋ฆฌ LD_PRELOAD๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชฉ๋ก์„ ์ €์žฅ ํ•จ์ˆ˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด, LD_LIBRARY_PATH์—์„œ ์ฐพ์Œ ๋‘ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๋งํฌ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐ์ž‘ ์˜ˆ์‹œ 1$ export LD_PRELOAD=/path/to/malicious.so 2$ ./vul Attacks via Execution Program ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์„ ์กฐ์ž‘ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ 1$ export PATH=/path/to/malicious:$PATH 2$ ./vul 3# // root shell ์ทจ๋“ Attacks via Library format string ๋“ฑ์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Attacks via Application Code buffer overflow ๋“ฑ์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Set-UID Approach VS Service Approach Clickjacking Attack ์‚ฌ์šฉ์ž์˜ ์˜๋„์™€ ์ƒ๊ด€์—†์ด ํด๋ฆญ์„ ์œ ๋„ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• 1<iframe id="top" src="http://www.attack.com" style="opacity: 0"></iframe> 2<iframe id="bottom" src="http://www.example.com>" style="opacity: 1"></iframe> ๋ฐฉ์–ด Client-side (Framekiller and Framebuster) javascript๋ฅผ ์ด์šฉํ•˜์—ฌ, ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ iframe์œผ๋กœ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ 1if (top != self) 2if (top.location != self.location) 3... ํ•œ๊ณ„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋งŽ์•„์„œ ๋ถˆ์•ˆ์ • -> ์ž˜ ์“ฐ์ง€ ์•Š๋Š”๋‹ค ์šฐํšŒ Double framing : ๋‘๊ฐœ์˜ iframe์„ ์‚ฌ์šฉํ•˜์—ฌ, ์ฒซ๋ฒˆ์งธ iframe์„ ์ˆจ๊ธฐ๊ณ , ๋‘๋ฒˆ์งธ iframe์„ ๋ณด์—ฌ์คŒ Abusing onBeforeUnload : ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚  ๋•Œ, alert์„ ๋„์›Œ์„œ, ์‚ฌ์šฉ์ž์˜ ํด๋ฆญ์„ ์œ ๋„ sandbox attribute : iframe์— sandbox attribute๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ•ด๋‹น iframe์—์„œ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•จ options allow-same-origin allow-scripts allow-forms allow-modals allow-top-navigation ์˜ˆ์‹œ 1<iframe ... sandbox="allow_forms allow-scripts"></iframe> Referrer checking problems Referer๋ฅผ ํ™•์ธํ•˜์—ฌ ํŠน์ • ๋„๋ฉ”์ธ์˜ ์‚ฌ์ดํŠธ๋งŒ iframe์œผ๋กœ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ•œ๊ณ„ : Referer๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ์šฐํšŒ ๊ฐ€๋Šฅ Server-side X-Frame-Options ํŠน์ • ORIGIN ํŽ˜์ด์ง€์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ ์˜ˆ์‹œ 1X-Frame-Options: DENY // ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ 2X-Frame-Options: SAMEORIGIN // ๊ฐ™์€ ORIGIN ํŽ˜์ด์ง€์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋ง 3X-Frame-Options: ALLOW-FROM uri // ํŠน์ • uri์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋ง Outdated : CSP ์‚ฌ์šฉ ๊ถŒ์žฅ Content Security Policy (CSP) ์›นํŽ˜์ด์ง€์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œ script-src : ์Šคํฌ๋ฆฝํŠธ source๋ฅผ ์ œํ•œ img-src : ์ด๋ฏธ์ง€์˜ source๋ฅผ ์ œํ•œ frame-ancestors : <frame>, <iframe>, <object>, <embed> ๋˜๋Š” <applet> ์š”์†Œ์˜ ๋ถ€๋ชจ๋ฅผ ์ œํ•œ ์˜ˆ์‹œ 1$csp = "Content-Security-Policy: frame-ancestors *"; 2header($csp); Types of Context Integrity Visual Integrity ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์— ๋Œ€ํ•œ ๋ฌด๊ฒฐ์„ฑ ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ• : User Confirmation, UI Randomization, Visibility Detection on Click Temporary Integrity ์‚ฌ์šฉ์ž ํ™•์ธ ์‹œ์ ๊ณผ ํด๋ฆญ ์‹œ์ž‘ ์‹œ์  ์‚ฌ์ด์˜ UI ์ƒํƒœ ์ฐจ์ด์— ๋Œ€ํ•œ ๋ฌด๊ฒฐ์„ฑ ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ• : Access Control Gadgets SSRF (Server Side Request Forgery) ์„œ๋ฒ„์—์„œ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ• ๊ณต๊ฒฉ (์„œ๋ฒ„๊ฐ€ ์‹ ๋ขฐ๋œ ์„œ๋ฒ„์—์„œ ์š”์ฒญ์ด ์˜จ ๊ฒƒ์œผ๋กœ ์ฐฉ๊ฐ) 1POST /product/stock HTTP/1.0 2Content-Type: application/www-form-urlencoded 3Content-Length: 30 4 5stockApi=http://localhost/admin ๋ฐฉ์–ด ์ฐจ๋‹จ๋œ ๋ฌธ์ž์—ด์„ URL ์ธ์ฝ”๋”ฉ ๋˜๋Š” ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ˜•์„ ํ†ตํ•ด ์ˆจ๊น€ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์š”์ฒญ์„ ๋ณด๋ƒ„ using @ 1https://expected-host:fakepassword@evil-host using # 1https://evil-host#expected-host Rogue DNS 1https://expected-host.evil-host Double encoding : # -> %23 -> %2523 XXE (XML eXternal Entity) Injection XML ํŒŒ์‹ฑ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• XML custom entity XML์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์„ ์ •์˜ 1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE message [<!ENTITY greeting "Hello, ">]> 3<message> 4 <text>&greeting;world!</text> 5</message> Access internal file XML ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ, ์„œ๋ฒ„์˜ ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๋Š” ๊ณต๊ฒฉ 1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE foo[<!ENTITY xxe SYSTEM "file:///etc/passwd">]> 3<stockCheck><productId>&xxe;</productId></stockCheck> With SSRF SSRF์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ณต๊ฒฉ 1<!DOCTYPE foo[<!ENTITY xxe SYSTEM "http://localhost/admin">]> ์•”ํ˜ธ๊ธฐ์ˆ  ์ „ํ†ต์ ์ธ ์•”ํ˜ธ๊ธฐ์ˆ  ์•”ํ˜ธ์˜ ์ •์˜ ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ๊ธฐ๋ฐ€์„ฑ (Confidentiality) : ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์•„์•ผํ•จ ์ž๋ฃŒ์˜ ๋ฌด๊ฒฐ์„ฑ (Data Integrity) : ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„๋ณ€์กฐ๋˜๋ฉด ์•ˆ๋จ ์ธ์ฆ (Authentication) : ์ •๋ณด์˜ ์ถœ์ฒ˜๊ฐ€ ์ •๋‹นํ•ด์•ผํ•จ ๋ถ€์ธ๋ฐฉ์ง€ (Non-repudiation) : ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š์•„์•ผํ•จ ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ธฐ๋ณธ ์กฐ๊ฑด (K : Key, M : Message, C : Cipher Text) ์•”ํ˜ธํ™” : E(K, M) = C ๋ณตํ˜ธํ™” : D(K, C) = C E(K, M)๊ณผ D(K, C)์˜ ๊ณ„์‚ฐ์€ ์‰ฌ์›Œ์•ผ ํ•จ K๋ฅผ ๋ชจ๋ฅผ๋•Œ C์—์„œ M์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์›Œ์•ผ ํ•จ ์•”ํ˜ธ ํ•ด๋… ๋ฐฉ๋ฒ• Cipher Text Only Attack : ์•”ํ˜ธ๋ฌธ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ํ‰๋ฌธ์„ ์ฐพ๋Š” ๊ณต๊ฒฉ Known Plain Text Attack : ์•”ํ˜ธ๋ฌธ๊ณผ ํ‰๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ์ฐพ๋Š” ๊ณต๊ฒฉ Chosen Plain Text Attack : ํ‰๋ฌธ์„ ์„ ํƒํ•˜์—ฌ ์•”ํ˜ธ๋ฌธ์„ ์ฐพ๋Š” ๊ณต๊ฒฉ ์•”ํ˜ธ์˜ ์ข…๋ฅ˜ ๋Œ€์นญํ‚ค(๋น„๋ฐ€ํ‚ค)(๊ด€์šฉํ‚ค) ์•”ํ˜ธ ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”์— ๊ฐ™์€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธ ์‚ฌ์šฉ์ž n๋ช…์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ‚ค์˜ ๊ฐœ์ˆ˜ : n(n-1)/2 ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜ ๋ธ”๋ก ์•”ํ˜ธ (DES, IDEA, AES) ํ‰๋ฌธ์„ ๋ธ”๋ก์œผ๋กœ ๋‚˜๋ˆ„์–ด ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ์‹ ์ŠคํŠธ๋ฆผ ์•”ํ˜ธ (RC4) ํ‰๋ฌธ๊ณผ ํ‚ค๋ฅผ ๋น„ํŠธ ๋‹จ์œ„๋กœ XORํ•˜์—ฌ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ์‹ ํ•œ๊ตญ์—์„œ ์“ฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ข…๋ฅ˜ : NEAT, SEED, NES, ARIA ๊ณต๊ฐœํ‚ค(๋น„๋Œ€์นญํ‚ค) ์•”ํ˜ธ ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”์— ๋‹ค๋ฅธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธ ์‚ฌ์šฉ์ž n๋ช…์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ‚ค์˜ ๊ฐœ์ˆ˜ : 2n ๊ธฐ๋ฐ€์„ฑ (Confidentiality) : ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”, ๊ฐœ์ธํ‚ค๋กœ ๋ณตํ˜ธํ™” ์ธ์ฆ (Authentication) : ๊ฐœ์ธํ‚ค๋กœ ์•”ํ˜ธํ™”, ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ํ‚ค ์ƒ์„ฑ DH ํ‚ค ๊ตํ™˜ ์•”ํ˜ธ๊ธฐ์ˆ ์˜ ํ™œ์šฉ ๋””์ง€ํ„ธ ์„œ๋ช… ํŠน์„ฑ : ์œ„์กฐ๋ถˆ๊ฐ€, ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€, ์„œ๋ช…์ž ์ธ์ฆ, ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€, ๋ถ€์ธ ๋ฐฉ์ง€ ๋™ํ˜•์•”ํ˜ธ์™€ ์–‘์ž์•”ํ˜ธ ๊ธฐ์ˆ 
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 ๊ฐœ๋… - MVC ํŒจํ„ด, Servlet (์„œ๋ธ”๋ฆฟ)
๐Ÿƒ Spring
Servlet ๊ฐœ๋… ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž๋ฐ” ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ์ˆ  ์›นํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค Servlet Conainer์˜ ์—ญํ•  Servlet์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค ์›น์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์ง€์› ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ์ง€์›, ๊ด€๋ฆฌ ์„ ์–ธ์ ์ธ ๋ณด์•ˆ ๊ด€๋ฆฌ ์˜ˆ์ œ - Servlet ๊ตฌํ˜„ 1public class TestServlet extends HttpServlet { 2 private static final Logger logger = LoggerFactory.getLogger(TestServlet.class); 3 4 @Override 5 public void init() throws ServletException {} 6} doGet, doPost ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์„œ http ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค Servlet Context๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ• web.xml ์ž‘์„ฑ web.xml web application์˜ ์„ค์ •์„ ์œ„ํ•œ deployment descriptor (๋ฐฐํฌ ์ง€์ •์ž) ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค src/webapp/WEB-INF/web.xml์— ์œ„์น˜ํ•œ๋‹ค 1<?xml version="1.0" encoding="UTF-8"?> 2<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 5 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 6 <servlet> 7 <servlet-name>myServlet</servlet-name> 8 <servlet-class>org.academy.abc.servlet.MyServlet</servlet-class> 9 </servlet> 10 <servlet-mapping> 11 <servlet-name>myServlet</servlet-name> 12 <url-pattern>/*</url-pattern> 13 </servlet-mapping> 14</web-app> @WebServet ์‚ฌ์šฉ Servlet์„ ์„ ์–ธํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•œ๋‹ค 1@WebServlet(value="/*", loadOnStartup = 1) 2public class TestServlet extends HttpServlet {...} WebApplicationInitializer ๊ตฌํ˜„ 1public class OrderWebApplicationInitializer implements WebApplicationInitializer { 2 @Override 3 public void onStartup(ServletContext servletContext) throws ServletException { 4 var servletRegistration = servletContext.addServlet("test", new TestServlet()); 5 servletRegistration.addMapping("/*"); 6 servletRegistration.setLoadOnStartup(1); 7 } 8} DispatcherServlet HTTP์š”์ฒญ์„ ์ค‘์•™์ง‘์ค‘์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค MVC ํŒจํ„ด DispatcherServlet์ด Handler mapping์„ ํ†ตํ•ด Handler๋ฅผ ์ฐพ๋Š”๋‹ค Handler adapter๊ฐ€ DispatcherServlet๊ณผ handler ์‚ฌ์ด์˜ ์ค‘๊ฐ„๋‹ค๋ฆฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค Controller๋Š” business logic์„ ์ฒ˜๋ฆฌํ•˜๊ณ  model๊ณผ view name์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค Dispatcher servlet์€ model์„ view๋กœ ๋„˜๊ฒจ์„œ view ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค
new ์ปดํ“จํ„ฐ๋„คํŠธ์›Œํฌ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
HTTP HTTP Method Method request payload response payload idempotent GET Optional O O HEAD Optional O O POST Yes O X PUT Yes O O DELETE Optional O O CONNECT Optional O X OPTIONS Optional O O TRACE Optional O O PATCH Yes O X HTTP Protocol Version HTTP/1.0 ์—ฐ๊ฒฐ๋ฐฉ์‹ : non-persistent HTTP TCP ์—ฐ๊ฒฐ ํ•œ๋ฒˆ์— ์ตœ๋Œ€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด ๊ฐ ๊ฐ์ฒด๋‹น 2๊ฐœ์˜ RTT๊ฐ€ ํ•„์š” HTTP/1.1 ์—ฐ๊ฒฐ๋ฐฉ์‹ : persistent HTTP ์ด์ „ TCP ์—ฐ๊ฒฐ์„ ์žฌ์‚ฌ์šฉ -> ์™•๋ณต์ง€์—ฐ์‹œ๊ฐ„ ๊ฐ์†Œ (Connection: Keep-Alive) Pipelining์œผ๋กœ ๋ณ‘๋ ฌ ์š”์ฒญ๊ณผ ์‘๋‹ต (์˜ˆ: HTML+CSS) 1๊ฐœ์˜ TCP์—์„œ ๊ฐ์ฒด๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ „์†ก -> Head-of-line(HoL) ํ˜„์ƒ ๋ฐœ์ƒ ์—ฌ๋Ÿฌ ๊ฐœ์˜ TCP ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉ - ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋„๋ฉ”์ธ๋‹น ์—ฐ๊ฒฐ ์ˆ˜ ์ œํ•œ ๋„๋ฉ”์ธ ์ƒค๋”ฉ(Domain Sharding) : ์—ฐ๊ฒฐ ์ œํ•œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋‘๊ธฐ (HTTP/2์—์„œ๋Š” X) HTTP/2 ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋ ˆ์ž„: ์šฐ์„ ์ˆœ์œ„, ํ๋ฆ„์ œ์–ด, ์„œ๋ฒ„ ํ‘ธ์‹œ ์šฐ์„ ์ˆœ์œ„ ์ง€์ • : ์ฝ˜ํ…์ธ ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ์ˆœ์„œ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ : TCP์—ฐ๊ฒฐ 1๊ฐœ๋กœ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์ „์†ก ์„œ๋ฒ„ ํ‘ธ์‹œ : ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์˜ˆ์ธกํ•˜์—ฌ ์ „์†ก ํ—ค๋” ์••์ถ•, ํ—ค๋”์™€ ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ HTTP/3 QUIC ํ”„๋กœํ† ์ฝœ, UDP ๊ธฐ๋ฐ˜ ๊ธฐํƒ€ HTTP Cookie ์›น์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ ์‹œ ๊ธฐ๋ก Third-party Cookie ๊ด‘๊ณ ์— ์‚ฌ์šฉ HTTP Cache ์ตœ์ดˆ ์š”์ฒญ์€ ์›๋ž˜ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ, ์ดํ›„ ์š”์ฒญ์€ Proxy(Cache) ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ CDN (Content Delivery Network) ์ปจํ…์ธ ๋ฅผ ์ „์„ธ๊ณ„ ์—ฌ๋Ÿฌ ์ง€์—ญ์— ๋ฏธ๋ฆฌ ๋ฐฐํฌ Internet protocol traceroute : ํŒจํ‚ท ๊ฒฝ๋กœ ์ถ”์  netstat -rn, route -n : ๋ผ์šฐํ„ฐ ์ •๋ณด ํ™•์ธ P2P ๋ฒ„ํด๋ฆฌ์†Œ์ผ“ : ๋ฒ„ํด๋ฆฌ ๋Œ€ํ•™๊ต์—์„œ ๊ฐœ๋ฐœํ•œ UNIX Socker API IP IP Address IPv4 32bit IPv6 128bit (64bit : network prefix, 64bit : host network identifier) Network identifier + Interface identifier ์ข…๋ฅ˜ : unicast, anycast, link-local, multicast ::1/128 : loopback address Internet ์„ฑ๋Šฅ ์ธํ„ฐ๋„ท ์„ฑ๋Šฅ ์ง€ํ‘œ ์†๋„(๋Œ€์—ญํญ, ๋น„ํŠธ์ „์†ก๋ฅ ) ๋‹จ์œ„ : BPS ์ธก์ • ๋„๊ตฌ : iperf ๋งํฌ์˜ ๋Œ€์—ญํญ ์ง€์—ฐ์‹œ๊ฐ„ ๋‹จ์œ„ : sec ์ธก์ • ๋ฐฉ๋ฒ• : ๋‹จ๋ฐฉํ–ฅ ์ง€์—ฐ์‹œ๊ฐ„, RTT ์ธก์ •๋„๊ตฌ : ping, traceroute ์ข…๋ฅ˜ ์ „์†ก ์ง€์—ฐ : 1bit ์ „์†ก์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ์ „ํŒŒ ์ง€์—ฐ ํ์ž‰ ์ง€์—ฐ : ์ปดํ“จํ„ฐ / ๋ผ์šฐํ„ฐ์—์„œ ์ฒ˜๋ฆฌ๋˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ์ง€์—ฐ : ํŒจํ‚ท ํ—ค๋” ๋˜๋Š” ๊ฒฝ๋กœ ํ…Œ์ด๋ธ” ์ฐพ๋Š” ์‹œ๊ฐ„ ์†์‹ค๋ฅ  ๋‹จ์œ„ : % ์ธก์ • ๋ฐฉ๋ฒ• : ์‹คํŒจํ•œ ํŒจํ‚ท ์ˆ˜ / ์ „์†กํ•œ ํŒจํ‚ท ์ˆ˜ ์ธก์ • ๋„๊ตฌ : ping ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋ฐฉ๋ฒ• HAR(HTTP ARchive format) ํŒŒ์ผ ๋ถ„์„ ๋ธŒ๋ผ์šฐ์ € <-> ์‚ฌ์ดํŠธ ๊ฐ„์˜ ํ†ต์‹  ๋‚ด์—ญ์„ JSONํ˜•ํƒœ๋กœ ์ €์žฅํ•œ ํŒŒ์ผ Bookmarklet ํ˜„์žฌ ์›น์‚ฌ์ดํŠธ ๋ถ„์„ํ•ด์ฃผ๋Š” ๋ธŒ๋ผ์šฐ์ € add-on ๋ธŒ๋ผ์šฐ์ € ์ตœ์ ํ™” css, js, html ์šฐ์„ ์ˆœ์œ„ ๋ถ€์—ฌ ์˜ˆ์ธกํ•ด์„œ ๋ฏธ๋ฆฌํ•˜๊ธฐ (์ž์› ๊ฐ€์ ธ์˜ค๊ธฐ, DNS, TCP ์—ฐ๊ฒฐ, Web page Rendering) DNS (Domain Name System) Domain ์ด๋ฆ„ -> IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ dig ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด dns ์ •๋ณด ํ™•์ธ ๊ฐ€๋Šฅ ํฌํŠธ๋ฒˆํ˜ธ : 53 Slammer Worm DNS ์„œ๋ฒ„ ๊ณต๊ฒฉ DNS ๋™์ž‘ ๋ฐฉ์‹ UDP(<= 512B),TCP(> 512B) PORT : 53 DNS Query Type A : IPv4 ์ฃผ์†Œ AAAA : IPv6 ์ฃผ์†Œ CNAME : ๋ณ„์นญ TLD (Top Level Domain) ๋งจ๋’ค์— ๋ถ™๋Š” ๋„๋ฉ”์ธ (.com, .net, .org ๋“ฑ๋“ฑ) Authoritative DNS Server DNS ์ •๋ณด์™€ ํ•ด๋‹น IP ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์„œ๋ฒ„ DNS Caching DDNS (Dynamic DNS) IP์ฃผ์†Œ๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉด DNS ์ •๋ณด ๊ฐฑ์‹  (๊ฐ€์ •์˜ ๊ณต์œ ๊ธฐ) DNS ๊ณต๊ฒฉ DNS Sppofing, DNS cache poisoning, Phising DNSSEC (DNS Security Extensions) ๋ฐ์ดํ„ฐ ์œ„์กฐ-๋ณ€์กฐ ๊ณต๊ฒฉ ๋ฐฉ์ง€ ํ‘œ์ค€๊ธฐ์ˆ  ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™”๋ฐฉ์‹์˜ ์ „์ž์„œ๋ช… ๋„์ž… DoH (DNS over HTTPS) DNS ์ •๋ณด๋ฅผ jsonํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์–ด HTTPS ์ „์†ก DNS over TLS DNS ์ •๋ณด๋ฅผ TLS๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ „์†ก SNI (Server Name Indication) : ๋„๋ฉ”์ธ ์ •๋ณด TLS์—์„œ๋Š” SNI๋ฅผ ์•”ํ˜ธํ™”ํ•˜์ง€ ์•Š์Œ ํฌํŠธ๋ฒˆํ˜ธ: 853 P2P ๋‘ ๋ฐฉ์‹์˜ ๋น„๊ต 1๊ฐœ์˜ ์„œ๋ฒ„ N๊ฐœ์˜ file $u_s$: ์„œ๋ฒ„ ์—…๋กœ๋“œ ๋Œ€์—ญํญ $d_i$: i๋ฒˆ์งธ peer์˜ ๋‹ค์šด๋กœ๋“œ ๋Œ€์—ญํญ Client-Server ๋ฐฉ์‹ ๋ฐฐํฌ ์‹œ๊ฐ„ $$ d_{cs} = max(\frac{NF}{u_s},\ \frac{F}{min(d_i)}) $$ P2P ๋ฐฉ์‹ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๋Š” ์‹œ๊ฐ„ $$ d*{p2p} = max(\frac{F}{u_s},\ \frac{F}{min(d*{i})},\ \frac{NF}{u_s+\sum{u_i}}) $$ BitTorrent ํŒŒ์ผ์„ 256KB chunks๋กœ ๋ถ„ํ•  Distributed Hash Table (DHT) ๋ถ„์‚ฐ P2P DB key: hash(content), value: IP address ์ธ์ ‘ํ•œ ์ด์›ƒ์—๊ฒŒ ํ‚ค๋ฅผ ํ• ๋‹น Circular DHT ๊ฐ ํ”ผ์–ด๋Š” ์ธ์ ‘ ๋…ธ๋“œ๋งŒ ์•Œ๊ณ ์žˆ์Œ Skype ์‚ฌ์šฉ์ž ๊ฐ„ P2Pํ†ต์‹  FTP, SMTP ๋ฉ”์ผ๊ด€๋ จ ํ”„๋กœํ† ์ฝœ SMTP: ์ด๋ฉ”์ผ ์„œ๋ฒ„ ์ „์†ก ํ”„๋กœํ† ์ฝœ POP3, IMAP, HTTP: ์ด๋ฉ”์ผ ์„œ๋ฒ„ ์ ‘๊ทผ ํ”„๋กœํ† ์ฝœ telnet ํฌํŠธ๋ฒˆํ˜ธ: 23 ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์ „์†ก๊ณ„์ธต TCP segment ์‹ ๋ขฐ์„ฑ: ์˜ค๋ฅ˜ ํƒ์ง€/๋ณต๊ตฌ, ์ˆœ์„œ ์ „์†ก, ์ค‘๋ณต ์ œ๊ฑฐ ํ๋ฆ„์ œ์–ด: ์ˆ˜์‹ ์ž์˜ ์ƒํƒœ์— ๋”ฐ๋ฅธ ์ „์†ก๋Ÿ‰ ์กฐ์ ˆ ํ˜ผ์žก์ œ์–ด: ๋„คํŠธ์›Œํฌ+์ˆ˜์‹ ์ž์˜ ํ˜ผ์žก์ƒํƒœ์— ๋”ฐ๋ฅธ ์ „์†ก๋Ÿ‰ ์กฐ์ ˆ ์—ฐ๊ฒฐ๊ด€๋ฆฌ UDP segment ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค, ๋น ๋ฅด๋‹ค, ๋‹จ์ˆœํ•œ๋‹ค checksum : ์˜ค๋ฅ˜ ๊ฒ€์ถœ ๊ฐ€๋Šฅ ๊ณตํ†ต ์ง€์—ฐ์‹œ๊ฐ„, ๋Œ€์—ญํญ์€ ๋ณด์žฅ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค Stop-and-Wait ARQ ์†ก์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ: 0 or 1 ์ˆ˜์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : 1 ์„ฑ๋Šฅ $$d_{trans}=\frac{L}{R}$$ $$U_{sender}=\frac{d_{trans}}{RTT+d_{trans}}$$ Go-Back-N ARQ ์†ก์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : $2^m - 1$ ์ˆ˜์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : 1 Selective Repeat ARQ ์†ก์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : $2^{m - 1}$ ์ˆ˜์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : $2^{m - 1}$ TCP TCP ๊ฐœ์š” ์—ฐ๊ฒฐ ์ง€ํ–ฅ์  ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์ „์†ก pipelining : ๋ณ‘๋ ฌ ์ „์†ก Full duplex data : ๋™์ผ ์—ฐ๊ฒฐ์—์„œ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ์ „์†ก flow control byte๋‹จ์œ„ ์˜ stream ์ „์†ก TCP Segment Timeout ์„ค์ • ์ ๋‹นํ•œ tcp timeout ๊ฐ’ ์„ค์ • ํ•„์š” RTT๋ณด๋‹ค ๊ธธ์–ด์•ผํ•จ ๋„ˆ๋ฌด ์งง์œผ๋ฉด ๋ถˆํ•„์š”ํ•œ ์žฌ์ „์†ก, ๋„ˆ๋ฌด ๊ธธ๋ฉด ์„ธ๊ทธ๋จผํŠธ ์†์‹ค RTT ์ธก์ • $$EstimatedRTT = (1-\alpha)EstimatedRTT + \alpha SampleRTT$$ ๋ณดํ†ต $\alpha$ : 0.125 ์˜ค์ฐจ ๋ฒ”์œ„ ๊ณ„์‚ฐ $$ DevRTT = (1-\beta)DevRTT + \beta |SampleRTT - EstimatedRTT| $$ Timeout Interval ๋„์ถœ $$ TimeoutInterval = EstimatedRTT + 4*DevRTT $$ TCP ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์ „์†ก cumulative acks pipelined segments timeout -> ์žฌ์ „์†ก duplicate acks -> ์žฌ์ „์†ก TCP Flow control control ๋™์ž‘์›๋ฆฌ RcvWindow : ์†ก์‹ ์ž ์ตœ๋Œ€ ์ „์†กํฌ๊ธฐ RcvWindow๋งŒํผ buffer ๋‚ด spare room์œผ๋กœ ํ•œ๋‹ค TCP ์—ฐ๊ฒฐ ๊ด€๋ฆฌ (3-way handshake) ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ๋‚˜๋ฆฌ์˜ค client->server : FIN server->client : ACK + FIN client->server : ACK Socket Programming ์†Œ์ผ“ ์‘์šฉ ํ”„๋กœ์„ธ์Šค์™€ ์ „์†ก ๊ณ„์ธต ์‚ฌ์ด์˜ API ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹  Multiprocess context switch ๋น„์šฉ ๋ฐœ์ƒ, IPC ํ†ต์‹  Multithread context switch ๋น„์šฉ ๋ฐœ์ƒ Select ์—ฌ๋Ÿฌ Socket I/O ๋™์‹œ ์ฒ˜๋ฆฌ ๋น„ํšจ์œจ์ ์ด๋‹ค Async ๋น ๋ฅด๋‹ค ๋ณต์žกํ•œ ์ฝ”๋“œ, ์–ด๋ ค์šด ๋””๋ฒ„๊น… WebSocket ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๊ฐ€๋Šฅ Socket.io Node.js ๊ธฐ๋ฐ˜์˜ WebSocket ๊ตฌํ˜„์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Data Link ๊ณ„์ธต ๋งํฌ ๊ณ„์ธต์˜ ์—ญํ•  ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์˜ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ๋งํฌ์ œ์–ด, ๋‹ค์ค‘์ ‘๊ทผ, ํ๋ฆ„์ œ์–ด, ์—๋Ÿฌ์ œ์–ด MAC ์ฃผ์†Œ ๋””๋ฐ”์ด์Šค ๊ณ ์œ ์˜ ์‹๋ณ„์ž, 48bit CIDR ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  Class(A, B, C) ๋‹จ์œ„ ํ• ๋‹น์— ๋”ฐ๋ฅธ ๋น„ํšจ์œจ์ ์ธ ์ฃผ์†Œ ๊ด€๋ฆฌ BGP ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ” ๊ฐœ์ˆ˜ ์ตœ์†Œํ™” ์˜ˆ์‹œ (172.16.150.115/22) ์ฃผ์†Œ ๊ฐœ์ˆ˜ : $2^{32-22}-2$ = 1024 - 2 = 1022 ์ฒซ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ์ฃผ์†Œ๋Š” ํŠน์ˆ˜๋ชฉ์  IP๋ผ์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ : 172.16.148.0/22 ์ฃผ์†Œ ๊ณต๊ฐ„ : 172.16.148.0 ~ 172.16.151.255 ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ฃผ์†Œ : 172.16.151.255 Network ๊ณ„์ธต - IP Network ๊ณ„์ธต์˜ ์—ญํ•  IP ํŒจํ‚ท ์†ก์ˆ˜์‹ , IP ํŒจํ‚ท ์ „๋‹ฌ, IP ๊ฒฝ๋กœ ์ฐพ๊ธฐ Fragmentation MTU(Maximum Transfer Unit) : ๋งํฌ ๊ณ„์ธต ํ”„๋ ˆ์ž„ ํฌ๊ธฐ ์ œํ•œ Ethernet : 1500B MTU ๋ณด๋‹ค ํฐ IP ํŒจํ‚ท์„ ํŒŒํŽธํ™”, ๋ชฉ์ ์ง€์—์„œ ์žฌ์กฐ๋ฆฝ TTL ๋ผ์šฐํŒ… ๋ฃจํ”„ ๋ฐฉ์ง€, 0์ด ๋˜๋ฉด ํ๊ธฐ traceroute : TTL์„ ์ด์šฉํ•œ ๋„๊ตฌ IP Options IPv4 IPv4 datagram format IP Options Record route, MTU probe/reply, timestamp IHL(Header Length): IP ํ—ค๋” ๊ธธ์ด IP Options ํ•„๋“œ์˜ ์ตœ๋Œ€๊ธธ์ด๋Š” ์ตœ๋Œ€ IPํ—ค๋”๊ธธ์ด 60B - IHLํ•„๋“œ ์ตœ์†Œ๊ฐ’ 20B = 40B IP Record Route Option: IP ์ฃผ์†Œ ๊ธฐ๋กํ•˜๋Š” ์˜ต์…˜ Subnets ์„œ๋ธŒ๋„ท (Subnets) ๋ผ์šฐํ„ฐ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ง‘ํ•ฉ DHCP ํด๋ผ์ด์–ธํŠธ์˜ IP ์ฃผ์†Œ๋ฅผ ์ž๋™์œผ๋กœ ํ• ๋‹น, ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœํ† ์ฝœ Ipv6 Ipv6 datagram format IPv4์™€ ๋น„๊ต no checksum no fragmentation / reassembly no options Ipv4 -> Ipv6 ๋ณ€ํ™˜ tunneling : IPv6 ํŒจํ‚ท์„ IPv4 ํŒจํ‚ท์— ์บก์Аํ™” MiddleBox ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€ ์‚ฌ์ด์—์„œ ip router์˜ ๊ธฐ๋Šฅ์„ ์ œ์™ธํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ค‘๊ฐ„ ์ƒ์ž NAT, Firewalls, Load balancers, Caches Network ๊ณ„์ธต - Routing Routing: ๊ธธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ Routing table : Trie ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ ๋ฐฉ์‹ : Longest prefix matching Forwarding: ํŒจํ‚ท ์ „๋‹ฌ ๊ธฐ๋Šฅ Forwarding table : ๊ฐ€์žฅ ๊ธด ๊ณตํ†ต prefix๋ฅผ ์ฐพ์•„์„œ ํŒจํ‚ท ์ „๋‹ฌ Switching fabrics ๋ผ์šฐํ„ฐ ๋‚ด๋ถ€์—์„œ ํŒจํ‚ท์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹ 3๊ฐ€์ง€ ์ข…๋ฅ˜ : Memory, Bus, Crossbar ์ž…๋ ฅ ํฌํŠธ์—์„œ์˜ ๋ฌธ์ œ ์ž…๋ ฅ ํฌํŠธ์˜ ์†๋„ > ์Šค์œ„์น˜ ์†๋„ -> ํ์ž‰ ์ง€์—ฐ ๋ฐœ์ƒ Head-of-line(HoL) blocking : ํ์ž‰ ์ง€์—ฐ์œผ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ํŒจํ‚ท๋“ค๋„ ์ง€์—ฐ๋˜๋Š” ํ˜„์ƒ ์ถœ๋ ฅ ํฌํŠธ์—์„œ์˜ ๋ฌธ์ œ ์Šค์œ„์น˜ ์†๋„ > ์ถœ๋ ฅ ํฌํŠธ์˜ ์†๋„ -> ํŒจํ‚ท ์†์‹ค ๋ฐœ์ƒ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ด๋ฏธ ๋Œ€๊ธฐ ์ค‘์ธ ํŒจํ‚ท์„ ํ๊ธฐ ์ƒˆ๋กœ ๋„์ฐฉํ•œ ํŒจํ‚ท์„ ํ๊ธฐ scheduling policy : FIFO, Round Robin ๋“ฑ๋“ฑ Transport ๊ณ„์ธต - ํ˜ผ์žก ์ œ์–ด ํ˜ผ์žก์ œ์–ด ๊ฐœ์š” Congestion : ๋„คํŠธ์›Œํฌ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰ < ๋ฐ์ดํ„ฐ ์ „์†ก๋Ÿ‰ ํ˜ผ์žก ํƒ์ง€ : ์žฌ์ „์†ก ํƒ€์ด๋จธ, ์ค‘๋ณต ACK -> ํŒจํ‚ท ์†์‹ค cwnd : congestion window size Van Jacobson์ด ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นจ MSS(Maximum Segment Size): ์„ธ๊ทธ๋จผํŠธ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ (๋ฐ์ดํ„ฐ๋งŒ ํฌํ•จ) MTU(Maximum Transfer Unit): ์ตœ๋Œ€ ์ „์†ก ํฌ๊ธฐ ํ˜ผ์žก ์ œ์–ด ๋ฐฉ๋ฒ• AIMD Additive Increase Multiplicative Decrease ๋งค RTT๋งˆ๋‹ค cwnd 1MSS ์”ฉ ์ฆ๊ฐ€ ํŒจํ‚ท ์†์‹ค ๊ฐ์ง€ : cwnd ์ ˆ๋ฐ˜์œผ๋กœ ๊ฐ์†Œ Slow Start ์ดˆ๊ธฐ cwnd: 1 or 10 MSS ๋งค RTT๋งˆ๋‹ค cwnd 2๋ฐฐ๋กœ ์ฆ๊ฐ€ ํŒจํ‚ท ์†์‹ค์‹œ window size = 1 ํ˜ผ์žก ์ œ์–ด ์ •์ฑ… TCP Tahoe ์ฒ˜์Œ์—๋Š” Slow Start, ์ดํ›„์—๋Š” AIMD 3 duplicate ACKs ๋˜๋Š” timeout ๋ฐœ์ƒ ์‹œ ์ž„๊ณ„์  = window size/2 window size = 1 TCP Reno Tahoe์™€ ๋น„์Šทํ•˜๋‹ค timeout ๋ฐœ์ƒ์‹œ ์ž„๊ณ„์ ์€ ๊ทธ๋Œ€๋กœ window size = 1 3 duplicate Acks์ธ ๊ฒฝ์šฐ ์ž„๊ณ„์  = window size/2 window size = window size/2 TCP CUBIC K: window size๊ฐ€ Wmax์ธ ์‹œ์  K ๊ทผ์ฒ˜์—์„œ ๋А๋ฆฌ๊ฒŒ ์ฆ๊ฐ€ K ๋ฉ€๋ฆฌ์—์„œ ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ TCP BBR BBR: Bottleneck Bandwidth and RTT NAT ๊ณต์œ ๊ธฐ IP ์ฃผ์†Œ ๋ณ€ํ™˜ public IP <-> private IP ์ฃผ์†Œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํฌํŠธ๋„ ๋ฐ”๋€๋‹ค ๊ณต์œ ๊ธฐ addr-port mapping table์˜ ์ƒ์„ฑ๊ณผ ์‚ญ์ œ ๋‚ด๋ถ€->์™ธ๋ถ€ ์ƒ์„ฑ : TCP/UDP ์ตœ์ดˆ ํŒจํ‚ท ์†ก์‹  ํ›„ ์‚ญ์ œ : ํƒ€์ด๋จธ/TCP ์—ฐ๊ฒฐ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ํ›„ ์™ธ๋ถ€->๋‚ด๋ถ€ ์ƒ์„ฑ : ๋‚ด๋ถ€์—์„œ ํŠธ๋ž˜ํ”ฝ ์ƒ์„ฑ ๋˜๋Š” ์ˆ˜๋™ ์‚ญ์ œ : ํƒ€์ด๋จธ/TCP ์—ฐ๊ฒฐ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ํ›„ ๋˜๋Š” ์ˆ˜๋™ ํฌํŠธ ํฌ์›Œ๋”ฉ : ๊ณต์œ ๊ธฐ ๋‚ด๋ถ€์˜ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํฌํŠธ(TCP) ๊ฐœ๋ฐฉ ๊ธฐ๋Šฅ ๊ณต์œ ๊ธฐ ์ •๋ณด ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด : netstat -rn, ifconfig, iptables -t nat -L -vn ๊ณต์œ ๊ธฐ์˜ ๊ณ„์ธต L7(์‘์šฉ๊ณ„์ธต) : DNS ์„œ๋ฒ„ L3(๋„คํŠธ์›Œํฌ ๊ณ„์ธต) : IP Router + ์ฃผ์†Œ ๋ฒˆ์—ญ๊ธฐ + DHCP L2(๋ฐ์ดํ„ฐ ๋งํฌ ๊ณ„์ธต) : Bridge, ์ด๋”๋„ท ์Šค์œ„์น˜, Wifi L1(๋ฌผ๋ฆฌ ๊ณ„์ธต) IP Routing L3(Network layer) ์—ญํ•  forwarding (data plane): ๋‹จ์ˆœ ํŒจํ‚ท ์ „๋‹ฌ routing (control plane): ํŒจํ‚ท ์ „๋‹ฌ ๊ฒฝ๋กœ ๊ฒฐ์ • control plane์˜ ๊ตฌ์กฐ Per-router control plane : ๋ผ์šฐํ„ฐ๋งˆ๋‹ค ๋ผ์šฐํŒ… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ SDN(Software Defined Networking) : ์ค‘์•™์ง‘์ค‘์‹ ๋ผ์šฐํŒ… ์•Œ๊ณ ๋ฆฌ์ฆ˜ Routing Protocols link state (centralized, global) ์ถœ๋ฐœ์ง€์—์„œ ๋ชฉ์ ์ง€๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐ dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ ์‹œ๊ฐ„๋ณต์žก๋„(n๊ฐœ์˜ node) : $O(n^2)$ oscillation ๋ฐœ์ƒ ๊ฐ€๋Šฅ : ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์ด ์ˆ˜๋ ดํ•˜์ง€ ์•Š๋Š” ํ˜„์ƒ distance vector : ์ธ์ ‘ํ•œ ๋ผ์šฐํ„ฐ์—๊ฒŒ๋งŒ ์ •๋ณด ์ „๋‹ฌ ๊ฐ ๋…ธ๋“œ์—์„œ ๋™๊ธฐ์ ์œผ๋กœ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐ bellman-ford ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ link cost๊ฐ€ ๋ฐ”๋€Œ๋ฉด local dv๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐ, ๋ฐ”๋€ dv๋ฅผ ์ธ์ ‘ node์— ์ „๋‹ฌ count-to-infinity ๋ฌธ์ œ : ๋ผ์šฐํŒ… ๋ฃจํ”„ ํ˜„์ƒ poisoned reverse : count-to-infinity ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• path vector Inter-AS routing protocol ๋ผ์šฐํ„ฐ ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ๋„ ์ž‘๋™ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ intra-AS routing protocols : RIP, EIGRP, OSPF RIP (Routing Information Protocol) DV algorithm ์‚ฌ์šฉ ๋ฃจํ”„ ํƒ์ง€๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ• : poison reverse ์ด์ œ๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ EIGRP (Enhanced Interior Gateway Routing Protocol) DV ๊ธฐ๋ฐ˜ cisco OSPF (Open Shortest Path First) classic link-state ๋ชจ๋“  OSPF๋ฉ”์‹œ์ง€๋Š” ์ธ์ฆ๋จ Hierarchical routing : local area, backbone ๋‘ ๊ฐœ์˜ ๋ ˆ๋ฒจ๋กœ ๊ตฌ์„ฑ boundary router : AS๊ฐ„ ๋ผ์šฐํ„ฐ local router : local ๋‚ด๋ถ€ ๋ผ์šฐํ„ฐ area border router : local๊ณผ backbone์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ผ์šฐํ„ฐ Inter-AS routing BGP BGP (Border Gateway Protocol): ์ธํ„ฐ๋„ท ์ƒ์˜ AS๊ฐ„ ๋ผ์šฐํŒ… ํ”„๋กœํ† ์ฝœ eBGP : ์ธ์ ‘ํ•œ AS๊ฐ„ ๋ผ์šฐํŒ… ์ •๋ณด ๊ตํ™˜ iBGP : AS ๋‚ด๋ถ€ ๋ผ์šฐํ„ฐ๋“ค์—๊ฒŒ ๋ผ์šฐํŒ… ์ •๋ณด ์ „๋‹ฌ BGP session : BGP routers๋Š” TCP๋กœ ์—ฐ๊ฒฐ๋จ BGP path: prefix + attributes prefix: IP ์ฃผ์†Œ AS-PATH: AS ๋ฆฌ์ŠคํŠธ NEXT-HOP: ๋‹ค์Œ AS๋กœ ํ–ฅํ•˜๋Š” ๋ผ์šฐํ„ฐ ์ฃผ์†Œ BGP messages OPEN : TCP ์—ฐ๊ฒฐ ์„ค์ • UPDATE : ์ƒˆ ๊ฒฝ๋กœ๋ฅผ ๊ณต์‹œ (๋˜๋Š” ์ด์ „ ์—ฐ๊ฒฐ ์ฒ ํšŒ) KEEPALIVE : UPDATES ์—†์ด ์—ฐ๊ฒฐ ์œ ์ง€ NOTIFICATION : ์˜ค๋ฅ˜ ๋ณด๊ณ  BGP ๊ฒฝ๋กœ ์„ ํƒ ๋ฐฉ๋ฒ• ํฐ weight ํฐ local preference ์งง์€ AS-PATH ๊ฐ€๊นŒ์šด NEXT-HOP MED (Multi-Exit Discriminator) Transport ๊ณ„์ธต - ๋ณด์•ˆ TLS(Transport Layer Security) ํ‘œ์ค€ SSL 3.0 -> IETF TLS 1.0 -> TLS 1.2 -> TLS 1.3 HTTPS = TCP + TLS + HTTP Network Security์˜ ๊ตฌ์„ฑ์š”์†Œ Confidentiality (๊ธฐ๋ฐ€์„ฑ) Authentication (์ธ์ฆ) Message Integrity (๋ฌด๊ฒฐ์„ฑ) Access & Availability (๊ฐ€์šฉ์„ฑ) ์•”ํ˜ธํ™” ๋ชจ์Œ (Cipher Suite) ํ‚ค ๊ตํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜: Diffie-Hellman ์ธ์ฆ: RSA (๊ณต๊ฐœํ‚ค) ์•”ํ˜ธํ™”: AES (๋Œ€์นญํ‚ค) ๋ฌด๊ฒฐ์„ฑ: SHA256 (ํ•ด์‹œ) TLS Handshake ํ”„๋กœํ† ์ฝœ์˜ ๊ณผ์ • Client Hello : ๋ฒ„์ „, ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์•”ํ˜ธํ™” ์ข…๋ฅ˜ Server Hello : ์•”ํ˜ธํ™” ์ข…๋ฅ˜ Certificate : ์ธ์ฆ์„œ Server Hello Done Client Key Exchange : Pre-Master Secret ์ƒ์„ฑ ํ›„ ์ „์†ก Change Cipher Spec : ์•”ํ˜ธํ™” ์ข…๋ฅ˜ ์„ ํƒ Change Cipher Spec Finished : ์•”ํ˜ธํ™” ์ข…๋ฅ˜ ์„ ํƒ ์™„๋ฃŒ SSL/TLS ์ธ์ฆ์„œ ์„œ๋น„์Šค ์ •๋ณด : ๋ฐœ๊ธ‰ํ•œ CA, ๋„๋ฉ”์ธ ๋“ฑ CA(Certificate Authority) : ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ธฐ๊ด€ TLS 1.2์™€ TLS 1.3์˜ ๋น„๊ต IP ๊ณ„์ธต - ๋ณด์•ˆ ์•”ํ˜ธํ†ต์‹  - IP Sec IP ํŒจํ‚ท์—์„œ encryption, authentication, integrity 2๊ฐ€์ง€ ๋ชจ๋“œ transport mode: 1๊ฐœ์˜ datagram payload๋งŒ ์•”ํ˜ธํ™” tunnel mode: ์ „์ฒด datagram์ด encrypted, authenticated ํ”„๋กœํ† ์ฝœ AH(Authentication Header): ์ธ์ฆ, ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ ESP(Encapsulating Security Payload): ์ธ์ฆ, ๋ฌด๊ฒฐ์„ฑ, ๊ธฐ๋ฐ€์„ฑ ๋ณด์žฅ SAs(Security Associations) ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „ SA ์ƒ์„ฑ IP: ๋น„์—ฐ๊ฒฐ์„ฑ, IPsec: ์—ฐ๊ฒฐ์„ฑ SPI(Security Parameter Index): SA๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’ IPsec datagram (tunnel mode, ESP) ESP trailer: block ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ padding ESP header IKE (Internet Key Exchange) ๊ธฐ์กด ๋ฐฉ์‹ : ์ˆ˜๋™ ํ‚ค๋กœ IPSec SA๋ฅผ ์ƒ์„ฑ endpoint๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ์ˆ˜๋™ ํ‚ค ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›€ -> IPsec IKE ์‚ฌ์šฉ ์•”ํ˜ธ ํ†ต์‹  - ๋Œ€์นญํ‚ค, ๊ณต๊ฐœํ‚ค, ์ „์ž์„œ๋ช… ์•”ํ˜ธ (cryptography) ๊ธฐ์ดˆ ์šฉ์–ด m : ํ‰๋ฌธ $K_A(m)$: ์•”ํ˜ธ๋ฌธ m = $K_B(K_A(m))$ : ๋ณตํ˜ธํ™” Symmetric key cryptography (๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”) ์•”ํ˜ธํ™”, ๋ณตํ˜ธํ™”์— ๊ฐ™์€ ํ‚ค ์‚ฌ์šฉ ๋‹จ์ˆœ ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ• substitution cipher : ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ์น˜ํ™˜ ์ข€ ๋” ์ •๊ตํ•œ ๋ฐฉ๋ฒ• cyclic cipher : ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ์น˜ํ™˜ํ•˜๊ณ , ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟˆ DES(Data Encryption Standard) 56bit symmetric key, input : 64bit ํ•˜๋ฃจ์— ์•ˆ ์ฑ„์›Œ์ง€๋Š” ์‹œ๊ฐ„์— ๋šซ๋ฆผ 3DES : 3๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๋กœ 3๋ฒˆ ์•”ํ˜ธํ™” AES(Advanced Encryption Standard) 128bit, 192bit, 256bit key input: 128bit AES๋Š” DEC๋ณด๋‹ค ๊ฒฌ๊ณ ํ•˜๋‹ค Public Key Cryptography (๊ณต๊ฐœํ‚ค) ๊ณต๊ฐœํ‚ค: ์•”ํ˜ธํ™”, ๊ฐœ์ธํ‚ค: ๋ณตํ˜ธํ™” ๋Œ€์นญํ‚ค๋ณด๋‹ค ๋А๋ฆฌ๋‹ค HTTPS = ๊ณต๊ฐœํ‚ค(ํ‚ค ๊ตํ™˜) + ๋Œ€์นญํ‚ค (์•”ํ˜ธํ™”) RSA ์•”ํ˜ธํ™” ๋ฐฉ์‹ ํŠน์ง• $K_B^-(K_B^+(m)) = m$ ๊ณต๊ฐœํ‚ค $K_B^+$๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๊ฐœ์ธํ‚ค $K_B^-$๊ฐ€ ๊ณ„์‚ฐ ๋ถˆ๊ฐ€๋Šฅ ํ•ด์•ผํ•œ๋‹ค. $K_B^-(K_B^+(m)) = m = K_B^+(K_B^-(m))$ ๋ฐฉ๋ฒ• ๋””์ง€ํ„ธ ์„œ๋ช… ์„œ๋ช…ํ•œ ์‚ฌ๋žŒ์˜ ์ธ์ฆ ์šฉ๋„ ๊ณต๊ฐœํ‚ค ํ™œ์šฉ ์ธ์ฆ์„œ ์ „์ž์„œ๋ช…๋งŒ์œผ๋กœ ์†ก์‹ ์ž์˜ ์‹ ์› ํ™•์ธ ๋ถˆ๊ฐ€๋Šฅ ๋‚ด์šฉ: ์‹ ์›์ •๋ณด, ๊ณต๊ฐœํ‚ค, ์œ ํšจ๊ธฐ๊ด€, ์ธ์ฆ๊ธฐ๊ด€์ •๋ณด, ์ „์ž์„œ๋ช… ํ‘œ์ค€ ๊ทœ๊ฒฉ : X.509 X.509 .der ํ˜น์€ .pem ํ™•์žฅ์ž ํŒŒ์ผ ์•”ํ˜ธํ†ต์‹  - ๋ฌด๊ฒฐ์„ฑ ์ „์ž ์„œ๋ช…์˜ ๋ฌด๊ฒฐ์„ฑ (A->B) m์— A๊ฐ€ ์œ ์ผํ•˜๊ฒŒ ์„œ๋ช…์„ ํ•ด์•ผํ•œ๋‹ค. A๋Š” m`์ด ์•„๋‹Œ m์—๋งŒ ์„œ๋ช…์„ ํ•ด์•ผํ•œ๋‹ค. ํ•ด์‹œ ํ•จ์ˆ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : MD5, SHA-1 ์•”ํ˜ธํ†ต์‹  - Firewall ๋ชฉ์  ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ๋ฐฉ์ง€ (SYN flooding: ๊ฐ€์งœ TCP ์—ฐ๊ฒฐ์„ ์ƒ์„ฑ) ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ฒ• ์ˆ˜์ •/์ ‘๊ทผ ๋ฐฉ์ง€ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•œ ๊ถŒํ•œ ์žˆ๋Š” ์•ก์„ธ์Šค๋งŒ ํ—ˆ์šฉ ํ•œ๊ณ„ IP spoofing: IP ์ฃผ์†Œ๋ฅผ ์œ„์กฐํ•˜์—ฌ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์— ์ ‘๊ทผํ•˜๋Š” ๊ณต๊ฒฉ Stateless packet filtering ํŒจํ‚ท ๋‹จ์œ„๋กœ ํŒจํ‚ท์„ ํ•„ํ„ฐ๋ง ํ•„ํ„ฐ๋ง ํ•˜๋Š” ๊ธฐ์ค€ : source IP, dest IP, TCP/UDP source, port ๋“ฑ ACL(Access Control List) : ํ—ˆ์šฉ/์ฐจ๋‹จ ๋ชฉ๋ก Stateful packet filtering TCP ์—ฐ๊ฒฐ๋งˆ๋‹ค ํŒจํ‚ท ์ƒํƒœ๋ฅผ ์ถ”์  ACL์— check connection column์ด ์ถ”์  ์—ฌ๋ถ€ ๊ฒฐ์ • Application gateway IP/TCP/UDP ํŒจํ‚ท์˜ data field๋ฅผ ํ™•์ธ Intrusion Detection System (IDS) (์นจ์ž… ํƒ์ง€ ์‹œ์Šคํ…œ) deep packet inspection : ํŒจํ‚ท์˜ ๋‚ด์šฉ์„ ํ™•์ธ ํŒจํ‚ท ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„ ์กฐ์‚ฌ (port scanning, network mapping, Dos attack) multiple IDSs : ์—ฌ๋Ÿฌ IDS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ท์„ ํ™•์ธ ์•”ํ˜ธํ†ต์‹  - email ์˜ˆ์‹œ (Alice๊ฐ€ Bob์—๊ฒŒ ๋ฉ”์ผ์„ ๋ณด๋‚ธ๋‹ค) Confidentiality(๊ธฐ๋ฐ€์„ฑ) Alice ๋Œ€์นญํ‚ค K ์ƒ์„ฑ K๋กœ ๋ฉ”์‹œ์ง€ ์•”ํ˜ธํ™”, K๋กœ ๋ฉ”์‹œ์ง€ ์•”ํ˜ธํ™” K๋ฅผ Bob์˜ ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™” ์•”ํ˜ธํ™” ๋œ K์™€ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ Bob K๋ฅผ Bob์˜ ๊ฐœ์ธํ‚ค๋กœ ๋ณตํ˜ธํ™” K๋กœ ๋ฉ”์‹œ์ง€ ๋ณตํ˜ธํ™” Integrity (๋ฌด๊ฒฐ์„ฑ), Authentication(์ธ์ฆ) Alice ๋ฉ”์‹œ์ง€ Hash์— Alice์˜ ๊ฐœ์ธํ‚ค๋กœ ๋””์ง€ํ„ธ ์„œ๋ช… ๋ฉ”์‹œ์ง€์™€ ๋””์ง€ํ„ธ ์„œ๋ช…์„ ์ „๋‹ฌ Bob ๋ฉ”์‹œ์ง€ hash๋ฅผ Alice์˜ ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ๋””์ง€ํ„ธ ์„œ๋ช…๊ณผ ๋ฉ”์‹œ์ง€ hash๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ PGP (Pretty Good Privacy) ๋ฉ”์ผ์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ AES256(๋Œ€์นญํ‚ค) ์‚ฌ์šฉ S/MIME (Secure/Multipurpose Internet Mail Extensions) ๋ฉ”์ผ์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ ์•”ํ˜ธํ™” + ๋””์ง€ํ„ธ ์„œ๋ช… = Confidentiality + Integrity + Authentication Multimedia streaming RTSP (Real-Time Streaming Protocol) RTMP (Real-Time Messaging Protocol) HLS (HTTP Live Streaming) ๋น„๋””์˜ค/์˜ค๋””์˜ค ์กฐ๊ฐ ํŒŒ์ผ HTTP ์ „์†ก ์ธ์ฝ”๋”ฉ : H.26 ์กฐ๊ฐํ™” : 6์ดˆ ์ •๋„ HTTP : TCP ๋ฒ„ํผ๋ง ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„ ๋ชฉ์ ์—๋Š” ๋ถ€์ ํ•ฉ MPEG-DASH (Dynamic Adaptive Streaming over HTTP) RTMP WebRTC Plug-in ์—†์ด ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์Œ์„ฑ/์˜์ƒ/P2P ๊ณต์œ  ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ‘œ์ค€ API P2P ์ž‘๋™ ๋ฐฉ์‹ STUN, TURN, ICE์™€ ๊ฐ™์€ NAT Traversal ๊ธฐ์ˆ  ์‚ฌ์šฉ ์‹ ํ˜ธ ๋ฉ”์‹œ์ง€ : Socket.io, ์›น์†Œ์ผ“, AJAX long polling STUN (Session Traversal Utilities for NAT) STUN ์„œ๋ฒ„์—์„œ ๊ณต์ธ IP ์ฃผ์†Œ ์ •๋ณด์™€ port๋ฒˆํ˜ธ ์งˆ์˜ ์‘๋‹ต TURN (Traversal Using Relays around NAT) ํ”ผ์–ด ๊ฐ„์— ํŠธ๋ž˜ํ”ฝ ๋ฆด๋ ˆ์ด ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋™์ผํ•œ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์— ์œ„์น˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ ICE (Interactive Connectivity Establishment) ๋ธŒ๋ผ์šฐ์ €๊ฐ€ Peer๋ฅผ ํ†ตํ•œ ์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ Wireless and Mobile Networks Elements of a wireless network base station : ์œ ์„  ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ relay: ๋กœ์ปฌ์—์„œ ์œ ์„  ๋„คํŠธ์›Œํฌ์™€ ๋ฌด์„  ํ˜ธ์ŠคํŠธ ๊ฐ„์— ํŒจํ‚ท ์ „์†ก์„ ๋‹ด๋‹น wireless link : ๋ชจ๋ฐ”์ผ์„ ๊ธฐ์ง€๊ตญ์— ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ infrastructure mode : ๊ธฐ์ง€๊ตญ์€ ํ•ธ๋“œํฐ์„ ์œ ์„  ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ handoff : ๋ชจ๋ฐ”์ผ์—์„œ AP๋ฅผ ๋ฐ”๊พธ๋ฉด์„œ ํ†ต์‹  ad hoc mode : ๊ธฐ์ง€๊ตญ ์—†์ด ๋ชจ๋ฐ”์ผ ๊ฐ„์— ํ†ต์‹  ๋ฌด์„  ํ†ต์‹ ์˜ ํŠน์ง• ์œ ์„  ๋Œ€๋น„ ์•ฝํ•œ ์‹ ํ˜ธ ๋‹ค๋ฅธ ๋ฌด์„  ์žฅ์น˜์™€์˜ ๊ฐ„์„ญ ๋‹ค์ค‘ ๊ฒฝ๋กœ ์ „ํŒŒ SNR(Signal to Noise Ratio) : ์‹ ํ˜ธ ๋Œ€ ์žก์Œ๋น„ BER(Bit Error Rate) : ๋น„ํŠธ ์˜ค๋ฅ˜์œจ Hidden terminal problem : A-B, B-C ๊ฐ€๋Šฅ A-C ๋ถˆ๊ฐ€๋Šฅ 802.11 LAN base station๊ณผ ๋ฌด์„  host๊ฐ„์˜ ํ†ต์‹  Infrastructure ๋ชจ๋“œ์˜ BSS(Basic Service Set)์— ํฌํ•จ๋˜๋Š” ๊ฒƒ Wireless hosts AP (base station) ad hoc mode: hosts only CSMA : ์ „์†ก ์ „ ์ถฉ๋Œ ๊ฒ€์‚ฌ -> ์ถฉ๋Œ ๊ฐ์ง€๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ ๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ Sense channel์ด DIFS์— ๋Œ€ํ•ด idleํ•˜๋ฉด ํ”„๋ ˆ์ž„์„ ์ „์†ก Sense channel์ด busyํ•˜๋ฉด random backoff ํ›„ ack๊ฐ€ ์˜ค์ง€ ์•Š์œผ๋ฉด backoff๋ฅผ ์ฆ๊ฐ€, 2๋ฒˆ ๋ฐ˜๋ณต ๋ฐ›๋Š” ์‚ฌ๋žŒ ํ”„๋ ˆ์ž„์„ ๋ฐ›์œผ๋ฉด SIFS ํ›„ ack ์ „์†ก CA sender๊ฐ€ ์ž‘์€ RTS(Request to Send) ํ”„๋ ˆ์ž„์„ BS๋กœ ์ „์†ก (CSMA ์‚ฌ์šฉ) BS broadcasts CTS(Clear to Send) to sender (CTS๊ฐ€ ๋ชจ๋“  ๋…ธ๋“œ์—๊ฒŒ ์ „๋‹ฌ) sender๊ฐ€ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„ ์ „์†ก, ๋‹ค๋ฅธ station์€ ์ „์†ก ์ง€์—ฐ advanced capabilities Rate adaptation : SNR(์‹ ํ˜ธ๋Œ€ ์žก์Œ๋น„)์™€ BER(๋น„ํŠธ ์˜ค๋ฅ˜์œจ)์„ ์ธก์ •ํ•˜์—ฌ ์ „์†ก๋ฅ ์„ ์กฐ์ ˆ CDMA (Code Division Multiple Access) unique code๊ฐ€ ๊ฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์—ฌ encoding: ์›๋ณธ ๋ฐ์ดํ„ฐ X chipping ์ˆœ์„œ (๋‚ด์  ์—ฐ์‚ฐ) decodding : encoded ๋ฐ์ดํ„ฐ X chipping ์ˆœ์„œ (๋‚ด์  ์—ฐ์‚ฐ) 4G/5G cellular networks ์ตœ๋Œ€ 100Mbps์˜ ์ „์†ก ์†๋„ ๊ธฐ์ˆ  ํ‘œ์ค€ : 3GPP(3rd Generation Partnership Project) Base station(eNodeB) : wifi AP์™€ ์œ ์‚ฌ HSS(Home Subscriber Server) : ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ MME(Mobility Management Entity) : ์‚ฌ์šฉ์ž ์œ„์น˜ ์ถ”์  S-GW(Serving Gateway) : ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ „์†ก P-GW(Packet Data Network Gateway) : ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ „์†ก GTP : GPRS Tunneling Protocol 5G 10๋ฐฐ ๋น ๋ฅธ ์†๋„, ์ง€์—ฐ ์‹œ๊ฐ„ 10๋ฐฐ ๊ฐ์†Œ, 100๋ฐฐ ๋งŽ์€ ์žฅ์น˜ ์—ฐ๊ฒฐ (4G ๋Œ€๋น„)
new ์†Œํ”„ํŠธ์›จ์–ด๊ณตํ•™
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
1์žฅ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ๊ฐœ์š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ์ข…๋ฅ˜ ์ฃผ๋ฌธํ˜•, ํŒจํ‚ค์ง€ํ˜•, ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ ์‹ค์‹œ๊ฐ„ ์†Œํ”„ํŠธ์›จ์–ด, ์ž๋ฃŒ์ฒ˜๋ฆฌ ์†Œํ”„ํŠธ์›จ์–ด ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์˜ ์ •์˜ IEEE : ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฐœ๋ฐœ, ์šด์šฉ, ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ํŒŒ๊ธฐ์— ๋Œ€ํ•œ ์ฒด๊ณ„์ ์ธ ์ ‘๊ทผ W.Humphrey : ์งˆ ์ข‹์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฒฝ์ œ์ ์œผ๋กœ ์ƒ์‚ฐํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๊ณตํ•™, ๊ณผํ•™, ์ˆ˜ํ•™์  ์›๋ฆฌ์— ์˜ํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•ด์•ผํ•œ๋‹ค ์†Œํ”„ํŠธ์›จ์–ด ํ’ˆ์งˆ (ํšจ-์šฉ-์‹ -์œ -์žฌ-) ํšจ์œจ์„ฑ(efficiency) ์‚ฌ์šฉ์šฉ์ด์„ฑ(usability) ์‹ ๋ขฐ์„ฑ(reliability) ์œ ์ง€๋ณด์ˆ˜์„ฑ(maintainability) ์žฌ์‚ฌ์šฉ์„ฑ(reusability) ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ ์ž‘์—… ์š”๊ตฌ๋ถ„์„๊ณผ ๋ช…์„ธํ™” ๋„๋ฉ”์ธ ๋ถ„์„, ๋ฌธ์ œ ์ •์˜, ์š”๊ตฌ ์ถ”์ถœ, ์š”๊ตฌ ๋ถ„์„, ์š”๊ตฌ ๋ช…์„ธํ™” ์„ค๊ณ„ : ๊ฐ€์šฉํ•œ ๊ธฐ์ˆ ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด์•ผํ•˜๋Š”์ง€ ๊ธฐ์ˆ  ์‹œ์Šคํ…œ ์—”์ง€๋‹ˆ์–ด๋ง, ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ณ UI ์„ค๊ณ„, DB ์„ค๊ณ„ ๋ชจ๋ธ๋ง : ๋„๋ฉ”์ธ์ด๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ‘œํ˜„์„ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€๋Š” ๊ณผ์ • ์œ ์Šค์ผ€์ด์Šค ๋ชจ๋ธ๋ง ์ •์  ๋ชจ๋ธ๋ง, ๋™์  ๋ชจ๋ธ๋ง, ํ–‰์œ„ ๋ชจ๋ธ๋ง ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ’ˆ์งˆ๋ณด์ฆ ๋ฆฌ๋ทฐ, ์ธ์ŠคํŽ™์…˜, ํ…Œ์ŠคํŠธ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ 2์žฅ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์„ธ์Šค ํญํฌ์ˆ˜ ๋ชจ๋ธ (Waterfall Model) ๊ฐ ๋‹จ๊ณ„๊ฐ€ ๋‹ค์Œ ์‹œ์ž‘ ์ „์— ๋๋‚˜์•ผ ํ•จ -> ๋А๋ฆผ ํ”„๋กœํ† ํƒ€์ž…๊ณผ ์žฌ์‚ฌ์šฉ์˜ ๊ธฐํšŒ๊ฐ€ ์ค„์–ด๋“ฆ ํ”„๋กœํ† ํƒ€์ž… ๋ชจ๋ธ (Prototyping Model) ์ธ๊ฐ„-๊ธฐ๊ณ„ ์ƒํ˜ธ์ž‘์šฉ ํ”„๋กœํ† ํƒ€์ž… ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ ๋‹ค - ํ”„๋กœํ† ํƒ€์ž…์„ ํ‰๊ฐ€ํ•œ๋‹ค ์ ์ฆ์  ๋ชจ๋ธ (Incremental Model) ์ ์ฆ์  ๋ฐฉ๋ฒ•: ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ฆด๋ฆฌ์ฆˆ ๋ฐ˜๋ณต์  ๋ฐฉ๋ฒ•: ๋ฆด๋ฆฌ์ฆˆ ํ• ๋•Œ๋งˆ๋‹ค ๊ธฐ๋Šฅ์˜ ์™„์„ฑ๋„๋ฅผ ๋†’์ธ๋‹ค ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•˜๋”๋ผ๋„ ๋นจ๋ฆฌ ๋ฆด๋ฆฌ์ฆˆ ๊ฐ€๋Šฅ ๋‚˜์„ ํ˜• ๋ชจ๋ธ (Spiral Model) ์ง„ํ™” ๋‹จ๊ณ„ ๊ณ„ํš ์ˆ˜๋ฆฝ ์œ„ํ—˜ ๋ถ„์„ ๊ฐœ๋ฐœ ํ‰๊ฐ€ ๋ฐ˜๋ณต์ ์ธ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ -> ๊ฐ•์ธ์„ฑ ํ–ฅ์ƒ ๊ด€๋ฆฌ, ์œ„ํ—˜ ๋ถ„์„์ด ์ค‘์š” ์ง„ํ™”์  ๋ชจ๋ธ (Evolutionary Model) ์ดˆ๊ธฐ์— ์š”๊ตฌ์‚ฌํ•ญ์„ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๊ณ  ๊ตฌํ˜„์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ, ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„์„ ํ•œ ๋ฒˆ์ด์ƒ ๋ฐ˜๋ณต UP (Unified Process) ๋„์ž… ๋‹จ๊ณ„ : ํ”„๋กœ์ ํŠธ์˜ ๋ฒ”์œ„๋ฅผ ์„ค์ •, ๋ชฉํ‘œ๋ฅผ ๋ช…ํ™•ํžˆ ์ •๋ จ ๋‹จ๊ณ„ : ์š”๊ตฌ๋ฅผ ์ฐพ์•„๋‚ด์–ด ์„ค๊ณ„๋ฅผ ์™„์„ฑ ๊ตฌ์ถ• ๋‹จ๊ณ„ : ์ œ์กฐ ๋‹จ๊ณ„, ์š”๊ตฌ์˜ ํ…Œ์ŠคํŠธ ๋งˆ๋ฌด๋ฆฌ ์ „ํ™˜ ๋‹จ๊ณ„ : ๋ฆด๋ฆฌ์ฆˆ ์• ์ž์ผ ํ”„๋กœ์„ธ์Šค (Agile Process) ํŠน์ง• ์งง์€ ๋ฆด๋ฆฌ์ฆˆ์™€ ๋ฐ˜๋ณต ์ ์ฆ์  ์„ค๊ณ„ ์‚ฌ์šฉ์ž ์ฐธ์—ฌ ๋ฌธ์„œ ์ตœ์†Œํ™” ๋น„๊ณต์‹์  ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์š”๊ตฌ์™€ ํ™˜๊ฒฝ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ • ์ต์ŠคํŠธ๋ฆผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (eXtreme Pragramming) ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก  ์ค‘ ํ•˜๋‚˜ Planning : ์š”๊ตฌ์‚ฌํ•ญ์„ ์ž‘์€ ์š”์†Œ๋กœ ๋ถ„ํ•  Analysis Design Execution : Coding, Testing Wrapping : small release, process improvement Closure : launch ์Šคํฌ๋Ÿผ (Scrum) ์กฐ์ง์ ์œผ๋กœ ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก ์„ ์ ์šฉ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐฑ๋กœ๊ทธ (Backlog) : ํ•  ์ผ ๋ชฉ๋ก ์Šคํ”„๋ฆฐํŠธ (Sprint) : Iteration์„ ์˜๋ฏธ, 1~4์ฃผ์˜ ๊ธฐ๊ฐ„ ์Šคํฌ๋Ÿผ ํšŒ์˜ : ๋งค์ผ 15๋ถ„๊ฐ„ ์ง„๋„ ํ™•์ธ ํšŒ์˜ ๋ฆฌ๋ทฐ : ์Šคํ”„๋ฆฐํŠธ ์ข…๋ฃŒ ํ›„ ๊ตฌํ˜„๋œ ์‚ฐ์ถœ๋ฌผ์„ ๋ฆฌ๋ทฐ ์Šคํ”„๋ฆฐํŠธ ํšŒ๊ณ  : ๋ฐฉ๋ฒ•๋ก  ์ž์ฒด์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ ์ˆ˜ํ–‰ ํ”„๋กœ์„ธ์Šค ๋ชจ๋ธ ์„ ์ • ์ผ๋ฐ˜์ ์ธ ๊ตฌ์ถ• : ํญํฌ์ˆ˜ ๋ชจ๋ธ ๋Œ€๊ทœ๋ชจ ์žฌ๊ตฌ์ถ• : ์ ์ฆ์  ๋ชจ๋ธ, ๋‚˜์„ ํ˜• ๋ชจ๋ธ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ : ์ ์ฆ์  ๋ชจ๋ธ ํ”„๋กœ์ ํŠธ ํƒ€๋‹น์„ฑ ๊ฒ€ํ†  : ํ”„๋กœํ† ํƒ€์ž… ๋ชจ๋ธ, ๋‚˜์„ ํ˜• ๋ชจ๋ธ ์—ฐ๊ตฌํ˜• ๊ฐœ๋ฐœ : ํ”„๋กœํ† ํƒ€์ž… ๋ชจ๋ธ, ๋‚˜์„ ํ˜• ๋ชจ๋ธ ์†Œ๊ทœ๋ชจ : ์• ์ž์ผ ํ”„๋กœ์„ธ์Šค ํ”„๋กœ์„ธ์Šค ํ™œ๋™ Software speicification Feasibility study(ํƒ€๋‹น์„ฑ ์กฐ์‚ฌ) Requirements elicitation and analysis(์š”๊ตฌ์‚ฌํ•ญ ๋„์ถœ ๋ฐ ๋ถ„์„) Requirements specification(์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ) Requirements validation(์š”๊ตฌ์‚ฌํ•ญ ๊ฒ€์ฆ) Software deisgn and implementation Architectureal design Interface design Component design Data structure design Algorithm design Software validation Vertification and validation (V&V) : ์‹œ์Šคํ…œ์ด ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ํ™œ๋™ Component or unit testing System testing Acceptance testing Software evolution ๋ณ€ํ™”ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€ํ™”ํ•จ์— ๋”ฐ๋ผ ์†Œํ”„ํŠธ์›จ์–ด ์ง„ํ™”ํ•˜๊ณ  ๋ณ€ํ™”ํ•ด์•ผ ํ•œ๋‹ค 3์žฅ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ํ™œ๋™ ์ œ์•ˆ์„œ ์ž‘์„ฑ ํ”„๋กœ์ ํŠธ ๊ณ„ํš ๋ฐ ์Šค์ผ€์ค„๋ง ํ”„๋กœ์ ํŠธ ๋น„์šฉ ๊ณ„ํš ํ”„๋กœ์ ํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ฒ€ํ†  ์ธ๋ ฅ ์„ ๋ฐœ ๋ฐ ํ‰๊ฐ€ ๋ณด๊ณ ์„œ ์ž‘์„ฑ ๋ฐ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ๋…ธ๋ ฅ ์ถ”์ • ํ”„๋กœ์ ํŠธ ์š”์†Œ ๋ฌธ์ œ์˜ ๋ณต์žก๋„, ์‹œ์Šคํ…œ์˜ ํฌ๊ธฐ, ์‹œ์Šคํ…œ ์‹ ๋ขฐ๋„ ์ž์› ์š”์†Œ ์ธ์  ์ž์›, H/W ์ž์›, S/W ์ž์› ์ƒ์‚ฐ์„ฑ ์š”์†Œ ๊ฐœ๋ฐœ์ž ๋Šฅ๋ ฅ, ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก  ๊ธฐ๋Šฅ ์ ์ˆ˜ ๋ชจ๋ธ (UFP: Unadjusted Function Point) ์‚ฐ์ • 5๊ฐ€์ง€ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ ์š”์†Œ๋ณ„ ๊ธฐ๋Šฅ ์ ์ˆ˜ ๊ฐ€์ค‘์น˜ ๋ถ€์—ฌ ์™ธ๋ถ€ ์ž…๋ ฅ, ์™ธ๋ถ€ ์ถœ๋ ฅ, ์™ธ๋ถ€ ์งˆ์˜ ๋‚ด๋ถ€ ๋…ผ๋ฆฌ ํŒŒ์ผ, ์™ธ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค ํŒŒ์ผ ๊ธฐ๋Šฅ ์ ์ˆ˜ ๋ชจ๋ธ (VAF: Value Adjustment Factor) ์‚ฐ์ • 14๊ฐ€์ง€ ๊ธฐ์ˆ ์  ๋ถ„์•ผ์— ๋Œ€ํ•œ ๋ณต์žก๋„๋ฅผ ๊ณ ๋ คํ•˜์—ฌ 0~5 ์ ์ˆ˜ ๋ถ€์—ฌ ๊ธฐ๋Šฅ ์ ์ˆ˜ ๋ชจ๋ธ (AFP: Adjusted Function Point) ์‚ฐ์ • AFP = UFP * VAF ๊ฐ์ฒด ์ ์ˆ˜ ๋ชจ๋ธ Cc(Class Complexity): ํด๋ž˜์Šค์˜ ๊ฐœ์ˆ˜ ์ถ”์ • Wi: ์‚ฌ์šฉ์ž ์ž…๋ ฅ์˜ ์ข…๋ฅ˜ ๋ถ„๋ฅ˜, ๊ฐ€์ค‘์น˜ ๋ถ€์—ฌ ์ตœ์ข… ํด๋ž˜์Šค ๊ฐœ์ˆ˜(TCc) = Cc(Wi+1) Effort = TCc X MD(ํด๋ž˜์Šค 1๊ฐœ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ์†Œ์š”๋˜๋Š” ์ƒ์‚ฐ์„ฑ ์ถ”์ • ๊ฐ’) ํ”„๋กœ์ ํŠธ ์ผ์ • ๊ด€๋ฆฌ Action: ํ”„๋กœ์ ํŠธ์—์„œ์˜ ํ™œ๋™ Milestones(์ด์ •ํ‘œ): ํ”„๋กœ์ ํŠธ์—์„œ์˜ ์ค‘์š”ํ•œ ์‹œ์  Deliverables(๋‚ฉํ’ˆ๋ฌผ) PERT/CPM ์ฐจํŠธ ์ž„๊ณ„ ๊ฒฝ๋กœ Pert Chart์—์„œ ์†Œ์š” ๊ธฐ๊ฐ„์ด ๊ฐ€์žฅ ๊ธด ๊ฒฝ๋กœ -> ํ”„๋กœ์ ํŠธ ์™„๋ฃŒ๊นŒ์ง€ ํ•„์š”ํ•œ ์ตœ์†Œ ์‹œ๊ฐ„ ๊ฐ„ํŠธ(Gantt) ์ฐจํŠธ ๊ฐ€๋กœ์ถ•: ์‹œ๊ฐ„ ์„ธ๋กœ์ถ•: ์ž‘์—… ๋งˆ์ผ์Šคํ†ค: ๋งˆ๋ฆ„๋ชจ ํ‘œ์‹œ ํŒŒ๋ž€์ƒ‰ ๋ง‰๋Œ€: ์—ฌ์œ ์‹œ๊ฐ„ ์• ์ž์ผ ์ผ์ • ๊ณ„ํš ์Šคํ† ๋ฆฌ์นด๋“œ ๋‹จ์œ„์˜ ์ผ์ • ๊ณ„ํš ํ”„๋กœ์ ํŠธ ์ธ์  ์ž์› ๊ด€๋ฆฌ ๊ณ„์ธตํ˜• ํŒ€ ์ดˆ๋ณด์ž์™€ ๊ฒฝํ—˜์ž๋ฅผ ๋ถ„๋ฆฌ ์žฅ์  : ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํฌ๊ณ  ๊ตฌ์กฐ๊ฐ€ ๊ณ„์ธต์ ์œผ๋กœ ์ž˜ ๋‚˜๋ˆ„์–ด์ง„ ๊ฒฝ์šฐ์— ์ ํ•ฉ ๋‹จ์  : ๊ธฐ์ˆ  ์ธ๋ ฅ์ด ๊ด€๋ฆฌ, ์˜์‚ฌ ์ „๋‹ฌ ๊ฒฝ๋กœ๊ฐ€ ๊น€ Egoless ํŒ€ ๋ฏผ์ฃผ์ฃผ์˜ ๋ฐฉ์‹, ๊ตฌ์„ฑ์›์ด ๋™๋“ฑํ•œ ์ฑ…์ž„๊ณผ ๊ถŒํ™˜ ์žฅ์  : ์˜์‚ฌ ๊ต๋ฅ˜ ํ™œ๋ฐœ, ๋ณต์žกํ•œ ์žฅ๊ธฐ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉ ๋‹จ์  : ์ฑ…์ž„์ด ๋ถˆ๋ช…ํ™•, ๋А๋ฆฐ ์˜์‚ฌ๊ฒฐ์ •, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ๋ถ€์ ํ•ฉ ์ฑ…์ž„ ํ”„๋กœ๊ทธ๋ž˜๋จธ ํŒ€์˜ ๊ตฌ์„ฑ ์ž‘์€ ํŒ€์œผ๋กœ ๊ตฌ์„ฑ, ์ฑ…์ž„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ†ต์ œ ์ฑ…์ž„ ํ”„๋กœ๊ทธ๋ž˜๋จธ, ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์„œ, ๋ณด์กฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ ๊ตฌ์„ฑ ์žฅ์  : ์˜์‚ฌ ๊ฒฐ์ •์ด ๋น ๋ฆ„, ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉ ๋‹จ์  : ํ•œ ์‚ฌ๋žŒ์˜ ๋Šฅ๋ ฅ๊ณผ ๊ฒฝํ—˜์ด ํ”„๋กœ์ ํŠธ์˜ ์„ฑํŒจ ์ขŒ์šฐ ํ”„๋กœ์ ํŠธ ์œ„ํ—˜ ๊ด€๋ฆฌ ์œ„ํ—˜ ์ข…๋ฅ˜ ํ”„๋กœ์ ํŠธ ์œ„ํ—˜, ์ œํ’ˆ ์œ„ํ—˜, ๋น„์ฆˆ๋‹ˆ์Šค ์œ„ํ—˜ ์œ„ํ—˜ ๊ด€๋ฆฌ ํ”„๋กœ์ ํŠธ ์œ„ํ—˜ ์‹๋ณ„ ์œ„ํ—˜ ๋ถ„์„ ์œ„ํ—˜ ๋Œ€์ฒ˜ ๊ณ„ํš ์ˆ˜๋ฆฝ ์œ„ํ—˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์œ„ํ—˜ ๋Œ€์ฒ˜ ๊ณ„ํš ์ˆ˜๋ฆฝ ํšŒํ”ผ ์ „๋žต: ์œ„ํ—˜์ด ๋ฐœ์ƒํ•  ํ™•๋ฅ ์„ ์ค„์ž„ ์ตœ์†Œํ™” ์ „๋žต: ์œ„ํ—˜์˜ ์˜ํ–ฅ์„ ์ค„์ž„ ๋น„์ƒ ๊ณ„ํš: ์œ„ํ—˜์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋Œ€์ฒ˜ ๋ฐฉ๋ฒ• 4์žฅ ์š”๊ตฌ์‚ฌํ•ญ ๊ฐœ๋ฐœ ๋ฐ ์ •์˜ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„๊ณผ์ • ๋„๋ฉ”์ธ ๋ถ„์„ -> ์š”๊ตฌ์‚ฌํ•ญ ์ถ”์ถœ -> ๋ถ„์„ ๋ฐ ๋ช…์„ธํ™” -> ๊ฒ€ํ†  ๋„๋ฉ”์ธ ๋ถ„์„ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋ฌธ์ œ๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋„๋ฉ”์ธ์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๊ฐ€๋Š” ๊ณผ์ • ๋„๋ฉ”์ธ: ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ณ ๊ฐ์ด ์ผํ•˜๋Š” ๋ถ„์•ผ์˜ ๋น„์ฆˆ๋‹ˆ์Šค๋‚˜ ๊ธฐ์ˆ  ๋„๋งค์ธ ๋ถ„์„์˜ ์ด์  ๋น ๋ฅธ ๊ฐœ๋ฐœ, ๋” ์ข‹์€ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ๊ฐ€๋Šฅ, ํ™•์žฅ ์˜ˆ๊ฒฌ ๋ฌธ์ œ ์ •์˜์™€ ๋ฒ”์œ„ ์„ค์ • ๋ฌธ์ œ ์ •์˜์„œ ๋ฌธ์ œ ์ •์˜ ๋ฒ”์œ„ ์‹œ์Šคํ…œ์— ํฌํ•จ๋˜์–ด์•ผ ํ•  ๊ธฐ๋Šฅ ๊ฒฐ์ • ์š”๊ตฌ์‚ฌํ•ญ ์ถ”์ถœ ์š”๊ตฌ์‚ฌํ•ญ ์ถ”์ถœ ๋ฐฉ๋ฒ• ๊ด€์ฐฐ, ์ธํ„ฐ๋ทฐ, ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ, ํ”„๋กœํ† ํƒ€์ดํ•‘, ์œ ์Šค์ผ€์ด์Šค ๋ถ„์„ ๊ด€์ฐฐ ์‚ฌ์šฉ์ž๋ฅผ ๊ด€์ฐฐ, ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋œ๋‹ค ์ธํ„ฐ๋ทฐ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ตœ์†Œํ•œ์˜ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด ๋ฌด์—‡์ธ์ง€ ์งˆ๋ฌธ ๋‹ค์ด์–ด๊ทธ๋žจ ์ž‘์„ฑ์„ ์š”๊ตฌ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ ๊ด€๋ จ์ž ๋ชจ๋‘๊ฐ€ ์ฐธ์—ฌ JAD(Joint Application Development) ์ตœ์ข… ์‚ฌ์šฉ์ž์™€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ ๋…ผ์˜ ํ”„๋กœํ† ํƒ€์ดํ•‘ paper prototype: ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ mock-up of the UI : ๊ฐ€์žฅ ํ”ํ•œ ํ˜•ํƒœ ์š”๊ตฌ์‚ฌํ•ญ ๋ฌธ์„œ ๊ตฌ์„ฑ ํ™˜๊ฒฝ ๋ฐ ์‹œ์Šคํ…œ ๋ชจ๋ธ ๊ธฐ๋Šฅ์  ์š”๊ตฌ์‚ฌํ•ญ ๋น„๊ธฐ๋Šฅ์  ์š”๊ตฌ์‚ฌํ•ญ : ์„ฑ๋Šฅ, ํšจ์œจ ๋“ฑ 5์žฅ ์œ ์Šค์ผ€์ด์Šค ๋ชจ๋ธ๋ง ์œ ์Šค์ผ€์ด์Šค ์‹œ์Šคํ…œ์ด actor์—๊ฒŒ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๊ฐ€์น˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ผ๋ จ์˜ ํ–‰๋™ ๋ฐ ๊ทธ ๋ณ€ํ˜•๋“ค์˜ ์ง‘ํ•ฉ ์œ ์Šค์ผ€์ด์Šค๋Š” ์™„์ „ํ•œ ๊ธฐ๋Šฅ์„ ๋ช…์„ธํ•œ๋‹ค ์‹œ๋‚˜๋ฆฌ์˜ค : ํŠน์ •ํ•œ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ์ผ๋ จ์˜ ํ–‰๋™์ด๋‚˜ ์ง‘ํ•ฉ ์œ ์Šค์ผ€์ด์Šค ๋‹ค์ด์–ด๊ทธ๋žจ ์‹œ์Šคํ…œ, ์•กํ„ฐ, ์œ ์Šค์ผ€์ด์Šค๋ฅผ ํฌํ•จ ์‹œ์Šคํ…œ : ๊ฐœ๋ฐœ๋  ์‹œ์Šคํ…œ์˜ ๊ฒฝ๊ณ„ ์•กํ„ฐ : ์‹œ์Šคํ…œ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ์™ธ๋ถ€ ์—์ด์ „ํŠธ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ญํ•  ์œ ์Šค์ผ€์ด์Šค ํ•ญ์ƒ ์•กํ„ฐ์— ์˜ํ•ด ๊ฐœ์‹œ๋จ ์•กํ„ฐ์—๊ฒŒ ๊ฐ€์น˜๋ฅผ ์ œ๊ณต ์™„์ „ํ•œ ์„ค๋ช…์ด์–ด์•ผ ํ•จ ์œ ์Šค์ผ€์ด์Šค ๊ฐ„์˜ ๊ด€๊ณ„ ํฌํ•จ ๊ด€๊ณ„ ๋‹ค์ˆ˜์˜ ์œ ์Šค์ผ€์ด์Šค๊ฐ€ ๊ณตํ†ต๋œ ํ–‰๋™์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ, ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ํ™•์žฅ ๊ด€๊ณ„ ํ•œ ์œ ์Šค์ผ€์ด์Šค์˜ ํ™•์žฅ ์ง€์ ์— ์•ก์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค๋ฅธ ์œ ์Šค์ผ€์ด์Šค๋กœ ํ™•์žฅ ์œ ์Šค์ผ€์ด์Šค ๊ฒ€์ฆ ๊ฒ€์ฆ: ๊ตฌํ˜„์„ ํ…Œ์ŠคํŠธ ํ™•์ธ: ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๋Š”๊ฐ€? ์›Œํฌ์“ฐ๋ฃจ: ์•กํ„ฐ์™€ ์‹œ์Šคํ…œ์˜ ์—ญํ• ๊ทน ์œ ์Šค์ผ€์ด์Šค ์‹คํ˜„ ์œ ์Šค์ผ€์ด์Šค๋Š” collaboration์œผ๋กœ ์‹คํ˜„ 6์žฅ ํด๋ž˜์Šค ๋ชจ๋ธ๋ง UML Unified Modeling Language ๊ฐ์ฒด์ง€ํ–ฅ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ชจ๋ธ๋งํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ๊ทธ๋ž˜ํ”ฝ ์–ธ์–ด ํด๋ž˜์Šค ์‚ฌ๊ฐํ˜•์œผ๋กœ ํ‘œํ˜„ ์ด๋ฆ„, ์†์„ฑ, ์˜คํผ๋ ˆ์ด์…˜ ํ‘œ์‹œ ์†์„ฑ ์˜คํผ๋ ˆ์ด์…˜ getter(), setter() operation signature์˜ ํ‘œํ˜„ 1+ digit(n:int) ๊ฐ€์‹œ์„ฑ public(+), private(-), protected(#) ์—ฐ๊ด€๊ด€๊ณ„ ๊ด€๊ณ„์ด๋ฆ„: ๋™์‚ฌ, ๋™์‚ฌ๊ตฌ ๋‹ค์ค‘์„ฑ: ๊ด€๊ณ„ ์‚ฌ์ด์— ๊ฐœ์ž…ํ•˜๋Š” ์ธ์Šคํ„ด์Šค ๊ฐœ์ˆ˜ 0..1: ์„ ํƒ์  ๊ด€๊ณ„ 1..*: 1๊ฐœ ๋˜๋Š” ๊ทธ ์ด์ƒ 3..5: 3๊ฐœ์—์„œ 5๊ฐœ๊นŒ์ง€ One-to-one Many-to-many One-to-many ์—ญํ•  ์ด๋ฆ„: ์—ญํ• , ๋งํฌ ์–‘ ์˜†์— ํ‘œ์‹œ ๋ฐฉํ–ฅ์„ฑ : ์—ฐ๊ด€๊ด€๊ณ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์–‘๋ฐฉํ–ฅ์„ฑ, ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ œํ•œ ๊ฐ€๋Šฅ ์ „์ฒด/๋ถ€๋ถ„ ๊ด€๊ณ„ (Aggregation) ์ „์ฒด ๊ฐ์ฒด๊ฐ€ ๋ถ€๋ถ„ ๊ฐ์ฒด๋ฅผ ํฌํ•จ ํฐ์ƒ‰ ๋‹ค์ด์•„๋ชฌ๋“œ๋กœ ํ‘œ์‹œ Composition ๊ด€๊ณ„ aggregation์ด ๊ฐ•ํ•œ ๊ด€๊ณ„ ์ „์ฒด๊ฐ€ ์†Œ๋ฉธ๋˜๋ฉด ๋ถ€ํ’ˆ๋„ ์†Œ๋ฉธ๋จ ๊ฒ€์€ ๋‹ค์ด์•„๋ชฌ๋“œ๋กœ ํ‘œ์‹œ ์ผ๋ฐ˜ํ™” ๊ด€๊ณ„ (Generalization) ์ผ๋ฐ˜ํ™”: ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ํด๋ž˜์Šค์˜ ๊ณตํ†ต ์š”์†Œ๋ฅผ ์ผ๋ฐ˜ํ™” ์ƒ์„ธํ™”(specialization): ์ˆ˜ํผํด๋ž˜์Šค๋ฅผ ์„œ๋ธŒํด๋ž˜์Šค๋กœ ๊ตฌ์ฒดํ™” ์ถ”์ƒํด๋ž˜์Šค (abstract)๋กœ ํ‘œ์‹œ ์ถ”์ƒ ์˜คํผ๋ ˆ์ด์…˜: ๊ตฌํ˜„์ด ์—†๋Š” ์˜คํผ๋ ˆ์ด์…˜ ์ธํ„ฐํŽ˜์ด์Šค <<interface>>๋กœ ํ‘œ์‹œ Notes = ์ฃผ์„ OCL (Object Constraint Language) ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ชจ๋“ˆ์˜ ์ œ์•ฝ์‚ฌํ•ญ์„ ์ •ํ˜•์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋„๋ก ์„ค๊ณ„๋œ ๋ช…์„ธ ์˜์–ด 7์žฅ ๋™์  ๋ชจ๋ธ๋ง ๋™์  ๋ชจ๋ธ๋ง ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๊ฐ ๋นŒ๋”ฉ ๋ธ”๋ก์ด ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€๋ฅผ ํ‘œํ˜„ ํ‘œํ˜„๋ฐฉ๋ฒ• : ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ, ์ƒํƒœ ๋‹ค์ด์–ด๊ทธ๋žจ, ํ™œ๋™ ๋‹ค์ด์–ด๊ทธ๋žจ ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ ์‹œ์Šคํ…œ์˜ ๋™์ ์ธ ์ธก๋ฉด์„ ๋ชจ๋ธ๋งํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฐ์ฒด, ์•กํ„ฐ, ๋ฉ”์‹œ์ง€(์•กํ„ฐ -> ๊ฐ์ฒด)๋กœ ๊ตฌ์„ฑ ์ˆ˜์ง ์ถ•์€ ์‹œ๊ฐ„ ํ๋ฆ„ ์•กํ„ฐ๋ฅผ ์™ผ์ชฝ์— ํ‘œ์‹œ ๊ฐ์ฒด๋งˆ๋‹ค life line์„ ๊ทธ๋ฆผ activation box : ๊ฐ์ฒด์˜ ํ™œ์„ฑํ™”๋ฅผ ํ‘œํ˜„ ๋ฉ”์‹œ์ง€๋Š” activation box ์‚ฌ์ด์— ํ™”์‚ดํ‘œ๋กœ ํ‘œ์‹œ ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋œ ์ดํ›„์—๋Š” ๋ผ์ดํ”„๋ผ์ธ์ด ์ค‘์ง€๋˜๋ฉฐ ‘X’๋กœ ํ‘œ์‹œ opt(if), alt(switch), loop(for) ์ƒํƒœ ๋‹ค์ด์–ด๊ทธ๋žจ ์‹œ์Šคํ…œ ์ „์ฒด, ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€, ๊ฐœ๋ณ„ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋™์ž‘์„ ๊ธฐ์ˆ ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์  ์ƒํƒœ ๋‹ค์ด์–ด๊ทธ๋žจ์ด ๋‚ด๋ถ€์— ๋‚ด์žฅ ๊ฐ€๋Šฅ ์ด๋•Œ, ๋‚ด๋ถ€ ๋‹ค์ด์–ด๊ทธ๋žจ์˜ ์ƒํƒœ๋ฅผ substate(์„œ๋ธŒ์ƒํƒœ)๋ผ๊ณ  ํ•จ ์ƒํƒœ ์ฃผ์–ด์ง„ ์‹œ์ ์— ์‹œ์Šคํ…œ์€ ์–ด๋–ค ์ƒํƒœ์— ์žˆ์Œ ํ‘œํ˜„ ์ƒํƒœ : ๋‘ฅ๊ทผ ์‚ฌ๊ฐํ˜• ์•ˆ์— ์ƒํƒœ ์ด๋ฆ„์„ ํ‘œ์‹œํ•˜์—ฌ ๋‚˜ํƒ€๋ƒ„ ์‹œ์ž‘ ์ƒํƒœ : ๊ฒ€์€ ์› ์ข…๋ฃŒ ์ƒํƒœ : ์› ์•ˆ์— ์› ํŠธ๋žœ์ง€์…˜ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์œผ๋กœ ์ธํ•œ ์ƒํƒœ ๋ณ€ํ™” (์ฆ‰์‹œ ์ผ์–ด๋‚จ์ด ์›์น™) ํŠธ๋žœ์ง€์…˜ ์œ„์—๋Š” ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ์ด๋ฒคํŠธ๋ฅผ ํ‘œ์‹œ ํ‘œํ˜„ : ํ™”์‚ดํ‘œ๋กœ ํ‘œ์‹œ ์ข…๋ฅ˜ : ๊ฒฝ๊ณผ ์‹œ๊ฐ„ ํ‘œ์‹œ ํŠธ๋žœ์ง€์…˜, ์กฐ๊ฑด ํ‘œ์‹œ ํŠธ๋žœ์ง€์…˜ ์•กํ‹ฐ๋น„ํ‹ฐ ์‹œ์Šคํ…œ์ด ์–ด๋–ค ์ƒํƒœ์— ์žˆ์„ ๋•Œ ์ˆ˜ํ–‰ํ•˜๋Š” ํ–‰์œ„ ์ธํ„ฐ๋ŸฝํŠธ ๊ฐ€๋Šฅ ํ‘œํ˜„ : ์ƒํƒœ ๋‚ด๋ถ€์— ์‚ฌ๊ฐํ˜• ๋ฐ•์Šค๋กœ ํ‘œ์‹œ ์•ก์…˜ ์‹œ๊ฐ„ ๊ฒฝ๊ณผ ์—†์ด ์ฆ‰์‹œ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘ ํ‘œํ˜„ : Enter/action, Exit/action, event/action ์•กํ‹ฐ๋น„ํ‹ฐ ๋‹ค์ด์–ด๊ทธ๋žจ ๊ฐ์ฒด๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ํ๋ฆ„์„ ์ดํ•ด, ์œ ์Šค์ผ€์ด์Šค ์‚ฌ์ด์˜ ๊ด€๊ณ„์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ์ƒํƒœ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ์œ ์‚ฌ ๋ณ‘ํ–‰ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค ํ‘œํ˜„ activity : ๋ชจ์„œ๋ฆฌ๊ฐ€ ๋‘ฅ๊ทผ ์‚ฌ๊ฐํ˜• transition(๊ฐ€๋“œ ์ปจ๋””์…˜, ์ „์†ก-์ ˆ, ์•ก์…˜ํ‘œํ˜„) : ํ™”์‚ดํ‘œ decision point : ๋‹ค์ด์•„๋ชฌ๋“œ ๋ณ‘ํ–‰ ์ฒ˜๋ฆฌ ํ‘œํ˜„ Fork ๋‹จ์ผ ์ž…๋ ฅ ํŠธ๋žœ์ง€์…˜๊ณผ ๋‹ค์ˆ˜ ์ถœ๋ ฅ ํŠธ๋žœ์ง€์…˜ Rendezvous ๋‹ค์ˆ˜ ์ž…๋ ฅ ํŠธ๋žœ์ง€์…˜๊ณผ ๋‹ค์ˆ˜ ์ถœ๋ ฅ ํŠธ๋žœ์ง€์…˜ Join ๋‹ค์ˆ˜ ์ž…๋ ฅ ํŠธ๋žœ์ง€์…˜๊ณผ ๋‹จ์ผ ์ถœ๋ ฅ ํŠธ๋žœ์ง€์…˜ Swimlane ๊ฐ™์€ swimlane์— ์žˆ๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ๋“ค์€ ๋™์ผํ•œ ํด๋ž˜์Šค์™€ ๊ด€๋ จ๋œ ๊ฒƒ ๋™์  ๋‹ค์ด์–ด๊ทธ๋žจ์˜ ๊ตฌํ˜„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์„ค๊ณ„ ์›๋ฆฌ 2 : ์‘์ง‘๋ ฅ์„ ๋†’์ด๊ธฐ ์‘์ง‘๋ ฅ ํ–ฅ์ƒ (์‘์ง‘๋ ฅ์ด ๋†’์€ ์ˆœ) ๊ธฐ๋Šฅ์  ์‘์ง‘๋„ : ํŠน์ • ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋งŒ ์กด์žฌ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›€, ์žฌ์‚ฌ์šฉ์„ฑ ๋†’์Œ, ๋Œ€์ฒด ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ -> ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋†’์Œ ๊ณ„์ธต์  ์‘์ง‘๋„ : ์—ฐ๊ด€ ๊ธฐ๋Šฅ ๊ฐ™์€ ๊ณ„์ธต ์˜ˆ) Application(์ƒ), DB system(ํ•˜) ์ˆœ์ฐจ์  ์‘์ง‘๋„ : ์ด์ „ ํ”„๋กœ์‹œ์ € ์ถœ๋ ฅ -> ๋‹ค์Œ ํ”„๋กœ์‹œ์ €์˜ ์ž…๋ ฅ ๊ตํ™˜์  ์‘์ง‘๋„ : ๋™์ผํ•œ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์‹œ์ €๋“ค์˜ ์ง‘ํ•ฉ ์ ˆ์ฐจ์  ์‘์ง‘๋„ : ์ฐจ๋ก€๋กœ ์ˆ˜ํ–‰๋˜๋Š” ํ”„๋กœ์‹œ์ €๋ฅผ ๋ชจ์Œ ์‹œ๊ฐ„์  ์‘์ง‘๋„ : ๊ฐ™์€ ์‹œ์ ์— ์ˆ˜ํ–‰๋  ์—ฐ์‚ฐ์„ ๋ชจ์Œ ์‹ค์šฉ์  ์‘์ง‘๋„ : ๋‹ค๋ฅธ ์‘์ง‘ ๋‹จ์œ„์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์—†๋Š” ํ”„๋กœ์‹œ์ €๋“ค์˜ ์ง‘ํ•ฉ ์„ค๊ณ„ ์›๋ฆฌ 3 : ๊ฒฐํ•ฉ๋ ฅ์„ ๋‚ฎ์ถ”๊ธฐ ๋‚ด์šฉ ๊ฒฐํ•ฉ : ํƒ€ ์ปดํฌ๋„ŒํŠธ์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋ฐ€๋ฆฌ์— ์ˆ˜์ • ๋ฐฉ์ง€์ฑ… : ์บก์Аํ™” ๊ณตํ†ต ๊ฒฐํ•ฉ : ์ „์—ญ ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์‹œ ํ•ญ์ƒ ๋ฐœ์ƒ ์ œ์–ด ๊ฒฐํ•ฉ : ํ”Œ๋ž˜๊ทธ, ์ปค๋งจ๋“œ ์ด์šฉ -> ํƒ€ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœํ•˜์—ฌ ์ œ์–ด ๋ฐฉ์ง€์ฑ… : operation์˜ ๋‹คํ˜•์„ฑ ์‚ฌ์šฉ, look-up table ์‚ฌ์šฉ ์Šคํƒฌํ”„ ๊ฒฐํ•ฉ : ํƒ€ ํด๋ž˜์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ ์ž๋ฃŒ ๊ฒฐํ•ฉ : ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜• ๋˜๋Š” ๋‹จ์ˆœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํด๋ž˜์Šค ๋ฃจํ‹ด ํ˜ธ์ถœ ์ง‘ํ•ฉ : ํ•˜๋‚˜์˜ ๋ฃจํ‹ด(๋ฉ”์†Œ๋“œ)๊ฐ€ ๋‹ค๋ฅธ ๋ฃจํ‹ด ํ˜ธ์ถœ ํƒ€์ž… ์‚ฌ์šฉ ๊ฒฐํ•ฉ : ํƒ€ ๋ชจ๋“ˆ์—์„œ ์ •์˜ํ•œ ์ž๋ฃŒํ˜• ์‚ฌ์šฉ ํฌํ•จ ๊ฒฐํ•ฉ : import & include ์™ธ๋ถ€ ๊ฒฐํ•ฉ : ์šด์˜์ฒด์ œ, ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ•˜๋“œ์›จ์–ด ์˜์กด ๋ฐฉ์ง€์ฑ… : ์˜์กด์„ฑ ์ฝ”๋“œ ์ค„์ด๊ธฐ, facade ์„ค๊ณ„ ํŒจํ„ด ์‚ฌ์šฉ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด ๊ณ„์ธต๊ตฌ์กฐ ์Šคํƒ€์ผ : ๊ฐ ์„œ๋ธŒ์‹œ์Šคํ…œ์ด ํ•˜๋‚˜์˜ ๊ณ„์ธต์ด ๋˜์–ด ํ•˜์œ„์ธต์ด ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์Šคํƒ€์ผ ๋ธŒ๋กœ์ปค ์Šคํƒ€์ผ : ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์Šคํƒ€์ผ : ์—ฐ์†์ ์ธ ์ž…๋ ฅ์„ ํ•˜๋‚˜์”ฉ ์ฝ์–ด ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ช…์‹œ ํŠธ๋žœ์žญ์…˜ : ์‹œ์Šคํ…œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๋Š” ๋ช…๋ น๋“ค์˜ ์ง‘ํ•ฉ ํŒŒ์ดํ”„ ํ•„ํ„ฐ ์Šคํƒ€์ผ : ๋น„๊ต์  ๋‹จ์ˆœํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์ด ํ”„๋กœ์„ธ์Šค์— ์ฐจ๋ก€๋กœ ์ „๋‹ฌ๋˜์–ด ์ฒ˜๋ฆฌ๋˜๋Š” ๊ตฌ์กฐ MVC ์Šคํƒ€์ผ : Model, View, Controller๋กœ ๊ตฌ์„ฑ ํด๋ž˜์Šค ์„ค๊ณ„ ์›์น™ ๋‹จ์ผ ์ฑ…์ž„์˜ ์›์น™ (SRP: Single Responsibility Principle) ํด๋ž˜์Šค๋Š” ํ•œ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค ๊ฐ์ฒด๋Š” ์•ฝํ•œ ๊ฒฐํ•ฉ๋ ฅ, ๊ฐ•ํ•œ ์‘์ง‘๋ ฅ์„ ์‹คํ˜„ ๊ฐœ๋ฐฉ-ํ์‡„์˜ ์›์น™ (OCP: Open-Closed Principle) ํ™•์žฅ์— ๋Œ€ํ•ด์„œ๋Š” open, ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด์„œ๋Š” close ๋ชจ๋“ˆ์„ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๊ทธ ๋ชจ๋“ˆ์„ ๋‘˜๋Ÿฌ์‹ผ ํ™˜๊ฒฝ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ์˜ ์›์น™ (ISP: Interface Segregation Principle) ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ์™€ ์˜์กด ๊ด€๊ณ„๋ฅผ ๊ฐ–์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค ๋ฆฌ์Šค์ฝ”ํ”„ ๊ต์ฒด์›์น™ (LSP: Liskov Substitution Principle) ์ž์‹ ํƒ€์ž…์€ ์–ธ์ œ๋‚˜ ๋ถ€๋ชจ ํƒ€์ž…์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ ์˜์กด ๊ด€๊ณ„ ์—ญ์ „์˜ ์›์น™ (DIP: Dependency Inversion Principle) ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌ์ฒด์  ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ถ”์ƒ ํด๋ž˜์Šค์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค 9์žฅ ๋””์ž์ธ ํŒจํ„ด ์ƒ์„ฑ ํŒจํ„ด Factory pattern ๊ฐ์ฒด ์ƒ์„ฑ์„ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ ์ž์‹ ๊ฐ์ฒด ์ค‘ ์–ด๋–ค ๊ฒƒ์ด ํ•„์š”ํ•œ์ง€ ์‹คํ–‰ ์‹œ๊ฐ„๊นŒ์ง€ ์•Œ ์ˆ˜ ์—†์„๋•Œ ์‚ฌ์šฉ Abstract Factory pattern ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ๊ทธ ๊ฐ์ฒด์™€ ์—ฐ๊ด€๋˜๋Š” ๊ฐ์ฒด ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต Prototype pattern ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹ค์‹œ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉ ํด๋ก  ๋ฉ”์†Œ๋“œ : ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ ๊ตฌ์กฐ ํŒจํ„ด Composite pattern ๊ฐ์ฒด์˜ ํŠธ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉ ๊ธฐ๋ณธ ํด๋ž˜์Šค์™€ ์ด๋ฅผ ํฌํ•จํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํด๋ž˜์Šค๋ฅผ ์žฌ๊ท€์ ์ธ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ Decorator pattern ๋Ÿฐํƒ€์ž„์— ๊ฐ์ฒด์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฐ์ฒด ์ƒ์„ฑ ์—†์ด ๊ฐœ๋ณ„ ๊ฐ์ฒด์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์ž‘์„ ์ฒจ๋ถ€ ๊ฐ€๋Šฅ Adapter pattern ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ์™ธ๋ถ€์—์„œ ํ•„์š”ํ•œ ํ˜•ํƒœ๋กœ ์ˆ˜์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ์›ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ •์˜ Facade pattern ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์˜ ๊ฐ„๋‹จํ•œ ์ž…๊ตฌ ์—ญํ•  ์ œ๊ณต ์‚ฌ์šฉํ•˜๋ ค๋Š” ํด๋ž˜์Šค ์ค‘ ํŠน์ • ํด๋ž˜์Šค๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ Proxy pattern ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑ์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ๊ฐ์ฒด๋ฅผ ์ข€ ๋” ๊ฐ„๋‹จํ•œ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ ํŠน์ • ๊ฐ์ฒด์— ์ ‘๊ทผ์„ ์กฐ์ ˆํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋Œ€๋ฆฌ์ž๋ฅผ ์„ธ์›€ ํ–‰์œ„ ํŒจํ„ด Observer pattern ์ •๋ณด ์ œ๊ณต์ž์™€ ์ด์šฉ์ž ์‚ฌ์ด์˜ ์—ฐ๊ด€์„ ๊ด€๋ฆฌํ•˜๋Š” ํŒจํ„ด ๋‹จ์ผ ๊ฐ์ฒด๊ฐ€ ์˜ํ–ฅ ๋ฐ›๋Š” ๊ฐ์ฒด ์ง‘ํ•ฉ์— ๋Œ€ํ•˜์—ฌ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ Mediator pattern ๊ด€๋ จ๋œ ๊ฐ์ฒด ์‚ฌ์ด์— ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ”ผํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ํ–‰์œ„๋ฅผ ํŠน์ • ๊ฐ์ฒด ์•ˆ์— ์บก์Аํ™” ์ฑ…์ž„ ์ฒด์ธ pattern ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์—…์„ ์–ด๋–ค ๊ฐ์ฒด์—๊ฒŒ ๋งก๊ธธ์ง€ ๋ชจ๋ฅผ๋•Œ ์‚ฌ์šฉ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฒด์ธ์ฒ˜๋Ÿผ ์—ฎ์–ด ๋†“์•˜๋‹ค๊ฐ€ ์™ธ๋ถ€์˜ ์š”์ฒญ์ด ์žˆ์œผ๋ฉด ์ฒด์ธ์— ๋„˜๊น€ Command pattern ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•  ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌ ๋ฐ•์Šค์— ์š”์ฒญํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒจํ„ด ์ปค๋งจ๋“œ ํด๋ž˜์Šค ์•ˆ์— ๋ช…๋ น์„ ์บก์Аํ™”ํ•˜์—ฌ ๋„ฃ์Œ State pattern ๊ฐ์ฒด์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๊ตฌ์ฒด์ ์ธ ํ–‰์œ„๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ์— ์ ์šฉ ์ƒํƒœ๋ฅผ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค๊ณ  ์ƒํƒœ ํด๋ž˜์Šค ์•ˆ์— ์ •์  ๋ณ€์ˆ˜๋กœ ์ €์žฅ ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ Test Driver : ๊ฐ„๋‹จํžˆ ๊ตฌ๋™ํ•˜๋„๋ก ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ Test Stub : ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•œ๊ฒƒ IUT (Implementation Under Test) Black Box ํ…Œ์ŠคํŠธ ๊ธฐ๋ฒ• ์ฃผ์–ด์ง„ ๋ช…์„ธ๋กœ๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์œ ๋„ ๋™๋“ฑ ๋ถ„ํ•  ๋™์น˜ ํด๋ž˜์Šค ๊ฒฐ์ • ์ž…๋ ฅ ๊ฐ’ ์˜์—ญ ๋˜๋Š” ์ถœ๋ ฅ ๊ฐ’ ์˜์—ญ์„ ๋…๋ฆฝ์ ์ธ ์ง‘ํ•ฉ์œผ๋กœ ๋‚˜๋ˆ” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์„ ์ • ์ง‘ํ•ฉ์˜ ์›์†Œ ์ค‘ ๋Œ€ํ‘œ๊ฐ’ ํ•˜๋‚˜๋ฅผ ์„ ํƒ ๋™๋“ฑ ๋ถ„ํ•  ํด๋ž˜์Šค ์œ ํšจํ•œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์™€ ์œ ํšจํ•˜์ง€ ์•Š์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ ์˜ˆ) ์‹๋ฃŒํ’ˆ์˜ ๋ฌด๊ฒŒ๋Š” 0๋ถ€ํ„ฐ 5000 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ–๋Š” ์ˆซ์ž์ด๋‹ค Black Box ํ…Œ์ŠคํŠธ ๊ธฐ๋ฒ• ๊ฒฝ๊ณ„ ๊ฐ’ ๋ถ„์„ ๋™๋“ฑ๋ถ„ํ• ์˜ ๊ฒฝ๊ณ„๋ถ€๋ถ„์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ๊ณ„ ๊ฐ’์„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ์„ ํƒํ•˜๋Š” ๊ธฐ๋ฒ• ์œ ํšจ ๊ฒฝ๊ณ„ ๊ฐ’, ๋น„์œ ํšจ ๊ฒฝ๊ณ„ ๊ฐ’์„ ์„ ํƒ ๊ฒฐํ•จ ๋ฐœ๊ฒฌ ์œจ์ด ๋†’๊ณ , ์ ์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค White Box ํ…Œ์ŠคํŠธ ๊ธฐ๋ฒ• ์†Œํ”„ํŠธ์›จ์–ด๋‚˜ ์‹œ์Šคํ…œ์˜ ์ฝ”๋“œ์™€ ๊ตฌ์กฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์˜ ๊ตฌ์กฐ๋Š” ๊ตฌ๋ฌธ, ๊ฒฐ์ •, ๋ถ„๊ธฐ๋ฌธ ๋“ฑ ์ฝ”๋“œ ๊ทธ ์ž์ฒด Coverage : ์‹œ์Šคํ…œ ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ตฌ์กฐ๊ฐ€ Test suite์— ์˜ํ•ด ํ…Œ์ŠคํŠธ ๋˜๋Š” ์ •๋„ ๊ตฌ๋ฌธ ํ…Œ์ŠคํŒ…๊ณผ ์ปค๋ฒ„๋Ÿฌ์ง€ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์— ์˜ํ•ด ์‹คํ–‰๋œ ๊ตฌ๋ฌธ์ด ๋ช‡ ํผ์„ผํŠธ์ธ์ง€ ์ธก์ •ํ•˜๋Š” ๊ฒƒ ์ œ์–ด ํ๋ฆ„ ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ (์ˆœ์ฐจ ๊ตฌ์กฐ, ์„ ํƒ ๊ตฌ์กฐ, ๋ฐ˜๋ณต ๊ตฌ์กฐ) $$ coverage = \frac{covered\ stmt}{(total\ stmt - unreachable\ stmt)} $$ ๊ฒฐ์ • ํ…Œ์ŠคํŒ…๊ณผ ์ปค๋ฒ„๋ฆฌ์ง€ ์‹คํ–‰๋œ ๊ฒฐ์ • ํฌ์ธํŠธ์˜ outcome์ด ๋ช‡ ํผ์„ผํŠธ์ธ์ง€ ์ธก์ •ํ•˜๊ณ  ํ‰๊ฐ€ “์ฐธ"๊ณผ “๊ฑฐ์ง“"์˜ ๋ชจ๋“  ๊ฐ’์„ ๊ฐ€์ง€๋ฉด 100% ์ปค๋ฒ„ํ•œ๋‹ค๊ณ  ํŒ๋‹ค ์กฐ๊ฑด ํ…Œ์ŠคํŒ…๊ณผ ์ปค๋ฒ„๋ฆฌ์ง€ ๊ฒฐ์ • ํฌ์ธํŠธ ๋‚ด์— ์žˆ๋Š” ๊ฐ๊ฐ์˜ ๊ฐœ๋ณ„์กฐ๊ฑด์‹์ด “์ฐธ"๊ณผ “๊ฑฐ์ง“"์˜ ๋ชจ๋“  ๊ฐ’์„ ๊ฐ€์ง€๋Š”์ง€ ํ…Œ์ŠคํŠธ ๊ฐœ๋ณ„ ์กฐ๊ฑด์‹์ด ์ฐธ ๊ฑฐ์ง“์„ ๊ฐ€์ง„๋‹ค๊ณ ํ•ด์„œ ์ „์ฒด ์กฐ๊ฑด์‹์ด ํ•ญ์ƒ ์ฐธ ๊ฑฐ์ง“์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์€ ์•„๋‹˜ ๋‹ค์ค‘ ์กฐ๊ฑด ์ปค๋ฒ„๋ฆฌ์ง€ ๊ฒฐ์ • ํฌ์ธํŠธ ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ๊ฐœ๋ณ„ ์กฐ๊ฑด์‹์˜ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๋…ผ๋ฆฌ์ ์ธ ์กฐํ•ฉ์„ ๊ณ ๋ คํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ž…๋ ฅ ์กฐ๊ฑด์ด 2๊ฐœ์ด๋ฉด TF, FT, FF, TT 4๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ํ•„์š” ํ…Œ์ŠคํŠธ ์ข…๋ฅ˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ (Unit Test) ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋ณธ ๋‹จ์œ„์ธ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ฃผ๋กœ ํ™”์ดํŠธ ๋ฐ•์Šค ํ…Œ์ŠคํŠธ๋ฅผ ์ด์šฉ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (Integration Test) ๋ชจ๋“ˆ ํ†ตํ•ฉ ๊ณผ์ •์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ†ตํ•ฉ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ํ™•์ธ ์‹œ์Šคํ…œ ํ…Œ์ŠคํŠธ (System Test) ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ, ๋น„๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ (Acceptance Test) ์š”๊ตฌ๋Œ€๋กœ ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ณ ๊ฐ๊ณผ ํ•จ๊ป˜ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋Œ€ํ˜• ์‹œ์Šคํ…œ ํ…Œ์ŠคํŠธ ์ „๋žต ๋น…๋ฑ… ํ…Œ์ŠคํŠธ : ์ „์ฒด ์‹œ์Šคํ…œ์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ํ…Œ์ŠคํŠธ ์ ์ง„์  ํ…Œ์ŠคํŠธ : ์‹œ์Šคํ…œ์„ ๋‹จ๊ณ„์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•˜ํ–ฅ์‹ ํ…Œ์ŠคํŠธ ์ƒํ–ฅ์‹ ํ…Œ์ŠคํŠธ ์ƒŒ๋“œ์œ„์น˜ ํ…Œ์ŠคํŠธ
new ์›น ๋ณด์•ˆ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
Web Security Model Web ๋ณด์•ˆ์˜ ๋ชฉํ‘œ Integirty : ๋ฌด๊ฒฐ์„ฑ Confidentiality : ๊ธฐ๋ฐ€์„ฑ HTTP URL https:// www.example.edu :80 /lectures ?lec=80 #slides protocol + hostname + port + path + query + fragment Cookies ์„œ๋ฒ„๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ณด๋‚ด๋Š” ์ •๋ณด ์—ญํ•  : ์„ธ์…˜ ๊ด€๋ฆฌ, ์‚ฌ์šฉ์ž ์„ค์ • ์ €์žฅ, ์‚ฌ์šฉ์ž ์ถ”์  ๋“ฑ 1// ์ฟ ํ‚ค ์„ค์ • 2Set-Cookie: name=value; 3// ์ฟ ํ‚ค ์ „์†ก 4Cookie: name=value; Same Origin Policy (SOP) ๊ฐ™์€ Origin์—์„œ๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค Origin scheme://domain:port Domain Relaxation ์„œ๋ธŒ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  document.domain์„ ์ˆ˜์ •ํ•˜์—ฌ, ์„œ๋ธŒ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  ๊ฐ€๋Šฅ ์˜ˆ์‹œ 1a.domain.com -> domain.com ๊ฐ€๋Šฅ 2a.domain.com -> b.domain.com ๋ถˆ๊ฐ€๋Šฅ 3a.domain.com -> com ๋ถˆ๊ฐ€๋Šฅ ์ทจ์•ฝ์  : ์•…์˜์ ์ธ ์‚ฌ์ดํŠธ๊ฐ€ document.domain์„ ์ˆ˜์ •ํ•˜์—ฌ ์ ‘๊ทผ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : Mozilla Public Suffix List (PSL) ์‚ฌ์šฉ BroadcastChannel API ๊ฐ™์€ origin์˜ ๋‹ค๋ฅธ context ๊ฐ„์˜ ํ†ต์‹  ์‚ฌ์šฉ๋ฒ• 1const bc = new BroadcastChannel('channel'); 2bc.postMessage('message'); 3bc.onmessage = (e) => console.log(e.data); XMLHttpRequest (XHR) ์„œ๋ฒ„์™€ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฐ์ฒด CORS (Cross-Origin Resource Sharing) ๋‹ค๋ฅธ Origin์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ, ์„œ๋ฒ„์—์„œ ํ—ˆ์šฉํ•˜๋Š” ์ •์ฑ… Cookie ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด๋Š” ์ •๋ณด Cookie Scoping Domain ํ•ด๋‹น ๋„๋ฉ”์ธ์€ Subdomain ๋˜๋Š” Parent Domain์— ๋Œ€ํ•ด์„œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†ก Path ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ํ•˜์œ„ ๊ฒฝ๋กœ๊นŒ์ง€ ์ฟ ํ‚ค๋ฅผ ์ „์†ก Secure Cookies HTTPS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†ก 1Set-Cookie: name=value; Secure HTTPOnly Cookies JavaScript์—์„œ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ํ•จ 1Set-Cookie: name=value; HttpOnly CSRF (Cross Site Request Forgery) ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์—์„œ ์š”์ฒญ์„ ์œ„์กฐํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ๋ฐฐ๊ฒฝ ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ๋ผ๋ฉด, ์‚ฌ์šฉ์ž๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ์ „์†ก cross-site์—์„œ๋„ ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„๋•Œ, ์„œ๋ฒ„๊ฐ€ same-site์ธ์ง€ cross-site์ธ์ง€ ํ™•์ธ์ด ๋ถˆ๊ฐ€ํ•œ ๊ฒฝ์šฐ CSRF ๊ณต๊ฒฉ ๊ฐ€๋Šฅ ์˜ˆ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค ํ”ผํ•ด์ž๊ฐ€ ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ๋กœ Malicious Site์— ์ ‘์† Malicious site์—์„œ ํ”ผํ•ด์ž ์˜์ง€์™€ ์ƒ๊ด€์—†์ด ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ์ „์†ก GET ์˜ˆ์‹œ ์ฝ”๋“œ 1<img src="http://bank.com/transfer?to=attacker&amount=1000" /> POST ์˜ˆ์‹œ ์ฝ”๋“œ 1<form action="http://bank.com/transfer" method="post"> 2 <input type="hidden" name="to" value="attacker" /> 3 <input type="hidden" name="amount" value="1000" /> 4</form> 5<script> 6 document.forms[0].submit(); 7</script> ๋ฐฉ์–ด Referer Header ์š”์ฒญ์„ ๋ณด๋‚ธ ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” HTTP header๋ฅผ ํ™•์ธํ•˜์—ฌ, ์š”์ฒญ์„ ๋ณด๋‚ธ ํŽ˜์ด์ง€๊ฐ€ ๊ฐ™์€ ์‚ฌ์ดํŠธ์ธ์ง€ ํ™•์ธ 1Referer: http://www.example.com ํ•œ๊ณ„ ํ•ด๋‹น field๋ฅผ ์ด์šฉํ•ด์„œ ์ ‘์† ๊ธฐ๋ก์„ ํ™•์ธ ๊ฐ€๋Šฅ -> ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฌธ์ œ Same-Site Cookies ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ๋•Œ, SameSite๋ผ๋Š” ์ฟ ํ‚ค ์†์„ฑ๋ฅผ ์ „์†ก, same-site์ธ์ง€ cross-site์ธ์ง€ ํ™•์ธํ•˜์—ฌ, ์„ค์ •๊ฐ’์— ๋”ฐ๋ผ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์Œ ์„ค์ • ๊ฐ’ None (๋ชจ๋“  ์š”์ฒญ์— ์ฟ ํ‚ค ์ „์†ก) Strict (cross-site๋Š” ํ•ญ์ƒ ์ฟ ํ‚ค ์ „์†กํ•˜์ง€ ์•Š์Œ) Lax (cross-site๋Š” GET ์š”์ฒญ์‹œ์—๋งŒ ์ฟ ํ‚ค ์ „์†กํ•˜์ง€ ์•Š์Œ) Secret Token ํŠน์ • origin์˜ ์ฒซ ์š”์ฒญ๋•Œ, ํŠน์ •ํ•œ ํ† ํฐ์„ ์ƒ์„ฑ, ์ดํ›„ ์š”์ฒญ์‹œ ํ•ด๋‹น ํ† ํฐ์„ ํ•จ๊ป˜ ์ „์†กํ•˜์—ฌ, ์š”์ฒญ์ด ๊ฐ™์€ Origin์—์„œ ์˜จ ๊ฒƒ์ธ์ง€ ํ™•์ธ Bypassing with Clickjacking ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ํด๋ฆญ์„ ์œ ๋„ํ•˜์—ฌ, CSRF ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ• ๋ฐฉ์–ด X-Frame-Options Header (๊ฐ’ : DENY, SAMEORIGIN, ALLOW-FROM uri) ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ XSS(Cross Site Scripting) Attack Non-persistent (Reflected) XSS Attack ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜์—ฌ, ๊ณต๊ฒฉ์ž๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ query string์„ ์‹คํ–‰ํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌ (innerHTML) ํ”ผํ•ด์ž๊ฐ€ ํ•ด๋‹น ๋งํฌ๋ฅผ ์‹คํ–‰ => http://www.example.com/search?input=<script>alert(โ€œattackโ€);</script> ํ”ผํ•ด์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ alert๊ฐ€ ์‹คํ–‰๋จ Persistent (Stored) XSS Attack ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ DB์— ์ €์žฅํ•˜์—ฌ, ๊ณต๊ฒฉ์ž๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ ๊ฒŒ์‹œํŒ์— ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌ ํ”ผํ•ด์ž๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๊ธ€์„ ์ฝ์„ ๋•Œ, ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋จ XSS๋กœ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ํ”ผํ•ด Web defacing(์›นํŽ˜์ด์ง€ ๋ณ€์กฐ) Spoofing requests(์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ๋ณ€์กฐ) Stealing information(์ •๋ณด ํƒˆ์ทจ) Self-Propagation XSS Worm XSS ๊ณต๊ฒฉ์„ ํ†ตํ•ด, ์ž๋™์œผ๋กœ ๊ณต๊ฒฉ์„ ์ „ํŒŒํ•˜๋Š” ๊ธฐ๋ฒ• 2๊ฐ€์ง€ ์ ‘๊ทผ DOM Approach 1let jsCode = document.getElementById('worm').innerHTML; Link Approach 1let jsCode = `'<script src="http://www.example.com/worm.js"></script>'`; ๋ฐฉ์–ด ์ž…๋ ฅ๊ฐ’ ํ•„ํ„ฐ๋ง : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ํ•„ํ„ฐ๋งํ•˜์—ฌ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค Encoding : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์ถœ๋ ฅํ•  ๋•Œ, HTML Encodingํ•˜์—ฌ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค Content Security Policy (CSP) : ์›นํŽ˜์ด์ง€์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œํ•˜์—ฌ, XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•œ๋‹ค ์˜ˆ์‹œ (script ํŒŒ์ผ) 1Content-Security-Policy: script-src 'self' example.com ์˜ˆ์‹œ (inline script) 1Content-Security-Policy: script-src 'nonce-2726c7f26c' 2// allowed script 3`<script nonce=2726c7f26c> ... </script>` 4// not allowed script 5`<script nonce=42eh44jhad> ... </script>` SQL Injection SQL ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ, DB์— ๋Œ€ํ•œ ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ EID์— “EID5002’#“์„ ์‚ฝ์ž… -> PASSWORD ๊ฒ€์ฆ์„ ์šฐ์ฆ 1SELECT NAME, SALERY, SSN 2FROM EMPLOYEE 3WHERE EID='EID5002'#' AND PASSWORD='1234'; curl์„ ์ด์šฉํ•ด์„œ SQL Injection ๊ณต๊ฒฉ 1curl 'www.example.com/getdata.php?EID=a' OR 1=1&PASSWORD=' ๋ฐฉ์–ด Filtering and Encoding data SQL Injection์—์„œ ์“ฐ์ด๋Š” ํŠน์ˆ˜๋ฌธ์ž๋ฅผ Filtering, Encoding 1$mysqli->real_escape_string($input); ํ•œ๊ณ„ ํ•„์š”ํ•œ ๋ฌธ์ž์—ด์„ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Œ Prepared Statements SQL ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜์—ฌ, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๊ณ , ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ 1$stmt = $mysqli->prepare("SELECT NAME, SALARY, SSN FROM EMPLOYEE WHERE EID=? AND PASSWORD=?"); 2// ss means "string string" 3$stmt->bind_param("ss", $EID, $PASSWORD); 4$stmt->execute(); Blind SQL Injection SQL Injection ๊ณต๊ฒฉ์„ ํ†ตํ•ด, DB์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๋Š” ๊ธฐ๋ฒ• Conditional Response 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฐ์ง€ ํ™•์ธ */ 2xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'm 3/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 't'๋ณด๋‹ค ํฐ์ง€ ํ™•์ธ */ 4xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 't SQL Error - Divide by Zero 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ */ 2xyz' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 3'm') THEN 1/0 ELSE 'a' END FROM Users)='a SQL Error - Cast 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ */ 2CAST((SELECT example_column FROM example_table) AS int) Time Delay 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ๋”œ๋ ˆ์ด ๋ฐœ์ƒ */ 2'; IF (SELECT COUNT(Username) FROM Users WHERE Username = 'Administrator' AND 3SUBSTRING(Password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'- ShellShock Attack bash ์‰˜์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Set-UID Programs Set-UID root ๊ถŒํ•œ์„ ๊ฐ€์ง„ ํ”„๋กœ๊ทธ๋žจ์ด systemํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• RUID : Real User ID : ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ EUID : Effective User ID : ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๊ถŒํ•œ Set-UID Program : ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ root ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ, RUID์™€ EUID๊ฐ€ ๋‹ค๋ฆ„, Set-UID Program์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 1$ sudo chown root vul 2$ sudo chmod 4755 vul 3$ ls -l vul 4-rwsr-xr-x 1 root root 1234 Mar 11 12:00 vul # s๊ฐ€ ์กด์žฌ ์ทจ์•ฝํ•œ C ํ”„๋กœ๊ทธ๋žจ (vul : Set-UID program) 1#include <stdio.h> 2void main() { 3 setuid(geteuid()); // root ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋กœ ์„ค์ • 4 system("/bin/ls -l"); // ls -l ๋ช…๋ น์–ด ์‹คํ–‰ 5} ๊ณต๊ฒฉ ๋ช…๋ น์–ด 1$ export foo='() { echo "hello"; }; /bin/sh' 2$ ./vul CGI(Common Gateway Interface) Programs ์›น ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” CGI ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ทจ์•ฝ์  ์ทจ์•ฝํ•œ CGI ํ”„๋กœ๊ทธ๋žจ (test.cgi) 1#!/bin/bash 2echo "Content-type: text/plain" 3echo 4echo "Hello, World!" ๊ณต๊ฒฉ ๋ช…๋ น์–ด 1$ curl http://10.0.2.69/cgi-bin/test.cgi 2Hello, World! ๊ณต๊ฒฉ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์„ค์ • ํŒŒ์ผ์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ db password ํƒˆ์ทจ reverse shell ์‹คํ–‰ Environment Variables & Attacks ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ• fork() : ์ž์‹์„ ์ƒ์„ฑ, ์ž์‹์ด ๋ถ€๋ชจ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ƒ์† execve() : ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์ž์‹์œผ๋กœ ์‹คํ–‰, ์ƒˆ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ • Attacks via Dynamic Linker ๋งํฌ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์›๋ฆฌ LD_PRELOAD๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชฉ๋ก์„ ์ €์žฅ ํ•จ์ˆ˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด, LD_LIBRARY_PATH์—์„œ ์ฐพ์Œ ๋‘ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๋งํฌ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐ์ž‘ ์˜ˆ์‹œ 1$ export LD_PRELOAD=/path/to/malicious.so 2$ ./vul Attacks via Execution Program ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์„ ์กฐ์ž‘ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ 1$ export PATH=/path/to/malicious:$PATH 2$ ./vul 3# // root shell ์ทจ๋“ Attacks via Library format string ๋“ฑ์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Attacks via Application Code buffer overflow ๋“ฑ์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Set-UID Approach VS Service Approach Clickjacking Attack ์‚ฌ์šฉ์ž์˜ ์˜๋„์™€ ์ƒ๊ด€์—†์ด ํด๋ฆญ์„ ์œ ๋„ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• 1<iframe id="top" src="http://www.attack.com" style="opacity: 0"></iframe> 2<iframe id="bottom" src="http://www.example.com>" style="opacity: 1"></iframe> ๋ฐฉ์–ด Client-side (Framekiller and Framebuster) javascript๋ฅผ ์ด์šฉํ•˜์—ฌ, ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ iframe์œผ๋กœ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ 1if (top != self) 2if (top.location != self.location) 3... ํ•œ๊ณ„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋งŽ์•„์„œ ๋ถˆ์•ˆ์ • -> ์ž˜ ์“ฐ์ง€ ์•Š๋Š”๋‹ค ์šฐํšŒ Double framing : ๋‘๊ฐœ์˜ iframe์„ ์‚ฌ์šฉํ•˜์—ฌ, ์ฒซ๋ฒˆ์งธ iframe์„ ์ˆจ๊ธฐ๊ณ , ๋‘๋ฒˆ์งธ iframe์„ ๋ณด์—ฌ์คŒ Abusing onBeforeUnload : ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚  ๋•Œ, alert์„ ๋„์›Œ์„œ, ์‚ฌ์šฉ์ž์˜ ํด๋ฆญ์„ ์œ ๋„ sandbox attribute : iframe์— sandbox attribute๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ•ด๋‹น iframe์—์„œ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•จ options allow-same-origin allow-scripts allow-forms allow-modals allow-top-navigation ์˜ˆ์‹œ 1<iframe ... sandbox="allow_forms allow-scripts"></iframe> Referrer checking problems Referer๋ฅผ ํ™•์ธํ•˜์—ฌ ํŠน์ • ๋„๋ฉ”์ธ์˜ ์‚ฌ์ดํŠธ๋งŒ iframe์œผ๋กœ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ•œ๊ณ„ : Referer๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ์šฐํšŒ ๊ฐ€๋Šฅ Server-side X-Frame-Options ํŠน์ • ORIGIN ํŽ˜์ด์ง€์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ ์˜ˆ์‹œ 1X-Frame-Options: DENY // ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ 2X-Frame-Options: SAMEORIGIN // ๊ฐ™์€ ORIGIN ํŽ˜์ด์ง€์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋ง 3X-Frame-Options: ALLOW-FROM uri // ํŠน์ • uri์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋ง Outdated : CSP ์‚ฌ์šฉ ๊ถŒ์žฅ Content Security Policy (CSP) ์›นํŽ˜์ด์ง€์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œ script-src : ์Šคํฌ๋ฆฝํŠธ source๋ฅผ ์ œํ•œ img-src : ์ด๋ฏธ์ง€์˜ source๋ฅผ ์ œํ•œ frame-ancestors : <frame>, <iframe>, <object>, <embed> ๋˜๋Š” <applet> ์š”์†Œ์˜ ๋ถ€๋ชจ๋ฅผ ์ œํ•œ ์˜ˆ์‹œ 1$csp = "Content-Security-Policy: frame-ancestors *"; 2header($csp); Types of Context Integrity Visual Integrity ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์— ๋Œ€ํ•œ ๋ฌด๊ฒฐ์„ฑ ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ• : User Confirmation, UI Randomization, Visibility Detection on Click Temporary Integrity ์‚ฌ์šฉ์ž ํ™•์ธ ์‹œ์ ๊ณผ ํด๋ฆญ ์‹œ์ž‘ ์‹œ์  ์‚ฌ์ด์˜ UI ์ƒํƒœ ์ฐจ์ด์— ๋Œ€ํ•œ ๋ฌด๊ฒฐ์„ฑ ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ• : Access Control Gadgets SSRF (Server Side Request Forgery) ์„œ๋ฒ„์—์„œ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ• ๊ณต๊ฒฉ (์„œ๋ฒ„๊ฐ€ ์‹ ๋ขฐ๋œ ์„œ๋ฒ„์—์„œ ์š”์ฒญ์ด ์˜จ ๊ฒƒ์œผ๋กœ ์ฐฉ๊ฐ) 1POST /product/stock HTTP/1.0 2Content-Type: application/www-form-urlencoded 3Content-Length: 30 4 5stockApi=http://localhost/admin ๋ฐฉ์–ด ์ฐจ๋‹จ๋œ ๋ฌธ์ž์—ด์„ URL ์ธ์ฝ”๋”ฉ ๋˜๋Š” ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ˜•์„ ํ†ตํ•ด ์ˆจ๊น€ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์š”์ฒญ์„ ๋ณด๋ƒ„ using @ 1https://expected-host:fakepassword@evil-host using # 1https://evil-host#expected-host Rogue DNS 1https://expected-host.evil-host Double encoding : # -> %23 -> %2523 XXE (XML eXternal Entity) Injection XML ํŒŒ์‹ฑ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• XML custom entity XML์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์„ ์ •์˜ 1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE message [<!ENTITY greeting "Hello, ">]> 3<message> 4 <text>&greeting;world!</text> 5</message> Access internal file XML ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ, ์„œ๋ฒ„์˜ ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๋Š” ๊ณต๊ฒฉ 1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE foo[<!ENTITY xxe SYSTEM "file:///etc/passwd">]> 3<stockCheck><productId>&xxe;</productId></stockCheck> With SSRF SSRF์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ณต๊ฒฉ 1<!DOCTYPE foo[<!ENTITY xxe SYSTEM "http://localhost/admin">]> ์•”ํ˜ธ๊ธฐ์ˆ  ์ „ํ†ต์ ์ธ ์•”ํ˜ธ๊ธฐ์ˆ  ์•”ํ˜ธ์˜ ์ •์˜ ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ๊ธฐ๋ฐ€์„ฑ (Confidentiality) : ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์•„์•ผํ•จ ์ž๋ฃŒ์˜ ๋ฌด๊ฒฐ์„ฑ (Data Integrity) : ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„๋ณ€์กฐ๋˜๋ฉด ์•ˆ๋จ ์ธ์ฆ (Authentication) : ์ •๋ณด์˜ ์ถœ์ฒ˜๊ฐ€ ์ •๋‹นํ•ด์•ผํ•จ ๋ถ€์ธ๋ฐฉ์ง€ (Non-repudiation) : ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š์•„์•ผํ•จ ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ธฐ๋ณธ ์กฐ๊ฑด (K : Key, M : Message, C : Cipher Text) ์•”ํ˜ธํ™” : E(K, M) = C ๋ณตํ˜ธํ™” : D(K, C) = C E(K, M)๊ณผ D(K, C)์˜ ๊ณ„์‚ฐ์€ ์‰ฌ์›Œ์•ผ ํ•จ K๋ฅผ ๋ชจ๋ฅผ๋•Œ C์—์„œ M์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์›Œ์•ผ ํ•จ ์•”ํ˜ธ ํ•ด๋… ๋ฐฉ๋ฒ• Cipher Text Only Attack : ์•”ํ˜ธ๋ฌธ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ํ‰๋ฌธ์„ ์ฐพ๋Š” ๊ณต๊ฒฉ Known Plain Text Attack : ์•”ํ˜ธ๋ฌธ๊ณผ ํ‰๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ์ฐพ๋Š” ๊ณต๊ฒฉ Chosen Plain Text Attack : ํ‰๋ฌธ์„ ์„ ํƒํ•˜์—ฌ ์•”ํ˜ธ๋ฌธ์„ ์ฐพ๋Š” ๊ณต๊ฒฉ ์•”ํ˜ธ์˜ ์ข…๋ฅ˜ ๋Œ€์นญํ‚ค(๋น„๋ฐ€ํ‚ค)(๊ด€์šฉํ‚ค) ์•”ํ˜ธ ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”์— ๊ฐ™์€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธ ์‚ฌ์šฉ์ž n๋ช…์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ‚ค์˜ ๊ฐœ์ˆ˜ : n(n-1)/2 ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜ ๋ธ”๋ก ์•”ํ˜ธ (DES, IDEA, AES) ํ‰๋ฌธ์„ ๋ธ”๋ก์œผ๋กœ ๋‚˜๋ˆ„์–ด ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ์‹ ์ŠคํŠธ๋ฆผ ์•”ํ˜ธ (RC4) ํ‰๋ฌธ๊ณผ ํ‚ค๋ฅผ ๋น„ํŠธ ๋‹จ์œ„๋กœ XORํ•˜์—ฌ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ์‹ ํ•œ๊ตญ์—์„œ ์“ฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ข…๋ฅ˜ : NEAT, SEED, NES, ARIA ๊ณต๊ฐœํ‚ค(๋น„๋Œ€์นญํ‚ค) ์•”ํ˜ธ ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”์— ๋‹ค๋ฅธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธ ์‚ฌ์šฉ์ž n๋ช…์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ‚ค์˜ ๊ฐœ์ˆ˜ : 2n ๊ธฐ๋ฐ€์„ฑ (Confidentiality) : ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”, ๊ฐœ์ธํ‚ค๋กœ ๋ณตํ˜ธํ™” ์ธ์ฆ (Authentication) : ๊ฐœ์ธํ‚ค๋กœ ์•”ํ˜ธํ™”, ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ํ‚ค ์ƒ์„ฑ DH ํ‚ค ๊ตํ™˜ ์•”ํ˜ธ๊ธฐ์ˆ ์˜ ํ™œ์šฉ ๋””์ง€ํ„ธ ์„œ๋ช… ํŠน์„ฑ : ์œ„์กฐ๋ถˆ๊ฐ€, ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€, ์„œ๋ช…์ž ์ธ์ฆ, ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€, ๋ถ€์ธ ๋ฐฉ์ง€ ๋™ํ˜•์•”ํ˜ธ์™€ ์–‘์ž์•”ํ˜ธ ๊ธฐ์ˆ 
new ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด๊ฐœ๋ก 
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
Ocaml Functional Programming ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ•จ์ˆ˜๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ํŠน์ง• Immutable ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค First-class function Higher-order function Referential transparency ๋™์ผํ•œ ์ธ์ž์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค Lazy evaluation (์ง€์—ฐ ๊ณ„์‚ฐ) ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ Primitive Types unit int float int_of_float : float->int float_of_int : int->float bool : true/false x = y : x equals y (structural equality) x <> y : x not equals y (structural equality) x == y : x equals y (physical equality) x != y : x not equals y (physical equality) char string ^ : string concatenation .[n] : n-th character .length : length of string .sub n m : substring from n to m Statement์™€ Expression Statement ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ์ „์ด(๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ–‰์œ„)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์–ธ์–ด์˜ ๊ตฌ์„ฑ ์š”์†Œ Expression ์‹คํ–‰ ์‹œ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐ์™ธ๋Š” ์–ธ์–ด์˜ ๊ตฌ์„ฑ์š”์†Œ Statement๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค Expression์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋Š” Expression๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค Tuple 1let x = (1, 2, 3) Function first-class object (1๊ธ‰ ๊ฐ์ฒด) ํ• ๋‹น์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™”๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ๋น„๊ต์—ฐ์‚ฐ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค Higher Order Function (๊ณ ์ฐจํ•จ์ˆ˜) ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์žฌ๊ท€ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ rec ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค Conditional branch 1if [expression1] then [expression2] else [expression3] Pattern Matching binding occurrence Ocaml ์ปดํŒŒ์ผ๋Ÿฌ๋Š” expression์˜ ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒจํ„ด๋งค์นญ์˜ ์™„์ „์„ฑ์„ ๊ฒ€์‚ฌ Lists :: : ๋ฆฌ์ŠคํŠธ ์•ž์— ์›์†Œ๋ฅผ ์‚ฝ์ž… @ : ๋ฆฌ์ŠคํŠธ๋ฅผ ์—ฐ๊ฒฐ Type definition Disjoint union : ๊ตฌ๋ถ„๋˜๋Š” ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๋ฌถ์€ ํƒ€์ž… Varient records๋ผ๊ณ ๋„ ๋ถ€๋ฆ„ type [type_name] = [constructor] (of [type])? (| [name] (of [type])?)* 1type number = 2 | Int of int 3 | Float of float Tail Call Optimization ์žฌ๊ท€ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ํ–‰์œ„์ผ ๋•Œ, ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ตœ์ ํ™” Syntax and Semantics Compilation ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ํ–‰์œ„ ์ ํ•ฉํ•œ ํ”„๋กœ์ ํŠธ ํฐ ๊ทœ๋ชจ์˜ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ : ๊ฒ€์ฆ์„ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ํƒ์ง€ ๊ณ ์„ฑ๋Šฅ ์†Œํ”„ํŠธ์›จ์–ด : ์ตœ์ ํ™”๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ ์ €์ˆ˜์ค€ ์†Œํ”„ํŠธ์›จ์–ด : ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ ๋‹จ์  ํ•™์Šต ๊ณก์„ ์ด ๋†’๋‹ค Compilation ๊ณผ์ •์ด ๋น„์‹ธ๊ณ  ๋ณต์žก Interpretation ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ํ•ด์„ํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ํ–‰์œ„ ์ ํ•ฉํ•œ ํ”„๋กœ์ ํŠธ ๋†’์€ ์–ธ์–ด์˜ ์ž์œ ๋„๋ฅผ ํ™œ์šฉํ•œ ์†Œํ”„ํŠธ์›จ์–ด prototyping : ๊ฒ€์ฆ ์ ˆ์ฐจ์˜ ๋ถ€์žฌ๋กœ ์ธํ•œ ๋‹ค์–‘ํ•œ ๋™์  ํŠน์„ฑ ์กด์žฌ ์‰ฝ๊ณ  ์ง๊ด€์ ์ธ ๊ตฌ์กฐ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต์œก : ๊ตฌ๋ฌธ ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœ ์‹คํ–‰ํ™˜๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” cross-platform ์†Œํ”„ํŠธ์›จ์–ด : platform ๋ณ„๋กœ ๊ตฌํ˜„๋œ interpreter๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ๋‹จ์  ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์กด์žฌ ๊ฒ€์ฆ ์ ˆ์ฐจ์˜ ๋ถ€์žฌ๋กœ ์ธํ•œ ๊ฒฐํ•จ ํƒ์ง€ ๋ฐ ์ˆ˜์ •์˜ ์–ด๋ ค์›€ Syntax (๊ตฌ๋ฌธ ๊ตฌ์กฐ) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ “ํ˜•ํƒœ” ๊ตฌ๋ฌธ ๊ตฌ์กฐ์˜ ์ข…๋ฅ˜ Concrete syntax : ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๊ตฌ๋ฌธ์„ ํ…์ŠคํŠธ๋กœ ํ‘œํ˜„ Abstract syntax : Concrete syntax๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ Semantics (์˜๋ฏธ) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ตฌ๋ฌธ์˜ “์‹คํ–‰๋™์ž‘” Unspecified Behaviors ํŠน์ •์กฐ๊ฑด์—์„œ ๊ตฌ๋ฌธ์˜ ์ •์˜ํ•˜์ง€ ์•Š์€ ๋™์ž‘ Undefined Behaviors ํŠน์ •์กฐ๊ฑด์—์„œ ๊ตฌ๋ฌธ์˜ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘ Programming Language Syntax and Parsing ์–ธ์–ด : L(G) The Chomsky Hierarchy Regular Language : Finite-State Automation Context-Free Language : Pushdown Automation Context-Sensitive Language : Linear-Bounded Automation Recursively Enumerable Language : Turing Machine AST (Abstract Syntax Tree) ํ”„๋กœ๊ทธ๋žจ์˜ ์ถ”์ƒ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŠธ๋ฆฌํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ CFG (Context-Free Grammar) ๋ฌธ๋งฅ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ํ•ญ์ƒ ๋™์ผํ•œ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฌธ๋ฒ• G = ($\sum$, N, P, S) $\sum$ : terminal์˜ ์œ ํ•œ์ง‘ํ•ฉ N : non-terminal ์œ ํ•œ์ง‘ํ•ฉ P : production์˜ ์ง‘ํ•ฉ S : ์‹œ์ž‘ nonterminal BNF (Backus-Naur Form) CFG์˜ ํ‘œํ˜„ ๋ฐฉ๋ฒ• ์˜ˆ์‹œ 1S ::= aAc 2A ::= aA 3| b 4| ๐œ– Derivation ๋ฌธ๋ฒ•์˜ ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ • Leftmost derivation Rightmost derivatio Parse Derivation์˜ ์—ญ๊ณผ์ • Source code –lexing–> Token –parsing–> AST leftmost derivation rightmost derivation ambiguous grammer leftmost derivation๊ณผ rightmost derivation์ด ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ๋ฒ• AE (Arithmetic Expression) Language Syntax ์ •์˜ Concrete syntax (syntax ํ˜•ํƒœ) Abstract syntax (tree ํ˜•ํƒœ) Semantics ์ •์˜ eโ‡“n : e๋Š” n์œผ๋กœ ๊ณ„์‚ฐ๋จ Inference rule (์ถ”๋ก  ๊ทœ์น™) ์ „์ œ๋กœ๋ถ€ํ„ฐ ๊ฒฐ๋ก ์„ ์ด๋Œ์–ด๋‚ด๋Š” ๊ทœ์น™ $$\frac{H_1 H_2 H_3 … H_n}{P}$$ $H_1, H_2, H_3, …, H_n$ : ์ „์ œ P : ๊ฒฐ๋ก  ์ „์ œ๊ฐ€ ๋ชจ๋‘ ์ฐธ์ด๋ฉด ๊ฒฐ๋ก ๋„ ์ฐธ Bigstep operational semantics Big-step : ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ„์‚ฐ์ด ํ•˜๋‚˜์˜ ํฐ ๋‹จ๊ณ„์— ์˜ํ•ด ์ˆ˜ํ–‰ Small-step : ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ„์‚ฐ์ด ํ•œ ์Šคํ… ๊ณ„์‚ฐ๋“ค์˜ ์—ฐ์†์— ์˜ํ•ด ์ˆ˜ํ–‰ Operational : ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ„์‚ฐ์„ ๊ฐ€์ƒ ๊ธฐ๊ณ„์˜ ๋™์ž‘(๊ณ„์‚ฐ)์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๊ธฐ์ˆ  Proof tree Inference rule์„ ์ด์šฉํ•˜์—ฌ ๊ฒฐ๋ก ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” treeํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ Syntactic Sugar and Identifier Syntactic Sugar ์‚ฌ์šฉ์ž ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ๊ตฌ๋ฌธ ์ฃผ๋กœ concrete syntax์˜ ํ™•์žฅ์„ ํ†ตํ•ด ์ œ๊ณต Desugaring ~(e) => 0 - e Sugaring 0 - e => ~(e) Identifier ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋–ค ์š”์†Œ์™€ ์—ฐ๊ด€๋œ ์ด๋ฆ„ Identifier ๋“ฑ์žฅ binding occurence : ์ •์˜๋ฅผ ์œ„ํ•ด ๋“ฑ์žฅ bound ocurrence : ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋“ฑ์žฅ free identifier : ์œ„ ๋‘๊ฐ€์ง€์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๋“ฑ์žฅ (์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ์ ‘๊ทผ) Identifier Scope Identifier๋Š” scope(๋ฒ”์œ„)๋‚ด์—์„œ binding-bound ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝ Scope : binding ocurrence identifier๊ฐ€ bound ๋  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„ Scope๋ฅผ ๋ฒ—์–ด๋‚œ ์ ‘๊ทผ : free identifier Shadowing : ๋™์ผํ•œ ์ด๋ฆ„์˜ identifier๊ฐ€ ์ค‘์ฒฉ๋œ scope์—์„œ binding๋˜๋Š” ๊ฒฝ์šฐ, ๋ฐ”๊นฅ์ชฝ scope์˜ identifier๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ Abstract Memory $\sigma$(x) : ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ $\sigma$์—์„œ x์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ $\sigma$[xโ†ฆn](x’) : ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ $\sigma$์—์„œ x๋ฅผ n์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ์ƒˆ๋กœ์šด ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ โ†ฆ (mapsto) : ์™ผ์ชฝ ๊ฐ’์„ ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ ๋งคํ•‘ํ•œ๋‹ค First Order Function (F1VAE) F1VAE VAE์— first-order function์„ ์ถ”๊ฐ€ํ•œ ์–ธ์–ด First-order function ๋ณ€์ˆ˜์™€ ๋‹ค๋ฅด๊ฒŒ ํŠน๋ณ„ ์ทจ๊ธ‰ํ•˜๋Š” ํ•จ์ˆ˜ Higher-order function ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ Concrete syntax 1// single function 2prog ::= decl expr 3// multiple functions 4prog ::= decl_list expr 5decl_list ::= decl decl_list | decl 6// single parameter 7decl ::= def var var = expr endef 8// multiple parameters 9decl ::= def var var_list = expr endef | def var = expr endef 10var_list ::= var var_list | var 11expr_list ::= expr, expr_list | expr 12 13// ๊ณตํ†ต 14expr ::= let var = expr in expr 15 | var(expr) 16 | expr + expr 17 | expr - expr 18 | (expr) 19 | number 20 | ~ (expr) 21 | var Abstract syntax ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ณด์กฐํ•จ์ˆ˜ ฮ›(x) : ํ•จ์ˆ˜ ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ ฮ›์—์„œ ํ•จ์ˆ˜์ด๋ฆ„ x์˜ ๊ฐ’์„ ์ฐพ์•„ ๋ฐ˜ํ™˜ ฮ›[x1 โ†ฆโ†’ (x2, e)] : ํ•จ์ˆ˜ ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ ฮ›์— ํ•จ์ˆ˜์ด๋ฆ„ x1์˜ ๊ฐ’์„ (x2, e)๋กœ ์—…๋ฐ์ดํŠธํ•œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ Multiple parameters $$ p ::= \overline{d}\ e \ d ::= def\ x\ \overline{x} = e \ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ x(\overline{e}) \ n \in Z\ x \in Var $$ Semantics e[n/x] ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ, ํ•จ์ˆ˜ ๋ชธ์ฒด์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌ๋œ ์ด์ž๋กœ ์น˜ํ™˜ํ•œ ํ›„ ๊ณ„์‚ฐ Lexical scope vs dynamic scope Lexical scope : identifier์˜ scope๊ฐ€ ์ปดํŒŒ์ผ์‹œ์ ์— ์ €์˜ Dynamic scope : identifier์˜ scope๊ฐ€ ์‹คํ–‰์‹œ์ ์— ๊ฒฐ์ • First Class Function (FVAE) First-class function ํ•จ์ˆ˜๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํŠน์„ฑ Concrete syntax 1expr ::= let var = expr in expr 2 | (fun var -> expr) // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํ•จ์ˆ˜ ์ •์˜ 3 | expr expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํ•จ์ˆ˜ ํ˜ธ์ถœ 4 | expr + expr 5 | expr - expr 6 | (expr) 7 | number 8 | ~ (expr) 9 | var function applications ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋Œ€์‹  ํ•จ์ˆ˜ ์ ์šฉ Abstract syntax $\lambda x.e$ $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e \ n \in Z\ x \in Var $$ $\lambda x.e$ : ํ•จ์ˆ˜ ์ •์˜ (x๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ, e๋Š” ํ•จ์ˆ˜ ๋ชธ์ฒด) x๋Š” binding occurence x์˜ scope๋Š” e $e\ e$ : ํ•จ์ˆ˜ ์ ์šฉ e1 : ํ•จ์ˆ˜๋กœ ๊ณ„์‚ฐ๋˜๋Š” expression e2 : ์ธ์ž Closure Closure = Var X Expr X Store FVAE์—์„œ๋Š” ํ•จ์ˆ˜๋„ “๊ฐ’"์ด๋ฏ€๋กœ “๊ฐ’"์˜ ํ™•์žฅ์ด ์š”๊ตฌ๋œ๋‹ค Multiple parameters Concrete syntax 1expr ::= let var = expr in expr 2 | let var var = expr in expr 3 | (fun var_list -> expr) // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํ•จ์ˆ˜ ์ •์˜ 4 | expr expr 5 | expr + expr 6 | expr - expr 7 | (expr) 8 | number 9 | ~ (expr) 10 | var 11var_list ::= var var_list | var // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ Conditional Branch (CFVAE) Concrete syntax 1expr ::= let var = expr in expr 2 | (fun var_list -> expr) 3 | if expr then expr else expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ์กฐ๊ฑด๋ฌธ 4 | expr expr 5 | expr + expr 6 | expr - expr 7 | expr < expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ๋น„๊ต์—ฐ์‚ฐ 8 | (expr) 9 | number 10 | bool 11 | ~ (expr) 12 | var if-then-else๊ฐ€ ๋‹ค๋ฅธ expression์— ๋น„ํ•ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ๋‹ค๊ณ  ๊ฐ€์ • Abstract syntax $$ e ::= n\ |\ b\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e\ |\ e?e\ : e\ |\ e\ <\ e \ n \in Z\ b \in {true, false } x \in Var $$ Boolean support as syntatics sugar true์™€ false๋ฅผ ์ •์ˆ˜๋กœ ํ‘œํ˜„ true์™€ false๋ฅผ closure๋กœ ํ‘œํ˜„ Option 1. C style $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e\ |\ e\ ?\ e\ :\ e\ |\ e\ <\ e\ n \in Z\ x \in Var $$ Option 2. Church boolean $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e\ |\ e\ <\ e\ n \in Z\ b \in {true, false }\ x \in Var $$ Recursion (RCFVAE) Concrete syntax 1expr ::= let var = expr in expr 2 | let rec var = expr in expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ์žฌ๊ท€ํ•จ์ˆ˜ 3 | (fun var -> expr) 4 | if expr then expr else expr 5 | expr expr 6 | expr + expr 7 | expr - expr 8 | expr < expr 9 | (expr) 10 | number 11 | bool 12 | ~ (expr) 13 | var Abstract syntax $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ let\ rec\ x\ =\ e\ in\ e |\ \lambda x.e\ |\ e\ e\ |\ e\ <\ e \ n \in Z\ x \in Var $$ minic 1 Imperative language (๋ช…๋ นํ˜• ์–ธ์–ด) ์—ฐ์†๋œ command(๋ช…๋ น)์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์˜ ์˜๋ฏธ๋ฅผ ์ˆ˜ํ–‰ Concrete syntax 1prog ::= stmts 2stmts ::= stmt | stmt stmts 3stmt ::= var = expr; 4 | if expr {stmts} 5 | if expr {stmts} else {stmts} 6expr ::= number 7 | var 8 | true 9 | false 10 | (expr) 11 | expr + expr 12 | expr - expr 13 | expr < expr 14 | expr > expr 15 | expr == expr 16 | expr && expr 17 | expr || expr Abstract syntax $$ p ::= \overline{s} \ s ::= x = e\ |\ e?\ \overline{s} : \overline{s} \ e ::= n\ |\ x\ |\ b\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ e\ <\ e\ |\ e\ >\ e\ |\ e\ ==\ e\ |\ e\ &&\ e\ |\ e\ ||\ e \ n \in Z\ b \in {true, false}\ x \in Var $$ Semantics p : MiniC program Prog -> Store s : MiniC statement Store X Stmt -> Store e : MiniC expression Store X Expr -> Value Short circuit evaluation ๋…ผ๋ฆฌ์‹ ์—ฐ์‚ฐ์— ์žˆ์–ด ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ•ด์ง„ ๊ฒฝ์šฐ ๋‚จ์€ expression ๊ณ„์‚ฐ minic 2 &x: reference *e: dereference Concrete syntax 1prog ::= stmts 2stmts ::= stmt | stmt stmts 3stmt ::= def var; 4 | var = expr; 5 | *expr = expr; 6 | if expr {stmts} 7 | if expr {stmts} else {stmts} 8 | while expr {stmts} 9expr ::= number 10 | var 11 | true 12 | false 13 | &var 14 | *expr 15 | (expr) 16 | expr + expr 17 | expr - expr 18 | expr < expr 19 | expr > expr 20 | expr == expr 21 | expr && expr 22 | expr || expr Abstract syntax $$ p ::= \overline{s} \ s ::= def\ x\ |\ x = e\ |\ *e = e\ |\ e?\ \overline{s} : \overline{s}\ |\ while\ e\ \overline{s} \ e ::= n\ |\ x\ |\ b\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ e\ <\ e\ |\ e\ >\ e\ |\ e\ ==\ e\ |\ e\ &&\ e\ |\ e\ ||\ e\ |\ &x\ |\ *e \ b \in {true, false}\ n \in Z\ x \in Var $$ Semantics
new ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๊ฐœ์š” ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ์˜ ์š”๊ตฌ์‚ฌํ•ญ ๊ธฐ๋ฐ€์„ฑ(Confidentiality) ์ •๋ณด๋ฅผ ๊ถŒํ•œ์ด ์—†๋Š” ๊ฐœ์ธ์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•จ ๋ฌด๊ฒฐ์„ฑ(Integrity) ์ •๋ณด์™€ ํ”„๋กœ๊ทธ๋žจ์€ ์ธ๊ฐ€๋œ ๋ฐฉ์‹์œผ๋กœ๋งŒ ๋ณ€๊ฒฝ๋˜๋„๋ก ํ•จ ๊ฐ€์šฉ์„ฑ(Availability) ์ •๋ณด ์ž์‚ฐ์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ์‹œ๊ฐ„์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•จ ๋ณด์•ˆ ๊ณต๊ฒฉ์˜ ์ข…๋ฅ˜ ์†Œ๊ทน์  ๊ณต๊ฒฉ(Passive Attack) ์ •๋ณด๋ฅผ ๋„์ฒญํ•˜๊ฑฐ๋‚˜ ๊ฐ์‹œํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ์–ด๋ฐฉ๋ฒ• : ์•”ํ˜ธํ™” ์ ๊ทน์  ๊ณต๊ฒฉ(Active Attack) ์ •๋ณด๋ฅผ ๋ณ€์กฐํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ์–ด๋ฐฉ๋ฒ• : ๋ฉ”์‹œ์ง€ ์ธ์ฆ ๋ณด์•ˆ ์„œ๋น„์Šค ์ธ์ฆ(Authentication) ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ • ๋Œ€๋“ฑ ๊ฐœ์ฒด ์ธ์ฆ, ๋ฐ์ดํ„ฐ-๊ทผ์›์ง€ ์ธ์ฆ ์ ‘๊ทผ ์ œ์–ด(Access Control) ์ž์›์„ ๋ถˆ๋ฒ•์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ€์„ฑ(Data Confidentiality) ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ฒ•์  ๋…ธ์ถœ์„ ๋ง‰๋Š” ๊ฒƒ ์—ฐ๊ฒฐ๊ธฐ๋ฐ€์„ฑ, ๋น„์—ฐ๊ฒฐ ๊ธฐ๋ฐ€์„ฑ, ์„ ๋ณ„๋œ-ํ•„๋“œ ๊ธฐ๋ฐ€์„ฑ, ํŠธ๋ž˜ํ”ฝ-ํ๋ฆ„ ๊ธฐ๋ฐ€์„ฑ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ(Data Integrity) ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์†ก์‹ ๋œ ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ ์—ฐ๊ฒฐํ˜• ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ, ๋น„์—ฐ๊ฒฐํ˜• ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ, ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์„ ๋ณ„๋œ-ํ•„๋“œ ์—ฐ๊ฒฐ ๋ฌด๊ฒฐ์„ฑ, ๋น„์—ฐ๊ฒฐ ๋ฌด๊ฒฐ์„ฑ, ์„ ๋ณ„๋œ-ํ•„๋“œ ๋น„์—ฐ๊ฒฐ ๋ฌด๊ฒฐ์„ฑ ๋ถ€์ธ ๋ด‰์‡„ (Non-repudiation) ํ†ต์‹ ์˜ ํ•œ ์ฃผ์ฒด๊ฐ€ ํ†ต์‹ ์— ์ฐธ์—ฌํ–ˆ๋˜ ์‚ฌ์‹ค์„ ๋ถ€์ธํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ๊ฐ€์šฉ์„ฑ ์„œ๋น„์Šค (Availability Service) ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํŠน์ • ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํŠน์ • ํ”„๋กœํ† ์ฝœ ๊ณ„์ธต์—์„œ ๊ตฌํ˜„๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ธ์ฆ ์•”ํ˜ธํ™” ๋””์ง€ํ„ธ ์„œ๋ช… ์ ‘๊ทผ ์ œ์–ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์ธ์ฆ ๊ตํ™˜ ํŠธ๋ž˜ํ”ฝ ํŒจ๋”ฉ ๊ฒฝ๋กœ ์ œ์–ด ๊ณต์ฆ ์ผ๋ฐ˜ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ณ„์ธต๊ณผ ์„œ๋น„์Šค์— ๋…๋ฆฝ์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์‹ ๋ขฐ๋ฐ›๋Š” ๊ธฐ๋Šฅ ๋ณด์•ˆ ๋ ˆ์ด๋ธ” ์‚ฌ๊ฑด ํƒ์ง€ ๋ณด์•ˆ ๊ฐ์‚ฌ ์ถ”์  ๋ณด์•ˆ ๋ณต๊ตฌ ์•”ํ˜ธ ๊ธฐ์ˆ ์˜ ์ดํ•ด ์ „ํ†ต์ ์ธ ์•”ํ˜ธ ๊ธฐ์ˆ  ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ๋น„๋ฐ€์„ฑ ์œ ์ง€ (Confidentiality) ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€ (Data Integrity) ์‚ฌ์šฉ์ž ๋˜๋Š” ์ž๋ฃŒ์˜ ์ถœ์ฒ˜ ์ธ์ฆ (Authentication) ๋ถ€์ธ ๋ฐฉ์ง€ (Non-repudiation) ์•”ํ˜ธ ํ•ด๋… ํ•ด๋…์ž๋Š” ์•”ํ˜ธ ์‹œ์Šคํ…œ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ํ‚ค๋งŒ ๋ชจ๋ฆ„ Cipher Text Only Attack : ์•”ํ˜ธ๋ฌธ ๋‹จ๋… ๊ณต๊ฒฉ Know Plain Text Attack : ์•Œ๋ ค์ง„ ํ‰๋ฌธ ๊ณต๊ฒฉ Chosen Plain Text Attack : ์„ ํƒ์  ํ‰๋ฌธ ๊ณต๊ฒฉ ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™” ๋น„๋ฐ€ํ‚ค ์•”ํ˜ธ์˜ ๋น„๊ต ๊ตฌ๋ถ„ ๊ณต๊ฐœํ‚ค ์•”ํ˜ธ ๋น„๋ฐ€ํ‚ค ์•”ํ˜ธ ํ‚ค์˜ ๊ด€๊ณ„ ์•”ํ˜ธํ™” ํ‚ค != ๋ณตํ˜ธํ™” ํ‚ค ์•”ํ˜ธํ™” ํ‚ค = ๋ณตํ˜ธํ™” ํ‚ค ํ‚ค์˜ ๊ฐœ์ˆ˜ 2n n(n-1)/2 1์ธ๋‹น ํ•„์š”ํ•œ ๋น„๋ฐ€ํ‚ค 1 n-1 ์†๋„ ๋น„ํšจ์œจ์  ํšจ์œจ์  ๋Œ€์นญํ‚ค(๋น„๋ฐ€ํ‚ค) ์•”ํ˜ธ ์ข…๋ฅ˜ ๋ธ”๋ก ์•”ํ˜ธ : ๋ธ”๋ก ๋‹จ์œ„๋กœ ์•”ํ˜ธํ™” DES, IDEA, AES ์ŠคํŠธ๋ฆผ ์•”ํ˜ธ : ๋น„ํŠธ ๋‹จ์œ„๋กœ ์•”ํ˜ธํ™” RC4, A5/1 ํ•œ๊ตญ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ NEAT, SEED, NES, ARIA ๊ณต๊ฐœํ‚ค(๋น„๋Œ€์นญํ‚ค) ์•”ํ˜ธ ์ข…๋ฅ˜ ์†Œ์ธ์ˆ˜ ๋ถ„ํ•ด ๊ธฐ๋ฐ˜ : RSA ์ด์‚ฐ ๋Œ€์ˆ˜ ๊ธฐ๋ฐ˜ : ElGamal ํƒ€์› ๊ณก์„  ๊ธฐ๋ฐ˜ ํ‚ค ์ƒ์„ฑ ์„œ๋กœ์†Œ์ธ ๋‘ ์†Œ์ˆ˜ p, q๋ฅผ ์„ ํƒ n = p * q ฯ†(n) = (p-1)(q-1) gcd(e, ฯ†(n)) = 1์„ ๋งŒ์กฑํ•˜๋Š” e ์„ ํƒ d * e mod ฯ†(n) = 1์„ ๋งŒ์กฑํ•˜๋Š” d ์„ ํƒ ๊ณต๊ฐœํ‚ค : {e, n}, ๋น„๋ฐ€ํ‚ค : {d, n} ์•”ํ˜ธํ™” C = M^e mod n ๋ณตํ˜ธํ™” M = C^d mod n DH (Diffie Hellman) ํ‚ค ๊ณต์œ  q(์†Œ์ˆ˜), ฮฑ(q์˜ ์›์‹œ๊ทผ, ฮฑ<q) ์ž„์˜ ์ˆ˜ $X_A < q$๋ฅผ ๋งŒ์กฑํ•˜๋Š” $X_A$๋ฅผ ์„ ํƒ ๊ณต๊ฐœํ•  $Y_A = \alpha^{X_A} mod\ q$ ์ƒ๋Œ€๋ฐฉ์ด ์ƒ์„ฑํ•˜๋Š” ๋น„๋ฐ€ํ‚ค $K = Y_A^{X_B} mod\ q$ ์•”ํ˜ธ ๊ธฐ์ˆ ์˜ ํ™œ์šฉ ๋””์ง€ํ„ธ ์„œ๋ช… ํŠน์„ฑ ์œ„์กฐ ๋ถˆ๊ฐ€, ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€, ์„œ๋ช…์ž ์ธ์ฆ, ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€, ๋ถ€์ธ ๋ฐฉ์ง€ ์„œ๋ช…์ž์˜ ๋น„๋ฐ€ํ‚ค๋กœ ์•”ํ˜ธํ™” ์„œ๋ช…์ž์˜ ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ฉ”์‹œ์ง€ ์ธ์ฆ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์š”๊ฑด ๋‹จ๋ฐฉํ–ฅ์„ฑ : H(x) = h์ผ๋•Œ, x๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค ์•ฝํ•œ ์ถฉ๋Œ ์ €ํ•ญ์„ฑ : H(x)=H(y)๋ฅผ ๋งŒ์กฑํ•˜๋Š” y(=x)๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค ๊ฐ•ํ•œ ์ถฉ๋Œ ์ €ํ•ญ์„ฑ : H(x)=H(y)๋ฅผ ๋งŒ์กฑํ•˜๋Š” (x, y)๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค ๊ณต๊ฐœํ‚ค ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ ์ธ์ฆ์„œ ๊ณต๊ฐœํ‚ค์™€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์ „์ž ๋ฌธ์„œ ํ‘œ์ค€ : X.509 v3 PKI (Public Key Infrastructure) ๊ณต๊ฐœํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ธ์ฆํ•˜๋Š” ๊ตฌ์กฐ CA (Certificate Authority) : ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ RA (Registration Authority) : ์‚ฌ์šฉ์ž ๋“ฑ๋ก CRL (Certificate Revocation List) : ํ๊ธฐ๋œ ์ธ์ฆ์„œ ๋ชฉ๋ก ๋™ํ˜•์•”ํ˜ธ์™€ ์–‘์ž์•”ํ˜ธ ๊ธฐ์ˆ  ๋™ํ˜•์•”ํ˜ธ ์•”ํ˜ธํ™”๋œ ์ƒํƒœ์—์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณตํ˜ธํ™”ํ•˜๋ฉด ์›๋ฌธ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ์•”ํ˜ธํ™” ๊ธฐ๋ฒ• ๋ถ€๋ถ„ ๋™ํ˜• ์•”ํ˜ธ : ๋ง์…ˆ๊ณผ ๊ณฑ์…ˆ ์ค‘์—์„œ ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ๋งŒ ์ง€์› ์ค€๋™ํ˜• ์•”ํ˜ธ : ์—ฐ์‚ฐ์˜ ํšŸ์ˆ˜์— ์ œํ•œ์ด ์กด์žฌ ์™„์ „ ๋™ํ˜• ์•”ํ˜ธ : ์ž„์˜์˜ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ ํ™œ์šฉ ์•”ํ˜ธํ™”๋œ ์ƒํƒœ๋กœ ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์„ฑ์ด ๋†’์Œ ์–‘์ž ๋‚ด์„ฑ ์•”ํ˜ธ (PQC: Post Quantum Cryptography) ์–‘์ž ์ปดํ“จํ„ฐ์— ์˜ํ•œ ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•œ ๊ณต๊ฐœํ‚ค ์•”ํ˜ธ QKD(Quantum Key Distribution) : ์–‘์ž ํ†ต์‹ ์„ ์œ„ํ•ด ๋น„๋ฐ€ํ‚ค๋ฅผ ๋ถ„๋ฐฐ/๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ  QRNG(Quantum Random Number Generator) : ์–‘์ž ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์‚ฌ์šฉ์ž ์ธ์ฆ ์›๋ฆฌ ์ธ์ฆ ์ ˆ์ฐจ ์‹ ์› ํ™•์ธ ๋‹จ๊ณ„ ์ž…์ฆ ๋‹จ๊ณ„ NIST์˜ ์ „์ž ์ธ์ฆ ๋ชจ๋ธ ์ธ์ฆ ์ˆ˜๋‹จ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ†ตํ•œ ์ธ์ฆ : ๋น„๋ฐ€๋ฒˆํ˜ธ ์†Œ์œ ๋ฌผ์„ ํ†ตํ•œ ์ธ์ฆ : OTP ๊ธฐ๊ธฐ, ์ธ์ฆ์„œ ์ƒ์ฒด ์กฐ์ง์„ ํ†ตํ•œ ์ธ์ฆ : ์ง€๋ฌธ, ๋ง๋ง‰ ํ–‰๋™์„ ํ†ตํ•œ ์ธ์ฆ : ๋ชฉ์†Œ๋ฆฌ ํŒจํ„ด, ํ•„์  ๋ณด์กด ๋“ฑ๊ธ‰ ์˜ํ–ฅ ํ”„๋กœํŒŒ์ผ ๋ณด์ฆ๋ ˆ๋ฒจ : ์‹ ๋ขฐ์„œ ์ •๋„์— ๋”ฐ๋ผ 4๊ฐ€์ง€ ๋“ฑ๊ธ‰์œผ๋กœ ๋ถ„๋ฅ˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๊ณต๊ฒฉ ์œ ํ˜• ์˜คํ”„๋ผ์ธ ์‚ฌ์ „ ๊ณต๊ฒฉ ํŠน์ • ๊ณ„์ • ๊ณต๊ฒฉ ์ž˜ ์•Œ๋ ค์ง„ ํŒจ์Šค์›Œ๋“œ ๊ณต๊ฒฉ, ๋Œ€์ž… ๊ณต๊ฒฉ ๋‹จ์ผ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ํŒจ์Šค์›Œ๋“œ ์ถ”์ธก ๋‹จ๋ง๊ธฐ ๊ฐ•ํƒˆ ์‚ฌ์šฉ์ž ์‹ค์ˆ˜ ์ด์šฉ ๋‹ค์ค‘ ๋น„๋ฐ€ ๋ฒˆํ˜ธ ์‚ฌ์šฉ ์ปดํ“จํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง : ํ†ต์‹  ํŒจํ‚ท ๋ถ„์„ ํ•ด์‹œํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉ Salt์˜ ์—ญํ•  ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์•„๋„ ๋‹ค๋ฅธ ํ•ด์‹œ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ํ•จ ํŒจ์Šค์›Œ๋“œ ํฌ๋ž™ํ‚น ์‚ฌ์ „ ๊ณต๊ฒฉ ๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ” ๊ณต๊ฒฉ : ๋ชจ๋“  ์†”ํŠธ์— ๋Œ€ํ•œ ํ•ด์‹œ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด ๋†“์€ ํ…Œ์ด๋ธ”์„ ์ด์šฉ ํŒจ์Šค์›Œ๋“œ ์„ ํƒ ๊ธฐ๋ฒ• ์‚ฌ์šฉ์ž ๊ต์œก ์ปดํ“จํ„ฐ ๋ฐœ์ƒ ํŒจ์Šค์›Œ๋“œ ํŒจ์Šค์›Œ๋“œ ๊ฒ€์‚ฌ์˜ ํ™œ์„ฑํ™” : ์ž์ฒด ํŒจ์Šค์›Œ๋“œ ํฌ๋ž˜์ปค ์‹คํ–‰ ์‚ฌ์ „ ํŒจ์Šค์›Œ๋“œ ๊ฒ€์‚ฌ : ํŒจ์Šค์›Œ๋“œ ์•ˆ์ •์„ฑ ๊ฒ€์‚ฌ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ข…๋ฅ˜ ๋ฉ”๋ชจ๋ฆฌ ์นด๋“œ ์Šค๋งˆํŠธ ์นด๋“œ : ์ž„๋ฒ ๋””๋“œ ๋งˆ์ดํฌ๋กœํ”„๋กœ์„ธ์„œ ํฌํ•จ ์ƒ์ฒด ์ธ์ฆ ๊ธฐ์ˆ  ์ •ํ™•๋„ : ํ™•๋ฅ  ๋ฐ€๋„ ํ•จ์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์ •๊ทœ ๋ถ„ํฌ๋ฅผ ๋”ฐ๋ฆ„ FAR (False Acceptance Rate) : ๊ฑฐ์ง“ ์ˆ˜๋ฝ๋ฅ  FRR (False Rejection Rate) : ๊ฑฐ์ง“ ๊ฑฐ๋ถ€์œจ EER (Equal Error Rate) : FAR๊ณผ FRR์ด ๊ฐ™์€ ์ง€์  ์›๊ฒฉ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฉ€ํ‹ฐ ํŒฉํ„ฐ ์ธ์ฆ : ๋‘ ์š”์†Œ ์ด์ƒ์„ ์‚ฌ์šฉํ•œ ์ธ์ฆ ๋ฉ€ํ‹ฐ ์ฑ„๋„ ์ธ์ฆ : ๋‹ค์–‘ํ•œ ์ฑ„๋„์„ ํ†ตํ•ด ์ธ์ฆ ์ธ์ฆ ํ”„๋กœํ† ์ฝœ ํŒจ์Šค์›Œ๋“œ ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ํŒจ์Šค์›Œ๋“œ์™€ ๋‚œ์ˆ˜๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํ•ด์‹œ๊ฐ’์„ ์ƒ์„ฑ, ์ „์†ก ํ† ํฐ ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚œ์ˆ˜๋ฅผ ์•”ํ˜ธํ™”, ์ „์†ก ์ •์  ์ƒ์ฒด ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๋Š” ๋‚œ์ˆ˜์™€ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ ์‹๋ณ„์ž๋ฅผ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์ฒด ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”, ์ „์†ก ๋™์  ์ƒ์ฒด ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋žœ๋ค ์‹œํ€€์Šค๋‚˜ ๋‚œ์ˆ˜๋ฅผ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ๋งํ•˜๊ฑฐ๋‚˜, ๊ธ€์ž๋ฅผ ์“ฐ๋Š” ๋“ฑ์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰, ์•”ํ˜ธํ™” ํ›„ ์ „์†ก ์ ‘๊ทผ ์ œ์–ด ์ ‘๊ทผ ์ œ์–ด ์›๋ฆฌ ์ ‘๊ทผ์ œ์–ด ์ฒ ํ•™ ์ ‘๊ทผํ†ต์ œ ์˜์—ญ ๊ด€๋ฆฌ์  ํ†ต์ œ ๊ธฐ์ˆ ์  ํ†ต์ œ ๋ฌผ๋ฆฌ์  ํ†ต์ œ ์ ‘๊ทผ ์ œ์–ด ์›์น™ ์•Œ ํ•„์š”์„ฑ ์›์น™ ์ตœ์†Œ ๊ถŒํ•œ ์›์น™ ์ตœ๋Œ€ ๊ถŒํ•œ ์›์น™ ์ง๋ฌด ๋ถ„๋ฆฌ ์›์น™ ์ ‘๊ทผ ์ œ์–ด ๊ธฐ๋ณธ ์š”์†Œ ์ฃผ์ œ : ๊ฐ์ฒด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์กด์žฌ : user, group, other ๊ฐ์ฒด : ์ ‘๊ทผ์ด ์ œ์–ด๋˜๋Š” ์ž์› : ํŒŒ์ผ ๋˜๋Š” ๋ ˆ์ฝ”๋“œ ์ ‘๊ทผ ๊ถŒํ•œ : ์ฃผ์ฒด๊ฐ€ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• : ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์‹คํ–‰ ๋“ฑ ์ ‘๊ทผ ์ œ์–ด ์š”๊ตฌ ์‚ฌํ•ญ ๋‹ซํžŒ ์ •์ฑ… : ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ ์—ด๋ฆฐ ์ •์ฑ… : ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ ์ ‘๊ทผ ์ œ์–ด ์ •์ฑ… ์ž„์˜ ์ ‘๊ทผ ์ œ์–ด (DAC) ๊ฐ•์ œ์  ์ ‘๊ทผ ์ œ์–ด (MAC) ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด (RBAC) ์†์„ฑ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด (ABAC) ์ž„์˜ ์ ‘๊ทผ ์ œ์–ด (DAC, ์ž์œจ์  ์ ‘๊ทผ ์ œ์–ด) ํ•œ ๊ฐœ์ฒด๊ฐ€ ์ž์‹ ์˜ ์˜์ง€๋Œ€๋กœ ๋‹ค๋ฅธ ๊ฐœ์ฒด์—๊ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹ ์ ‘๊ทผ ์ œ์–ด ๋ชฉ๋ก (access control list) > ๊ฐœ์ฒด๋ณ„๋กœ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ช…์‹œํ•˜๋Š” ๋ฐฉ์‹ ์ธ๊ฐ€ ํ…Œ์ด๋ธ” ํ™•์žฅ๋œ ์ ‘๊ทผ ์ œ์–ด ๋งคํŠธ๋ฆญ์Šค UNIX ํŒŒ์ผ ์ ‘๊ทผ ์ œ์–ด Set-UID : ์‹คํ–‰ํ•  ๋•Œ, euid๋ฅผ ์†Œ์œ ์ž์˜ id๋กœ ์„ค์ •๋จ ex) -rwsr-xr-x : 4755 Set-GID : ์‹คํ–‰ํ•  ๋•Œ, egid๋ฅผ ์†Œ์œ ๊ทธ๋ฃน์˜ id๋กœ ์„ค์ •๋จ ex) -rwxr-sr-x : 2755 ํŒจ์Šค์›Œ๋“œ ํŒŒ์ผ : /etc/shadow : ———- : 000 ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์— ๋”ฐ๋ผ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹ ์—ญํ•  ๊ณ„์ธต - RBAC1 ์—ญํ•  ๊ตฌ์กฐ๋Š” ๊ธฐ๊ด€ ๋‚ด ์—ญํ• ์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜๋‹จ ์ œ์•ฝ(์ „์ œ์กฐ๊ฑด)์˜ ์˜๋ฏธ์™€ ์ข…๋ฅ˜ - RBAC2 ์ œ์•ฝ์˜ ์ข…๋ฅ˜ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ธ ์—ญํ•  : ์ง๋ฌด์™€ ๋Šฅ๋ ฅ์„ ๋ถ„๋ฆฌ cardinality : ์—ญํ• ์— ๊ด€ํ•œ ์ตœ๋Œ€์ˆซ์ž๋ฅผ ์„ค์ • ์ „์ œ ์กฐ๊ฑด : ํŠน์ • ์—ญํ• ์ด ๋‹ค๋ฅธ ๋ช…์‹œ๋œ ์—ญํ• ์— ํ• ๋‹น ๋˜์—ˆ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๋Š” ๊ทธ ์—ญํ• ์—๋งŒ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค ์†์„ฑ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด ์ž์›๊ณผ ์ฃผ์ฒด์˜ ์„ฑ์งˆ์˜ ํŠน์„ฑ์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•˜์—ฌ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹ ABAC ๋ชจ๋ธ์˜ 3๊ฐ€์ง€ ์ฃผ์š” ์š”์†Œ ๊ตฌ์„ฑ ๋‚ด์˜ ์กด์žฌ๋ฅผ ์œ„ํ•ด ์ •์˜๋œ ์†์„ฑ ABAC ์ •์ฑ…์„ ์œ„ํ•ด ์ •์˜๋œ ์ •์ฑ… ๋ชจ๋ธ ์ ‘๊ทผ ์ œ์–ด ์‹คํ–‰์„ ์œ„ํ•œ ์ •์ฑ…์— ์ ์šฉ๋˜๋Š” ๊ตฌ์กฐ ๋ชจ๋ธ ์†์„ฑ ์ฃผ์ฒด, ๊ฐ์ฒด ํ™˜๊ฒฝ ์กฐ๊ฑด, ๊ถŒํ•œ์— ์˜ํ•ด ๋ฏธ๋ฆฌ ์ •์˜๋˜๊ณ  ํ• ๋‹น๋œ ์š”๊ตฌ ๋™์ž‘์˜ ํŠน์ • ์ธก๋ฉด์„ ์ •์˜ํ•˜๋Š” ์„ฑ์งˆ ์œ ํ˜• ์ฃผ์ฒด ์†์„ฑ : ์‚ฌ์šฉ์ž, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ, ํ”„๋กœ์„ธ์Šค, ๋””๋ฐ”์ด์Šค ๊ฐ์ฒด ์†์„ฑ : ๋””๋ฐ”์ด์Šค, ํŒŒ์ผ, ํ”„๋กœ๊ทธ๋žจ, ๋„คํŠธ์›Œํฌ ๋“ฑ ํ™˜๊ฒฝ ์†์„ฑ : ๋‚ ์งœ, ์‹œ๊ฐ„, ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๋ ˆ๋ฒจ ๋“ฑ ABAC์˜ ๋…ผ๋ฆฌ ๊ตฌ์กฐ ACL ์ ‘๊ทผ ์ฒด์ธ ABAC ์‹ ๋ขฐ ์ฒด์ธ ์ •์ฑ… ์กฐ์ง ๋‚ด์—์„œ ์ฃผ์ฒด์˜ ๊ถŒํ•œ๊ณผ ํ™˜๊ฒฝ ์กฐ๊ฑด์—์„œ ์ž์› ํ˜น์€ ๊ฐ์ฒด๋“ค์ด ๋ณดํ˜ธ๋˜๋Š” ๊ฒƒ์— ๊ธฐ๋ฐ˜ํ•œ ํ—ˆ๊ฐ€๋œ ํ–‰์œ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ทœ์น™๊ณผ ๊ด€๊ณ„์˜ ์ง‘ํ•ฉ ๊ฐ•์ œ์  ์ ‘๊ทผ ์ œ์–ด (MAC) ๊ฐ์ฒด์— ํฌํ•จ๋œ ์ •๋ณด์˜ ๋น„๋ฐ€์„ฑ๊ณผ ์ด๋Ÿฌํ•œ ๋น„๋ฐ€์„ฑ์˜ ์ ‘๊ทผ ์ •๋ณด์— ๋Œ€ํ•˜์—ฌ ์ฃผ์ฒด๊ฐ€ ๊ฐ–๋Š” ๊ถŒํ•œ์— ๊ทผ๊ฑฐํ•˜์—ฌ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ธฐ๋ฐ€์„ฑ์— ๋”ฐ๋ฅธ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด No read up (๋‹จ์ˆœ ๋ณด์•ˆ ์†์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ๊ฐ์ฒด๋ฅผ ์ฝ์„ ์ˆ˜ ์—†์Œ No write down (*(์Šคํƒ€) ๋ณด์•ˆ ํŠน์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ๊ฐ์ฒด์— ๊ธฐ๋กํ•  ์ˆ˜ ์—†์Œ ๋ฌด๊ฒฐ์„ฑ์— ๋”ฐ๋ฅธ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด No read up (๋‹จ์ˆœ ๋ฌด๊ฒฐ์„ฑ ํŠน์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ๊ฐ์ฒด๋ฅผ ์ฝ์„ ์ˆ˜ ์—†์Œ No write down (*(์Šคํƒ€) ๋ฌด๊ฒฐ์„ฑ ํŠน์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ๊ฐ์ฒด์— ๊ธฐ๋กํ•  ์ˆ˜ ์—†์Œ ์‹ ์›, ์‹ ์šฉ์žฅ, ์ ‘๊ทผ ๊ด€๋ฆฌ (ICAM) ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž์› : ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ, ์‹œ์Šคํ…œ ์ž์›, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ž์› ์ „ํ†ต์ ์ธ DoS ๊ณต๊ฒฉ ํ”Œ๋Ÿฌ๋”ฉ ํ•‘ ๋ช…๋ น ๋Œ€์ƒ ์กฐ์ง์— ๋Œ€ํ•ด ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๊ธฐ๋Šฅ์„ ์ œ์••ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์  ์‹œ์ž‘ ์ฃผ์†Œ ์Šคํ‘ธํ•‘ ์œ„์กฐ๋œ ์†Œ์Šค ์ฃผ์†Œ ์‚ฌ์šฉ ํ›„๋ฐฉ ์‚ฐ๋ž€(backscatter) ํŠธ๋ž˜ํ”ฝ์„ ์ด์šฉํ•ด ๋Œ€์‘ SYN ์Šคํ‘ธํ•‘ ์ผ๋ฐ˜์ ์ธ DoS๊ณต๊ฒฉ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ๋„˜์น˜๊ฒŒ ํ•จ Flooding ๊ณต๊ฒฉ์— ๋น„ํ•ด ์ ์€ ํŠธ๋ž˜ํ”ฝ์œผ๋กœ ๊ณต๊ฒฉ ๊ฐ€๋Šฅ ๊ณต๊ฒฉ์ž ์ž…์žฅ ์Šคํ‘ธํ•‘๋œ ์‹œ์Šคํ…œ์ด ์กด์žฌํ•œ๋‹ค๋ฉด Reset ํŒจํ‚ท์„ ์ˆ˜์‹  ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํƒ€์ด๋จธ์— ์˜ํ•œ ์žฌ์ „์†ก ํ›„ ์—”ํŠธ๋ฆฌ ์‚ญ์ œ Reset์œผ๋กœ ๋ฐ˜์‘ํ•˜์ง€ ์•Š๋Š” ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉ ํ”Œ๋Ÿฌ๋”ฉ ๊ณต๊ฒฉ ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ ICMP ํ”Œ๋Ÿฌ๋”ฉ UDP ํ”Œ๋Ÿฌ๋”ฉ TCP SYN ํ”Œ๋Ÿฌ๋”ฉ DDoS (Distributed Denial of Service) ์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ ์‹œ์Šคํ…œ์„ ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉ์‹ ๋ถ„์‚ฐ ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๊ธฐ๋ฐ˜ ๋Œ€์—ญํญ ๊ณต๊ฒฉ ์„ธ์…˜ ๊ฐœ์‹œ ํ”„๋กœํ† ์ฝœ(SIP) ํ”Œ๋Ÿฌ๋“œ ์„ธ์…˜ ๊ฐœ์‹œ ํ”„๋กœํ† ์ฝœ : VoIP ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ HTTP ๊ธฐ๋ฐ˜ ๊ณต๊ฒฉ ์ŠคํŒŒ์ด๋”๋ง(spidering) ํŠน์ • HTTP ๋งํฌ์—์„œ ์‹œ์ž‘๋˜๋ฉฐ, ์žฌ๊ท€์  ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์›น์‚ฌ์ดํŠธ์— ๋ชจ๋“  ๋งํฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ๋ด‡ R-U-DEAD-YET (RUDY) ๊ณต๊ฒฉ Content-Length๋ฅผ ํฌ๊ฒŒ ์„ค์ •ํ•˜์—ฌ ์„œ๋ฒ„์˜ ์ง€์—ฐ์„ ์œ ๋ฐœํ•˜๋Š” ๊ธฐ๋ฒ• Slowloris ๊ณต๊ฒฉ ๋น„์ •์ƒ์ ์ธ ํ—ค๋” ๊ฐ’์„ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜์—ฌ, ์„œ๋ฒ„๊ฐ€ ํ—ค๋”๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐ˜์‚ฌ ๋ฐ ์ฆํญ ๊ณต๊ฒฉ ๋ฐ˜์‚ฌ ๊ณต๊ฒฉ TCP SYN ์Šคํ‘ธํ•‘ ๊ณต๊ฒฉ DNS ๋ฐ˜์‚ฌ ๊ณต๊ฒฉ ์ฆํญ ๊ณต๊ฒฉ (smurfs) DNS ์ฆํญ ๊ณต๊ฒฉ ๊ณต๊ฒฉ์ž๊ฐ€ ํƒ€๊ฒŸ ์‹œ์Šคํ…œ์˜ ์Šคํ‘ธํ•‘ ์†Œ์Šค ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” DNS ์—ฐ์‡„์  ์š”์ฒญ ์ ์€ ์š”์ฒญ์œผ๋กœ ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” DNS ํ–‰์œ„๋ฅผ ์ด์šฉ ๋ฐฉ์–ด์ฑ… : ์Šคํ‘ธํ•‘ ์†Œ์Šค ์ฃผ์†Œ์˜ ์‚ฌ์šฉ์„ ๋ฐฉ์ง€ DoS ๊ณต๊ฒฉ ๋ฐฉ์–ด, ์˜ˆ๋ฐฉ, ๋Œ€์‘ DoS ๊ณต๊ฒฉ ์˜ˆ๋ฐฉ ์Šคํ‘ธํ•‘ ์†Œ์Šค ์ฃผ์†Œ ์ฐจ๋‹จ TCP ์—ฐ๊ฒฐ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ • IP ๋‹ค์ด๋ ‰ํŠธ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… ๊ธฐ๋Šฅ ์ฐจ๋‹จ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์„œ๋น„์Šค๋‚˜ ๋ถ€ํ˜ธ์กฐํ•ฉ ์ฐจ๋‹จ capcha๋ฅผ ์ด์šฉํ•ด ์ž๋™ํ™”๋œ ์š”์ฒญ ์ฐจ๋‹จ ์•Œ๋งž์€ ํ‘œ์ค€ ์‹œ์Šคํ…œ ๋ณด์•ˆ ๊ด€ํ–‰ํ™” ๋ฏธ๋Ÿฌ ์„œ๋ฒ„ ๋˜๋Š” ๋ณต์ œ ์„œ๋ฒ„์˜ ์‚ฌ์šฉ DoS ๊ณต๊ฒฉ ๋Œ€์‘ ๊ณต๊ฒฉ ์œ ํ˜• ํ™•์ธ : ํŒจํ‚ท ์บก์ฒ˜ ISP๋กœ ํŒจํ‚ท์˜ ํ๋ฆ„์„ ์—ญ์ถ”์  : ๋†’์€ ๋น„์šฉ ๋ฐœ์ƒ ๋น„์ƒ ์‚ฌํƒœ ๊ณ„ํš ๊ตฌํ˜„ ์‚ฌ๊ณ  ๋Œ€์‘ ๊ณ„ํš ์—…๋ฐ์ดํŠธ DNS ์‹ฑํฌํ™€ ์ ์šฉ ์ข€๋น„์™€ C&C ์„œ๋ฒ„์˜ ํ†ต์‹ ์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ• DDoS ๋Œ€ํ”ผ์†Œ ์นจ์ž… ํƒ์ง€์™€ ์นจ์ž… ์ฐจ๋‹จ ์นจ์ž…์ž ์นจ์ž…์ž ์œ ํ˜• ์‚ฌ์ด๋ฒ„ ๋ฒ”์ฃ„์ž ํ•ดํ‚น์ฃผ์˜์ž ์ •๋ถ€ ํ›„์› ์ง‘๋‹จ ๊ธฐํƒ€ ํ–‰๋™ ํŒจํ„ด ๊ณต๊ฒฉ ๋Œ€์ƒ ํฌ์ฐฉ ๋ฐ ์ •๋ณด ์ˆ˜์ง‘ ์ดˆ๊ธฐ ์ ‘์† ๊ถŒํ•œ ์ƒ์Šน ์ •๋ณด ์ˆ˜์ง‘ ๋˜๋Š” ์‹œ์Šคํ…œ ๊ณต๊ฒฉ ์ ‘๊ทผ ๊ด€๋ฆฌ ์ถ”์  ํšŒํ”ผ ์นจ์ž… ํƒ์ง€ ๋ณด์•ˆ ์นจ์ž… : ์นจ์ž…์ž๊ฐ€ ํ—ˆ๊ฐ€ ๊ถŒํ•œ ์—†์ด ์‹œ์Šคํ…œ (๋˜๋Š” ์ž์›)์„ ๋นผ๋‚ด๊ฑฐ๋‚˜ ์•ก์„ธ์Šคํ•˜๋ ค๋Š” ์‹œ๋„๋กœ ๊ตฌ์„ฑ๋œ ์‚ฌ๊ฑด์˜ ์กฐํ•ฉ ์นจ์ž… ํƒ์ง€ : ํ—ˆ๊ฐ€๋˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ์‹œ์Šคํ…œ ์ž์›์—์„œ์˜ ์ ‘๊ทผ ์‹œ๋„๋ฅผ ๋ฐœ๊ฒฌ ๋ฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•Œ๋ ค์ฃผ๋Š” ๋ชฉ์ ์˜ ์‹œ์Šคํ…œ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ณด์•ˆ ์„œ๋น„์Šค ์นจ์ž… ํƒ์ง€ ์‹œ์Šคํ…œ (IDS) ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ IDS ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ IDS ๋ถ„์‚ฐ IDS ๋˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ IDS ๋ถ„์„ ๋ฐฉ๋ฒ• ์ด์ƒ ์ง•ํ›„ ํƒ์ง€ ํ–‰๋™ ๊ธฐ๋ฐ˜ ํƒ์ง€ : ํ–‰๋™ ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ์ง€ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํƒ์ง€ : ์•Œ๋ ค์ง„ ๊ณต๊ฒฉ ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ์ง€ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ฐฉ์‹ ๋˜๋Š” ํœด๋ฆฌ์Šคํ‹ฑ ๋ฐฉ์‹ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ IDS HIDS ์ทจ์•ฝํ•˜๊ฑฐ๋‚˜ ๋ฏผ๊ฐํ•œ ์‹œ์Šคํ…œ์— ํŠน์ˆ˜ ๋ณด์•ˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ณ„์ธต์„ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์  ๋กœ๊ทธ ํŒŒ์ผ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ์‚ฌ ๊ธฐ๋ก : ์‹œ์Šคํ…œ์ด ์ƒ์„ฑํ•˜๋Š” ๋กœ๊ทธ ํŒŒ์ผ ํŠน์ • ๊ฐ์‚ฌ ๊ธฐ๋ก : IDS์— ์˜ํ•ด ์š”๊ตฌ๋œ ์ •๋ณด๋งŒ์„ ๊ธฐ๋กํ•˜๋Š” ์ˆ˜์ง‘ ์‹œ์„ค ํŒŒ์ผ ๋ฌด๊ฒฐ์„ฑ ์ฒดํฌ์„ฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์•ก์„ธ์Šค USTAT ์•ก์…˜ vs SunOS ์ด๋ฒคํŠธ ์œ ํ˜• ๋ถ„์‚ฐ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์นจ์ž… ํƒ์ง€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ IDS NIDS ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์นจ์ž…์„ ํƒ์ง€ NIDS ์„ผ์„œ ๋ฐฐ์น˜ ์ธ๋ผ์ธ ์„ผ์„œ : ๋„คํŠธ์›Œํฌ ์„ธ๊ทธ๋จผํŠธ์— ์‚ฝ์ž…๋˜์–ด ๊ทธ ์„ผ์„œ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ๋งŒ ๊ฐ์ง€ ์ˆ˜๋™ ์„ผ์„œ : ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ์‚ฌ๋ณธ์„ ๊ฐ์‹œ ์นจ์ž… ํƒ์ง€ ๊ธฐ๋ฒ• ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํƒ์ง€ ์ด์ƒ ์ง•ํ›„ ๊ฐ์ง€ Stateful protocol analysis ํŠธ๋ž˜ํ”ฝ์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜์—ฌ ๋น„์ •์ƒ์ ์ธ ํŠธ๋ž˜ํ”ฝ์„ ํƒ์ง€ ๋ฐฉํ™”๋ฒฝ ๊ธฐ๋Šฅ ์ ‘๊ทผ ํ†ต์ œ ์‚ฌ์šฉ์ž ์ธ์ฆ ๊ฐ์‚ฌ ๋ฐ ๋กœ๊ทธ ๊ธฐ๋Šฅ ์ฃผ์†Œ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ (NAT) ์ข…๋ฅ˜ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฐฉํ™”๋ฒฝ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ๋ฐฉํ™”๋ฒฝ ํ†ตํ•ฉ ์œ„ํ˜‘ ๊ด€๋ฆฌ (UTM) ๋ฐฉํ™”๋ฒฝ, IDS, IPS, ๋ฐฑ์‹  ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ์†”๋ฃจ์…˜์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•œ ์žฅ๋น„ ํŽธ์˜์„ฑ์ด ๋†’๊ณ  ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Œ ํ—ˆ๋‹ˆํŒŸ ๊ณต๊ฒฉ์ž์˜ ๊ณต๊ฒฉ์„ ์œ ๋„ํ•˜์—ฌ ๊ณต๊ฒฉ์ž์˜ ํ–‰๋™์„ ๋ถ„์„ํ•˜๋Š” ์‹œ์Šคํ…œ ์Šค๋…ธํŠธ ํ˜ธ์ŠคํŠธ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค IDS ํŒจํ‚ท ๋””์ฝ”๋” : ํ”„๋กœํ† ์ฝœ ํ—ค๋” ์‹๋ณ„ ๋ฐ ๊ฒฉ๋ฆฌ ํƒ์ง€ ์—”์ง„ : ๊ทœ์น™ ์ง‘ํ•ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ํŒจํ‚ท์„ ๋ถ„์„ ๋กœ๊ฑฐ : ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ ํŒจํ‚ท์„ ์†Œํ˜•์œผ๋กœ ์ €์žฅ ๊ฒฝ๊ณ  : ํƒ์ง€๋œ ํŒจํ‚ท์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋ƒ„ SSL/TLS/VPN SSL์˜ ๊ธฐ๋ณธ ๊ฐœ๋… SSL/TLS ํ”„๋กœํ† ์ฝœ ๊ตฌ์„ฑ Handshake Layer : Handshake, Cipher spec ๋ณ€๊ฒฝ, Alert ํ”„๋กœํ† ์ฝœ๋กœ ๊ตฌ์„ฑ Record Layer : ๋‹จํŽธํ™”, ์••์ถ•, ๋ฌด๊ฒฐ์„ฑ, ์•”ํ˜ธํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Record ํ”„๋กœํ† ์ฝœ๋กœ ๊ตฌ์„ฑ SSL/TLS Handshake client->server hello server->client hello certificate : ์„œ๋ฒ„ ์ธ์ฆ์„œ server key exchange : ์„œ๋ฒ„ ํ‚ค ๊ตํ™˜ certificate_request : ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ์š”์ฒญ (์„ ํƒ) hello done client->server certificate : ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ (์„ ํƒ) client key exchange : ํด๋ผ์ด์–ธํŠธ ํ‚ค ๊ตํ™˜ certificate_verify : ์„œ๋ฒ„ ์ธ์ฆ์„œ ๊ฒ€์ฆ (์„ ํƒ) change cipher spec finished server->client change cipher spec finished Change Cipher Spec Protocol ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์ƒˆ๋กœ์šด ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ Alert Protocol ์˜ค๋ฅ˜ ๋ฐœ์ƒ์‹œ ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ํ†ต๋ณดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฒฝ๊ณ ์™€ ์‹ฌ๊ฐ์œผ๋กœ ๋ถ„๋ฅ˜, ์‹ฌ๊ฐ์˜ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ ์ข…๋ฃŒ Record Protocol ๋™์ž‘๊ณผ์ • : ๋‹จํŽธํ™” -> ์••์ถ•(์„ ํƒ) -> MAC ์ฒจ๋ถ€ -> ์•”ํ˜ธํ™” -> SSL ๋ ˆ์ฝ”๋“œ ํ—ค๋” ๋ถ™์ด๊ธฐ MAC : ํ‚ค ๊ณต์œ ๊ณผ์ •์—์„œ ๋„์ถœ๋œ ๋น„๋ฐ€ํ‚ค ์‚ฌ์šฉ ์•”ํ˜ธํ™” : ์••์ถ•๋œ ๋ฉ”์‹œ์ง€์™€ MAC์„ ๋Œ€์นญ ์•”ํ˜ธ๋กœ ์•”ํ˜ธํ™” SSL vs TLS Handshake์—์„œ์˜ ์ฐจ์ด์  TLS๋กœ ๋ฐœ์ „ํ•˜๋ฉด์„œ Handshake ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค„์ž„ ์‚ฌ์šฉํ•˜๋Š” ์ด ์•”ํ˜ธ ๊ทธ๋ฃน ์ˆ˜๋ฅผ ์ค„์—ฌ ํ”„๋กœ์„ธ์Šค ์†๋„๋ฅผ ํ–ฅ์ƒ Alert์—์„œ์˜ ์ฐจ์ด์  ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€ ์œ ํ˜•์ด ์ถ”๊ฐ€๋จ TLS Alert๋Š” ๋ณด์•ˆ์„ ์œ„ํ•ด ์•”ํ˜ธํ™”๋˜์–ด ์ „์†ก๋จ ๋ฉ”์‹œ์ง€ ์ธ์ฆ์—์„œ์˜ ์ฐจ์ด์  SSL์€ MAC์„ ์‚ฌ์šฉ, TLS๋Š” HMAC์„ ์‚ฌ์šฉ Cipher suite์—์„œ์˜ ์ฐจ์ด์  ์ทจ์•ฝํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(RC4, DES) ์‚ฌ์šฉ ์ค‘๋‹จ ์‹ ๊ทœ ํ‚ค ๊ตํ™˜, ๊ฒ€์ฆ, ์•”ํ˜ธํ™”, MAC ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ์šฉ TLS๋Š” ๋ฒ„์ „ ๋ณ„๋กœ ์ง€์›ํ•˜๋Š” Cipher suite๊ฐ€ ๋‹ค๋ฆ„ SSL/TLS ํ™œ์šฉ TLS ์„œ๋ฒ„ ๊ตฌ์ถ• ๋ฐฉ๋ฒ• ํ‚ค์Œ ์ƒ์„ฑ ์ƒ์„ฑํ•œ ๊ณต๊ฐœํ‚ค๋ฅผ ๋„ฃ์–ด์„œ CSR ์ƒ์„ฑ, ๊ฐœ์ธํ‚ค๋กœ ์ „์ž ์„œ๋ช… CSR์„ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰๊ธฐ๊ด€์— ์ „์†ก ์ธ์ฆ์„œ ๋ฐœ๊ธ‰๊ธฐ๊ด€์€ CSR์˜ ์ „์ž ์„œ๋ช…์„ CSR์— ํฌํ•จ๋œ ๊ณต๊ฐœํ‚ค๋กœ ์„œ๋ช… ๊ฒ€์ฆ ์‚ฌ์šฉ์ž์˜ ๊ณต๊ฐœํ‚ค์™€ ์ถ”๊ฐ€์ •๋ณด(๋„๋ฉ”์ธ, ์ด๋ฉ”์ผ ๋“ฑ)๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์›น์„œ๋ฒ„์— ์ ์šฉ SSL/TLS ์„œ๋ฒ„์˜ ๋ณด์•ˆ ๊ฐ•ํ™” HSTS (HTTP Strict Transport Security) HTTPS๋กœ๋งŒ ํ†ต์‹ ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ธฐ์ˆ  ํ—ค๋”์— Strict-Transport-Security๋ฅผ ์„ค์ • max-age ๊ธฐ๊ฐ„๋™์•ˆ ์ž๋™ ์ ์šฉ SSL/TLS ์ทจ์•ฝ์  TLSv1.2์ด์ „์˜ ํ”„๋กœํ† ์ฝœ์€ ์ทจ์•ฝ์ ์ด ์กด์žฌ POODLE (Padding Oracle On Downgraded Legacy Encryption) ๋ธ”๋ก ์•”ํ˜ธํ™” ๊ธฐ๋ฒ•์ธ CBC ๋ชจ๋“œ ์‚ฌ์šฉ์‹œ ์•”ํ˜ธ๋ฌธ์ด MAC์— ์˜ํ•ด ๋ณดํ˜ธ๋˜์ง€ ์•Š๋Š” ์ทจ์•ฝ์  DROWN (Decrypting RSA with Obsolete and Weakened eNcryption) ๊ณต๊ฒฉ์ž๊ฐ€ SSLv2 proves๋ฅผ ์†ก์‹ ํ•˜์—ฌ ํ‚ค๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์  BEAST (Browser Exploit Against SSL/TLS) CBC์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•ด HTTPS ์ฟ ํ‚ค๋ฅผ ํ•ด๋…ํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์  FREAK (Factoring RSA Export Keys) SSL ์„œ๋ฒ„๊ฐ€ ๊ณต๊ฒฉ์— ์˜ํ•ด ์ˆ˜์ถœ์šฉ RSA๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ์‹œํ‚จํ›„ Brute-force๋กœ ํ‚ค๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์ทจ์•ฝ์  Logjam SSL ์„œ๋ฒ„๊ฐ€ ๊ณต๊ฒฉ์— ์˜ํ•ด ์ˆ˜์ถœ์šฉ DHE๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ์‹œํ‚จํ›„ Brute-force๋กœ ํ‚ค๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์ทจ์•ฝ์  Heartbleed OpenSSL 1.0.1์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ทจ์•ฝ์  ์ทจ์•ฝ์  ๋Œ€์‘ ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž : ์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ, Cipher suite๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •, ์ฒ ์ €ํ•œ ๋น„๋ฐ€ํ‚ค ๊ด€๋ฆฌ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž : ์ตœ์‹  ๋ฒ„์ „์˜ ๋ธŒ๋ผ์šฐ์ € ์œ ์ง€, ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ ํ™•์ธ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ ์ž์ œ ๊ณตํ†ต : ์ตœ์‹  SLS/TLS ํ”„๋กœํ† ์ฝœ ์†Œํ”„ํŠธ์›จ์–ด ์‚ฌ์šฉ HTTPS ํŒจํ‚ท ์ฐจ๋‹จ ๊ธฐ์ˆ  ๋ฐ ์ด์Šˆ DNS ์„œ๋ฒ„ ์‘๋‹ต ๋ณ€์กฐ ๋ฐ IP ์ฐจ๋‹จ DNS ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๋ณ€์กฐํ•˜์—ฌ HTTPS ์ ‘์†์„ ์ฐจ๋‹จํ•˜๋Š” ๊ธฐ์ˆ  CDN ์„œ๋ฒ„ ๊ฒฝ์œ ๋ฅผ ํ†ตํ•ด ์šฐํšŒํ•˜๋Š” ์‚ฌ๋ก€๊ฐ€ ๋“ฑ์žฅ -> ํŒจํ‚ท ๋ถ„์„ ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ ํŒจํ‚ท ๋ถ„์„ ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ ํŒจํ‚ท์„ ๋ถ„์„ํ•˜์—ฌ HTTPS ํŒจํ‚ท์„ ์ฐจ๋‹จํ•˜๋Š” ๊ธฐ์ˆ  DPI (Deep Packet Inspection) : ํŒจํ‚ท์˜ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ฐจ๋‹จ HTTPS SNI ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ TLS ํ†ต์‹  ํ‘œ์ค€์„ ์—ญ์ด์šฉํ•œ ์ฐจ๋‹จ ๋ฐฉ๋ฒ• SNI๋Š” Client Hello ๋‹จ๊ณ„์—์„œ ํ‰๋ฌธ์œผ๋กœ ์ „์†ก๋œ๋‹ค๋Š” ํŠน์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ฐจ๋‹จ TLS ์•…์šฉ๊ณผ ๋Œ€์‘ ๊ธฐ์ˆ  ์•…์šฉ์‚ฌ๋ก€ ์ •๋ณด ์œ ์ถœ ๊ฒฝ๋กœ๋กœ์˜ ์•…์šฉ SSL/TLS ๊ธฐ์ˆ ์„ ์—ญ์ด์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ์ •๋ณด ์œ ์ถœ ์‹œ ๋‚ด์šฉ์„ ์•Œ ์ˆ˜ ์—†๋„๋ก ํ•จ ์•…์„ฑ ์ฝ”๋“œ ์œ ์ž… ํ†ต๋กœ๋กœ์˜ ์•…์šฉ SSL/TLS ๊ธฐ์ˆ ์„ ์ด์šฉํ•˜์—ฌ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์œ ํฌํ•˜๋Š” ํ†ต๋กœ๋กœ ์‚ฌ์šฉ ๋Œ€์‘ ๊ธฐ์ˆ  TLS ๊ฐ€์‹œ์„ฑ ํ™•๋ณด ๊ธฐ์ˆ  SSL/TLS์„ ๋ณตํ˜ธํ™” ํ•ด ๊ฐ€์‹œ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ธฐ์ˆ  TLS Fingering ๊ธฐ์ˆ  TLS Handshake ๋ฐ ํŠธ๋ž˜ํ”ฝ์—์„œ ํŠน์ง•์„ ์ถ”์ถœํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ธฐ์ˆ  ๋ฉ”์‹œ์ง€๋ฅผ ์ฑ„์ทจ -> ํ•„๋“œ ์ถ”์ถœ -> ์ง€๋ฌธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ -> ์ €์žฅ ๋ฐ ๋น„๊ต ๊ธฐ๋ฒ• ์‚ฌ์šฉ ์˜ˆ์‹œ : JA3, ์ธ๊ณต์ง€๋Šฅ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ  IPSec IP ํŒจํ‚ท์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ IPSec ๊ฐœ์š” ์ œ๊ณต : ์ธ์ฆ, ๊ธฐ๋ฐ€์„ฑ, ํ‚ค ๊ด€๋ฆฌ ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ ์ „์†ก ๋ชจ๋“œ : ํŽ˜์ด๋กœ๋“œ๋งŒ ์•”ํ˜ธํ™” ํ„ฐ๋„ ๋ชจ๋“œ : ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ ๋ชจ๋‘ ์•”ํ˜ธํ™” ํ”„๋กœํ† ์ฝœ AH(Authentication Header) ์ œ๊ณต : ์ธ์ฆ, ๋ฌด๊ฒฐ์„ฑ ESP(Encapsulating Security Payload) ์ œ๊ณต : ์ธ์ฆ, ๊ธฐ๋ฐ€์„ฑ, ๋ฌด๊ฒฐ์„ฑ ESP ๋‹จ๋… ์‚ฌ์šฉ ๋˜๋Š” ESP+AH ์‚ฌ์šฉ(ํ„ฐ๋„๋ชจ๋“œ) IKE (Internet Key Exchange)
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 [๋ชจ๊ฐ์ฝ”24ํ•˜๊ณ„] 05 : ๊ฒฐ๊ณผ
๐Ÿ‘จโ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ”
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„๋ฅผ ์ง„ํ–‰์ค‘์ด๋‹ค. ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์€ 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 Express&React ํ”„๋กœ์ ํŠธ์— Recaptcha v3 ์ ์šฉํ•˜๊ธฐ
๐ŸŒ Javascript
์ƒํ™ฉ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ “์•Œ๋ก"์„ ๊ฐœ๋ฐœํ•˜๋˜ ์ค‘, ์‚ฌ์šฉ์ž๊ฐ€ ์•…์˜์ ์ธ ๋ชฉ์ ์œผ๋กœ ๋ฐ˜๋ณต์ ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋ง‰์„๊นŒ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์กฐ์‚ฌ๋ฅผ ํ†ตํ•ด Google์—์„œ ์ œ๊ณต๋˜๋Š” Recaptcha๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ณต๊ฒฉ์ž์˜ ์ž…์žฅ์—์„œ ์ƒ๊ฐํ–ˆ์„ ๋•Œ, ์ง€๊ธˆ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ทจ์•ฝํ•œ ๋ถ€๋ถ„์€ ํšŒ์›๊ฐ€์ž…์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…์€ ํšŒ์›์ด ์•„๋‹Œ ์ž๊ฐ€, ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ทœ์น™๋งŒ ๋งŒ์กฑํ•œ๋‹ค๋ฉด ๋ฐ˜๋ณต์ ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ , ์ด๋Š” DB์— ๋ฐ”๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํšŒ์›๊ฐ€์ž… ๋ถ€๋ถ„์— Recaptcha๋ฅผ ์ ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. Recaptcha๋ž€? Recaptcha๋Š” ๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฌด๋ฃŒ ๋ณด์•ˆ ์„œ๋น„์Šค๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๋ด‡์ด ์•„๋‹˜์„ ์ฆ๋ช…ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ง€์› ์ข…๋ฃŒ๋œ v1์„ ์ œ์™ธํ•˜๋ฉด v2, v3 ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์ด ์žˆ๋‹ค. v2๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ‘๋‚˜๋Š” ๋กœ๋ด‡์ด ์•„๋‹™๋‹ˆ๋‹ค’๋ฅผ ํด๋ฆญํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธ์ฆ์ด ์™„๋ฃŒ๋œ๋‹ค. v3๋Š” ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ ์—†์ด ์ž๋™์œผ๋กœ ์ธ์ฆ์ด ์™„๋ฃŒ๋œ๋‹ค. ํ•„์ž๋Š” ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜๊ณผ ์ด๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋‚˜์˜ ๊ณ ์ƒ์„ ๋œ๊ธฐ ์œ„ํ•ด v3๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. v3์˜ ์ž‘๋™ ๋ฐฉ์‹ ์‚ฌ์šฉ์ž์˜ ๋งˆ์šฐ์Šค ํด๋ฆญ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ, ์Šคํฌ๋กค, ์š”์ฒญ ํŒจํ„ด ๋“ฑ์„ ๋ถ„์„ํ•˜์—ฌ ์ ์ˆ˜๋ฅผ ๋งค๊ธด๋‹ค. ์ ์ˆ˜๋Š” 0.0 ~ 1.0 ์‚ฌ์ด์˜ ๊ฐ’์œผ๋กœ, 0.0์€ ๋กœ๋ด‡, 1.0์€ ์‚ฌ๋žŒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” Recaptcha๊ฐ€ ํ‰๊ฐ€ํ•œ ์ ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์ผ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€์— ์ ‘์†ํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋‹จ์—์„œ Recaptcha ํ‚ค๋ฅผ Recaptcha ํ† ํฐ์„ ๋ฐ›์•„์˜จ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์›๊ฐ€์ž… ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, Recaptcha ํ† ํฐ์„ ํ•จ๊ป˜ ์ „๋‹ฌํ•œ๋‹ค. ์„œ๋ฒ„์—์„œ Recaptcha ํ† ํฐ์„ ๊ฒ€์ฆํ•˜๊ณ , ์ ์ˆ˜๊ฐ€ 0.5๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค. ์ ์šฉ ์‚ฌ์ „ ์„ค์ • https://www.google.com/recaptcha/์— ์ ‘์†ํ•˜์—ฌ ๋„๋ฉ”์ธ์„ ๋“ฑ๋กํ•˜๊ณ  ํ‚ค๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ž์„ธํ•œ ๊ณผ์ •์€ ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ์—๋„ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์–ด์„œ ์ƒ๋žตํ•œ๋‹ค. Server (Express) user-service.ts 1// ์„œ๋น„์Šค ๋ ˆ์ด์–ด์— ์ถ”๊ฐ€ํ•œ Recaptcha ๊ฒ€์ฆ ํ•จ์ˆ˜ 2static async verifyRecaptcha(token: string): Promise<void> { 3 // Recaptcha ๊ฒ€์ฆ 4 const response = await fetch( 5 // ํ‚ค๋Š” Recaptcha ์‚ฌ์ดํŠธ์—์„œ ๋ฐ›์€ ๊ฒƒ์ด๋ฉฐ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌ 6 `https://www.google.com/recaptcha/api/siteverify?secret=${process.env.RECAPTCHA_SECRET_KEY}&response=${token}`, 7 { 8 method: "POST", 9 } 10 ); 11 // ๊ฒฐ๊ณผ๋ฅผ JSON์œผ๋กœ ํŒŒ์‹ฑ 12 const verificationReuslt = await response.json(); 13 14 // ์ ์ˆ˜๊ฐ€ 0.5๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง 15 if (verificationReuslt.score <= 0.5) { 16 throw new RecaptchaScoreTooLowError(); 17 } 18 19 // ์„ฑ๊ณต ์—ฌ๋ถ€๊ฐ€ false์ด๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง (ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ) 20 if (!verificationReuslt.success) { 21 throw new RecaptchaTokenInvalidError(); 22 } 23} user-router.ts 1// ์ปจํŠธ๋กค๋Ÿฌ ๋ถ€๋ถ„์—์„œ ๋ถ€๋ถ„์—์„œ Recaptcha ๊ฒ€์ฆ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ, ๋ฐœ์ƒ์‹œํ‚จ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌ 2try { 3 await UserService.verifyRecaptcha(recaptchaToken); 4 await UserService.createUser(username, password); 5 res.status(201).send("User created successfully"); 6} catch (err: any) { 7 // Recaptcha ์ ์ˆ˜๊ฐ€ ๋‚ฎ์€ ๊ฒฝ์šฐ -> 403 Forbidden 8 if (err instanceof RecaptchaScoreTooLowError) { 9 res.status(403).send(err.message); 10 // Recaptcha ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ -> 400 Bad Request 11 } else if (err instanceof RecaptchaTokenInvalidError) { 12 res.status(400).send(err.message); 13 } else if (err instanceof UserAlreadyExistsError) { 14 res.status(409).send(err.message); 15 } else { 16 console.error(err); 17 res.status(500).send(err.message); 18 } 19} Client (React) App.tsx 1import { GoogleReCaptchaProvider } from "react-google-recaptcha-v3"; 2 3return ( 4 // ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— GoogleReCaptchaProvider๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Recaptcha ํ‚ค๋ฅผ ์ „๋‹ฌ 5 <GoogleReCaptchaProvider 6 reCaptchaKey={process.env.REACT_APP_RECAPTCHA_SITE_KEY || ""} 7 > 8 <Router> 9 {/* ... */} 10 </Router> 11 </GoogleReCaptchaProvider> 12); SignupPage.tsx 1import { useGoogleReCaptcha } from "react-google-recaptcha-v3"; 2 3const SignupPage: React.FC = () => { 4 // useGoogleReCaptcha ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ Recaptcha ํ† ํฐ์„ ๋ฐ›์•„์˜ด 5 const { executeRecaptcha } = useGoogleReCaptcha(); 6 7 const handleSignup = async () => { 8 // Recaptcha ํ† ํฐ์„ ๋ฐ›์•„์˜ค๊ธฐ๋„ ์ „์— ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์›๊ฐ€์ž…์„ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ 9 if (!executeRecaptcha) { 10 console.log("Execute recaptcha not yet available"); 11 return; 12 } 13 // Recaptcha ํ† ํฐ์„ ๋ฐ›์•„์˜ด (signup์€ action์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด) 14 const recaptchaToken = await executeRecaptcha("signup"); 15 16 if (password !== confirmPassword) { 17 alert("๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."); 18 return; 19 } 20 21 try { 22 const response = await api.post<SignupResponse>("/users/signup", { 23 username, 24 password, 25 // ์„œ๋ฒ„๋กœ Recaptcha ํ† ํฐ์„ ์ „๋‹ฌ 26 recaptchaToken, 27 }); 28 } catch() { 29 // ... 30 } 31 }; 32}; ๊ฒฐ๊ณผ ๊ด€๋ฆฌ์ž ์ฝ˜์†”์„ ํ†ตํ•ด Recaptcha๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆ๋œ ์š”์ฒญ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
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 ํ˜„๋Œ€์ธ์˜ ์ƒํ™œ๋ฌธํ™”
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๊ธ€๋กœ๋ฒŒ ๋งค๋„ˆ ๋งค๋„ˆ ์ธ๊ฐ„๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋ฐ ์žˆ์–ด ์ค‘์š”ํ•œ ์š”์†Œ ์–ด์› : 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) ๋ฐฉ์‹์„ ์œ„ํ•ด ํŒฌ๊ณผ ์˜ค๋ธ ์‚ฌ์šฉ, ํฌํฌ ๋‚˜์ดํ”„ ์‚ฌ์šฉ ๊ธ€๋กœ๋ฒŒ์ „ํ†ต์Œ์‹ : ๋ธŒ๋ผ์งˆ, ์ค‘๊ตญ ํ•œ๊ตญ, ์ผ๋ณธ, ์ค‘๊ตญ์˜ ์ “๊ฐ€๋ฝ ๋น„๊ต ํ•œ๊ตญ ์ผ๋ณธ ์ค‘๊ตญ ๋ช…์นญ ์ “๊ฐ€๋ฝ ํ•˜์‹œ ์ฝฐ์ด์ฆˆ ์žฌ์งˆ ๊ธˆ์† ๋‚˜๋ฌด ํ”Œ๋ผ์Šคํ‹ฑ, ๋Œ€๋‚˜๋ฌด ํ˜•ํƒœ ๋‚ฉ์ž‘ํ•˜๊ณ , ๊ตต๊ธฐ ์ฐจ์ด๊ฐ€ ์ ๋‹ค ๋์ด ๋พฐ์กฑํ•˜๊ณ  ๊ธธ์ด๊ฐ€ ์งง๋‹ค, ๊ตต๊ธฐ ์ฐจ์ด๊ฐ€ ํฌ๋‹ค ๊ธธ์ด๊ฐ€ ๊ธธ๋‹ค, ๊ตต๊ธฐ ์ฐจ์ด๊ฐ€ ํฌ๋‹ค ์ค‘๊ตญ์˜ ์‹์‚ฌ ์˜ˆ์ ˆ ํฐ ์ ‘์‹œ์˜ ์Œ์‹์„ ๋‚˜๋ˆ„์–ด ๋จน๋Š”๋‹ค ์ขŒ์„๋ฐฐ์น˜ : ์ฃผ๋นˆ์ด ๋˜๋Š” ์†๋‹˜์ด ์ƒ์„(์•ˆ์ชฝ)์— ์•‰๊ณ  ์ฃผ์ธ์€ ํ•˜์„ (๋ฐ”๊นฅ์ชฝ)์— ์•‰๋Š”๋‹ค ์ฃผ๋นˆ ์šฐ์„  : ์Œ์‹์ด ๋‚˜์˜ค๋ฉด ์ฃผ๋นˆ ์•ž์— ๋†“๊ณ , ์ˆ ์˜ ์ข…๋ฅ˜๋„ ๋ฌผ์–ด์„œ ์ •ํ•œ๋‹ค ์Šคํ‘ผ์€ ํƒ•์„ ๋จน์„ ๋•Œ๋งŒ ์‚ฌ์šฉ, ๋ฐฅ์ด๋‚˜ ํƒ•์ด ๋‹ด๊ธด ๊ทธ๋ฆ‡์€ ๋“ค๊ณ  ๋จน๋Š”๋‹ค. ์‚ฌ์šฉํ•œ ์ˆŸ๊ฐ€๋ฝ์€ ๋’ค์ง‘์–ด ๋†“๋Š”๋‹ค ํšŒ์ ์‹ํƒ : ์˜ˆ์˜์ƒ ๊ฐ™์ด ๋Œ๋ ค์ค€๋‹ค. ๊ฐœ์ธ ์ ‘์‹œ๋‚˜ ์ปต์„ ๋†“์ง€ ์•Š๋Š”๋‹ค. ๊ธ€๋กœ๋ฒŒ ์ „ํ†ต์Œ์‹ : ํ”„๋ž‘์Šค ํ”„๋ž‘์Šค์—์„œ ๊ธˆ๊ธฐ์‹œ ๋˜๋Š” ํ–‰๋™ ์‚ฌ๋žŒ ์•ž์—์„œ ์ฝ”๋ฅผ ํ›Œ์ฉ ๊ฑฐ๋ฆฌ๋Š” ํ–‰๋™ ๋ฐ–์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ๋ชธ์ด ๋‹ฟ์•˜์„ ๋•Œ ์‚ฌ๊ณผ๋ฅผ ํ•˜์ง€ ์•Š๋Š” ํ–‰๋™ ์‹๋‹น์—์„œ ์ง์›์„ ๋ถ€๋ฅด๋Š” ํ–‰๋™ (๋ˆˆ์ด ๋งˆ์ฃผ์น˜๋ฉด ๋ˆˆ์ง“์œผ๋กœ ํ˜ธ์ถœ) ์™ธ๋ชจ (๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ๊ฒƒ)์— ๋Œ€ํ•œ ์–˜๊ธฐ (์นœํ•œ ์‚ฌ์ด๋ผ๋„) ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๊ณผ ๋ˆˆ์ด ๋งˆ์ฃผ์น˜๋Š” ๊ฒƒ ํ”„๋ž‘์Šค ์ฝ”์Šค ์š”๋ฆฌ ์ˆœ์„œ ์•„ํŽ˜๋ฆฌํ‹ฐํ”„(์‹์ „์ฃผ) ์•™ํŠธ๋ ˆ / ์˜คํ ๋˜๋ธŒํ ์ ๋ผ (์ƒ์„  ์š”๋ฆฌ / ์œก๋ฅ˜ ์š”๋ฆฌ) ํ”„๋กœ๋งˆ์ฅฌ (์น˜์ฆˆ) ๋””์ €ํŠธ ์ปคํ”ผ / ์ฐจ ํ…Œ์ด๋ธ” ๋งค๋„ˆ ์ดˆ๋Œ€์ž์—๊ฒŒ ๊ฐ์‚ฌ์˜ ํ‘œ์‹œ๋กœ ๊ฝƒ์ด๋‚˜ ํฌ๋„์ฃผ, ํ™”์ดˆ ๋“ฑ์˜ ๊ฐ€๋ฒผ์šด ์„ ๋ฌผ์„ ํ•˜๊ณ , ์„ ๋ฌผ์€ ์•ˆ์ฃผ์ธ์—๊ฒŒ ๊ฑด๋‚ธ๋‹ค ๋ฏธ๋ฆฌ ์ด์•ผ๊ธฐ ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉด, ์Œ์‹์€ ์„ ๋ฌผํ•˜์ง€ ๋ง์ž, ๊ณผ์ž๋‚˜ ์ผ€์žŒ์ด ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค ์Œ์‹์€ ์ ˆ๋Œ€ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค (๋ง› ์—†์–ด์„œ ๋‚จ๊ธด๊ฑธ๋กœ ๊ฐ„์ฃผ) ์Œ์‹์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค “๋ง›์žˆ๋‹ค"๋Š” ์นญ์ฐฌ์„ ๋นผ๋†“์•„์„œ๋Š” ์•ˆ๋œ๋‹ค ํ”„๋ž‘์Šค ์™€์ธ ์ถ•์ œ ๋ณด๋ฅด๋„ ์™€์ธ ํŽ˜์Šคํ‹ฐ๋ฒŒ ๋ณด์กธ๋ ˆ ๋ˆ„๋ณด ์ถ•์ œ ํ”„๋ž‘์Šค ๋Œ€ํ‘œ ์Œ์‹ ๋ฐ”๊ฒŒํŠธ : ๋ฐ€๊ฐ€๋ฃจ + ๋ฌผ + ์†Œ๊ธˆ + ์ด์ŠคํŠธ ํฌ๋กœ์™€์ƒ : ๋ฐ”๊ฒŒํŠธ ์žฌ๋ฃŒ + ์„คํƒ• + ๋ฒ„ํ„ฐ + ๋ถ„์œ  ์—์Šค๊นŒ๋ฅด๊ณ  : ์‹์šฉ ๋‹ฌํŒฝ์ด ํ‘ธ์•„๊ทธ๋ผ : ์ง€๋ฐฉ์ด ๋งŽ์€ ๊ฑฐ์œ„์˜ ๊ฐ„ ํฌ๋ ˆํ”„ : ๋ฐ€๊ฐ€๋ฃจ๋‚˜ ๋ฉ”๋ฐ€๊ฐ€๋ฃจ ๋ฐ˜์ฃฝ์„ ์–‡๊ฒŒ ๋ถ€์น˜๊ณ  ๊ทธ ์œ„์— ๋‹ค์–‘ํ•œ ์†์žฌ๋ฃŒ๋ฅผ ์–น์–ด ์‹ธ๋จน๋Š” ๋ฐฉ์‹
  • ««
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
  • »»
๐Ÿง  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)