🏢 데이터 센터(DC)
기업이 다양한 네트워크 형식의 컴퓨팅 및 스토리지 인프라를 수용하는 용도로 사용하는 물리적 시설
🧐 데이터 센터를 많이 보유한 곳?
통신사(SK, KT, LG)
삼성SDS 등의 IT 자회사
🏢 한국의 데이터 센터는 서울·경기에 대부분 분포
대부분의 회사가 수도권에 집중되어있는 경향을 보이기 때문
땅 가격 저렴 & 지역적으로 시원하다는 이점에 강원 지역에도 건설 중
🔩 데이터 센터는 무조건 이중화
자체 망이 죽더라도 다른 망으로의 서비스 제공이 가능해지기 때문
💡 데이터 센터 등급 분류
⑴ 1티어~4티어로 나뉘며 등급이 높을수록 신뢰도↑
⑵ 한국은 3티어, 가동률 99.98%에 1시간 정도의 다운타임을 가지고 있음
⑶ Five Nine 99.9990%는 다운타임이 5.256분을 가짐
→ 적어도 Four Nine 정도 되어야 서비스가 안정적
클라우드 시장에서 차지하는 비중(2021) | 비율 |
---|---|
AWS | 33 % |
Azure | 21 % |
Alibaba Cloud | 10 % |
IBM Cloud | 6 % |
salesforce | 3 % |
Tencent Cloud | 3 % |
Oracle | 2 % |
구글 클라우드와 구글 데이터 센터는 서로 다른 법인
🏭 AWS 리전
AWS가 전 세계에서 데이터 센터를 클러스터링하는 물리적 위치
더 높은 가용성, 확장성, 내결함성을 위해 다중의 가용영역으로 구성
→ 홍수나 화재, 지진 같은 만일의 상황에 대비하여 가용영역(Availability Zone)을 4개 이상 구성
✍ EC2(Elastic Compute Cloud)
AWS에서 제공하는 클라우드 컴퓨팅
✍ EBS(Elastic Block Storage)
데이터를 저장
API를 이용해 생성, 연결, 수정 등의 역할 수행
✍ AMI(Amazon Machine Image)
인스턴스를 실행 할 때 필요한 정보를 모아 저장한 단위
CPU의 타입, 저장 공간의 용량, OS가 무엇인지 등의 정보
💻 EC2 인스턴스
AWS 클라우드에서 사용하는 일종의 가상 컴퓨터
🔎 Amazone EC2 인스턴스 표기법
M5d.xlarge | 뜻 |
---|---|
M | 인스턴스 패밀리 |
5 | 인스턴스 세대 |
d | 추가 기능 |
xlarge | 인스턴스 크기 |
✍ 인스턴스 크기
8코어 짜리를 2개, 4개, 8개로 나누어 운영
xlarge 8시간 운영하는 비용과 8xlarge 1시간 운영하는 비용은 같음
→ 즉, 작은 크기로 된 인스턴스를 사용할수록 비용 절감 가능
💡 클라우드의 장점
"Pay as you go"
"쓴 만큼 지불하라"
🏬 회사는 보통 5개년 감가상각
서비스를 시도하는 경우 → 클라우드 사용
서비스가 안정화 된 경우 → 온프렘(On-Prem) 사용
📢 여기서 잠깐! 온프레미스(On-premise)란?
IT 서비스를 운영하는 회사가 자체적으로 보유한 공간에 물리적으로 하드웨어 장비를 가지고 인프라를 직접 운영하는 방식
☁ Cloud Native
클라우드의 장점을 최대한 활용하는 방식
🏦 CNCF (Cloud Native Computing Foundation)
클라우드 네이티브로의 전환이 가능한 다양한 오픈소스 프로젝트를 추진하고 관리하는 단체
CNCF |
---|
⑴ Containerized |
⑵ Dynamically orchestrated |
⑶ Microservices oriented |
☁ Cloud Native Lanscape
클라우드 네이티브를 전제로 한 오픈소스들이 즐비해있는 공간
✍ 마이크로 서비스
① 비용 효율적
▫ 예를 들어 자바에서는 하나의 패키지에 모든 기능이 포함되어 있다면 마이크로 서비스는 기능들을 분리시켜 별개의 컨테이너로 만들어 줌
▫ 장애가 발생하더라도 부분적으로만 쓰지 못하고 나머지 서비스는 이용 가능
② 업데이트 편리
▫ 서비스를 분화시켜 놓으면 업데이트가 빠름
▫ 필요에 따라 사용하려는 부분만 업데이트 가능
③ 분리된 환경, 서비스가 다른 서비스를 호출하는 형식으로 사용
▫ 유튜브나 넷플릭스 같은 것들
구조 App App Operating System Hardware → 맨 밑
구조1 구조2 VM1-OS-Bin/Lib-App VM2-OS-Bin/Lib-App Hypervisor Hypervisor Operating System Operating System Hardware Hardware → 맨 밑
✍ 가상화
격리된 상태라도 서비스 제공 가능
회사에서 많이 사용 ex. VMware
✍ Guest OS의 단점
리소스 오버헤드
부트업 타임 증가
📢 이러한 가상화의 단점은 컨테이너로 보완 가능
구조1 구조2 Container1-Bin/Lib-App Container2-Bin/Lib-App Operating System Operating System Hardware Hardware → 맨 밑
✔ 컨테이너
별도의 OS 공간 X
격리 제공
오버헤드 X
VMware보다는 컨테이너가 사용에 용이
🚪 Docker
대표적인 컨테이너 런타임
도커를 말아넣으면 라이브러리 간 충돌 발생 X
VMware보다 더 작게, 오버헤드 없이 운영 가능
같은 피지컬 서버에 더 많은 서버를 띄울 수 있음
💻 Serverless
개발자가 서버를 관리할 필요 없이 애플리케이션을 빌드하고 실행할 수 있도록 하는 클라우드 네이티브 개발 모델
✍ 쿠버네티스(K8S)
컨테이너들을 서버에 안전하게 띄워주는 역할
명령에 따라 내부에서 알아서 관리하는 것
만약 컨테이너 하나가 죽었다면, 쿠버네티스가 이를 확인하고 죽은 컨테이너를 찔러본 다음 다시 실행시킴
❗ 파이썬(Python)
1990년 네덜란드 소프트웨어 엔지니어인 귀도 반 로섬이 만든 언어
인터프리터를 사용하는 객체지향 언어이자 플랫폼에 독립적인 동적 타이핑 대화형 언어
공동 작업과 유지 보수가 매우 쉽고 편리
ex. 인스타그램, 넷플릭스, 아마존 등
① 사람이 생각하는 방식을 그대로 표현할 수 있는 인간다운 언어
② 문법이 쉬워 빠르게 배우기 가능
문법 자체가 쉽고 간결해 사람의 사고 체계와 매우 닮아있음
③ 무료지만 강력
오픈 소스
④ 간결
펄(Perl)은 100가지 방법으로 1가지 일 처리
파이썬은 가장 좋은 방법 1가지만 사용
⑤ 프로그램을 실행하려면 줄(들여쓰기)을 반드시 맞춰야 함
가독성 향상
프로그램의 시각적 구조가 의미 구조를 정확하게 반영
⑥ 개발 속도가 빠름
"Life is too short, You need Python."
→ 이에 파생된 말
① 웹 프로그래밍
웹 프로그램 만들기에 적합한 도구
② 인공지능과 머신러닝
자연어 처리, 음성 인식, 이미지 인식 등과 같은 인공지능 기술 구현
③ 수치 연산 프로그래밍
④ 데이터 분석
Numpy, Pandas, Matplotlib 등의 라이브러리를 활용해 데이터 분석
⑤ 데이터베이스 프로그래밍
⑥ 시스템 유틸리티 제작
운영체제(윈도우, 리눅스 등)의 시스템 명령어를 사용하는 도구를 통한 시스템 유틸리티 제작
⑦ GUI(Graphic User Interface) 프로그래밍
화면에 윈도우 창을 만들고 프로그램 동작 등의 기능 가능
⑧ C/C++과 결합
C나 C++로 만든 걸 파이썬에서, 파이썬에서 만든 프로그램을 C나 C++에서 사용 가능
⑨ 사물 인터넷
라즈베리파이를 제어하며 사물 인터넷 구현
① 시스템과 밀접한 프로그래밍 영역
운영체제, 엄청난 횟수의 반복과 연산이 필요한 프로그램 등 빠른 속도를 요구하거나 하드웨어를 건드려야 하는 등의 행위 불가능
② 모바일 프로그래밍
안드로이드 네이티브 앱 개발 부족
→ 아이폰 앱 개발 불가
https://www.python.org/downloads
https://code.visualstudio.com/download
cmd(명령 프롬프트) → 시작 메뉴에서 실행
C:\Users\r2com> python --version
Python 3.12.2 # 설치한 파이썬 버전이 표시
2가지 방법 中 원하는 방법으로 실행
① 대화형 인터프리터 실행 → 시작 메뉴 → python 으로 실행
② 명령 프롬프트 → python 명령으로 실행
C:\Users\r2com> python
Python 3.12.2 (tags/v3.12.2:6abddd9, Feb 6 2024, 21:26:36) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
시작 메뉴 → python idle 실행
📢 여기서 잠깐! 통합 개발 환경(IDE)이란?
개발을 함에 있어 필요한 것들을 모아놓은 것
ex. 파이참, VS코드 등
# 디렉토리 생성
C:\Users\r2com> mkdir c:\python
# 생성한 디렉토리로 이동
C:\Users\r2com> cd c:\python
# 현재 디렉토리를 프로젝트 기준(루트) 디렉토리로 설정한 후 VSCode 실행
c:\python> code .
파이썬의 경우 print 함수를 사용하지 않더라도 코드 실행 결과가 하단에 즉시 출력됨
VS코드의 경우 별도의 파일을 만들어 실행할 때 결과를 즉각적으로 내기 위해선 print 함수가 필요
>>> 3/2 # 정수/정수의 결과로 실수 반환
1.5
>>> 3%2 # %는 나눗셈 결과에서 나머지만 반환
1
>>> 3//2 # //는 나눗셈 결과에서 몫만 반환
1
>>> 5 / 2
2.5
>>> 5 % 2
1
>>> 5 // 2
2
✔ 괄호(=)를 기준으로 왼쪽엔 변수명, 오른쪽엔 변수값
ex. a = 1
>>> a = 1 # 변수에 값 할당(할당 연산자 '=' 사용)
>>> b = 2
>>> a + b # 변수에 할당된 값 사용
3
>>> a = 10 # 새로운 값 할당 가능(변수의 값 변경 가능)
>>> b = 20
>>> a + b # 변수가 숫자 타입의 값을 가지면 덧셈 연산으로 동작
30
# 변수의 값을 따옴표로 묶으면 문자열(string) 타입의 값을 가지게 됨
>>> a = "string"
>>> b = "문자열"
# 변수가 문자열 타입의 값을 가지면 + 연산자는 문자열을 결합하는 용도로 동작
>>> a + b
'string문자열'
📝 숫자형(number)
숫자 형태로 이루어진 자료형
분류 | 예시 |
---|---|
정수 | 123, -345, 0 |
실수 | 123.45, -1234.5, 3.4e10 |
8진수 | 0o34, 0o25 |
16진수 | 0x2A, 0xFF |
📝 숫자형을 활용하기 위한 연산자
사칙연산(+, -, *, /)
x의 y제곱을 나타내는 ** 연산자
나눗셈 후 나머지를 리턴하는 % 연산자
나눗셈 후 몫을 리턴하는 // 연산자
>>> a = 10
>>> b = 20
>>> a * b
200
>>> a ** b
100000000000000000000
📝 문자열(string)
문자, 단어 등으로 구성된 문자들의 집합
따옴표("", '')로 묶여진 데이터
ex. "python", 'apple' 등
>>> a = """aaa # 여러 줄(라인)에 내용을 포함하는 문자열을 의미
... bbb""" # 입력할 내용이 남아있음을 의미
>>> a
'aaa\nbbb' # 개행문자(\n)를 포함한 문자열 → \n는 줄 바꿈 문자(이스케이프 문자)
>>> print(a)
aaa
bbb # 개행문자에 의해 새로운 줄에서 출력
+-- 문자열 데이터의 시작을 의미
| +-- 문자열 데이터의 끝을 의미하는 기호로 해석
| |
| |
>>> food = 'Python's favorite food is perl'
~~~~~~~~~~~~~~~~~~~~~~~~
# 프로그램에서 해석할 수 없는 내용으로 처리
File "<stdin>", line 1
food = 'Python's favorite food is perl'
^
SyntaxError: invalid syntax
① 쌍따옴표(" ")
+-- 문장 부호의 의미로 사용
|
+------|-----------------------+-- 문자열 데이터의 시작과 끝을 의미하는 기호로 사용
| | |
>>> food = "Python's favorite food is perl"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
문자열 데이터에 홑따옴표를 포함하고 있는 경우
→ 문자열 데이터를 쌍따옴표로 묶어서 표현
>>> food
"Python's favorite food is perl"
② 이스케이프 처리
+-- 뒤에 나오는 홑따옴표가 문자열 데이터의 시작과 끝을 의미하는 기호가 아닌
| 문장 부호의 의미로 사용되는 것을 의미 ⇒ 이스케이프 처리
|
+------|------------------------+-- 문자열 데이터의 시작과 끝을 의미하는 기호로 사용
| | |
>>> food = 'Python\'s favorite food is perl'
>>> food
"Python's favorite food is perl"
💻 문자열
Ex.
>>> s='abcd'
>>> len(s)
4
>>> l=[1,2,3,4]
>>> len(l)
4
>>> 'nh' + 'xy' # 문자열 + 문자열 → 문자열 결합
'nhxy'
>>> 'nh' + 3 # 문자열 + 숫자 또는 숫자 + 문자열 → 에러
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
>>> 3 + 'hn'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> str(3) # 매개변수로 설정된 숫자를 문자로 변환해주는 함수
'3'
>>> 'nh' + str(3)
'nh3'
>>> str(3) + 'nh'
'3nh'
>>> 10+'10' # 숫자 + 문자열 → 에러
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> 10+int('10') # 숫자 + 숫자 → 덧셈 결과 도출
20
>>> str(10)+'10' # 문자열 + 문자열 → 문자열 결합 결과 도출
'1010'
>>> int('1234') # int 함수에는 정수 형태의 문자열이 매개변수로 전달되어야 함
1234
>>> int('1234.0')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '1234.0'
>>> int('123')
123
>>> float('123')
123.0
>>> int('123.45') # 타입 변환 오류
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '123.45'
>>> 4 * '-' # 반복 (반복 횟수가 0보다 작거나 같으면 빈 문자열 반환)
'----'
>>> 'NULL' * 0
''
>>> 'NULL' * -3
''
📝 의미 문자 = 메타 문자 = 특수 기호
어떤 기능에서 특별한 용도로 정의되어 있거나 의미를 가지고 있는 문자
Ex.
SQL문에서 홑따옴표는 문자열 데이터의 시작과 끝을 의미
select * from users where name = 'Hong'
~ ~
URL에서 &는 요청 파라미터와 파라미터를 구분짓는 용도
http://www.test.com/getCompanyInfo.jsp?
companyName=SK&city=Secoul&type=ITService
~~~~~~~~~~~~~~ ~~~~~~~~~~~ ~~~~~~~~~~~~~~
🔎 의미 문자에서 의미를 제거하고 단순 문자로만 사용하고 싶은 경우
해당 기능에서 제공하는 일정한 규칙에 따라 변형해서 사용
→ 인코딩
Ex.
# MySQL의 경우 홑따옴표를 두 번 사용하면 홑따옴표 문자로 인식
select * from users where name = 'John''s Junior 2'
~~
# & 기호를 URL 인코딩하여 전달
http://www.test.com/getCompanyInfo.jsp?companyName=Bandi%26Luice
의미 문자를 제거하고 단순 문자로 사용한다는 의미의 문자 사용
→ 이스케이프를 의미하는 문자인 백슬래시(\)
Ex.
select * from users where name = 'John\'s Junior 2'
~~
💻 여러 줄인 문자열을 변수에 대입하고 싶을 때
'\n' 삽입
Ex.
multi = """ # \n
첫 번째 라인
두 번째 라인
세 번째 라인
"""
print("*" * 10) # "*" 문자를 10번 반복
print(multi)
print("*" * 10)
********** 첫 번째 라인 두 번째 라인 세 번째 라인 **********
multi = """
첫 번째 라인
두 번째 라인
세 번째 라인
"""
print("*" * 10)
print(multi)
print("*" * 10)
singleline = "\n첫번째\n두번째\n세번째\n"
print("*" * 10)
print(singleline)
print("*" * 10)
********** 첫 번째 라인 두 번째 라인 세 번째 라인 ********** ********** 첫번째 두번째 세번째 **********