728x90

๊นŒ๋จน์ง€ ๋ง๊ณ  ๋ณต์Šตํ•˜์ž STL์€ ๊ฝค๋‚˜ ์œ ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด STL์€ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ž‘์„ฑ๋œ ๋งŽ์€ ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

์ปจํ…Œ์ด๋„ˆ,iterator,์•Œ๊ณ ๋ฆฌ์ฆ˜๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.

 

- ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฅ˜

 ํด๋ž˜์Šค

ํ—ค๋” 

 vector

<vector> 

deque

<deque> 

list

<list> 

set

<set> 

map

<map> 

 stack

<stack> 

 queue

<queue> 

- iterator ์ข…๋ฅ˜

 ์ข…๋ฅ˜

iterator 

 const_iterator

 reverse_iterator

 const_reverse_iterator

- ์•Œ๊ณ ๋ฆฌ์ฆ˜

copy 

 merge

 random

 rotate

 equal

 min

 remove

 search

 find

 move

 replace

 sort

 max 

partition

 reverse

 swap

 

๋ฐ˜์‘ํ˜•
728x90

์•„๋ฌด๋ž˜๋„ ์ด์ „์— ์˜ฌ๋ ธ๋˜ ๊ฒƒ๋“ค์€ ์ˆ˜์—…์‹œ๊ฐ„์— ๊ต์ˆ˜๋‹˜์˜ ๋„์›€์„ ๋ฐ›์•„ ํ–ˆ๋˜ ๊ฒƒ๋“ค์ธ๋ฐ

๊ฝค ์ ์ง€ ์•Š์€ ๋ถ„๋“ค์ด openGL์— ๋Œ€ํ•ด ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๊ณต๋ถ€๋„ ํ• ๊ฒธ ๋‚ด๊ฐ€ ์ง์ ‘ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ž๋ฃŒ๋“ค์„ ์ฐธ๊ณ ํ•˜์—ฌ์„œ ๋งŒ๋“ค์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์ผ๋‹จ ๋‚˜๋Š” VisualStudio 2017์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  main.cpp๋ฅผ ์†Œ์Šค ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ 

ํ”„๋กœ์ ํŠธ(P) → ์†์„ฑ(P) ์„ ํด๋ฆญํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ์†์„ฑ์„ ํ‚จ๋‹ค.

 

 

 

1. C/C++ → ์ผ๋ฐ˜ → ์ถ”๊ฐ€ ํฌํ•จ ๋””๋ ‰ํ„ฐ๋ฆฌ

2. ๋ง์ปค → ์ผ๋ฐ˜ → ์ถ”๊ฐ€ ํฌํ•จ ๋””๋ ‰ํ„ฐ๋ฆฌ

3. ๋ง์ปค → ์ž…๋ ฅ → ์ถ”๊ฐ€ ์ข…์†์„ฑ

์— GLFW์™€ gl3w๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

GLFW ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : https://www.glfw.org/

 

GLFW๋Š” ๋ฐ์Šคํฌํƒ‘์—์„œ OpenGL, OpenGL ES ๋ฐ Vulkan ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ๋‹ค์ค‘ ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
์ฐฝ, ์ปจํ…์ŠคํŠธ ๋ฐ ํ‘œ๋ฉด ์ƒ์„ฑ, ์ž…๋ ฅ ๋ฐ ์ด๋ฒคํŠธ ์ˆ˜์‹ ์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ API๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.
glfwinit(), glfwCreateWindow() ๋“ฑ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

 

gl3w ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : https://github.com/skaslev/gl3w (cmake ์ด์šฉํ•ด์„œ ๋นŒ๋“œํ•ด์•ผํ• ๋“ฏ)

 

gl3w๋Š” glew๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ glew๋Š” ์˜›๋‚  ๋ฒ„์ „์˜ OpenGL๊นŒ์ง€ ์ง€์›ํ•œ๋‹ค.
gl3w ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” OpenGL 3์™€ 4์˜ ์ฝ”์–ด ํ”„๋กœํŒŒ์ผ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ๋‹ค.

 

๋งŒ์•ฝ LNK2001 ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ˆ gl3w.c ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ์•ˆ์— ์†Œ์Šค๋กœ ์ถ”๊ฐ€ํ•˜์ž. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ฐพ์€ ๋งํฌ

 

 

 

 

main์— ๊ธฐ๋ณธํ˜•์„ ์ ์–ด์ฃผ๊ณ (https://www.khronos.org/opengl/wiki/OpenGL_Loading_Library#GL3W ์„ ์ฐธ๊ณ ํ•จ)

 

๊ทธ๋ฆฌ๊ณ  

#include <GL/gl3w.h> #include <GLFW/glfw3.h>

์ด๋ถ€๋ถ„์€ ๊ผญ ์ˆœ์„œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ ์ง€ ๋ง๊ณ  ๋˜‘๊ฐ™์ด ์ ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผํ•ด๋ณด๋ฉด

 

 

 

์ด ์ฐฝ์ด ๋œจ๋ฉด ์ •์ƒ์ด๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋œจ๋ฉด ๋‹ค์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป๋˜์ง„ ์•Š์•˜๋Š”์ง€,  64๋น„ํŠธ 32๋น„ํŠธ ์ž˜ ํ™•์ธํ–ˆ๋Š”์ง€ ํ•œ๋ฒˆ ๋” ์ฒดํฌํ•ด๋ณด์ž.

ํ•„์ž๋Š” ์˜คํ”ˆ์†Œ์Šค์ธ ImGUI๋ฅผ ์ด์šฉํ•˜์—ฌ์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์ฐธ๊ณ  ๋งํฌ : https://github.com/ocornut/imgui

๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ ํฌํ•จ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋„ฃ๋Š”๋‹ค.

ImGUI๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋”ฐ๋กœ ์ž์ฒด์ ์œผ๋กœ ์ œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ํ†ต์งœ๋กœ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋‚ด๋ถ€์— ๋„ฃ์–ด์„œ ๋นŒ๋“œํ•˜๋ฉด ๋œ๋‹ค.

๋‚˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ์ž‘ ์•„๋ž˜ ๋งํฌ์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ๋”ฐ๋ผ์„œ ์ œ์ž‘ํ•ด์„œ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

https://swstar.tistory.com/229#gref

 

๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค C/C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ธฐ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค์—์„œ C์–ธ์–ด ๋˜๋Š” C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ์ž‘ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ •์  (static) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋™์  (dynamic) ๋ผ์ด๋ธŒ๋Ÿฌ

swstar.tistory.com

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •์ด ๋๋‚˜๋ฉด

https://github.com/ocornut/imgui/blob/master/examples/opengl3_example/main.cpp

์ด ์ชฝ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด imgui์™€ glfw3,gl3w์— ๊ด€ํ•œ ์˜ˆ์ œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ์„ ์กฐ๊ธˆ ์ฐธ๊ณ ํ•˜์—ฌ์„œ ๋„ฃ์–ด๋ณด์ž.

 

--------------------------------------------------------------------------------------------------------------

์ตœ๊ทผ์— ๋‹ค์‹œ ๋“ค์–ด๊ฐ€๋ณด๋‹ˆ ๋ช‡๊ฐ€์ง€ URL๋„ ์‚ฌ๋ผ์ง€๊ณ  ํ•ด์„œ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์“ฐ๊ธธ ๋ฐ”๋ž€๋‹ค.

์•„๋ฌด๋ž˜๋„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ž์ฃผ ํ•˜์‹œ๋‹ค ๋ณด๋‹ˆ ๋ฐฉ๋ฒ•์„ ๋ฐ”๊พผ๋“ฏ ํ•œ๋ฐ

๊ฐ„๋‹จํ•˜๊ฒŒ https://github.com/ocornut/imgui ์—ฌ๊ธฐ์„œ ์ดˆ๋ก์ƒ‰ Code ๋ฒ„ํŠผ -> download Zip -> ์••์ถ•ํ•ด์ œ ํ›„ imgui ๊ด€๋ จ ์†Œ์Šค๋“ค์„ ํ”„๋กœ์ ํŠธ์— ํฌํ•จ์‹œ์ผœ์„œ ์ง„ํ–‰ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

๋‚˜๋Š” ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ImGUI ์†Œ์Šค๋“ค์„ ์ถ”๊ฐ€ํ•˜์˜€๊ณ  ์†์„ฑ๋“ค์„ ๋‹ค์‹œ ์žฌ์„ค์ •ํ•˜์˜€๋‹ค.

glfw ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์†์„ฑ์— ์ถ”๊ฐ€ํ•˜์—ฌ์ฃผ์—ˆ๊ณ 

glviewport, glclearcolor, glclear ํ•จ์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” LNK2019 ์—๋Ÿฌ๊ฐ€ ๋œจ๋Š” ๊ฒฝ์šฐ์—๋Š”

์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ ์ข…์†์„ฑ์— glfw3.lib์™€ opengl32.lib๋ฅผ ๋„ฃ์–ด๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค.

 

opengl3_loader.h์˜ ๊ฒฝ์šฐ ํ˜„์žฌ gl3w.h์˜ ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ๋“ค์„ ๋•ก๊ฒจ์„œ ์˜ค๋ฏ€๋กœ ๋‚˜์ค‘์— gl3w.lib๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋•ก๊ฒจ์˜ค๋Š” ๊ฒฝ์šฐ ์žฌ์ •์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

https://github.com/ocornut/imgui/issues/4445

 

OpenGL backend now embeds its own GL loader (imgui_impl_opengl3_loader.h) · Issue #4445 · ocornut/imgui

TL;DR; Our GL backend now embed its own minimal GL loader (embedded file; full source repo) User/application don't need to configure anything related to GL loader. User/application can use their ow...

github.com

์œ„์˜ ๋งํฌ๋Š” ํ•ด๋‹น ์—๋Ÿฌ์— ๋Œ€ํ•œ imgui ์ œ์ž‘์ž๊ฐ€ ๋‹ต๋ณ€ํ•œ ๊ฒฝ์šฐ์ด๋ฉฐ gl3w_stripped๋ผ๋Š” ํŒŒ์ผ์„ ์ œ์ž‘ํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถฉ๋Œ์‹œํ‚ค์ง€ ์•Š๊ฒŒ๋” ๋งŒ๋“ค๋ผ๋Š” ๊ฒƒ์ธ๋ฐ

https://github.com/dearimgui/gl3w_stripped

 

GitHub - dearimgui/gl3w_stripped: Simple OpenGL core profile loading, customized for Dear ImGui

Simple OpenGL core profile loading, customized for Dear ImGui - GitHub - dearimgui/gl3w_stripped: Simple OpenGL core profile loading, customized for Dear ImGui

github.com

๋‚˜์˜ ๊ฒฝ์šฐ cmake๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์–ด์„œ ๋Œ๋ฆฌ๋‹ˆ๊นŒ imgui_loader.h์— ํ•„์š”ํ•œ gl3w ํŒŒ์ผ๋“ค์ด ์ œ์ž‘๋˜์–ด์„œ gl3w.h ํ—ค๋”ํŒŒ์ผ ๋Œ€์‹  imgui_impl_opengl3_loader.h ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

 

https://github.com/ocornut/imgui/blob/master/examples/example_glfw_opengl3/main.cpp

์ด ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์„œ main ํ•จ์ˆ˜๋ฅผ ์ œ์ž‘ํ•˜์˜€๋‹ค.

 

๋ณธ ํ™”๋ฉด์ด ๋–ณ๋‹ค๋ฉด ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค. ์•ž์œผ๋กœ ์ด ImGUI์™€ ํ•จ๊ป˜ openGL์„ ๊ณต๋ถ€ํ•ด๋ณด๋„๋ก ํ•˜์ž!

 

์ด์— ๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ ํ• ๋งŒํ•œ ์‚ฌ์ดํŠธ์˜ ๋งํฌ๋“ค์„ ์ข€ ๋‚จ๊ฒจ๋†“๊ฒ ์Šต๋‹ˆ๋‹ค

์ €๋„ ์ œ ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๋ฉด ์•„๋งˆ ํฌ์ŠคํŒ…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฒŒ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค~!

 

LearnOpenGL

learnopengl.com/

 

Learn OpenGL, extensive tutorial resource for learning Modern OpenGL

Welcome to OpenGL Welcome to the online book for learning OpenGL! Whether you are trying to learn OpenGL for academic purposes, to pursue a career or simply looking for a hobby, this book will teach you the basics, the intermediate, and all the advanced kn

learnopengl.com

LearnOpenGL ๋ฒˆ์—ญ ๋ธ”๋กœ๊ทธ

heinleinsgame.tistory.com/4

 

[Learn OpenGL ๋ฒˆ์—ญ] 2-1. ์‹œ์ž‘ํ•˜๊ธฐ - OpenGL

OpenGL ์‹œ์ž‘ํ•˜๊ธฐ/OpenGL ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋จผ์ € OpenGL์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. OpenGL์€ ๊ทธ๋ž˜ํ”ฝ ๋ฐ ์ด๋ฏธ์ง€๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜๋Š” API( Application Programming Interface )๋ผ..

heinleinsgame.tistory.com

 

 

 

 

P.S ํ˜น์—ฌ๋‚˜ ๋ฌธ์ œ๊ฐ€ ๋˜๊ฑฐ๋‚˜ ํ‹€๋ฆฐ ์‚ฌํ•ญ์€ ๊ฐ€๋ฅด์ณ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)

 

 

 

 

๋ฐ˜์‘ํ˜•
728x90

Chapter 1. Ubuntu์—์„œ mariadb ์‹คํ–‰์„ ํ•˜์—ฌ๋ณด์ž.

*๋ชจ๋“  ์‹คํ–‰์€ MariaDB 5.5์—์„œ ์ž‘๋™ํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค

mariadb๋ฅผ ๋‹ค ์„ค์น˜ํ•˜์…จ์œผ๋ฉด ํ•œ๋ฒˆ ์‹คํ–‰ํ•ด๋ณผ๊นŒ์š”? ๋จผ์ € Ubuntu ํ™”๋ฉด์—์„œ terminal์„ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.

 

 

 

 

 

์ด๋Ÿฌํ•œ ์‹คํ–‰์ฐฝ์ด ๋–ด๋‹ค๋ฉด ์„ฑ๊ณตํ•˜์‹ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์œผ๋กœ๋Š” mariadb๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๊ธฐ ์œ„ํ•ด ๋ช…๋ น์–ด๋ฅผ ์ ์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ mariadb๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด mariadb –u root –p ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์˜€๋”๋‹ˆ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

mysql –u root –p ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์˜€๋”๋‹ˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜์˜ค๊ณ  ์ดˆ๊ธฐ์— ์„ค์ •ํ•˜์˜€๋˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด 'Welcome to the MariaDB monitor' ๋ผ๋Š” ๋ฌธ๊ตฌ์™€ ํ•จ๊ป˜ mairaDB๊ฐ€ ๊ตฌ๋™๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

.

 

Chapter 2. ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

 

mariaDB๋„ ์ž˜ ๊ตฌ๋™๋˜๋‹ˆ ์ง€๊ธˆ๋ถ€ํ„ฐ ๋‚˜๋งŒ์˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ํšŒ์› ๊ด€๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„์€ 'membership' ์œผ๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

mariadb์—์„œ๋Š” mysql์—์„œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2.1 CREATE

MariaDB[(none)]> create database (๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„);

 

 

create ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•œ ๊ฐœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

2.2 SHOW

MariaDB[(none)]> show databases;

 

 

 

show ๋ช…๋ น์–ด๋ฅผ ์“ฐ๋ฉด ์œ„์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

๋ณด๋ฉด db1์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์™€ membership์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค 2๊ฐœ๊ฐ€ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

2.3 DROP

MariaDB[(none)]> drop database (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„);

 

 

drop ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด์„œ db1๊ณผ membership ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง€์šด ๋ชจ์Šต์ด๋‹ค.

 

2.4 USE

MariaDB[(์„ ํƒ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)]> use (์„ ํƒํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„)

 

 

 

use๋ฅผ ์ด์šฉํ•ด์„œ ์–ด๋А ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์“ธ ๊ฒƒ์ธ์ง€๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์„ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„๊ณผ ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์ด ๋ช…์‹œ๋˜์–ด์•ผํ•œ๋‹ค.

 

2.5 ALTER

 

ALTER๋ฌธ์€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋‚˜ ํ˜•์‹๋“ฑ์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์•„๋ž˜์˜ ๋ฌธ์žฅ์€ ํ…Œ์ด๋ธ” ์•ˆ์— ์นผ๋Ÿผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฌธ์žฅ์ด๋‹ค.

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> alter table (ํ…Œ์ด๋ธ” ์ด๋ฆ„) add (์นผ๋Ÿผ ์ด๋ฆ„) datetime null;

 

 

datetime not null์„ ํ•˜๊ฒŒ ๋˜๋ฉด

 

 

*์นผ๋Ÿผ ์ถ”๊ฐ€

-๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€: alter table ํ…Œ์ด๋ธ”๋ช… add column ์นผ๋Ÿผ์ด๋ฆ„ ์นผ๋Ÿผํƒ€์ž…

-์ง€์ • ์นผ๋Ÿผ ๋’ค์—: alter table ํ…Œ์ด๋ธ”๋ช… add column ์นผ๋Ÿผ์ด๋ฆ„ ์นผ๋Ÿผํƒ€์ž… after ์นผ๋Ÿผ์ด๋ฆ„

-์ œ์ผ ์•ž์—: alter table ํ…Œ์ด๋ธ”๋ช… add column ์นผ๋Ÿผ์ด๋ฆ„ ์นผ๋Ÿผํƒ€์ž… first

 

*์นผ๋Ÿผ ์‚ญ์ œ

alter table ํ…Œ์ด๋ธ”๋ช… drop column ์นผ๋Ÿผ์ด๋ฆ„

 

*์นผ๋Ÿผ ๋ณ€๊ฒฝ

alter table ํ…Œ์ด๋ธ”๋ช… modify ์นผ๋Ÿผ์ด๋ฆ„ ์ƒˆ์นผ๋Ÿผํƒ€์ž…

alter table ํ…Œ์ด๋ธ”๋ช… change ์นผ๋Ÿผ์ด๋ฆ„ ์ƒˆ์นผ๋Ÿผ์ด๋ฆ„ ์ƒˆ์นผ๋Ÿผํƒ€์ž…

 

 

 

*์ธ๋ฑ์Šค์— ์ƒˆํ•ญ๋ชฉ ์ถ”๊ฐ€

alter table ํ…Œ์ด๋ธ”๋ช… add index(์นผ๋Ÿผ์ด๋ฆ„)

 

 

 

*์ธ๋ฑ์Šค ์‚ญ์ œ

alter table ํ…Œ์ด๋ธ”๋ช… drop index ์นผ๋Ÿผ์ด๋ฆ„

drop index ์ธ๋ฑ์Šค์ด๋ฆ„ on ํ…Œ์ด๋ธ”๋ช…

 

*Primary key ์ง€์ •ํ•˜๊ธฐ

alter table ํ…Œ์ด๋ธ”๋ช… add constraint 'primary key์ด๋ฆ„' primary key(์นผ๋Ÿผ์ด๋ฆ„)

 

*Primary key ์‚ญ์ œ

alter table ํ…Œ์ด๋ธ”๋ช… drop primary key

 

 

Chapter 3. ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๋ณด์ž

 

3.1 INSERT

 

ํ…Œ์ด๋ธ”์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ insert ๋ฌธ์žฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. insert ๋ฌธ์žฅ์ด ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋จผ์ € ํ…Œ์ด๋ธ”์ด ์กด์žฌ ํ•ด์•ผ ํ•œ๋‹ค.

 

*ํ…Œ์ด๋ธ” ์ƒ์„ฑํ•˜๊ธฐ

 

id

name

age

 

 

 

 

๋งŒ์•ฝ ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

MaiaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> create table (ํ…Œ์ด๋ธ” ์ด๋ฆ„)(

->id varchar(์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ธธ์ด),

->name varchar(์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ธธ์ด),

->age varchar(์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ธธ์ด)

->);

 

ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉด INSERT๋ฅผ ์ด์šฉํ•˜์—ฌ์„œ ํ…Œ์ด๋ธ”์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜์—ฌ๋ณด์ž.

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> insert into (ํ…Œ์ด๋ธ” ์ด๋ฆ„) (id,name,age) values(๋„ฃ์„ ๊ฐ’,๋„ฃ์„ ๊ฐ’,๋„ฃ์„ ๊ฐ’);

 

5297734 KIM 22 ์„ ๋„ฃ์–ด๋ณด๋„๋ก ํ•˜์ž

 

 

INSERT INTO ... ON DUPLICATE KEY UPDATE ,,, ๋ผ๋Š” ํ˜•ํƒœ์˜ ๊ตฌ๋ฌธ์ด ์‚ฌ์šฉ๋˜๋ฉด ์ค‘๋ณต๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ 

์ด๋ฏธ ์กด์žฌํ•  ๋•Œ์—๋Š” UPDATE๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ์—๋Š” INSERT๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

 

์ด ๊ตฌ๋ฌธ์—์„œ UPDATE๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  INSERT๊ฐ€ ์‹คํ–‰๋œ ์ด์œ ๋Š” ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ๋•Œ PRIMARY KEY๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•„์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ”์„ ๋‹ค์‹œ ๋งŒ๋“  ๋’ค ON DUPLICATE KEY UPDATE๋ผ๋Š” ์˜ต์…˜์„ ์„ค์ •ํ•˜์ง€ ์•Š์€ ์ฑ„๋กœ ์ง‘์–ด ๋„ฃ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ๋‹น์—ฐํžˆ ์˜ค๋ฅ˜ ๋ฌธ๊ตฌ๋ฅผ ๋„์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> insert into ํ…Œ์ด๋ธ”์ด๋ฆ„ (...) values(...)

->onduplicate key update (๋ฐ”๋€Œ๋Š” ๊ฐ’)

 

 

 

3.2 SELECT

 

INSERT๋ฅผ ์ด์šฉํ•ด์„œ ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ์ง‘๊ณ  show๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‚ด์šฉ์„ ๋ณด๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ๋ณด์ด์ง€๊ฐ€ ์•Š๋Š”๋‹ค

ํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” select ๋ฌธ์žฅ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฆ„]> select *from (ํ…Œ์ด๋ธ” ์ด๋ฆ„)

 

๊ทธ๋Ÿฌ๋ฉด ์•„๊นŒ ๋งŒ๋“ค์–ด๋ดค๋˜ membershipํ…Œ์ด๋ธ”์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋„๋ก ํ•˜์ž.

 

 

3.3 UPDATE

 

๊ทธ๋Ÿฐ๋ฐ ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” ๋‹ค๋ฉด ๋ฐ”๊ฟ”์•ผ ํ•  ๋•Œ ์“ฐ๋Š” ๊ฒƒ์ด UPDATE ๋ฌธ์žฅ์ด๋‹ค

INSERT๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ , ๋ ˆ์ฝ”๋“œ์˜ ์ผ๋ถ€ ์นผ๋Ÿผ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ SQL๋ฌธ์žฅ์ด๋‹ค.

 

name์„ GAHYEON ์œผ๋กœ ๋ฐ”๊พธ์–ด๋ณด๊ฒ ๋‹ค.

 

MariaDB [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> update (ํ…Œ์ด๋ธ” ์ด๋ฆ„) set name='GAHYEON' where id=5297734;

 

 

*UPDATE ๋ฌธ์žฅ ์‚ฌ์šฉ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ 

WHERE ์กฐ๊ฑด์ ˆ์ด ์—†๋Š” ๊ฒฝ์šฐ ๊ทธ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์นผ๋Ÿผ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋œ๋‹ค.

 

3.4 REPLACE

 

๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด INSERT๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ  ๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” update๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

 

MariaDB [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฆ„]> replace (ํ…Œ์ด๋ธ” ์ด๋ฆ„) set age=20, id=5297734;

 

 

๊ทธ๋Ÿฌ๋‚˜ ์ด ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ์“ฐ๋ ค๊ณ  ๋ดค๋”๋‹ˆ ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๋Œ€๋กœ ๋‚˜์˜ค์ง€๊ฐ€ ์•Š์•˜๋‹ค

์ค‘๋ณต๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ INSERTํ•˜๊ฒŒ ๋œ๋‹ค๊ณ  ํ•˜์˜€๋Š”๋ฐ ๋ ˆ์ฝ”๋“œ๊ฐ€ 3๊ฐœ์ธ ํ…Œ์ด๋ธ”์—์„œ๋Š” ์ค‘๊ฐ„ ๊ฐ’์ด null๋กœ ๋“ค์–ด๊ฐ€๊ณ  ์•ž์˜ ์นผ๋Ÿผ์ด ์‚ญ์ œ ๋˜์ง€ ์•Š์€ ์ฑ„๋กœ INSERT๊ฐ€ ๋˜์—ˆ๋‹ค

๊ทธ๋ž˜์„œ ์ธ์ž ๊ฐ’์ด ๋ชจ์ž๋ผ์„œ ๊ทธ๋ ‡๊ฒŒ ๋œ ๊ฒƒ์ธ๊ฐ€? ๋ผ๋Š” ์ƒ๊ฐ์„ ํ•ด๋ณด์•˜๋‹ค.

 

 

์„ธ ๊ฐœ์˜ ์ธ์ž ๊ฐ’์„ ์จ์„œ REPLACE ๋ฌธ์žฅ์„ ์จ๋ณด์•˜๋Š”๋ฐ ์ด๋ฒˆ์—๋„ INSERT ๋ฌธ์žฅ์ด ์‹คํ–‰๋˜์—ˆ๋‹ค

๊ทธ๋ž˜์„œ ๊ตฌ๋ฌธ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๊ฐ€? ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ฌธ์žฅ์„ ์ด์šฉํ•ด๋ณด์•˜๋‹ค.

 

MariaDB [๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> replace into membership values(...);

 

 

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒˆ์—๋„ ๋˜‘๊ฐ™์ด ์ถ”๊ฐ€๊ฐ€ ๋˜๋Š” ํ˜•์‹์œผ๋กœ ์ง„ํ–‰๋˜์—ˆ๋‹ค

๋ฌด์—‡์ธ๊ฐ€ ์ด์ƒํ•˜์—ฌ์„œ ์ฐพ์•„๋ณด์•˜๋”๋‹ˆ(https://mariadb.com/kb/en/mariadb/replace ์ฐธ๊ณ , 'Real MariaDB' ์ฑ…์—๋„ ์žˆ๋Š” ๋‚ด์šฉ) 'REPLACE๋Š” INSERT์™€ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘๋œ๋‹ค

primary key๋‚˜ uniqueํ‚ค๊ฐ€ ์ค‘๋ณต๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋จผ์ € ๊ทธ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ ˆ์ฝ”๋“œ๋กœ insert๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.' ๋ผ๋Š” ์ „์ œ์กฐ๊ฑด์ด ์žˆ์—ˆ๋‹ค

๊ทธ๋Ÿฌ๋ฉด primary key๊ฐ€ ํฌํ•จ๋œ table์„ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์„œ replace๋ฌธ์„ ์‹คํ–‰์‹œ์ผœ ๋ณด๋„๋ก ํ•˜์ž.

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> create table (ํ…Œ์ด๋ธ” ์ด๋ฆ„) (

                      -> ๋ณ€์ˆ˜๋ช… varchar(ํฌ๊ธฐ),

                      -> constraint ๋ณ€์ˆ˜๋ช… primary key(๋ณ€์ˆ˜๋ช…),

                      -> ๋ณ€์ˆ˜๋ช… varchar(ํฌ๊ธฐ)

                      -> );

 

 

INSERT๋ฌธ์žฅ์„ ์ด์šฉํ•˜์—ฌ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์•„๊นŒ ์ „์˜ REPLACE ๋ฌธ์žฅ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋ณด์ž.

 

 

์ƒ๊ฐํ•œ๋Œ€๋กœ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค! REPLACE ๋ฌธ์žฅ์€ ์ค‘๋ณต๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ INSERTํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ INSERT INTO ... ON DUPLICATE KEY UPDATE ... ๋ฌธ์žฅ๋ณด๋‹ค๋Š” ๋ถ€ํ•˜๋„ ๋†’๊ณ  ์‹œ์Šคํ…œ์˜ ์ž์›์„ ๋งŽ์ด ์†Œ๋ชจํ•˜๊ฒŒ ๋œ๋‹ค

๊ฐ€๋Šฅํ•œ๋Œ€๋กœ REPLACE๋ฌธ์žฅ ๋ณด๋‹ค๋Š” INSERT INTO ... ON DUPLICATE KEY UPDATE ... ๋ฌธ์žฅ์„ ์“ฐ๋„๋ก ํ•˜์ž.

 

3.5 DELETE

 

ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•  ๋•Œ DELETE๋ฌธ์žฅ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

MariaDB[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„]> delete from (ํ…Œ์ด๋ธ” ์ด๋ฆ„) where table_id=5297734;

 

 

 

WHERE ์กฐ๊ฑด์ ˆ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ ์กฐ๊ฑด์— ๋ถ€ํ•ฉ๋˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ์„ ์‚ญ์ œํ•˜์ง€๋งŒ WHERE ์กฐ๊ฑด์ ˆ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

+ Recent posts