목차
완벽한 정리가 목적이 아니고, 로드맵을 보면서 기본 개념을 알고 차후 파고들어서 공부하기 위한 사전 준비 과정인 스터디이다. 따라서 이하 정리한 내용이 부실할 수 있습니다(애초에 제대로 보려면 한 주제당 블로그 글 하나 이상씩 나와야 하는 수준..)
Learn a Language
프론트엔드는 HTML, CSS, JS 를 기반으로 +@로 파생되는 다른 애들이 있음. 백엔드는 그런건 잘 없는것 같음. 언어 및 프레임워크에 더해서 DB, 서버, 보안 등도 다뤄야 해서 러닝커브가 큰 것 같음.
Java
자바스크립트 - 스크립트
- JVM 위에서 돌아감
- JVM, JRE, JDK
- 빌드툴 : Gradle, Maven
- 웹용 프레임워크 : 스프링, 스프링부트, 플레이 등 - 하지만 스프링쪽이 너무 압도적임.
- 테스트 관련 : JUnit, Mockito, JMeter 등
C#
C++++- 자바와 비슷한 부분이 상당히 많아서 자바를 알고 있으면 배우기 쉬운편. 닷넷 3.0 이전까지는 약간 자바 따라하는 느낌으로 가서, 상당히 많은 자바 함수에 맨앞만 대문자로 바꾸면 자동완성에 뜨는걸 볼 수 있음. 심지어 일반적으로 Vector로 불리는 자료구조를 자바에서는 자바1에서 만들었다가 이후 Collection이 추가되면서 컬렉션에 포함되도록 동일한걸 ArrayList라는 이름으로 만들었는데, 그것마저 C#에도 있음. 다만 4.0이후부터는 자바보다 언어적인 기능면에서 앞서감(람다, 링큐 등등).
- e.g. 백준 9093을 C#으로 푼 것. (자바와 상당히 비슷)
using System;
using System.IO;
using System.Text;
namespace Prac {
class Program {
private static StreamReader sr = new StreamReader(Console.OpenStandardInput());
private static StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
static void Main(String[] args) {
int tc = int.Parse(sr.ReadLine());
while (tc-->0) {
string[] tmp = sr.ReadLine().Split(" ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < tmp.Length; i++) {
sb.Append(reverseStr(tmp[i]));
sb.Append(i < tmp.Length-1 ? " " : "\n");
}
sw.Write(sb.ToString());
}
sr.Close();
sw.Flush();
sw.Close();
}
private static string reverseStr(string str) {
char[] strArr = str.ToCharArray();
char[] resArr = new char[str.Length];
for (int i = 0; i < str.Length; i++)
resArr[i] = strArr[str.Length-i-1];
return new string(resArr);
}
}
}
- 자바의 JVM 처럼 C#도 CLR이라는 가상 머신 위에서 실행됨.
- .net framework : 주로 윈도우 응용프로그램(WinForm 등) 만들 때 쓰고, 웹도 만들 수 있는(ASP.NET) 프레임워크. 개발 환경도 제공하고 실행 환경도 제공함.
- 닷넷은 C# 전용이 아니고, C++이나 VB, C++로도 사용 가능함.
- 자바에서도 일반 프로그램 만들 땐 그냥 작성하고, 웹사이트 개발할 땐 Servlet, JSP등이 들어가는 것 처럼 닷넷 프레임워크를 통해 개발 시 웹을 개발하려면 ASP.NET을 사용하는 것임.
- 예시 (닷넷을 쓴 C#에서 ASP.NET 작성한거)
@{
var rank = 50;
}
<html>
<body>
@if (rank < 60)
{
<p>Welcome to GeeksforGeeks!</p>
}
</body>
</html>
결과 : Welcome to GeeksforGeeks!
Rust
- Go랑 같이 비교되곤하는 시스템 프로그래밍 언어
- C/C++와 동등한 수준의 속도를 달성하면서도 안정성, 동시성을 챙기는걸 목표로 하는 언어.
- 러닝커브는 높은 편
- 절차지향, 병렬형, 함수형, 객체지향 등을 지원하는 다중 패러다임 언어
- 일단 엄청 빠름. Go도 빠른데 러스트가 더 빠름.
- 0.1초안에 500만개의 입력을 받아 그 합을 출력해야 하는 백준 11921 문제를 통과한 몇 안되는 언어 중 하나. C, C++, Assembly(?), Rust (Go는 아직 백준에서 지원 안해서 모름. 통과될듯)
- 다른 언어들은 GC가 있거나, C처럼 명시적으로 넣어주는데 러스트는 컴파일 시 코드가 알아서 메모리 관리 로직을 넣어줌.
Go
- 장점 : 구글꺼임, 단점 : 구글꺼임
- 겹치는 단어도 많고 해서 주로 golang이라고 많이 부름.
- 컴파일 언어지만 컴파일 속도가 매우 빨라 인터프리터처럼 쓸 수도 있음.
- 문법적으로 c와 비슷한 면이 많음. (c 알면 배우기 더 쉬움)
- GC, 타입추론 있음.
- 에코 등의 웹 프레임워크도 있음.
Ruby
- 배우기 쉽다고 함.
- 속도가 느린편. (대규모 서비스에서는 사용이 어렵다고 함)
- 국내 사용률 매우 저조함.
- Ruby on Rails : 루비용 웹 프레임워크.
- 일본인이 만듬. 그래서인지 일본에서 많이 쓰임
Version Control Systems
파일의 변화를 추적하고 관리하는 시스템.
GitHub
- 대표적인 Git 저장소
- GitLab, Bitbucket보다 비쌈.
- 비공개 저장소가 무료로 2019년에 변경되긴 했지만 인원수 3인 이하.
GitLab
- Ruby on Rails로 만들어진 오픈소스 Git 저장소.
- 인지도는 떨어지나, 비공개 저장소를 참여 인원 수에 관계없이 무제한으로 생성할 수 있어서 기업에서 사용하기 좋음.
- 3way, rebase, ff, squash 등 merge 방식이 있음.
Bitbucket
- 둘보다 더 쌈.
- 개인저장소는 5인 제한
DB
SQL
RDB에서 자료의 검색과 관리, 스키마 생성과 수정, 객체 접근 조정 관리 등을 위해 고안됨. RDB에 저장된 데이터를 효율적으로 가져오는 것이 목적. 주로 백엔드에서 작성하고 호출.
GQL
GraphQL, API 인터페이스를 위한 쿼리임. 웹 클라이언트가 데이터를 서버로 부터 효율적으로 가져오는 것이 목적. 주로 프론트엔드(클라이언트)에서 작성하고 호출.
RDB
관계형 데이터 모델을 기초로 두고 모든 데이터를 2차원 테이블 형태로 표현하는 데이터베이스. 관계를 나타내기 위해 외래 키(foreign key)라는 것을 사용한 테이블 간 Join이 가능하다는게 가장 큰 특징
- 오라클 : 성능 좋고 비쌈. 대용량 데이터 처리와 유지보수에서 장점이 있음. 다양한 DB 통계 정보 지원. ANSI/ISO SQL 뿐 아니라 오라클 SQL도 있음.
- MS-SQL(SQL Server) : 마소에서 개발한 관계형 DB. MS의 다른 개발 언어와 호환성이 뛰어남. SQL Server 2017 이전까지는 윈도우만 지원하다가, 2017 부터는 리눅스도 지원. 하나의 쿼리에 여러개의 SELECT문을 사용해 여러개의 결과를 한번에 받는 기능도 있음. 가격이 쌈.
- MySQL : 현재는 오라클이 인수한 상태임. 대부분의 운영체제와 호환되며 현재 가장 많이 사용되는 DB.
- MariaDB : 오라클에 MySQL이 넘어가면서, 오픈 소스 진영에서 MySQL을 모태로 만든 DB.
- PostgreSQL : 오픈소스 객체-관계형 DB (ORDBMS). MySQL에 비해 SQL 표준을 더 잘 지원하고, 비교적 쿼리가 복잡해질수록 MySQL보다 성능이 잘 나온다고 함. 다만 기본 CRUD 성능이 다른 DB보다 안좋은편. PostGIS라는 지리적 객체에 대한 지원을 추가하는 확장이 있음.
NoSQL
RDB 형태의 관계형 데이터베이스가 아닌 다른 형태의 데이터 저장 기술. 테이블 간 관계를 정의하지 않음(따라서 JOIN 불가). 대량의 분산된 데이터를 저장하고 조회하는 데 특화 (페타급의 데이터도 저장 가능). 스키마가 유동적임. 칼럼이 각기 다른 데이터 타입이라도 가능.
- Key-Value : 가장 단순한 형태의 NoSQL. 간단한 API(put, get, delete)만을 제공하므로 배우기 쉬운편. Value는 어떤 형태의 데이터라도 담을 수 있음(이미지나 비디오도 가능). Redis 등
- Document : Key-Document 형태로 저장. 키-값 모델에서 좀 더 진화된 모델. Value가 계층적인 형태의 도큐먼트(객체)로 변경됨. 질의 결과는 json이나 xml 형태. 도큐먼트 내의 item을 이용한 쿼리가 가능하지만, SQL은 아니고 Xquery 등의 도큐먼트 질의 언어를 따로 익혀야함. MongoDB 등.
NoSQL - Wide Column형 DB (컬럼형 DB)
- RDB는 row 를 기준으로 데이터가 추가되고 처리됨. 스키마를 이미 정해놓고, row 단위로 insert 하게 됨.
- 대부분의 관계형 DB는 부하를 분석하기 어렵고, 선형적 확장이 불가능해서 빅데이터를 처리하기엔 매우 비효율적. (크기가 커질수록 DB가 보틀넥이 되버림)
- 컬럼형 DB는 컬럼형으로 데이터를 저장함 → 선형적 확장 가능
- 컬럼 패밀리 : 컬럼 패밀리라 부르는 몇 개의 특정 컬럼을 기준으로 파티션키를 지정하고, 해당 파티션 키 아래에 데이터가 저장됨 (e.g. 카산드라)
- 클라이언트가 데이터를 가져올 때는 파티션키를 사용.
- 단점: 이미 생성된 테이블의 파티션키 수정 불가(테이블을 삭제할 수 밖에 없음), 파티션키가 아닌 데이터를 where 절로 필터링 하기 어려움(풀스캔 되버림).
자바와 DB
- JDBC : 이하 모든 자바 데이터베이스 접속의 기본 기술로, 자바에서 제공하는 API임. 이것만 가지고도 당연히 DB 다루는거 다 가능함.
- ORM은 자바 객체를 데이터베이스 객체로 매핑해줘서 SQL을 자동생성해주는 방식. SQL Mapper는 SQL을 명시해줘야함.
- SQL Mapper : MyBatis 등 (기존 아파치 iBatis에서 구글로 이전되면서 이름 및 기능 바뀜)
- ORM : JPA(자바 ORM 기술에 대한 자바의 API 표준 명세), Hibernate(JPA의 구현체 중 하나.) 등
ACID, 트랜잭션
- DB 내에서 일어나는 하나의 트랜잭션의 안정성을 보장하기 위해 필요한 성질
- 트랜잭션의 격리 수준 → 찾아보기
- 트랜잭션 : 여러 개의 작업을 하나로 묶은 실행 단위
- Atomicity (원자성)
- 한 트랜잭션의 연산들이 모두 성공하거나, 반대로 전부 실패되는 성질
- Consistency (일관성)
- 트랜잭션 이전과 이후, db의 상태는 이전과 같이 유효해야 한다. 예를들어 ‘모든 고객은 반드시 이름을 가지고 있어야 한다.’ 라는 제약이 있는데, 이름 없는 새로운 고객을 추가한다면 일관성이 깨지게 됨.
- Isolation (격리성, 고립성)
- 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다.
- Durability (지속성)
- 한 트랜잭션이 성공적으로 수행되었다면, 해당 기록은 영구적이어야 한다. 예를들어 계좌이체 트랜잭션이 성공적으로 끝났다면, 그 뒤에 DB에 오류가 발생해 종료되더라도 계좌이체 내역은 기록은 남아야 한다.
DB 정규화
- 릴레이션 간의 잘못된 종속 관계로 인해 DB 이상현상이 일어나서를 이를 해결하거나, 저장 공간을 효율적으로 사용하기 위해 릴레이션을 여러 개로 분리하는 과정.
- 1NF, 2NF, 3NF, BCNF(3NF 강화), 4NF, 5NF. 다만 실무적으로 4NF, 5NF는 잘 하지 않음.
- 1NF : 테이블의 컬럼이 원자값을 갖도록 테이블을 분해하는 것.
- 2NF : 완전 함수 종속을 만족하도록 테이블을 분해
- 3NF : 이행적 종속을 없애도록 테이블을 분해
- BCNF : 모든 결장자가 후보키가 되도록 테이블을 분해
Data Replication
- 두 개 이상의 db를 Master/Slave로 나눠서 동일한 데이터를 저장하는 방식
샤딩
- 같은 테이블 스키마를 가진 데이터를 다수의 db에 분산해서 저장하는 방법
References
https://www.geeksforgeeks.org/difference-between-asp-and-asp-net/
https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html
https://www.jetbrains.com/ko-kr/lp/devecosystem-2021/
https://survey.stackoverflow.co/2022/#overview
https://dingrr.com/blog/post/가장-사랑받는-언어-rust-왜-러스트-인가
https://programmers.co.kr/pages/2022-dev-survey
https://www.itworld.co.kr/news/109976
https://ko-kr.facebook.com/218158748272233/posts/2059812467440176/
https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/
https://pythontoomuchinformation.tistory.com/528
https://tech.kakao.com/2019/08/01/graphql-basic/
https://code-lab1.tistory.com/53
https://www.youtube.com/watch?v=birtUcZbfCY
https://velog.io/@savernet/DB-DBMS별-차이
https://hanamon.kr/데이터베이스-트랜잭션의-acid-성질/
https://mangkyu.tistory.com/110
https://nesoy.github.io/articles/2018-02/Database-Replication
https://nesoy.github.io/articles/2018-05/Database-Shard
https://sabarada.tistory.com/91
'Study > Backend Roadmap' 카테고리의 다른 글
[roadmap.sh] Backend 4주차 정리 (0) | 2022.12.10 |
---|---|
[roadmap.sh] Backend 3주차 정리 (0) | 2022.12.03 |
[roadmap.sh] Backend 1주차 정리 (0) | 2022.11.19 |
댓글