🌼 강의 링크 (무료)

https://www.inflearn.com/course/초보-백엔드-개발자-로드맵


백엔드 로드맵 링크

https://roadmap.sh/backend


🌼 인터넷


인터넷 동작 방식

  • 중앙에 라우터 라는 기계를 두고, 각 컴퓨터를 라우터와 연결 -> 단순하게 연결
  • 라우터끼리도 연결 가능 -> 네트워크 확장
  • 인터넷 제공 장비: 모뎀
  • 인터넷 제공 업체: 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}

스크린샷 2023-04-09 오후 5 39 55

  • 거의 모든 프로젝트에서 지원
  • 주석 넣을 수 없음


YAML


🌼 리눅스 명령어 (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만 작성하는 용도로 추천
      • 최소한의 설정과 제약, 플라스크와 비슷


🌼 데이터베이스


  • 검색과 축적이 쉽도록 정의된 데이터 모음

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
    }
}