๐ŸŒ†โ”‚Web_Study/๐ŸฅŠโ”‚pentestgym

์›น ์„œ๋ฒ„์ธก ๊ธฐ์ˆ 

Jastes 2023. 7. 6. 17:53

๐Ÿ’กํ•ด๋‹น ๋‚ด์šฉ์€ pentestqym์˜ ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋ฉฐ,
   ๋ชจ๋“  ์ €์ž‘๊ถŒ์€ ํ•ด๋‹น ์‚ฌ์ดํŠธ์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค.

 ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์  ์›น ์ปจํ…์ธ ๋ฅผ ์„œ๋น„์Šคํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„์ธก์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์›น ์„œ๋ฒ„, ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŠธ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์˜ ๊ธฐ์ˆ ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค.


๊ฐœ์š”

 ์„œ๋ฒ„ ์ธก(Server-Side) ๊ธฐ์ˆ ์ด๋ž€ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋ชจ๋ธ[๊ฐ์ฃผ:1]์—์„œ ํด๋ผ์ด์–ธํŠธ, ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ๊ธฐ์ˆ ์„ ๋งํ•ฉ๋‹ˆ๋‹ค

 ์„œ๋ฒ„์ธก ๊ธฐ์ˆ ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌํ˜„์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์„œ๋ฒ„์‚ฌ์ด๋“œ ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด(Ex. PHP), ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Ex. MySQL), ์›น ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด(Ex. Apache) ๋“ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์€ ์›น ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งž์ถคํ˜• ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

 ์ด๋Ÿฌํ•œ ๋ชฉ์ ์€ ๊ธฐ์ˆ ์˜ ๋ฐœ์ „์œผ๋กœ ์žˆ๋Š” ํŒŒ์ผ(Ex. DOM)์„ ๋‹จ์ˆœํžˆ ๋ณด์—ฌ์ฃผ๋Š”๊ฒƒ์— ๊ทธ์น˜๋Š” ์ •์ ์ธ ์›น์—์„œ ๋™์ ์œผ๋กœ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์˜ ๋ฐœ์ „์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.


์„œ๋ฒ„ ์ธก ๋™์ž‘

๋”๋ณด๊ธฐ
  1. ์›น ๋ธŒ๋ผ์šฐ์ € → ์„œ๋ฒ„ HTTP ์š”์ฒญ
  2. ์ˆ˜์‹ ๋œ ์š”์ฒญ์€ ์›น ์„œ๋ฒ„(WAS)์— ๋ฐ›์•„ ์ „์†ก๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ Server-Side Script์— ์ „๋‹ฌ
    - Nginx, Apache, JBoss ๋“ฑ์ด ์‚ฌ์šฉ๋จ
  3. ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•˜์—ฌ DB ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋กœ ์งˆ์˜๋ฅผ ๋ณด๋ƒ„
    - PHP, Pytho ๋“ฑ์ด ์‚ฌ์šฉ๋จ

  4. DB์—์„œ ์ „๋‹ฌ๋œ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์งˆ์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•œ ๋ ˆ์ฝ”๋“œ์…‹[๊ฐ์ฃผ:2]์œผ๋กœ  ๋ฐ˜ํ™˜
    - ์ฃผ๋กœ Mysql, MSsql, Oracle, Postgresql ๋“ฑ์ด ์‚ฌ์šฉ๋จ
  5. ๋‹ค์‹œ Server-side Script์— HTML Template์— DB์—์„œ ์ถ”์ถœ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์น˜ํ•จ
  6. ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŠธ๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ์ตœ์ข… ํŽ˜์ด์ง€๋ฅผ ์›น ์„œ๋ฒ„(WAS)์— ๋ฐ˜ํ™˜

  7. ์ตœ์ข… ํŽ˜์ด์ง€๋ฅผ HTTP ํ†ต์‹ ์„ ํ†ตํ•ด ์›น ๋ธŒ๋ผ์šฐ์ €์— ์‘๋‹ต

Web Server(WAS)

 ์›น ์„œ๋ฒ„๋Š” HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ œ๊ณตํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค. ์›๋ž˜๋Š” ์ •์  ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์šฉ์–ด๋กœ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ํ˜„๋Œ€์ ์œผ๋กœ๋Š” ๋™์  ์ปจํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น ์„œ๋ฒ„์™€ WAS(Web Application Server)๋Š” ๊ฐœ๋…์ ์œผ๋กœ ๊ตฌ๋ถ„๋˜์ง€๋งŒ, ํ˜„์žฌ๋Š” ๋‘ ๊ธฐ๋Šฅ์ด ํ˜ผ๋™๋˜์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›น ์„œ๋ฒ„์™€ WAS์˜ ์—ญํ• ์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ตฌ๋ณ„๋˜์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ์ !.


WAS ์„œ๋ฒ„ ์ข…๋ฅ˜๋“ค

Apache HTTP Server
 ์˜คํ”ˆ์†Œ์Šค ์›น ์„œ๋ฒ„์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, MPM(Multi-Processing Module)[๊ฐ์ฃผ:3]์„ ์ด์šฉํ•œ ๋ชจ๋“ˆ์‹ ๊ตฌ์„ฑ์„ ์ง€์›ํ•˜๋ฏ€๋กœ ํ™•์žฅ์„ฑ์ด ๋งค์šฐ ๋›ฐ์–ด๋‚œ ๊ฒƒ์ด ์žฅ์ 

ํฌ๋กœ์Šค ํ”Œ๋žซํผ[๊ฐ์ฃผ:4]์„ ์ง€์›ํ•˜๊ณ  ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ ์ •์ ๊ณผ ๋™์  ์›น ์ปจํ…์ธ ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. APM(APache Module) ์Šคํƒ์—๋Š” Apache, PHP, MySQL(๋˜๋Š” MariaDB)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, LAMP, WAMP ๋“ฑ์œผ๋กœ ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

 

NGINX
Apache HTTP ์„œ๋ฒ„์˜ ๋Œ€์•ˆ์œผ๋กœ ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ์›น ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด

  Apache HTTP ์„œ๋ฒ„์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณต(C10K ๋ฌธ์ œ[๊ฐ์ฃผ:5])ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœํ•˜์˜€์œผ๋ฉฐ, ๋” ์ ์€ ๋ฆฌ์†Œ์Šค๋กœ ๋” ๋งŽ์€ ๋™์‹œ ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ  ๋น ๋ฅธ ์„ฑ์žฅ์„ ์ด๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค. NGINX๋Š” ๋™์  ์›น ์ปจํ…์ธ  ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ์‹œ์žฅ์—์„œ์˜ ์ ์œ ์œจ์ด ๊พธ์ค€ํžˆ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

Historical quarterly trends in the usage statistics of web servers, July 2023

 

w3techs.com

 

 ๊ทธ ์ด์™ธ์—๋„ Google Web Server, IIS, Apache Tomcat ๋“ฑ ๋งŽ์ด ์žˆ์ง€๋งŒ, ๋Œ€์ถฉ ์–ด๋–ค ์„œ๋น„์Šค์ธ์ง€๋งŒ ์•Œ์•„๋ณด๋Š” ๊ฒƒ์ด๊ธฐ์— ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๊ณต๋ถ€ํ•˜์‹œ๋‹ค๋ณด๋ฉด ๊ธˆ๋ฐฉ ํŠน์ง•์„ ์•Œ ์ˆ˜ ์žˆ์„๊ฒ๋‹ˆ๋‹ค.


์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŠธ

 ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์  ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋กœ, ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž ์š”์ฒญ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ, ์˜จ๋ผ์ธ ์‡ผํ•‘๋ชฐ, ์ด๋ฉ”์ผ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 ์ฆ‰, ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŠธ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์  ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ๊ณผ ์‚ฌ์šฉ์ž ์š”์ฒญ ์ฒ˜๋ฆฌ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŠธ๋Š” ์„œ๋ฒ„์—์„œ๋งŒ ์‹คํ–‰๋˜๊ณ , ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ํด๋ผ์ด์–ธํŠธ์ธก ์Šคํฌ๋ฆฝํŠธ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๋กœ์ปฌPC์— ์ €์žฅ๋˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๋Š” ์„œ๋ฒ„์ธก์—์„œ ๋™์  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด๋Š” ์„œ์ ์ด๋‚˜ ์ „๋ฌธ ๊ต์œก์„ ํ†ตํ•ด ํ•™์Šตํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค(์š”์ฒญํ•˜์‹œ๋ฉด ์ •๋ฆฌํ•ด์„œ ์˜ฌ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.. ์•„๋งˆ๋„)


PHP
์˜คํ”ˆ์†Œ์Šค ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๋กœ์„œ ์ •์  ๋ฐ ๋™์  ์›น ์‚ฌ์ดํŠธ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ

  PHP๋กœ ๊ฐœ๋ฐœ๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์†Œ๊ทœ๋ชจ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ๊นŒ์ง€ ๋‹ค์–‘ํ•˜๋ฉฐ, ํŽ˜์ด์Šค๋ถ๊ณผ ๊ฐ™์€ ๋Œ€ํ˜• ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋„ PHP๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. PHP๋ฅผ ํ™œ์šฉํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์ƒ์šฉ ์†”๋ฃจ์…˜์ด ์ œ๊ณต๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ธ”๋กœ๊ทธ - Wordpress, Joomla
  • ๊ฒŒ์‹œํŒ - PHPBB, vBulletin
  • ์ „์ž์ƒ๊ฑฐ๋ž˜, ์‡ผํ•‘ ์นดํŠธ - Prestashop, OpenCart
  • ๊ด€๋ฆฌ์ž ํŒจ๋„ - PHPMyAdmin

๋˜ํ•œ ์›น ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Laravel(๋ผ๋ผ๋ฒจ)
  • CodeIgniter(์ฝ”๋“œ์ด๊ทธ๋‚˜์ดํ„ฐ)

PHP๋Š” HTML ํŒŒ์ผ์— ์‰ฝ๊ฒŒ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด <?php ... ?>๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์˜์—ญ์„ ์‚ฝ์ž…ํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

<html>
<head>
  <title>PHP ๊ฐ„๋‹จ ์˜ˆ์ œ</title>
</head>
<body>
  <?php echo "Hello, hunters!" ?>
</body>
</html>

PHP์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์„ค๋ช…์€ ์—ฌ๊ธฐ๋กœ!

 

JSP(Jakarta Server Page or Java Server Page)
์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ๋™์  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด

 JSP(์ž๋ฐ” ์„œํ”Œ๋ฆฟ[๊ฐ์ฃผ:6])๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ[๊ฐ์ฃผ:7]๊ฐ€ ์ง€์›๋˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. JSP๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ์ปดํŒŒ์ผ๋˜์–ด ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋Š” HTML Template๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ตœ์ข…์ ์œผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์‘๋‹ต์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

 

์ž๋ฐ”์˜ ํŠน์ง•์€ ์ „๋ถ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. JSP๋„ PHP์™€ ์œ ์‚ฌํ•œ ๊ตฌ๋™์œผ๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ง€์‹œ๋ฌธ(Directive): ์ปจํ…Œ์ด๋„ˆ๊ฐ€ JSP ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ์†์„ฑ๊ณผ ๊ฐ’๋“ค์„ ์ •์˜ํ•จ
<%@ directive-name
  attribute1="value1"
  attribute2="value2"
  ...
  attributeN="valueN" 
%>
  • ํ‘œํ˜„์‹(Expression): ์–ด๋–ค ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉ๋จ
<%= Some-expression %>
  • ์„ ์–ธ๋ฌธ(Declaration): ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉ๋จ
<%! Dec var %>
  • ์Šคํฌ๋ฆฝํ‹€๋ฆฟ(Scriptlet): ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋จ
<% Some-java-code %>

๋‹ค์Œ์€ ์ž„์˜์˜ ์ˆซ์ž๊ฐ€ 100๋ณด๋‹ค ํฌ ํ‡ด๊ทผ, ์ดํ•˜๋ฉด ๋‚จ๋Š” ๋ณต๋ถˆ๋ณต๊ฒŒ์ž„ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

<html>
<head>
  <title>JSP ๊ฐ„๋‹จ ์˜ˆ์ œ</title></head><body>
  <%
    double num = Math.random(); // ์Šคํฌ๋ฆฝํ‹€๋ฆฟ์„ ์ด์šฉํ•ด if-else ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•จ.
    if (num > 100) {
  %>
      <h2>์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค. ์–ผ๋ฅธ ํ‡ด๊ทผํ•˜์„ธ์š”!</h2><p>(<%= num %>)</p> // ํ‘œํ˜„์‹์„ ์ด์šฉํ•ด num ๊ฐ’์„ ์ถœ๋ ฅํ•จ.
  <%
    } else {
  %>
      <h2>์ €๋Ÿฐ~ ๋‹น์‹ ์ด ํ•ด์•ผํ•  ์ผ์ด ์žˆ์–ด์š”.</h2><p>(<%= num %>)</p> // ํ‘œํ˜„์‹์„ ์ด์šฉํ•ด num ๊ฐ’์„ ์ถœ๋ ฅํ•จ.
  <%
    }
  %>
  <a href="<%= request.getRequestURI() %>"> // ํ‘œํ˜„์‹์„ ์ด์šฉํ•ด getRequestURI() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•จ.
    <h3>๋‹ค์‹œ ํ•ด๋ณผ๊นŒ์š”?</h3>
  </a>
</body>
</html>

๋” ์ž์„ธํ•œ ๊ณต๋ถ€๋Š” ์—ฌ๊ธฐ๋กœ!(JSP๋Š”.. ์ž๋ฃŒ๊ฐ€ ์• ๋งคํ•ด์„œ ์•ˆ ์˜ฌ๋ ธ์–ด์š”)

 

๊ทธ ์ด์™ธ์—๋„ Python, Ruby, ASP.NET ๋“ฑ์ด ์žˆ์œผ๋‚˜ ๋Œ€ํ‘œ์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์ด๊ธฐ๋„ ํ•˜๊ณ  ํŠน์ง•๋งŒ ์„ค๋ช…ํ•˜๊ธฐ์— ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.


๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB)

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ, ์ €์žฅ, ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ 

 DB๋Š” ๊ตฌ์กฐํ™”๋œ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉฐ, ํ•„์š”ํ•  ๋•Œ ์‰ฝ๊ฒŒ CRUD(์ƒ์„ฑ, ๊ฒ€์ƒ‰, ์ˆ˜์ •, ์‚ญ์ œ)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋กœ์„œ ๋‹ค์–‘ํ•œ ์œ ํ˜•๊ณผ ๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(DBMS)์— ๋Œ€ํ•ด ํŠน์ง•๊ณผ ํ•จ๊ป˜ ์•Œ์•„๋ด…์‹œ๋‹ค.


๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDB; Relational DataBase)

  ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๊ธฐ์ˆ ๋กœ, ๋Œ€๋ถ€๋ถ„์˜ DB๋Š” RDB๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฐ์ดํ„ฐ๋ฅผ Key์™€ Vaule์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ–‰๊ณผ ์—ด๋กœ ๊ตฌ์„ฑ๋œ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ข…์†์„ฑ๊ณผ ์ œ์•ฝ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

RDB๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋Œ€ํ‘œ์ ์ธ ํ˜•ํƒœ๋กœ, ์—‘์…€๊ณผ ์œ ์‚ฌํ•œ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ด ๋˜ ํ•„์š”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ DBMS(DataBase Management System)๋ผ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋กœ, DB์˜ CRUD์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 DBMS๋Š” SQL(Structured Query Language)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์กฐ์ž‘์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. SQL์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์ž‘์—…์— ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด๋กœ, ์›น ํ•ดํ‚น์—์„œ๋Š” SQL ์ธ์ ์…˜ ๊ณต๊ฒฉ์— ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

SQL์€ ํฌ๊ฒŒ ๋‹ค์Œ์˜ ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋‰˜์–ด์ง‘๋‹ˆ๋‹ค.

  • DDL (Data Definition Language, ๋ฐ์ดํ„ฐ ์ •์˜ ์–ธ์–ด)
    : CREATE, DROP, ALTER ๋“ฑ์˜ ํ…Œ์ด๋ธ”๊ณผ ์ธ๋ฑ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ๋ฌธ
CREATE TABLE employees (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT,
  department VARCHAR(50)
);
  • DML (Data Manipulation Language, ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ์–ธ์–ด)
    : INSERT, UPDATE, DELETE, SELECT ๋“ฑ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘, ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ๋ฌธ
INSERT INTO employees (id, name, age, department)
VALUES (1, 'John Doe', 30, 'IT');
  • DCL (Data Control Language, ๋ฐ์ดํ„ฐ ์ œ์–ด ์–ธ์–ด)
    : GRANT, REVOKE, COMMIT, ROLLBACK ๋“ฑ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ๋ฌธ
GRANT SELECT, INSERT ON employees TO user1;

๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(NoSQL)

 ์•ž์—์„œ ์‚ดํŽด๋ณธ RDB๋Š” ํ–‰๊ณผ ์—ด๋กœ ์ •ํ˜•ํ™”๋œ DB๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ด์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์ˆ ์˜ ๋ฐœ์ „์œผ๋กœ ์ด๋ฏธ์ง€, ์˜์ƒ ์ •ํ˜•ํ™”๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ ์ฆ‰, ๋น„์ •ํ˜•ํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

No SQL ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ณด๋‹ค ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ์„ฑ์ด ๋†’์€ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ ์†”๋ฃจ์…˜

 NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ •ํ˜•ํ™”๋˜์ง€ ์•Š์€ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ €์žฅํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. NoSQL์€ ๋‹ค์–‘ํ•œ ๋ชจ๋ธ์„ ์ œ๊ณตํ•˜๋ฉฐ, ํ‚ค-๊ฐ’ ์Šคํ† ์–ด, ๋ฌธ์„œ ์Šคํ† ์–ด, ์—ด ์ง€ํ–ฅ ์Šคํ† ์–ด, ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์˜ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. NoSQL์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์†Œ์…œ ๋ฏธ๋””์–ด, ๋กœ๊ทธ ๋ถ„์„, ์‚ฌ๋ฌผ ์ธํ„ฐ๋„ท ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ํ™œ๋ฐœํžˆ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์—” ํฌ๊ฒŒ 4๊ฐ€์ง€์˜ ์ข…๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ถ”ํ›„ ๋˜ ํ™œ์šฉ๋œ ์˜ˆ์‹œ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฐ๊ฒŒ ์žˆ๊ตฌ๋‚˜ ๋„˜์–ด๊ฐ€์…”๋„ ๋ฉ๋‹ˆ๋‹ค.


Key-Value ๋ชจ๋ธ

๋‹จ์ˆœํ•œ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ

 ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ String, Bitmaps, Hash, Lists ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Document ๋ชจ๋ธ

JSON ๋˜๋Š” BSON[๊ฐ์ฃผ:8] ํ˜•ํƒœ์˜ ๋ฌธ์„œ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. MongoDB๊ฐ€ ๋ฐ”๋กœ ์ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


Column-family ๋ชจ๋ธ

 ํ•˜๋‚˜์˜ Row Key์— ๋งคํ•‘๋˜๋Š” ๋‹ค์ˆ˜์˜ Column-value ์Œ์˜ ๋ชจ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ DBMS๋กœ๋Š” Casandra, Hbase ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.(RDB๋ž‘ ๋น„์Šทํ•œ ๋А๋‚Œ์ด์ฃ ?)


Graph ๋ชจ๋ธ

 ๋…ธ๋“œ,  ์—ฃ์ง€, ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ๋ž˜ํ”„์˜ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๊ทธ๋ฆผ์—์„œ ๊ฐ ๋…ธ๋“œ๋ฅผ ์ž‡๋Š” ์„ ์€ ๋…ธ๋“œ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ง‘ํ•ฉ ์ง€ํ–ฅ์ด๋ผ๊ธฐ ๋ณด๋‹ค๋Š” ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ DBMS๋กœ๋Š”AllegroGraph, Amazon Neptune ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ

์ฐธ๊ณ  ์ด๋ฏธ์ง€

 

  1. ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ๋Š” ์„œ๋ฒ„์—์„œ ์‘๋‹ต๋ฐ›์€ HTML, CSS๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์›น ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ๊ทธ๋ฆฌ๊ณ , ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•ด์„ํ•˜์—ฌ ์‚ฌ์šฉ์ž๋‹จ์˜ ๋™์  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. [๋ณธ๋ฌธ์œผ๋กœ]
  2. ๋ ˆ์ฝ”๋“œ์…‹์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์„ ์˜๋ฏธ [๋ณธ๋ฌธ์œผ๋กœ]
  3. ์—ฌ๋Ÿฌ ์šด์˜์ฒด์ œ ๋˜๋Š” ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ [๋ณธ๋ฌธ์œผ๋กœ]
  4. ์—ฌ๋Ÿฌ ์šด์˜์ฒด์ œ ๋˜๋Š” ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ [๋ณธ๋ฌธ์œผ๋กœ]
  5. ๊ทธ ๋‹น์‹œ์˜ ๋ฌธ์ œ์ ์œผ๋กœ Linux์˜ OS ๋ฌธ์ œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๋ฉฐ, OS์—์„œ ์ œ๊ณตํ•˜๋Š” I/O ์ฒ˜๋ฆฌ๋ฐฉ์‹์˜ ๋ฌธ์ œ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌ X์˜ ๋ฌธ์ œ์  ์ฆ‰, ๋™์‹œ์— 10000์ด์ƒ ์ ‘์†์ด ์–ด๋ ค์›€ [๋ณธ๋ฌธ์œผ๋กœ]
  6. ์ž๋ฐ”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›นํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์„œ๋ฒ„์ธก ํ”„๋กœ๊ทธ๋žจ ํ˜น์€ ๊ทธ ์‚ฌ์–‘ [๋ณธ๋ฌธ์œผ๋กœ]
  7. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค. HTTP ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ํด๋ผ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ, ์„œ๋ธ”๋ฆฟ๊ณผ JSP์™€ ๊ฐ™์€ ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋™์  ์›น ์ปจํ…์ธ ๋ฅผ ์ƒ์„ฑ(์„ธ์…˜ ๊ด€๋ฆฌ, ๋ณด์•ˆ, ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณต) [๋ณธ๋ฌธ์œผ๋กœ]
  8. binary๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด ์žˆ๋Š” JSON์ด๋ฉฐ,  BSON์€ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜๋œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •, ์ฆ‰ ๋””์ฝ”๋”ฉ ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. [๋ณธ๋ฌธ์œผ๋กœ]