
gcc -o helloworld helloworld.c./helloworld실제 애플리케이션은 많은 파일로 복잡하게 구성되어 있기 때문에 gcc로 일일이 컴파일해서 하나의 실행 파일로 만드는 것은 매우 번거로운 작업.
→ 이를 해결하기 위한 make 명령
makefile 이라고 하는 설정된 정보를 읽어서 여러 소스 파일을 컴파일하고 링크해서 최종 실행 파일을 생성
소스 코드로 배포되는 많은 오픈소스 소프트웨어는 소스 코드와 makefile을 같이 배포
one.c
#include <stdio.h>
extern int two();
int main() {
printf("Go to Module Two---\n");
two();
printf("End of Module One\n");
return 0;
}
#include <stdio.h>
int two() {
printf("End of Module One\n");
return 0;
}
TARGET=one
OBJECTS=one.o two.o
# 최종 실행 파일 생성
${TARGET} : ${OBJECTS}
gcc -o ${TARGET} ${OBJECTS}
# one.o 생성 (one.c를 컴파일만 함)
one.o : one.c
gcc -o one.c
# two.o 생성 (two.c를 컴파일만 함)
two.o : two.c
gcc -o two.c
./one
python3 --version
sudo apt-get upgrade python3
# venv 모듈 설치
sudo apt install python3-venv
mkdir pythontest
cd pythontest
# 가상환경 생성
python3 -m venv myvenv
# 가상환경 활성화
source myvenv/bin/activate
# main.py
# 학생 성적 리스트
scores = [85, 92, 78, 90, 88]
# 80점 이상인 성적만 필터링 (List Comprehension)
high_scores = [s for s in scores if s >= 80]
# 평균 계산
average = sum(scores) / len(scores)
print(f"고득점 리스트: {high_scores}")
print(f"전체 평균: {average:.2f}")
python3 main.py
pip freeze > requirements.txt
📌 파이썬에서 venv 를 항상 사용하는 이유
1. 파이썬은 글로벌 저장소를 사용
- 파이썬은 기본적으로 패키지를 시스템 전체(Global)가 공유하는 하나의 폴더에 설치함
- → Dependency Hell 에 빠질 위험
2. 컴파일 언어와의 차이
- C / Go / Rust : 필요한 라이브러리를 가져와서 컴파일하면, 결과물로 모든 기능이 포함된 하나의 실행파일(바이너리)이 나옴.
- Java: 프로젝트마다 pom.xml, build.gradle 을 통해 필요한 라이브러리를 프로젝트 단위로 관리하는 구조(Maven, Gradle)가 매우 강력하게 정착되어 있음
- Python: 인터프리터 언어라서 실행하는 순간에 시스템에 깔린 라이브러리를 찾음. 이때 가상환경이 없으면 무조건 시스템 폴더만 탐색하기 때문에 충돌이 발생
3. venv가 해결해주는 것
- 독립된 폴더 생성: 프로젝트 폴더 안에 작은 파이썬 복사본을 만듦
- 경로(PATH) 조작: 가상환경을 activate 하는 순간, 컴퓨터에게 시스템 폴더 말고, 해당 프로젝트 폴더 안에 있는 site-packages를 먼저보라고 명령
- 환경 격리: venv 덕분에 프로젝트 A와 B는 서로 어떤 버전의 라이브러리를 사용하는지 전혀 모름
정리
- 파이썬은 패키지 보관함이 기본적으로 하나뿐이라서, 프로젝트마다 전용 보관함을 만들어주는 venv 작업이 필수이다.
Docker, Kubernetes 개발 언어
설치
// 기존에 설치된 go가 있다면 삭제
sudo rm -rf /usr/local/go
// Go 다운로드 (버전 숫자는 변경될 수 있음) - arm64
curl -OL https://golang.org/dl/go1.22.0.linux-arm64.tar.gz
// 압축 해제
sudo tar -C /usr/local -xzf go1.22.0.linux-arm64.tar.gz
// 어느 디렉토리에서나 go 명령어를 사용할 수 있도록 환경 변수를 설정
// go 관련 명령어의 위치 (/usr/local/go/bin)
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.profile
// 환경 설정 파일(~/.profile)을 수정한 후 바로 적용하기
source ~/.profile
// 확인
go version
// 작업 디렉토리 생성
mkdir hello-go
cd hello-go
// hello-go 라는 이름으로 모듈을 시작
go mod init hello-go
// 소스 코드 작성(main.go)
package main
import "fmt"
func main() {
fmt.Println("Hello. Go world!")
// simple example
a := 10
b := 20
sum := a + b
fmt.Printf("%d + %d = %d\n", a, b, sum)
}
// 실행
go run main.go
개요
특징
원격 접속: 텍스트 기반의 CLI 를 통해 원격 호스트를 제어TCP 기반: 기본적으로 TCP 23번 포트를 사용하여 통신플랫폼 독립성: 윈도우, 리눅스, 맥 등 서로 다른 OS 간에도 표준화된 방식으로 통신이 가능NVT(Network Virtual Terminal): 서로 다른 시스템 환경에서도 명령어를 인식할 수 있도록 가상의 단말기 개념을 사용하여 데이터를 주고 받음포트 개방 확인(네트워크 진단) : 특정 서버의 특정 포트가 열려 있는지 확인할 때 유용애플리케이션 테스트 : HTTP, SMTP 등 텍스트 기반 프로토콜의 응답을 직접 확인하기 위해 수동으로 명령을 보낼 때 사용장점
단점
개요
특징
강력한 암호화 : 패스워드뿐만 아니라 전송되는 데이터 전체를 암호화인증(Authentication) : 접속하려는 사용자가 올바른 사용자인지 확인(비밀번호 방식, 공개키 방식 등)무결성(Integrity) : 전송된 데이터가 중간에 위변조되지 않았음을 보장압축 : 데이터를 압축하여 전송하므로 네트워크 효율이 좋음동작 원리
22번공개키(Public Key) : 서버에 저장되는데 누구나 봐도 상관 없으며 데이터를 암호화하는 데 사용개인키(Private Key) : 클라이언트(사용자 PC)에 보관되는데 절대로 유출되면 안 되며, 암호화된 데이터를 푸는(복호화) 데 사용주요 활용 사례
설치, 동작 및 접속
# 설치
apt -y install openssh-server
# 서비스 시작
sudo systemctl start ssh
# 부팅과 동시에 서비스 시작
sudo systemctl enable ssh
# 서비스 가동 여부 확인
sudo systemctl status ssh
# 방화벽에서 22번 포트 해제
sudo ufw allow 22/tcp
ssh-keygen -t rsa -b 4096 -C “your_email@example.com”ssh-copy-id -p 포트번호 [사용자명]@[서버 주소]~/.ssh/authorized_keys 파일 끝에 복사한 내용을 붙여넣고 저장
.ssh 디렉토리 (생성됨)
공개키를 서버에 전송하기
ssh-copy-id -p 포트번호 [사용자명]@[IP주소]접속 방식 설정 시 파일 전송을 하지 않고 설정 가능
scp [옵션] [원본 경로] [대상 경로]
상황 1) 클라이언트의 파일을 서버로 전송
scp [파일 경로] [유저 이름]@[IP 주소: 서버의 경로]scp -P [파일 경로] [유저 이름]@[IP 주소: 서버의 경로]상황 2) 클라이언트의 디렉토리 전송
scp -P 포트번호 -r 디렉토리 유저이름@IP주소:서버의경로상황 3) 서버의 파일을 다운로드
scp -P 포트번호 유저이름@IP주소:서버의경로 로컬경로# 설치
sudo apt-get install mariadb-server
# mariadb.service 를 활성화
systemctl start mariadb
systemctl enable mariadb
# 서비스 확인
systemctl status mariadb
sudo mysql
# MariaDB 서버를 관리한다.
mysqladmin [명령]
version : MariaDB 서버의 버전 정보를 출력status : MariaDB 서버의 현재 상태 정보를 출력password 암호 : 계정의 암호를 지정sudo mysqladmin -u root password 암호
# 변경된 비밀번호로 접속
sudo mysql -u root -p
# 유정 생성
CREATE USER 'itstudy'@'%' IDENTIFIED BY 암호';
# %는 모든 외부 IP로부터의 접속을 허용한다는 의미.
#특정 IP에서만 접속하게 하려면 % 대신 IP를 적으면 됨
# 접속 권한 설정
GRANT ALL PRIVILEGES ON *.* TO 'itstudy'@'%';
# *.*은 모든 데이터베이스와 모든 테이블에 대한 권한을 의미
# 변경 사항 적용
FLUSH PRIVILEGES;
# 변경된 비밀번호로 접속
sudo mysql -u itstudy -p
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnfsudo systemctl restart mariadbufw allow 3306/tcpmysqldump -u [사용자 계정] -p [패스워드] [원본 데이터베이스명] > [생성할 백업DB명].sqlmysql -u [사용자 계정] -p [패스워드] [복원할 DB] < [백업된 DB].sql# 패키지 업데이트
sudo apt update && sudo apt install gnupg curl
# MongoDB 공개 GPG 키 등록
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg \
--dearmor
# 저장소 리스트 추가
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ]
https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee
/etc/apt/sources.list.d/mongodb-org-7.0.list
# 설치
sudo apt update
sudo apt install -y mongodb-org
# 서비스 시작 및 자동 실행 설정
sudo systemctl start mongod
sudo systemctl enable mongod
sudo nano /etc/mongod.conf
net:
port: 27017
bindIp: 0.0.0.0 # 127.0.0.1에서 0.0.0.0으로 변경 (모든 IP 허용)
# 서비스 재시작
sudo systemctl restart mongod
# 방화벽에서 포트 연결 허용
sudo ufw allow 27017/tcp
# 외부에서 접속
mongodb://IP주소:포트번호
# 몽고 쉘 접속
mongosh
# 계정 생성
use admin
db.createUser({
user: "adminUser",
pwd: "password123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
})
# /etc/mongod.conf 파일을 열어서 인증 모드 사용 설정 코드 추가
security:
authorization: enabled
# 서비스 재시작
sudo systemctl restart mongod
# 외부 접속 URL
mongodb://adminUser:password123@서버IP주소:27017/
# 설치
sudo apt update
sudo apt install redis-server -y
# 상태 확인
sudo systemctl status redis-server
# 로컬에서 접속
redis-cli
# 설정 파일 수정
sudo nano /etc/redis/redis.conf
# bind 127.0.0.1 ::1 <- 주석 처리하거나
bind 0.0.0.0 # <- 모든 IPv4 접속 허용
requirepass 비밀번호
# 서비스 재시작
sudo systemctl restart redis-server
# 방화벽 설정
sudo ufw allow 6379/tcp
# 로컬에서 확인
redis-cli
> AUTH 비밀번호
> PING
# 결과로 PONG이 나오면 성공
# 외부에서 접속
redis-cli -h IP주소 -p 포트번호 -a 비밀번호
는 접속할 클라이언트의 특정 IP만 허용하는 것이 안전기본 포트인 6379 대신 다른 포트를 사용하는 것도 자동화된 공격을 피하는 좋은 방법