[MySQL]맥북에서 mysql 설치하기

맥북에서 mysql을 설치하는 방법을 정리한다.

Homebrew를 통한 설치

설치

brew 업데이트를 하고 설치를 진행한다.

1
2
brew update
brew install mysql

서버 시작

1
mysql.server start

서버 정지

1
mysql.server stop

root 비밀번호 설정

1
mysql_secure_installation

root 비밀번호를 설정하기 위해 위의 명령어를 입력하게 되면 몇몇의 질문을 받게 된다. 질문에 대한 내용은 다음과 같다.

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
# root 비밀번호 입력
Enter password for user root:

# 비밀번호 보안을 위한 컴포넌트 사용 여부
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

# 기존에 root 패스워드를 만들었다면 변경할 것인지
Change the password for root ? ((Press y|Y for Yes, any other key for No) :

# 익명 사용자를 사용할 것인지 여부.
# no를 입력하면 익명사용자를 그대로 두며 mysql 명령어만으로 접속 가능
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) :

# localhost 이외의 주소에서 root 사용자로 접속 가능한지 여부
# yes를 입력하면 외부에서 root 사용자로 접속 불가
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) :

# 테스트 DB 삭제 여부
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) :

# 권한관련 테이블 리로딩 여부
# 권한 변경을 수행했다면 yes를 입력
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) :

charset 확인

utf8을 사용하는 게 정신적으로 이로움으로 꼭 확인해본다. mysql 접속 후 명령어 실행!

1
2
3
4
5
6
status;

Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4

[참고]
https://github.com/helloheesu/SecretlyGreatly/wiki/%EB%A7%A5%EC%97%90%EC%84%9C-mysql-%EC%84%A4%EC%B9%98-%ED%9B%84-%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

Share

파이썬으로 알아보는 자료구조 - double linked list

Double Linked List

  • 이중 연결리스트
  • 단방향성을 가진 단순 연결리스트의 단점을 보완
  • 이전 노드(prev)와 다음 노드(next), 그리고 데이터(data)를 가짐
  • head / tail 키워드가 중요!!

연습

1. 클래스로 구현

head와 tail에 주의하여야 한다!!

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
class Node():
def __init__(self, data, prev=None, next=None):
self.prev = prev
self.data = data
self.next = next


class NodeMgmt():
def __init__(self, data):
self.head = Node(data)
self.tail = self.head

def add(self, data):
node = self.head
while node.next:
node = node.next
new = Node(data)
node.next = new
new.prev = node
self.tail = new

def desc(self):
node = self.head
while node:
print(node.data)
node = node.next

dll = NodeMgmt(1)
for i in range(2, 11):
dll.add(i)
dll.desc()

2. 앞 / 뒤에서부터 이중 연결리스트의 값 출력하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 아래의 두 함수는 NodeMgmt 클래스의 인스턴스 메소드

# 앞에서부터 시작
def desc_from_head(self):
node = self.head
while node:
print(node.data)
node = node.next

# 뒤에서 시작
def desc_from_tail(self):
node = self.tail
while node:
print(node.data)
node = node.prev

3. 특정 데이터 앞에 노드 추가하기1

head에서 부터 데이터를 읽기 시작하여 특정 데이터 앞에 새로운 노드를 추가

1
2
3
4
5
6
7
8
9
10
11
12
def insert_from_head(self, data, target):
node = self.head
while node.next:
if node.next.data == target:
new = Node(data)
new.next = node.next
node.next.prev = new
new.prev = node
node.next = new
return
else:
node = node.next

4. 특정 데이터 앞에 노드 추가하기2

tail에서 부터 데이터를 읽기 시작하여 특정 데이터 앞에 새로운 노드를 추가

1
2
3
4
5
6
7
8
9
10
11
12
def insert_from_tail(self, data, target):
node = self.tail
while node.prev:
if node.data != target:
node = node.prev
else:
new = Node(data)
new.prev = node.prev
new.next = node
node.prev.next = new
node.prev = new
return
Share

파이썬으로 알아보는 자료구조 - linked list

Linked List

  • 연결리스트
  • 배열은 순차적으로 연결된 공간에 연속적으로 데이터를 저장
  • 연결리스트는 떨어진 공간에서도 사용할 수 있다
  • 파이썬에서는 리스트가 연결리스트를 모두 지원

image
출처: https://medium.com/tanay-toshniwal/linked-list-introduction-662f7973dee5

예시

  • 파이썬의 기본 자료구조인 리스트(list)

용어

  • 노드(Node): 데이터의 저장 단위. 데이터와 포인터로 구성

  • 포인터(Pointer): 각 노드 안에서 다음 노드의 주소 정보를 가지고 있는 공간

  • head: 연결리스트의 맨 앞 노드

  • tail: 연결리스트의 맨 마지막 노드

장단점

장점

  • 동적으로 메모리 사용
  • 데이터의 재구성 용이

단점

  • 특정 인덱스의 데이터에 접근하기 어려움
  • 즉, 중간 노드의 탐색이 어려움
  • 연결을 위한 포인터와 같은 별도의 공간이 필요함으로 저장 공간 효율이 좋지 않음
  • 중간 데이터의 삭제 / 수정 / 추가 시, 앞뒤 노드를 재구성해야 하는 추가작업 필요

연습

1. 간단히 구현

파이썬의 클래스를 활용. 각 노드를 객체로 관리한다.

1
2
3
4
class Node():
def __init__(self, data, addr=None):
self.data = data
self.next = addr

맨 뒤에 새로운 데이터 추가하기

1
2
3
4
node1 = Node(1)
node2 = Node(2)
node1.next = node2
head = node1 # 연결리스트의 시작을 알기 위해서 보통 사용함

함수를 정의하여 데이터 추가하기

1
2
3
4
5
6
7
8
9
10
def add(data):
node = head
while node.next:
node = node.next
node.next = Node(data)

node1 = Node(1)
head = node1
for i in range(2, 6):
add(i)

연결리스트의 모든 노드 출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
head = node1
def pprint():
node = head
while node.next:
print(node.data)
node = node.next
print(node.data)

pprint()
# 1
# 2
# 3
# 4
# 5

2. 클래스 이용

연결리스트에서는 리스트의 맨 앞을 가리키는 head가 매우 중요한 것 같다.

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
class Node():
def __init__(self, data, addr=None):
self.data = data
self.next = addr

class NodeMgmt():
def __init__(self, data):
self.head = Node(data)

def add(self, data):
node = self.head
while node.next:
node = node.next
node.next = Node(data)

def desc(self):
node = self.head
while node:
print(node.data)
node = node.next

node1 = NodeMgmt(1)
for i in range(2, 11):
node1.add(i)
node1.desc()

3. 노드 삭제

연결리스트의 노드를 삭제하는 종류에는 세 가지가 있다.

  • head 삭제
  • tail 삭제
  • 중간 노드 삭제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 인스턴스 메소드로 추가
def delete(self, data):
# 1. head 삭제
if self.head.data == data:
temp = self.head
self.head = self.head.next
del temp
# 2. tail 삭제
# 3. 중간 노드 삭제
else:
node = self.head
while node.next:
if node.next.data == data:
temp = node.next
node.next = node.next.next
del temp
else:
node = node.next

4. 노드 찾기

특정 값을 가지는 노드 찾기

1
2
3
4
5
6
7
8
# 인스턴스 메소드로 추가
def find(self, data):
node = self.head
while node:
if node.data == data:
return node.data
else:
node = node.next
Share