# 20201208(화)

### **1. 학습 날짜**

* 2020-12-08

### **2. 학습 시간**

* 09:00 \~  21:00

### **3. 학습 범위 및 주제**

* SQL
* Webserv Auth 리팩토링

### **4. 학습 목표**

* 서버의 동작 방식을 익히고 그에 맞게 설계 및 구현을 한다.

### **5. 과제 제출**

* [https://github.com/get-Pork-Belly/Webserv](https://github.com/get-Pork-Belly/Webserv)

### **6. 상세 학습 내용**

* SQL
  * 표준 SQL의 여러 가지 명령어에 대해 학습했다. 오늘은 데이터베이스를 생성하는 부분보다는 쿼리문을 작성해서 현재 DB에 존재하는 테이블에 대해서 조회하는 방법에 대해 학습함.
  * SELECT: 가장 기본이 되는 명령어다. 보통 `SELECT * FROM table` 이 문구를 SQL의 `HELLO WORLD`라고 한단다. SELECT 뒤에 나오는 `*`는 all 이라는 뜻으로 table 에 존재하는 모든 `Column`를 출력하라는 것이다. 즉 여기서의 SELECT는 열을 말하는 것.
  * SELECT로 열을 골랐다면 행은 어떻게 지정할까? 행은 `FROM table` 의 뒤에 조건을 붙여서 지정할 수 있다.
  * 일반 조건은 `WHERE` 구로 지정한다. `SELECT * FROM table WHERE price > 10` 과 같이 사용한다. 이렇게 하면 테이블에 존재하는 모든 레코드에서 price 가 10이 넘는 레코드를 찾고 그 레코드를 (모든)열과 함께 출력한다.
  * AGGREGATE 함수: 흔히 집계함수라고 부른다 이 함수로는 `MAX MIN COUNT AVG` 등이 있다.
    * 보통 집계함수를 사용하면 단 하나의 스칼라 값만 나오게 된다.
  * GROUP BY: 이름 그대로 그룹으로 묶는 역할을 한다. 주로 집계함수와 같이 쓰인다. (집계함수와 같이 사용하지 않으면 별 의미가 없긴함.)
    * 집계함수와 같이 사용하게 되면 각 레코드의 특정 부분으로 구분이 된 상태로 집계함수의 결과가 나온다.
  * HAVING: GROUP BY, 집계함수 등과 같이 사용되는 조건문이다. WHERE 조건문이 있는데 왜 HAVING이 있는걸까? 라고 묻는 다면 함수의 처리 순서 때문이라고 할 수 있다. WHERE은 쿼리에서 가장 먼저 처리 되버리기 때문에 GROUP BY에는 영향을 미치지 못한다. GROUP BY 라고 하는 것은 조건에 따라 묶는다 라는 의미가 큰데 묶기 전에 먼저 WHERE를 때려버리면 당연히 문제가 발생함. 따라서 HAVING을 사용한다.
  * 서브쿼리: 서브쿼리란 쿼리 안의 쿼리라고 생각하면 된다. 서브쿼리의 결과로는 하나의 셀(스칼라)가 나올 수도, 또는 여러 행이 나올 수도 있다. 만약 특정 속성의 값이 가장 작은 레코드를 지우고 싶다 라고 할 때 사용될 수 있다. SELECT와 집계함수로 가장 작은 레코드의 셀을 찾고, 그 셀을 조건의 식으로 해서 지우면 되기 때문. 만약 서브쿼리의 결과로 여러 값이 나온다면 EXISTS 또는 IN 을 사용해서 처리할 수 있다.
* 리팩토링
  * 어제 리팩토링한 코드에 에러가 (내가 확인했을 때는) 없음을 확인했으므로 오늘은 이 코드를 진정한 의미의 리팩토링을 진행했다.
  * 리팩토링 내용은 아래와 같다.
    1. 쓸모없는 변수는 지운다.
    2. 함수 하나의 코드가 너무 길다.
  * 함수의 길이가 너무 긴 부분을 나눌 때는 먼저 함수가 어떤 동작을 하는지에 초점을 두고 분석했다. 분석 결과 `checkAuthenticate` 함수는 아래 3가지 동작을 수행한다.
    1. 요청한 URI의 라우터에 보안관련 설정이 되어있는지 확인한다.
    2. 요청 HEADER에 보안 헤더가 있는지 확인한다.
    3.  요청 HEADER의 보안 헤더와 보안 파일을 비교한다.

        따라서 함수를 위의 세가지 함수로 리팩토링했다.

### **7. 오늘 학습 내용에 대한 개인적인 총평**

* 나쁘지는 않았다..?

### **8. 다음 학습 계획**

* 웹서버 설계 및 구현
