[Inflearn] 초보 백엔드 개발자 로드맵
🌼 강의 링크 (무료)
https://www.inflearn.com/course/초보-백엔드-개발자-로드맵
백엔드 로드맵 링크
🌼 인터넷
인터넷 동작 방식
- 중앙에 라우터 라는 기계를 두고, 각 컴퓨터를 라우터와 연결 -> 단순하게 연결
- 라우터끼리도 연결 가능 -> 네트워크 확장
- 인터넷 제공 장비: 모뎀
- 인터넷 제공 업체: ISP (Internet Service Provider)
- 인터넷으로 연결된 컴퓨터들은 IP 주소를 가짐
- IP 주소를 사람이 알기 쉽게 알파벳과 숫자로 바꾼 것: DNS (도메인)
terminal에서 google 찾기
ping google.com
-> 구글 서버의 IP 주소 나옴
웹소켓
- 데이터를 주고 받을 때 HTTP로 주고 받음
- HTTP
- 클라이언트가 서버에 요청해야 응답을 줄 수 있음
- 웹소켓
- HTTP의 단점 보강한 프로토콜
- HTTP 위에서 구축
- 구동 단계
- 1) HTTP로 핸드쉐이크
- 2) 웹소켓으로 양방향 통신
- 3) 접속 끊기 (클라이언트/서버 아무나 끊을 수 있음)
- 실시간 통신이 필요할 때, 채팅, 주식 같은 사이트에서 주로 사용
- ex) 업비트
🌼 Version Control
Git
- 분산형 버전 관리 시스템
- 다른 버전 관리 시스템과 차별화: 협업 가능
- 로컬 머신의 코드와 분산 서버의 코드가 완전히 동일한 구조
-
git push
: 로컬 머신 코드 업로드 - 영역
- 작업 디렉터리
- staging area: 커밋을 하기 위해
git add
로 추가하면 올라가는 영역 - repository: 커밋 완료 -> 버전 관리가 가능해짐
vi test.txt
git add test.txt
git status
# 커밋할 변경 사항
git commit -m 'test'
git log --oneline
git push # 원격 서버로 올림
git pull # 해당 파일 받음
Github
- git 기반 호스팅 사이트
- pull request: 코드 관리자가 아닌 사람이 코드 변경 요청
- action: 코드 저장소에 어떤 이벤트가 일어날 때 특정 작업이 일어나게 하거나, 주기적으로 어떤 작업을 반복 실행하고 싶은 경우
- project: project 관리
- insight: 저장소 운영 통계
🌼 개발 언어
- JavaScript / TypeScript
- Java
-
Python
- 하나라도 잘 하기!
🌼 데이터 표현법
JSON
- JavaScript Object Notation
- JavaScript 오브젝트 표현법
- 많이 사용됨
- 문법 -> http://json.org/json-ko.html
- 이름과 값 / 배열
{key:value}
- 거의 모든 프로젝트에서 지원
- 주석 넣을 수 없음
YAML
- 마크업 언어가 아님
- http://learnxinyminutes.com/docs/yaml
- JSON보다는 복잡
---
: 문서 구분#
: 주석key: value
- true/false 구분 주의할 것
🌼 리눅스 명령어 (Ubuntu)
# 현재 위치
pwd
# 현재 디렉터리의 파일과 디렉터리
ls
# 디렉터리 이동, 생성, 복사
cd [dir]
mkdir [dir]
cp [dir1] [dir2]
# 파일 열기
vi ~.txt
# 디렉터리 변경
mv dir1 dir2 dir3
# 파일 삭제
rm
# 파일 내용 확인
cat
# 빈 파일 만들기
touch ~.txt
# 화면에 글자 표시
echo
# ip 정보
ip addr
(or) ifconfig
# 네트워크 상태
ss
# 서버 포트 확인
nc localhost(local machine) [port]
# 어떤 명령어가 어디 있는지
which [명령어]
# 파일 마지막 부분 표시
tail
# 파일, 디렉터리 찾음
find []
# 프로세스 상태
ps -aux
# 파일 내부에 패턴을 만족하는 문자열 있는지 확인
grep ' ' [file]
# 프로세스 죽임
kill [pid]
🌼 웹서버
- 애플리케이션 중간에 위치한 서버
- 유저 요청 -> 웹서버 -> 애플리케이션 서버 응답 -> 웹서버 -> 유저
- 유저가 원하는 정적 페이지 (HTML/jpg) 서비스할 때 이용하기도 함
- ex) Nyinx, IIS, Apache
- 웹 개발할 때 웹서버도 같이 보게되는 경우가 많음
- Kubernetes k8s - ingress: nyinx로 되어 있음
🌼 인증과 인가
- 인증 (Authenticattion)
- 신원 확인
- ex) 로그인
- 인가 (Authorization)
- 무엇을 할 수 있는지 정해주는 것
- ex) 권한 지정
- 보통은 인증과 인가 섞어서 쓰지만, 구분할 필요 있음!
🌼 프레임워크
- 개발 시에 필요한 것들을 미리 만들어두어서 작업을 편하게 하는 코드 덩어리
- 종류
- 개발시에 설정을 어떻게 하고 코드는 어떻게 짜야하는지 제안
- 최소한의 코어만을 가지고 설정과 제약을 조금만 하는
- 서버 측에서 API를 만드는 데 필요한 프레임워크
- NestJS
- 아키텍처 구조 잡아줌
- decorator로 추가적인 설정 파일을 두지 않고 라우터나 미들웨어 설정
- 아직 spring에 비해 기업용 프로그램을 작성하기에 부족한 부분이 있지만, 발전 가능성 있음
- Spring
- 기업용 애플리케이션을 만드는 데 필요한 것들을 모두 갖추고 있음
- 많은 학습 필요, 커뮤니티 활성화 되어 있음
- JAVA 발전 더딘 편 - Kotlin이 나와서 어느정도 해소
- FastAPI
- Python 커뮤니티에서 최근 유행
- API만 작성하는 용도로 추천
- 최소한의 설정과 제약, 플라스크와 비슷
- NestJS
🌼 데이터베이스
- 검색과 축적이 쉽도록 정의된 데이터 모음
RDB
- 관계형 DB, 기본키로 각 행 식별
- 질의, 수정, 삭제 용이하지만, 성능을 높이려면 분산 서버 생각해야 함
- 각 테이블 별 관계 지울 수 있음
- MySQL
NoSQL
- MongoDB
- document 저장에 용이
- BSON 문서 모델 저장
- 클러스터 지원하여 확장이 용이
- redis
- key-value 기반
- 분산 캐시
- list, set, hash 등 다양하게 지원
DB 지식들
- ORM
- Object Relation Mapping
- 클래스 오브젝트와 테이블의 관계를 클래스로 가져올 수 있도록
- 특정 클래스의 메소드를 실행하면 실행시에 쿼리 생성을 하거나 쿼리 실행
- 쿼리 작성 없이 DB 조작 가능
- 직관적으로 데이터 관리 가능
- ACID
- 원자성, 일관성, 격리성, 내구성
- 원자성: 트랜잭션을 구성하는 명령어 묶음이 모두 성공하거나 모두 실패하도록
- 일관성: 트랜잭션에 사용된 변경사항이 DB의 무결성조건 만족할 수 있도록
- 격리성: 두 개의 트랜잭션이 서로에게 영향을 미칠 수 없음
- 내구성: 트랜잭션이 성공적으로 끝나면 그 결과가 DB에 계속 유지됨
- 트랜잭션
- 데이터베이스의 상태 변화를 시키기 위해 시키는 작업의 단위
- 동시 다발적으로 발생하는 데이터 변경 요청에도 데이터가 안전하게 변경될 수 있도록 해줌
- N + 1 문제
- ORM 사용 시 많이 마주치는 문제
- 클래스 모델에 다른 클래스의 관계를 설정하고 해당 클래스를 조회할 때 데이터 개수만큼 쿼리가 발생하는 것
- 불필요하게 많은 쿼리 발생
🌼 API
REST 방식
- Representational State Transfer
- 자원의 표현에 의한 상태 전달
- 자원은 HTTP URI 형식으로 자원 표현
- HTTP Method를 사용하여 해당 자원에 대한 상태 전달
- POST, GET, PUT, DELETE
GraphQL
- 쿼리언어 스펙
- 클라이언트가 서버로부터 데이터를 효과적으로 가져오게 하는 것이 목적
- endpoint가 하나만 있음
- REST는 각각의 URI 만들어주어야 함
{
user(id: "1000") {
name
createDt
}
}