216.73.216.141 TODAY : 4,075

PHP ์˜จ๋ผ์ธ ๊ฐ•์˜

 > 

PHP - ์ตœ์ƒ๊ธ‰

๐Ÿ“š PHP ์ตœ์ƒ๊ธ‰ - 5์ฃผ์ฐจ: NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (MongoDB/Redis) ํ™œ์šฉ- 03 PHP์—์„œ NoSQL ์—ฐ๋™ ๋ฐ ํ™œ์šฉ ์‚ฌ๋ก€ (์บ์‹ฑ, ์„ธ์…˜ ์ €์žฅ, ๋กœ๊ทธ ๋“ฑ)

๐Ÿ“š PHP ์ตœ์ƒ๊ธ‰ - 5์ฃผ์ฐจ: NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (MongoDB/Redis) ํ™œ์šฉ- 03 PHP์—์„œ NoSQL ์—ฐ๋™ ๋ฐ ํ™œ์šฉ ์‚ฌ๋ก€ (์บ์‹ฑ, ์„ธ์…˜ ์ €์žฅ, ๋กœ๊ทธ ๋“ฑ)

์ฃผ์š” ํ”„๋กœ๊ทธ๋žจ ์ŠคํŽ™

  • ํ‰์ : 10.0
  • ๋ผ์ด์„ ์Šค: free
  • ์šด์˜์ฒด์ œ:
  • ํŒŒ์ผ ํฌ๊ธฐ: 0

ํ”ผ๋“œ๋ฐฑ ๋ฐ ๋‹ค์šด๋กœ๋“œ

  • ์‚ฌ์šฉ์ž ํ‰์ : 10.0
  • ๋‹ค์šด๋กœ๋“œ ์ˆ˜: 0
  • ์กฐํšŒ์ˆ˜: 3

์ œ์กฐ์‚ฌ ๋ฐ ๋“ฑ๋ก ์ •๋ณด

  • ์ œ์ž‘์‚ฌ: LUZENSOFT
  • ๋“ฑ๋ก์ผ: 2025-10-18 15:06:26
  •  

- ์„ค๋ช…

#PHP์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์— #NoSQL ์„ ํ†ตํ•ฉํ•˜๋Š” ์‹ค์งˆ์  ๋ฐฉ๋ฒ•

uploadImage


์ง€๋‚œ ๋‘ ์‹œ๊ฐ„ ๋™์•ˆ ์šฐ๋ฆฌ๋Š” #NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ•„์š”์„ฑ, ์ข…๋ฅ˜, ๊ทธ๋ฆฌ๊ณ  #MongoDB ์™€ #Redis ์˜ ๊ธฐ๋ณธ์ ์ธ CRUD ๋ช…๋ น์–ด ์‚ฌ์šฉ๋ฒ•์„ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ #PHP์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ #NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ํ†ตํ•ฉํ•˜๊ณ  ํ™œ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌ์ฒด์ ์ธ ์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

#Redis ๋Š” ์บ์‹ฑ๊ณผ ์„ธ์…˜ ๊ด€๋ฆฌ์—, #MongoDB ๋Š” ๋Œ€๊ทœ๋ชจ ๋กœ๊ทธ ์ €์žฅ์ด๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ถ„์„ ๋ฐ์ดํ„ฐ ์ €์žฅ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. #PHP๊ฐœ๋ฐœ ์—์„œ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์ ์žฌ์ ์†Œ์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด #์ตœ์ƒ๊ธ‰๊ธฐ์ˆ  ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.



1. #Redis ๋ฅผ ํ™œ์šฉํ•œ ์ดˆ๊ณ ์† ์บ์‹ฑ ๊ตฌํ˜„



#์บ์‹ฑ ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‘๋‹ต ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋‚˜ ๋ณต์žกํ•œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ #Redis ์— ์ €์žฅํ•ด ๋‘์—ˆ๋‹ค๊ฐ€, ๋™์ผํ•œ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ #Redis ์—์„œ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ ์ฃผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDB ๋˜๋Š” MongoDB)์˜ ๋ถ€ํ•˜๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


1.1. ์บ์‹ฑ ๋กœ์ง ๊ตฌํ˜„


#PHP ์—์„œ #Redis ๋ฅผ ์บ์‹œ๋กœ ํ™œ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋กœ์ง ํ๋ฆ„์ž…๋‹ˆ๋‹ค.

  1. ์กฐํšŒ ์‹œ๋„: #Redis ์— ์š”์ฒญ๋œ ๋ฐ์ดํ„ฐ์˜ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

  2. Cache Hit: ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋ฉด, #Redis ์— ์ €์žฅ๋œ ๊ฐ’์„ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค

  3. Cache Miss: ํ‚ค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด, ๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค

  4. ์ €์žฅ ํ›„ ๋ฐ˜ํ™˜: ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ **#Redis ์— ์ €์žฅ(SET)**ํ•ฉ๋‹ˆ๋‹ค (์ผ๋ฐ˜์ ์œผ๋กœ ๋งŒ๋ฃŒ ์‹œ๊ฐ„(TTL) ์„ค์ • ํฌํ•จ). ์ดํ›„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค


1.2. PHP ์บ์‹ฑ ์˜ˆ์‹œ ์ฝ”๋“œ


PHP

// Redis ์—ฐ๊ฒฐ์€ ์ด์ „ ํฌ์ŠคํŒ… ์ฐธ๊ณ 

function getProductData($productId, $redis) {
    $cacheKey = "product:{$productId}";
    
    // 1. Redis์—์„œ ์บ์‹œ ๋ฐ์ดํ„ฐ ์กฐํšŒ
    $data = $redis->get($cacheKey);
    
    if ($data) {
        // 2. Cache Hit: JSON ๋””์ฝ”๋”ฉํ•˜์—ฌ ๋ฐ˜ํ™˜
        return json_decode($data, true); 
    }
    
    // 3. Cache Miss: DB์—์„œ ๋ฐ์ดํ„ฐ ์กฐํšŒ (๊ฐ€์ƒ)
    // $product = DB::query("SELECT * FROM products WHERE id = {$productId}");
    $product = ['id' => $productId, 'name' => '์ตœ์‹  ์ƒํ’ˆ', 'price' => 10000]; // DB ์กฐํšŒ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    
    if ($product) {
        // 4. ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•ํƒœ๋กœ Redis์— ์ €์žฅ (1์‹œ๊ฐ„ ๋งŒ๋ฃŒ)
        $redis->set($cacheKey, json_encode($product), 3600); 
    }
    
    return $product;
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
// $productInfo = getProductData(123, $redisConnection);



2. #Redis ๋ฅผ ํ™œ์šฉํ•œ PHP ์„ธ์…˜ ๊ด€๋ฆฌ

uploadImage


๊ธฐ๋ณธ์ ์œผ๋กœ #PHP ์˜ ์„ธ์…˜์€ ์›น ์„œ๋ฒ„์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€๋กœ ํ™•์žฅ๋  ๊ฒฝ์šฐ(๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ํ™˜๊ฒฝ) ์„ธ์…˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค. #Redis ๋ฅผ ์„ธ์…˜ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์„ธ์…˜ ์ ‘๊ทผ ์†๋„๋ฅผ ๋น„์•ฝ์ ์œผ๋กœ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


2.1. ์„ธ์…˜ ์ €์žฅ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ


#PHP ์„ค์ • ํŒŒ์ผ(php.ini)์—์„œ ์„ธ์…˜ ์ €์žฅ ํ•ธ๋“ค๋Ÿฌ๋ฅผ redis๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , #Redis ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

Ini, TOML

; php.ini ์„ค์ • (PHP Redis ํ™•์žฅ ์„ค์น˜ ํ•„์ˆ˜)
session.save_handler = redis
; session.save_path = "tcp://redis-host:6379?auth=password"
session.save_path = "tcp://redis:6379" ; Docker ํ™˜๊ฒฝ ์˜ˆ์‹œ

์ด ์„ค์ •์„ ์ ์šฉํ•˜๋ฉด #PHP ๋Š” $_SESSION ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ์ด ์•„๋‹Œ #Redis ์— ์ž๋™์œผ๋กœ ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉฐ, ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ๋„ ์„ธ์…˜ ์ผ๊ด€์„ฑ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.



3. #MongoDB ๋ฅผ ํ™œ์šฉํ•œ ๋Œ€๊ทœ๋ชจ ๋กœ๊ทธ ๋ฐ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ ์ €์žฅ

uploadImage


#MongoDB ๋Š” ์Šคํ‚ค๋งˆ๊ฐ€ ์œ ์—ฐํ•˜๊ณ  ๋Œ€๋Ÿ‰์˜ ๋ฌธ์„œ ์‚ฝ์ž…์— ๊ฐ•์ ์ด ์žˆ์–ด, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋‚˜ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์ตœ์ ์ž…๋‹ˆ๋‹ค.


3.1. ๋กœ๊ทธ ๋ฐ์ดํ„ฐ ์ €์žฅ์˜ ์ด์ 


  • ์œ ์—ฐํ•œ ๊ตฌ์กฐ: ์„œ๋น„์Šค ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•ด ๋กœ๊ทธ์— ์ƒˆ๋กœ์šด ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด๋„ #RDB ์ฒ˜๋Ÿผ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค

  • ๋น ๋ฅธ ์“ฐ๊ธฐ: ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ €์žฅ(Insert)ํ•  ์ˆ˜ ์žˆ์–ด, ์„œ๋น„์Šค ํŠธ๋ž˜ํ”ฝ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค


3.2. PHP ๋กœ๊ทธ ์ €์žฅ ์˜ˆ์‹œ ์ฝ”๋“œ


#PSR-3 ํ‘œ์ค€ ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Monolog์™€ MongoDB ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

PHP

// Composer๋ฅผ ํ†ตํ•ด Monolog์™€ MongoDB ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ํ•„์š”
require 'vendor/autoload.php';

use MongoDBClient;
use MonologLogger;
use MonologHandlerMongoDBHandler;

// 1. MongoDB ์—ฐ๊ฒฐ
$mongoClient = new Client('mongodb://mongo:27017'); 

// 2. Monolog ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐ MongoDB Handler ์ถ”๊ฐ€
$log = new Logger('AppLog');
$log->pushHandler(new MongoDBHandler($mongoClient, 'app_logs', 'error_collection')); 
// 'app_logs' ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ 'error_collection' ์ปฌ๋ ‰์…˜์— ๋กœ๊ทธ ์ €์žฅ

// 3. ๋กœ๊ทธ ๊ธฐ๋ก (๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค)
$log->error('์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ์‹คํŒจ', [
    'user_id' => 101,
    'ip_address' => $_SERVER['REMOTE_ADDR'],
    'request_url' => $_SERVER['REQUEST_URI'],
    'payload' => $_POST 
]);

echo "์˜ค๋ฅ˜ ๋กœ๊ทธ๊ฐ€ MongoDB์— ๊ธฐ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.n";


๊ฒฐ๋ก 



#PHP ์—์„œ #NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ˜„๋Œ€ ์›น ์„œ๋น„์Šค ๊ฐœ๋ฐœ์˜ ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค. #Redis ๋Š” ์ดˆ๊ณ ์† #์บ์‹ฑ ๊ณผ ์•ˆ์ •์ ์ธ ์„ธ์…˜ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ , #MongoDB ๋Š” ์œ ์—ฐํ•œ ์Šคํ‚ค๋งˆ์™€ ๋น ๋ฅธ ์“ฐ๊ธฐ ์„ฑ๋Šฅ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰ ๋กœ๊ทธ ๋ฐ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ธ ๊ฐ€์ง€ ์š”์†Œ(RDB, Redis, MongoDB)๋ฅผ ์กฐํ™”๋กญ๊ฒŒ ํ™œ์šฉํ•˜๋Š” ๋Šฅ๋ ฅ์ด ๊ณง #PHP์ตœ์ƒ๊ธ‰ ๊ฐœ๋ฐœ์ž์˜ ์—ญ๋Ÿ‰์ž…๋‹ˆ๋‹ค.



๊ฒŒ์ž„, ๋งˆ์ผ€ํŒ…, ์„œ๋ฒ„์šฉ ๊ณ ์ •IP, ๋ฐฉํ™”๋ฒฝ์šฐํšŒ, ๊นจ๋—ํ•˜๊ณ  ์ค‘๋ณต์—†๋Š” IP ์ œ๊ณต.

https://xn--299ao67b9qbmsf04c.net/