반응형

1. 소개

    ① 개요

    - 넘파이는 Numerical Python의 합성어. (Numerical : 수의, 수와 관련된, 숫자로 나타낸)

    - 이름에서 알 수 있듯이 넘파이는 수와 관련된 부분을 지원하는 라이브러리임을 알 수 있다.

    - 주로 행렬이나 다차원 배열을 쉽게 처리하고 고속의 연산을 수행할 수 있도록 지원하는 파이썬 라이브러리이다.

    - 그러다보니 머신러닝, 딥러닝, 데이터 분석 및 과학 분야에서 많이 사용된다.

 

2. import, version, array, shape

    ① numpy import

1
2
3
# python에서 numpy 임포트 하기
>>> # numpy import
>>> import numpy as np
cs

 

    ② numpy version 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2.2.    numpy version 확인
>>> # numpy import
>>> import numpy as np
>>>
>>> np._version_
Traceback (most recent call last):
  File "<pyshell#73>", line 1in <module>
    np._version_
  File "C:\Users\web\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\__init__.py", line 219in __getattr__
    raise AttributeError("module {!r} has no attribute "
AttributeError: module 'numpy' has no attribute '_version_'
>>> 
>>> np.__version__
'1.18.5'
>>>
cs

 

    ③ np.array를 이용하여 numpy array 생성

1
2
3
4
5
6
7
8
9
>>> # numpy를 이용하여 1차원 배열 만들기
>>> ar1 = np.array( [ 12345 ] )
>>> ar1
array([12345])
 
# 배열의 모양(형태)을 알 수 있다.
>>> ar1.shape
(5,)
 
cs

 

1
2
3
4
5
6
7
8
9
# 파이선 리스트 변수를 만들어 삽입도 가능
>>> lst = [ 678910 ]
>>> ar2 = np.array(lst)
 
>>> ar2
array([ 6,  7,  8,  910])
 
>>> ar2.shape
(5,)
cs

 

    ④ shape 명령어로 np.array 형태 확인

1
2
3
4
5
6
7
8
9
10
11
12
# 1차원 np.array 형태
>>> arr1 = np.array( [123] )
>>> arr1.shape
(3,)
 
>>> arr2 = np.array( ['a''b''c'] )
>>> arr2.shape
(3,)
 
>>> arr3 = np.array( [123'a''b''c'] )
>>> arr3.shape
(6,)
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 다차원 np.array 형태
>>> arr1 = np.array( [123], [456] )
Traceback (most recent call last):
  File "<pyshell#81>", line 1in <module>
    arr1 = np.array( [123], [456] )
TypeError: data type not understood
 
>>> arr1 = np.array( [[123], [456]] )
>>> arr1.shape
(23)
 
>>> arr2 = np.array( [[1234], [5678], [9101112]] )
>>> arr2.shape
(34)
 
>>> arr3 = np.array( [[123], [567], [101112]] )
>>> arr3.shape
(33)
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 넘파이 배열 출력
>>> arr1
array([[123],
       [456]])
 
>>> arr2
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9101112]])
 
>>> arr3
array([[ 1,  2,  3],
      [ 5,  6,  7],
       [101112]])
 
>>> print(arr1)
[[1 2 3]
 [4 5 6]]
 
>>> print(arr2)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
cs

 

3. type, size, ndim

    ① type

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# list type과 numpy.ndarray type
>>> arr = [ 1234 ]
>>> arr
[1234]
 
>>> type(arr)
<class 'list'>
 
>>> ndarr = np.array( arr )
>>> ndarr
array([1234])
 
>>> type(ndarr)
<class 'numpy.ndarray'>
 
>>> ndarr.shape
(4,)
 
>>> arr.shape
Traceback (most recent call last):
  File "<pyshell#147>", line 1in <module>
    arr.shape
AttributeError: 'list' object has no attribute 'shape'
 
cs

 

    ② size

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# numpy.array의 size
>>> arr1
array([[123],
       [456]])
 
>>> arr1.size
6
 
>>> arr2
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9101112]])
 
>>> arr2.size
12
 
>>> arr3
array([[ 1,  2,  3],
       [ 5,  6,  7],
       [101112]])
 
>>> arr3.size
9
 
>>> arr3.shape
(33)
cs

 

    ③ ndim

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# numpy.array의 차원 확인
 
# 배열의 차원만 알고자 할 때 ndim 사용
>>> a = np.array( [[ 123 ], [ 456 ]] )
>>> a
array([[123],
       [456]])
 
# size는 차원에 대한 정보를 전혀 알 수 없음.
>>> a.size
6 
 
# shape으로도 알 수 있음.
>>> a.shape 
(23)
 
# 차원만 출력.
>>> a.ndim 
2
cs

 

    ④ sizelen의 차이점

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# size : numpy array의 원소의 개수를 출력
# len() : numpy array의 행의 개수를 출력. 차원을 의미하는 것이 아님에 주의.
 
>>> import numpy as np
>>> lst = [[123], [456], [789]]
>>> ndarr = np.array( lst )
 
>>> ndarr
array([[123],
       [456],
       [789]])
 
>>> print(ndarr)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
 
>>> ndarr.size
9
 
>>> len(ndarr)
3
cs

 

shape 결과 값이 행과 열의 값으로 출력된다는걸 알았는데요. 예를들어, arr1 경우 shape 출력값이 (2, 4) 나오는데 arr2 경우 분명히 1 x 5열로 구성된 같은데 shape 메서드로 찍으면 결과가 (5,) 출력되는 이유는 무엇인가? (1, 5) 출력되는 것이 맞지 않나?

☞ 1행으로만 구성된 경우, 생략되기 때문이다.

 

    ⑤ identical type

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# numpy 행렬의 모든 요소는 동일한 데이터 타입으로 통일
#     파이썬 list 보다 연산 처리 속도가 빠르다.
 
>>> arr3 = np.array( [123'a''b''c'] )
>>> arr3[0]
______
>>> 
>>> type(arr3[0])
<class ‘_________________'>
>>> 
>>> lst = [ 1, 2, 3, 'a', 'b', 'c' ]
>>> lst
[1, 2, 3, 'a', 'b', 'c']
>>> 
>>> lst[0]
1
>>> 
>>> type(lst[0])
<class 'int'>
cs

 

4. 다차원 배열

    ① 다차원 배열의 크기, 차원, 길이, 요소

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 다차원 배열: 배열의 배열
# np.shape(arr)
>>> import numpy as np
>>> a = np.array( [[ 123 ], [ 456 ]] )
>>> 
>>> a.shape
(23)
 
>>> a.ndim
2
 
>>> a.size
6
 
>>> len(a)
2
 
>>> a[ 10 ]
4
 
>>> a[ 12 ]
6
 
>>> a[ 02 ]
3
 
cs

 

    ② shape으로 행과 열 구하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# shape로 행, 열만 구하기
# arr.shape[0]
>>> arr = np.array( [[ 123 ], [ 456 ]] )
>>> 
>>> arr
array([[123],
       [456]])
>>> 
>>> arr.shape
(23)
>>> 
>>> arr.shape[0]
2
>>> 
>>> arr.shape[1]
3
>>> 
>>> 
>>> np.shape( [[ 123 ], [ 456]] )
(23)
>>> arr.shape[2]
Traceback (most recent call last):
  File "<pyshell#208>", line 1in <module>
    arr.shape[2]
IndexError: tuple index out of range
cs

 

    ③ 행렬 재배열

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 구조 변경 : .reshape(행,열)
>>> arr = np.array( [[ 123456 ], [ 123456 ]] )
>>> arr
array([[123456],
       [123456]])
 
>>> print(arr)
[[1 2 3 4 5 6]
 [1 2 3 4 5 6]]
 
>>> # 3 x 4 shape change
>>> arr = np.array( [[ 123456 ], [ 123456 ]] ).reshape( 34 )
 
>>> arr
array([[1234],
       [5612],
       [3456]])
 
>>> arr.shape
(34)
cs

 

5. 행렬의 종류

    ① 영행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# .zeros(행, 열)
# 모든 요소를 0으로 갖는 행렬 생성
>>> arr = np.zeros( (22) )
>>> arr
array([[0.0.],
       [0.0.]])
 
>>> arr = np.zeros( (34) )
>>> arr
array([[0.0.0.0.],
       [0.0.0.0.],
       [0.0.0.0.]])
 
# 행렬간의 연산(+, -, *) 결과 값을 저장할 때
# 처음에 0으로 만들어야 할 때
 
cs

 

    ② 일행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
# .ones(행, 열)
# 모든 요소를 1로 갖는 행렬 생성
>>> arr = np.ones( (22) )
>>> arr
array([[1.1.],
       [1.1.]])
 
>>> arr = np.ones( (34) )
>>> arr
array([[1.1.1.1.],
       [1.1.1.1.],
       [1.1.1.1.]])
 
cs

 

    ③ 단위 행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# .eye(행)
# 단위 행렬(identity matrix) : 
주대각선(Main diagonal)의 원소가 모두 1이고, 다른 요소들은 0으로 하는
정사각형 행렬
# 1차 단위행렬
>>> arr = np.eye(1)
>>> arr
array([[1.]])
 
# 2차 단위행렬
>>> arr = np.eye(2)
>>> arr
array([[1.0.],
       [0.1.]])
 
# 3차 단위행렬
>>> arr = np.eye(3)
>>> arr
array([[1.0.0.],
       [0.1.0.],
       [0.0.1.]])
 
# 4차 단위행렬
>>> arr = np.eye(4)
>>> arr
array([[1.0.0.0.],
       [0.1.0.0.],
       [0.0.1.0.],
       [0.0.0.1.]])
 
cs

 

6. 행렬의 연산

    ① 행렬 곱셈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# np.dot()
# 행렬의 곱셈
>>> ar1 = np.eye(2)
>>> ar2 = np.array( [[34,], [56]] )
>>> ar1
array([[1.0.],
       [0.1.]])
>>> ar2
array([[34],
       [56]])
 
>>> ar1xar2 = np.dot( ar1, ar2 )
>>> ar1xar2
array([[3.4.],
       [5.6.]])
 
>>> test = ar1 * ar2
>>> test
array([[3.0.],
       [0.6.]])
cs

 

7. 행렬 생성

    ① 범위, 간격 지정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# np.arange(시작, 종료, 간격)
# arange로 원하는 숫자 범위, 간격을 지정.
>>> arr = np.arange(10#python range
>>> arr
array([0123456789])
 
>>> arr = np.arange(20)
>>> arr
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  910111213141516,
       171819])
 
>>> arr = np.arange( 0103 )
>>> arr
array([0369])
 
>>> arr = np.arange( 1202 )
>>> arr
array([ 1,  3,  5,  7,  91113151719])
cs

 

    ② 짝수, 홀수를 요소로 갖는 행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# np.arange(시작, 종료, 간격)
# 짝수 출력, 0.5 간격
>>> arr = np.arange( 0202 )
>>> arr
array([ 0,  2,  4,  6,  81012141618])
 
>>> arr = np.arange( 0212 )
>>> arr
array([ 0,  2,  4,  6,  8101214161820])
 
arr = np.arange( 110, .5 )
>>> arr
array([1. , 1.52. , 2.53. , 3.54. , 4.55. , 5.56. , 6.57. ,
       7.58. , 8.59. , 9.5])
 
cs

 

    ③ 범위, 간격, shape을 이용한 행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# .arange()와 .rehape()을 이용하여 3Ⅹ3 행렬 만들기
>>> arr = np.array( [[123], [456], [789]] )
>>> arr
array([[123],
       [456],
       [789]])
 
>>> arr.shape
(33)
 
>>> arr.arange(9)
Traceback (most recent call last):
  File "<pyshell#491>", line 1in <module>
    arr.arange(9)
AttributeError: 'numpy.ndarray' object has no attribute 'arange'
 
>>> arr_new = np.arange(9)
>>> arr_new
array([012345678])
 
>>> arr_new.reshape( 33 )
array([[012],
       [345],
       [678]])
 
cs

 

    ④ arrange()reshape() 조합

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# arrange() 배열 생성 후 reshape()
# 6 x 6 행렬
 
>>> arr = np.arange( 137 )
>>> arr
array([ 1,  2,  3,  4,  5,  6,  7,  8,  91011121314151617,
       1819202122232425262728293031323334,
       3536])
 
>>> arr = arr.reshape(66)
>>> arr
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9101112],
       [131415161718],
       [192021222324],
       [252627282930],
       [313233343536]])
 
cs

 

    ⑤ reshape(-1, n[])

        - .reshape(-1, n) 또는 .reshape(n, -1) 메소드는 주어진 배열의 요소 사이즈와 연관성이 높다.
        -  배열에 있는 요소가 재배열 되려는 배열의 모양구조에 빠짐없이 배분이 되어질 수 있느냐 없느냐가 중요한 핵심이다.
        -  제대로 분배가 안되어지는 경우의 모양은 에러가 발생한다.
        -  예를들어, 12개 배열 요소에서 .reshape(-1, 5) 혹은 .reshape(7, -1)로 재배열하려고 한면 에러가 발생한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# .reshape(-1, 열)
# shape( -1, n[정수] )
>>> ar = np.arange(12).reshape(34)
>>> ar
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  91011]])
 
>>> ar1 = ar.reshape(-11)
>>> ar1
array([[ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11]])
# (-1, 1) == (12, 1)
>>> ar2 = ar.reshape( -12 )
>>> ar2
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [1011]])
 
>>> ar3 = ar.reshape( -13 )
>>> ar3
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 91011]])
 
>>> ar4 = ar.reshape( -15 )
Traceback (most recent call last):
  File "<pyshell#855>", line 1in <module>
    ar4 = ar.reshape( -15 )
ValueError: cannot reshape array of size 12 into shape (5)
 
>>> ar3 = ar.reshape( -16 ) # == (2, 6)
>>> ar3
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  91011]])
 
cs

 

    ⑥ reshape(n[], -1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# .reshape(행, -1)
# shape( n[정수], -1 )
>>> ar = np.arange(12)
 
>>> ar1 = ar.reshape(1-1)
>>> ar1
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  91011]])
 
>>> ar2 = ar.reshape(2-1)
>>> ar2
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  91011]])
 
>>> ar3 = ar.reshape(3-1)
>>> ar3
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  91011]])
 
>>> ar5 = ar.reshape(5-1)
Traceback (most recent call last):
    ar5 = ar.reshape(5-1)
ValueError: cannot reshape array of size 12 into shape (5,newaxis)
 
cs

 

    ⑦ reshape(-1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# reshape(-1)
>>> ar = np.arange(12).reshape(34)
>>> ar
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  91011]])
 
>>> ar1 = ar.reshape(-1)
>>> ar1
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  91011])
 
>>> ar2 = ar.reshape(1-1)
>>> ar2
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  91011]])
 
>>> ar3 = ar.reshape(-11)
>>> ar3
array([[ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11]])
 
cs

 

    ⑧ reshape() 기타

        - .reshape(-1, -1) : 행과 열에 명확한 기준값이 없으므로 에러가 발생한다.

        - .reshape(6, -2) : -1 보다 작은 값을 입력해도 동일한 의미를 갖는다.

 

반응형
반응형

1. 시험환경

    · python v3.7.2 (64 bit)

    · wxPython

 

2. 목적

    · pip를 이용하여 wxPython 라이브러리를 설치한다.

    · wxPython 윈도우/속성/메뉴 생성 등 기본 사용법을 알아보자.

 

3. 적용

    ①  pip를 이용하여 wxPython 라이브러리를 설치한다.

        - pip 업데이트를 진행한다: pip  -m  pip  install  -upgrade  pip

 

        - wxPython 라이브러리를 설치한다: pip  install  wxPython

 

        -  정상 설치 여부를 확인한다: python 프롬프트에서 import wx 실행

 

 

    ② wx.Frame을 이용한 Window 생성 예제

        - 파일명: 01_wxFrame_basic.py

1
2
3
4
5
6
7
8
9
import wx
 
app = wx.App()
 
frame = wx.Frame(None-1"Hello World!")
frame.Show()
 
app.MainLoop()
 
cs

 

        - 결과) “Hello World!”라는 title 갖는 window 생성

01_wxFrame_basic.py 실행화면

 

 

    ③ wx.Frame 속성을 적용한 Window 생성

        - 파일명: 02_wxFrame_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import wx
 
#    SetSize(width, height) : wx.Frame의 “가로 x 세로” 크기 설정
#    SetBackgroundColour(“color”) : wx.Frame 배경색 설정
#    CreateStatusBar() : 상태 표시줄 설정
#    Centre() : 화면 가운데 위치로 윈도우 이동
#    Move(wx.Point point) : 설정값 위치로 윈도우 이동
#    MoveXY(int x, int y) : 설정 좌표로 윈도우 이동
#    SetPosition(wx.Point point) : 윈도우의 위치 설정
#    SetDimensions(x, y, width, height, sizeFlags) : 윈도우의 위치와 크기 설정
 
class WxFrame_Setting(wx.Frame):
 
    def __init__(self, parent, title):
        super().__init__(parent, title = title)
        self.SetSize(600400)
        self.SetBackgroundColour("gray")
        self.CreateStatusBar()
        self.Centre()
        self.Show()
 
 
if __name__ == "__main__":
    app = wx.App()
    WxFrame_Setting(None, title = "wx.Frame Setting")
    app.MainLoop()
cs

 

 

        - 결과) 설정이 반영된 윈도우 화면

02_wxFrame_setting.py 실행화면

 

    ④ wx.Menu 속성을 이용한 메뉴 구성 예제

        - 파일명: 03_menu_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import wx
 
# wx.MenuBar : wx.Frame 상단에 위치한 메뉴를 구성하는 Bar
# wx.Menu : 메뉴에 기본적으로 나타나는 항목
# wx.MenuItem : wx.Menu 클릭시 나타나는 메뉴 항목
 
class wxMenu_setting(wx.Frame):
 
    def __init__(self, parent, title):
        super().__init__(parent, title = title)
        self.SetSize(600400)
        self.SetBackgroundColour("gray")
        self.CreateStatusBar()
        self.Centre()
 
        menu = wx.Menu()
        menu.Append(wx.ID_ABOUT, "About""description_1 in status bar")
        menu.AppendSeparator()
        Exit_ = menu.Append(wx.ID_EXIT, "Exit\tCtrl+E""description_2 in status bar")
        self.Bind(wx.EVT_MENU, self.evt_exit_click, Exit_)
 
        menuBar = wx.MenuBar()
        menuBar.Append(menu, "&File")
 
        self.SetMenuBar(menuBar)
        self.Show()
 
 
    # binding function
    def evt_exit_click(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    wxMenu_setting(None"wx.Menu setting")
    app.MainLoop()
 
cs

 

        - 결과) 설정 메뉴 확인 <Alt> 누르면 코드에서 지정한 단축키가 밑줄로 표시

 

 

    ⑤ Sub Menu 구성 예제

        - 파일명: 04_wxMenu_SubMenu_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import wx
 
# 동일한 서브메뉴를 구성하는 항목들은 동일한 ID로 설정해야 한다.
class wxMenu_SubMenu_setting(wx.Frame):
 
    def __init__(self*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.createWidget()
 
 
    def createWidget(self):
        menu = wx.Menu()
        menu.Append(wx.ID_NEW, "&New")
        menu.Append(wx.ID_OPEN, "&Open")
        menu.Append(wx.ID_SAVE, "&Save")
 
        menu.AppendSeparator()
 
        subMenu = wx.Menu()
        subMenu.Append(wx.ID_ANY, "Import File")
        subMenu.Append(wx.ID_ANY, "Import Image")
        subMenu.Append(wx.ID_ANY, "Export File")
 
        menu.Append(wx.ID_ANY, "Import/Export", subMenu)
 
        Exit_ = menu.Append(wx.ID_EXIT, "&Exit")
        self.Bind(wx.EVT_MENU, self.evt_exit_click, Exit_)
 
        menuBar = wx.MenuBar()
        menuBar.Append(menu, "&Menu1")
 
        self.SetMenuBar(menuBar)
 
        self.Show(True)
 
 
    def evt_exit_click(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    wxMenu_SubMenu_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) 메뉴 서브메뉴 구성 확인

04_wxMenu_SubMenu_setting.py 실행화면

 

    ⑥ Check Menu 구성 예제

        - 파일명: 05_wxMenu_Check_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import wx
 
#     menu item 생성시 wx.ITEM_CHECK 속성을 이용하여 check menu로 설정
class wxMenu_Check_setting(wx.Frame):
 
    def __init__(self*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.createWidget()
 
    def createWidget(self):
 
        menuBar = wx.MenuBar()
 
        # 1. File Menu
        m_file = wx.Menu()
        menuBar.Append(m_file, "&File")
 
        # 2. View Menu
        m_view = wx.Menu()
 
        # kind: Menu Type parameter
        # wx.ITEM_NORMAL(default), wx.ITEM_CHECK(check menu)
        self.show_tb = m_view.Append(wx.ID_ANY, "툴바 보기""툴바 ON/OFF", kind = wx.ITEM_CHECK)
        self.show_sb = m_view.Append(wx.ID_ANY, "상태바 보기""상태바 ON/OFF", kind = wx.ITEM_CHECK)
        
        # Default Set : ToolBar(Checked), StatusBar(Checked)
        m_view.Check(self.show_tb.GetId(), True)
        m_view.Check(self.show_sb.GetId(), True)
        
        # Binding event function
        self.Bind(wx.EVT_MENU, self.toolbar_click, self.show_tb)
        self.Bind(wx.EVT_MENU, self.statusbar_click, self.show_sb)
        
        menuBar.Append(m_view, "&View")
 
        self.SetMenuBar(menuBar)
 
        self.toolbar = self.CreateToolBar()
 
        self.statusBar = self.CreateStatusBar()
        self.statusBar.SetStatusText("Ready")
 
        self.Show(True)
 
 
    def toolbar_click(self, e):
        if self.show_tb.IsChecked():
            self.toolbar.Show()
        else:
            self.toolbar.Hide()
 
 
    def statusbar_click(self, e):
        if self.show_sb.IsChecked():
            self.statusBar.Show()
        else:
            self.statusBar.Hide()
 
 
if __name__ == "__main__":
    app = wx.App()
    wxMenu_Check_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) 체크 메뉴 선택에 따른 툴바 상태바 ON/OFF 기능

 

 

    ⑦ Pop-Up Menu 예제

        - 파일명: 07_wxMenu_PopUp_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import wx
 
#     MenuItem 클래스를 이용한 Pop-Up Menu 구성
class PopupMenu_setting(wx.Menu):
 
    def __init__(self, parent):
        super().__init__()
        self.parent = parent
 
        m_minimize = wx.MenuItem(self, wx.NewId(), "최소화")
        self.Append(m_minimize)
        self.Bind(wx.EVT_MENU, self.exec_minimize_func, m_minimize)
 
        m_exit = wx.MenuItem(self, wx.NewId(), "종료")
        self.Append(m_exit)
        self.Bind(wx.EVT_MENU, self.exec_exit_func, m_exit)
 
    def exec_minimize_func(self, e):
        self.parent.Iconize()
 
    def exec_exit_func(self, e):
        self.parent.Close()
 
        
class WinFrame(wx.Frame):
 
    def __init__(self*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.createWidget()
 
    def createWidget(self):
        # 1. Event : right click on mouse
        self.Bind(wx.EVT_RIGHT_DOWN, self.exec_right_down_func)
        self.Show(True)
 
    # Binding Function
    def exec_right_down_func(self, e):
        # 2. get the position(x, y) on the screen and show your definded popoup menu
        self.PopupMenu(PopupMenu_setting(self), e.GetPosition())
 
    def main():
        app = wx.App()
        WinFrame(None)
        app.MainLoop()
 
 
if __name__ == "__main__":
    WinFrame.main()
 
cs

 

        - 결과) 마우스 우클릭시 나타나는 팝업 메뉴 구성 기능 확인

07_wxMenu_PopUp_setting.py 실행화면

 

    ⑧ ToolBar Icon 구성 예제

        - 파일명: 08_Toolbar_Icon_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import wx
 
class Toolbar_Icon_setting(wx.Frame):
 
    def __init__(self*args, **kw):
        super().__init__(*args, **kw)
        self.createWidget()
 
    def createWidget(self):
 
        # Create a ToolBar in wx.Frame
        # CreateToolBar()를 이용하여 생성된 ToolBar에 Icon 이미지 및 기능 추가
        tb = self.CreateToolBar()
 
        # Insert icon image into the ToolBar
        Exit_ = tb.AddTool(wx.ID_ANY, "Exit", wx.Bitmap("icon_image/icon_01.jpg"))
        self.Bind(wx.EVT_TOOL, self.exec_exit_func, Exit_)
 
        # essential code to show icon image for Win/Mac
        tb.Realize()
 
        self.Show(True)
 
    def exec_exit_func(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    app.locale = wx.Locale(wx.LANGUAGE_ENGLISH)
    Toolbar_Icon_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) ToolBar 추가된 Icon 이미지 기능 확인

08_Toolbar_Icon_setting.py 실행화면

 

    ⑨ Multiple ToolBar Icon 예제

        - 파일명: 09_Toolbar_Multiple_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import wx
 
# 여러 개의 ToolBar를 사용하여 wx.Frame에 배치하는 경우, 겹쳐서 표현되는 문제를 해결해야 함
# wx.BoxSizer(wx.VERTICAL|wx.HORIZONTAL) : wx.Frame을 구획
# Add(ToolBar 객체, 구획비율, wx.EXPAND) : WindowFrame에 설정값으로 ToolBar 추가
class Toolbar_Multiple_setting(wx.Frame):
 
    def __init__(self*args, **kw):
        super().__init__(*args, **kw)
        self.createWidget()
 
    def createWidget(self):
 
        # Use wx.ToolBar() instread of wx.CreateToolBar() to create Multiple ToolBar
        tb1 = wx.ToolBar(self)
        tb1.AddTool(wx.ID_ANY, "New", wx.Bitmap("icon_image/new.png"))
        tb1.AddTool(wx.ID_ANY, "Open", wx.Bitmap("icon_image/open.png"))
        tb1.AddTool(wx.ID_ANY, "Save", wx.Bitmap("icon_image/save.png"))
        tb1.Realize()
 
        # Use wx.ToolBar() instread of wx.CreateToolBar() to create Multiple ToolBar
        tb2 = wx.ToolBar(self)
        Exit_ = tb2.AddTool(wx.ID_ANY, "Exit", wx.Bitmap("icon_image/icon_01.jpg"))
        self.Bind(wx.EVT_TOOL, self.exec_exit_func, Exit_)
        tb2.Realize()
 
        # Set horizontal position of ToolBars in wx.Frame
        hBox = wx.BoxSizer(wx.HORIZONTAL)
        hBox.Add(tb1, 2, wx.EXPAND)
        hBox.Add(tb2, 1, wx.EXPAND)
        self.SetSizer(hBox)
 
        '''
        # Set vertical position of ToolBars in wx.Frame
        vBox = wx.BoxSizer(wx.VERTICAL)
        vBox.Add(tb1, 0, wx.EXPAND)
        vBox.Add(tb2, 0, wx.EXPAND)
        self.SetSizer(vBox)
        '''
        self.Show(True)
 
 
    def exec_exit_func(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    app.locale = wx.Locale(wx.LANGUAGE_ENGLISH)
    Toolbar_Multiple_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) wx.HORIZONTAL/wx.VERTICAL 구획비율을 변경하며 테스트

09_Toolbar_Multiple_setting.py 실행화면

 

    ⑩ ToolBar의 아이콘(버튼) 활성/비활성 제어

        - 파일명: 10_Toolbar_icon_active_nonactive.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import wx
 
# EnableTool(“object ID”, True | False)
class Toolbar_icon_Act_NonAct(wx.Frame):
 
    def __init__(self*args, **kw):
        super().__init__(*args, **kw)
        self.createWidget()
 
 
    def createWidget(self):
        self.count = 5
 
        self.toolbar = self.CreateToolBar()
        toolbar_undo = self.toolbar.AddTool(wx.ID_UNDO, 'undo', wx.Bitmap('icon_image/undo.png'))
        toolbar_redo = self.toolbar.AddTool(wx.ID_REDO, 'redo', wx.Bitmap('icon_image/redo.png'))
 
        self.toolbar.AddSeparator()
 
        toolbar_exit = self.toolbar.AddTool(wx.ID_EXIT, 'exit', wx.Bitmap('icon_image/exit.png'))
 
        self.Bind(wx.EVT_TOOL, self.onUndo, toolbar_undo)
        self.Bind(wx.EVT_TOOL, self.onRedo, toolbar_redo)
        self.Bind(wx.EVT_TOOL, self.onExit, toolbar_exit)
 
        self.toolbar.Realize()
 
        self.Show(True)
 
 
    def onUndo(self, e):
        if self.count > 1 and self.count <= 5:
            self.count -= 1
        elif self.count == 1:
            self.toolbar.EnableTool(wx.ID_UNDO, False)
        elif self.count == 4:
            self.toolbar.EnableTool(wx.ID_REDO, True)
 
 
    def onRedo(self, e):
        if self.count >= 1 and self.count < 5:
            self.count += 1
        elif self.count == 5:
            self.toolbar.EnableTool(wx.ID_REDO, False)
        elif self.count == 2:
            self.toolbar.EnableTool(wx.ID_UNDO, True)
 
 
    def onExit(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    app.locale = wx.Locale(wx.LANGUAGE_ENGLISH)
    Toolbar_icon_Act_NonAct(None)
    app.MainLoop()
 
cs

 

        - 결과) ToolBar 버튼 활성화/비활성화

 

4. 결과

    · 소스코드 파일첨부

Python_GUI_wxPython.zip
0.02MB

 

 

반응형
반응형

1. 데이터베이스 개요

    ① 자료 (data)

    - 현실 세계에서 관찰이나 측정을 통해 수집한 단순한 사실이나 

 

    ② 정보 (information)

    - 의사 결정에 도움을 있는 유용한 형태

    - 자료를 가공(처리)해서 얻을 있는 결과를 의미

 

    ③ 데이터베이스

    - 어느 조직체의 여러 응용 시스템들이 공동으로 사용할 있도록 통합하여 저장한 운영 데이터의 집합

    - 공동의 목적을 지원하기 위한 서로 관련된 자료들의 모임

    - 주제와 관련된 의미있는 데이터들의 모음

 

2. 데이터베이스 정의

    ① 통합된 데이터 (integrated data)

    - 산재되어 있지 않고 한곳에 있어야

    - 모든 데이터가 중복을 최소화하면서 통합

 

    ② 저장 데이터 (stored data)

    - 컴퓨터에서 처리 가능하도록 전자적 형태로 저장

    - 디스크, 테이프 컴퓨터가 접근 가능한 저장 매체에 저장된 데이터

 

    ③ 운영 데이터 (operational data)

    - 고유 기능을 수행하기 위해 반드시 유지되어야 데이터

 

    ④ 공용 데이터 (shared data)

    -  조직의 여러 응용 시스템들이 공동으로 소유, 유지, 이용하는 데이터

 

3. 데이터베이스 특징

    ① 실시간 접근 가능 (real-time accessibilities)

    - 수시적이로 비정형적인 질의(query) 대하여 실시간 처리로 응답

    ② 계속적인 변화 (continuous evolution)

    - 새로운 데이터의 삽입(insert), 삭제(delete), 갱신(update)으로 항상 변하고 속에서 현재의 정확한 데이터를 유지할 있음

    ③ 동시 공유 가능 (concurrent sharing)

    - 여러 사용자가 동시에 자기가 원하는 데이터에 접근

    ④ 내용에 의한 참조 가능 (content reference)

    - 데이터의 레코드 위치(location) 주소(address) 아닌 사용자가 요구하는 데이터의 내용(contents) , 데이터가 가지고 있는 값에 따라 참조

    - 모든 레코드들은 물리적 위치와 상관없이 하나의 논리적 단위로 취급되고 접근

 

4. 데이터베이스 구성요소

    ① 개체 (Entity) : 데이터베이스에 표현하는 유형 무형의 정보

    - 개체 타입 (유형) : 속성의 이름들로 구성

    - 개체 집합 : 개체 어커런스(인스턴스) 모임

 

    ② 속성(Attribute) : 데이터의 가장 작은 논리적 단위(컬럼) 항목, 필드에 해당

 

 

5. DBMS(DataBase Management System)

    ① 정의

    - 사용자에게 데이터베이스를 생성하고 유지할 있게하는 프로그램 집합

    - DBMS 데이터베이스 언어를 가지고 있으며 이를 통해 데이터의 삽입/삭제/수정을 있다.

 

    ② 기능 : 데이터의 무결성 유지

    - DB 데이터는 실세계를 적용하는 규칙을 항상 만족해야 한다.

    - 서로 다른 부분에 있는 두개의 데이터가 서로 모순되지 않아야 한다.

 

    ③ 특성

    - 데이터의 논리적 독립성 : 속성에 가해진 변경이 동일한 테이블에서 다른 속성에 영향을 주지 않는 것을 의미한다.

    - 참조 무결성과 데이터 무결성 : 응용프로그램 개발시 무결성 제약 조건을 신경쓰지 않아도 된다.

    - 비정규 질의 : 사용자는 작업을 실행하는 방법을 명시하지 않고도 데이터베이스에게 어떤 데이터를 조회할 것인지 명령할 있어야한다.

 

6. 데이터베이스 모델의 종류

    ① 계층 데이터 모델 (Hierarchical Data Model)

    - 데이터를 저장하는 단위(Entity) 구조가 상하 종속적인 관계로 구성된다.

    - 개체를 노드로 표현하고 개체 집합들 사이의 관계를 링크로 연결한 트리(Tree) 형태의 자료 구조

 

    ② 데이터 모델 (Network Data Model)

    - CODASYL 제안하여 CODASYL DBTG 모델이라고도 한다.

    - 그래프를 이용해서 데이터의 논리적 구조를 표현한 데이터 모델이다.

    - 상위와 하위 레코드 사이에서 다대다(M:M) 대응 관계를 만족하는 구조이다.

 

    ③ 관계 데이터 모델 (Relational Data Model)

    - 개체 집합에 대한 속성 관계를 표현하기 위하여 개체를 테이블(table) 사용하고 개체 집합들 사이의 관계는 공통 속성으로 연결하는 독립된 형태의 데이터 모델이다.

 

7. 관계형 모델의 구성요소

    ① 관계 데이터베이스에 데이터를 저장할 있는 형식 테이블이다. (Table = Relation)

    - SQL에서 릴레이션보다 테이블이란 용어 사용

    ② 행과 열의 교차점은 원자값(atomic value)라는 오직 하나의 값으로 구성된다.

    ③ 테이블에서 행은 순서가 정해져 있지 않다.

    ④ 테이블의 내용은 실제적인 행의 집합으로 간주된다.

 

8. SQL(Structured Query Language)

    ① SQL 관계형 데이터베이스 언어이다.

    ② 데이터의 삽입, 삭제, 갱신, 질의, 보호(보안) 명령문으로 구성된다.

    ③ SQL 관계 데이터베이스 언어로 비절차적 데이터베이스 언어로 분류한다.

 

반응형
반응형

    ① DB에서 인덱스를 사용하는 이유

    -

DB에 저장한 데이터는 HDD와 같은 저장매체에 저장되고, 각 데이터는 HDD의 주소와 매핑된다.

    - DB에서 어떠한 데이터를 SELECT 하는 경우, DB(HDD)에서 전체 내용을 검색한다(Full Scan).

    - 경우에 따라, 데이터 1건을 찾기 위해 HDD 전체 내용을 뒤져야 하는 경우 시간 소모가 많이 발생한다.

    - 하지만, 찾고자 하는 데이터와 그 데이터가 저장된 주소값이 매핑 테이블로 관리되고 있다면, 찾고자 하는 데이터의 주소값에 직접 접근할 수 있으므로 Full Scan 보다 시간을 획기적으로 단축시킬 수 있다.

    - 이러한 원리로 이용하는 것이 DB index이며, index는 데이터와 그 데이터가 저장된 주소값(row id)으로 관리 된다.

    - 인덱스 생성시 원래 테이블에 있던 데이터는 그대로 두고, 다른 메모리 영역(pga라는 sort area, temporary table space)로 데이터를 가져와서, Indexing 정의에 따라 HDD 블록에 기록된다.

 

    ②  rowid를 구성하는 18자리 의미
    - 6자리 : data object 번호
    - 3자리 : 파일 번호
    - 6자리 : 파일의 block 번호

    - 3자리 : row 번호 (테이블 내에서 몇번째 위치)

scott 계정 접속하여 DEPT 테이블의 rowid 확인

 

    ③ 인덱스 생성 방법

    - Unique Index

    - 명령어) create unique index  인덱스명 on 테이블명(컬럼명);

테스트를 위한 테이블 생성 : DEPT_TEST

 

 

DEPT_TEST 테이블을 unique index로 설정 및 index에 중복 데이터 추가

 

    - Non-Unique Index

    - 명령어) create index  인덱스명 on 테이블명(컬럼명);

테스트를 위한 테이블 생성 : EMP_TEST

 

EMP_TEST 테이블에 Non-Unique Index 설정 및 index에 동일 데이터 추가

 

 

    ④ 인덱스 확인 및 삭제

    - 테이블에 설정된 Index 정보 확인

    - 명령어) SELECT  *  FROM  USER_INDEXES  WHERE  TABLE_NAME='[테이블명]';

    - 명령어) SELECT  *  FROM  USER_IND_COLUMNS  WHERE  TABLE_NAME='[테이블명]';

DEPT_TEST 테이블에 생성된 index 정보 확인

 

EMP_TEST 테이블에 생성된 index 정보 확인

 

    - 인덱스 삭제 명령어) DROP INDEX [인덱스명];

DEPT_TEST, EMP_TEST 테이블에 생성된 index 삭제

 

    ⑤ 인덱스 종류

    - B-Tree 인덱스 : 데이터 종류(colum 수)가 많으면서, 데이터(row 수)가 적은 경우 사용. 

    - FBI(Function Based Index, 함수 기반 인덱스) : WHERE절에서 index로 설정한 컬럼이 함수와 엮이게 되면, index 효과가 나타나지 않음.

    - Decending Index (내림차순 인덱스) : 설정한 컬럼을 기준으로 내림차순 정렬

    - Composit Index (결합 인덱스) : 두개 이상의 컬럼들을 합쳐서 하나의 index로 생성
    - Bitmap 인덱스 : 데이터가 있는 자리만 1로 표시하고, 그렇지 않은 행은 0으로 표시해서 map을 구성해서 관리하는 방식으로 새로운 데이터가 추가되거나 수정되면 bitmap을 다시 생성해야 하는 단점이 있지만 성능은 좋다.

 

 

    ⑥ Index와 성능의 관계

    - 인덱스를 생성하면 성능이 좋아진다? 경우에 따라서 full-scan보다 늦어질 수 있다.
    - INSERT 경우,
       인덱스가 없는 테이블) 그냥 넣으면 된다.
        인덱스가 있는 테이블) 정렬순서대로 insert해야 하므로 테이블이 갈라지면서 여러번에 걸쳐 작업해야 한다.

                                                   (index split 현상)
    - DELETE 경우,
       인덱스가 없는 테이블) 그냥 지워진다.
        인덱스가 있는 테이블) 테이블에서는 데이터가 지워졌지만, 인덱스에서는 지워지지 않고 사용하지 않는 표시
.

                                                  이러한 경우가 누적되면 쿼리 속도가 늦어질 수 있다.
    - UPDATE 경우,
       인덱스가 있는 테이블) DELETE 후 INSERT 작업을 하므로 부하가 발생한다.

 

    ⑦ Index Rebuild

    - index 작업 후 취약점 또는 개선사항 발견 후, index를 새롭게 구성하는 것.

    - index를 한번 생성해 놓았다고해서 영구적으로 좋은 성능을 유지할 수 없기 때문에 꾸준한 관리가 필요.

    - 명령어) analyze  index  [ 이블명]  validate  structure;

    - 명령어) alter  index  [테이블명]  rebuild;

 

    ⑧ Invisible Index

    - index 삭제 전 사용안함 상태로 만들어 테스트할 수 있는 기능.

    - 명령어) alter  index  [인덱스명]  invisible;

    - 관련 명령어) alter  index  [인덱스명]  visible;

 

반응형
반응형

1. 시험환경

    · 윈도우

    · PocketBase

 

2. 목적

    · 윈도우 환경에서 PocketBase를 설치 및 사용법을 알아보자.

 

3. 적용

    ① PocketBase 사이트에 접속하여 다운로드 받는다.

        - URL : https://pocketbase.io/docs/

 

PocketBase - Open Source backend in 1 file

Open Source backend in 1 file with realtime database, authentication, file storage and admin dashboard

pocketbase.io

 

 

    ② 다운로드 받은 압축파일을 해제한다.

 

    ③ CMD 창에서 pocketbase를 실행한다.

        - > pocketbase.exe serve

 

    ④ Admin UI에 접속하여 ID를 생성하고 로그인한다.

 

4. 결과

    · Admin 화면에서 테이블을 생성할 수 있다.

 

 

 

반응형
반응형

1. 시험환경

    · 윈도우

    · node v20.15.0

    · npm 10.7.0

 

2. 목적

    · next.js 프로젝트를 신규 생성하는 방법을 알아보자.

 

3. 적용

    ① 프로젝트 폴더를 생성한다.

        - 예시) nextjs 폴더를 생성한다.

 

    ② nextjs 프로젝트를 생성한다.

        - npx  create-next-app@latest  ./nextjs

 

    ③ 설치한 의존성 라이브러리를 선택하면 설치가 진행된다.

 

    ④ 프로젝트를 실행한다.

        - npm  run  dev

 

4. 결과

 

 

반응형
반응형

1. 시험환경

    ① 워드프레스 최초 설치 후 관리자 계정의 PW는 시스템에서 무작위로 할당한다.

        - 최초 PW 예시 : Q14*6!%Hdjrj*YCaw

 

    ② 최초 발급받은 패스워드는 관리가 어려우므로 로그인 후 변경해보자.

        - http://localhost:8080/wp-admin

워드프레스 로그인

 

    ③ 로그인 후 오른쪽 상단에 "프로필" 클릭 후 나타나는 팝업메뉴에서 [편집]을 클릭한다.

 

    ④ 본문에 나타나는 화면에서 [새 비밀번호 설정] 버튼 후 신규 비밀번호를 입력한다.

 

    ⑤ 로그아웃 후 변경된 비밀번호로 다시 로그인한다.

반응형
반응형

1. 시험환경

    ˙ 윈도우 11

    ˙ MySQL 5.7

    ˙ Docker, Docker-Compose

 

2. 목적

    ˙ 도커, 도커컴포즈 기반으로 워드프레스를 설치한다.

    ˙ DB 및 Wordpress 데이터를 로컬 드라이브에 별도로 저장한다.

 

3. 적용

    ① 윈도우 운영체제에 도커 데스크탑이 설치 및 실행된 상태이어야 한다.

        - URL : https://www.docker.com/products/docker-desktop/

 

Docker Desktop: The #1 Containerization Tool for Developers | Docker

Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.

www.docker.com

 

    ② 도커 컴포트 파일을 구성한다.

        - DB와 Wordpress의 데이터를 윈도우 로컬 디렉토리로 마운트 설정한다.

        - 아래 양식에서 <<Window 로컬 디렉토리>> 부분을 마운트할 경로로 대체하여 작성한다.

 

    ③ 도커 컴포즈를 실행한다.

        - docker-compose  -f  [파일명].yml  up

 

    ④ 도커 데스트탑에서 "Running" 상태인지 확인한다.

 

    ⑤ 워드프레스에 접속하여 초기 설치를 진행한다.

        - http://localhost:8090 (여기서는 Local 접속 8090 포트 사용)

 

4. 결과

    ˙ LocalPC Mount 경로에 저장된 DB 데이터

 

    ˙ LocalPC Mount 경로에 저장된 WP 데이터

 

 

반응형

+ Recent posts