뉴딜일자리
Protocol, HTTP, TCP/IP
Protocol
- 통신 규약
- 보내고 받는 것을 해석하여 처리하는 것
HTTP
- HyperText Transfer Protocol
- Request
- Response
- 상태 코드값을 넘긴다(ex. 200, 404, 500....)
- body에는 HTML과 JavaScript 뿐이다.
- JS는 인라인 컴파일러이기 때문에 웹에 용이하다.
- 그때그때 컴파일한다.
- Connectionless - 서버에 연결하고, 요청 후 응답을 받으면 연결을 끊는다.
- 장점: 불특정 다수를 대상으로 하는 서비스에 적합
- 단점: 클라이언트의 이전 상태를 알 수 없음. (stateless), 예를 들어 과거에 로그인을 성공했더라도 로그 정보를 유지할 수 없다. => cookie를 이용해서 이 문제를 해결
- HTTP는 전송 프로토콜이고 URI(Uniform Resource Identifiers)는 자원의 위치를 알려주기 위한 프로토콜이다.
참고링크 : https://velog.io/@teddybearjung/HTTP-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%86%8C
- http 통신 구조
- http 상태 코드
- 자주 쓰이는 응답 코드
- 200 - OK, 서버가 요청을 제대로 처리함.
- 301 - Moved Permanently, 해당 URI가 다른 주소로 바뀌었을 때.
- 400 - Bad Request, request에 포함된 보내는 데이터가 잘못 보내어졌을 때.
- 401 - Unauthorized, 유저가 해당 요청을 진행하려면 로그인을 필요하다는 것을 나타내는 코드.
- 403 - Forbidden, 서버가 요청을 거부 (권한이 없기 때문), 예를 들어 구독자만 볼 수 있는 데이터 요청했을 때.
- 404 - Not Found, 요청한 자원(uri)이 서버에 존재하지 않음.
- 505 - Internal Server Error, 서버에서 에러가 났을 때 사용되는 코드.
웹 실행 순서는 웹 서버에서 전달받은 html과 js 중에 html을 먼저 화면에 뿌리고 나서 js를 한 줄씩 실행하고 화면에 뿌려준다.
Keep-alive
- Keep-alive 설정을 하면, 지정된 시간 동안 연결을 끊지 않고 요청을 계속해서 보낼 수 있다.
HTTP Request 구조
크게 3 부분으로 구성 Start Line / Headers / Body
- Start Line
- 예시) GET /search HTTP/1.1
- GET : HTTP Method에 해당 / request가 의도한 action을 정의하는 파트
HTTP Methods: GET, POST, PUT, DELETE, OPTIONS 등이 있다.
- /search : Request target
해당 request가 전송되는 목표 uri
- HTTP/1.1: HTTP Version
- Headers
- request에 대한 추가 정보를 담고 있는 부분
- Accept: / Accept-Encoding: gzip, deflate Connection: keep-alive Content-Type: application/json Content-Length: 257 Host: google.com User-Agent: HTTPie/0.9.3
- 자주 사용되는 Header 정보
Host: 요청이 전송되는 target의 host url
User-Agent: 요청을 보내는 클라이언트에 대한 정보
Accept: 해당 요청이 받을 수 있는 응답(response) 타입
Connection: keep-alive로 설정하면 한 번에 하나씩 요청/응답이 아닌 불러올 파일들을 모두 한 번에 받을 수 있다.
Content-Type: 요청이 보내는 메시지 body의 타입.
Content-Length: 메시지 body의 길이
- Body
- 클라이언트 요청(request)의 실제 내용
- POST /payment-sync HTTP/1.1 Accept: application/json Accept-Encoding: gzip, deflate Connection: keep-alive Content-Length: 83 Content-Type: application/json Host: intropython.com User-Agent: HTTPie/0.9.3 { "imp_uid": "imp_1234567890", "merchant_uid": "order_id_8237352", "status": "paid" }
TCP/IP
DNS Server
참고 링크 : https://gentlysallim.com/dns%EB%9E%80-%EB%AD%90%EA%B3%A0-%EB%84%A4%EC%9E%84%EC%84%9C%EB%B2%84%EB%9E%80-%EB%AD%94%EC%A7%80-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC/
WebServer & WAS
WebServer
- 주소창에서 요청을 보내면 가장 먼저 웹서버로 들어간다.
- JSP를 받는다.
- Apache. Nginx와 같은 것들이 WebServer이다.
WAS(Web Application Server)
- 아래와 같은 것들을 포함한다.
- Controller
- Service
- Dao
- SQL
- Apache Tomcat, JEUS와 같은 것들이 WAS이다.
Signal Flow
-
Browser(Request)
서버에 요청
-
WebServer
요청받은 주소를 중계, 해석 후 WAS에 해석한 요청(주소)을 넘김
-
WAS
요청받은 것을 처리한다 (아래를 포함)
Java Class File
Xml
Controller
Service
Dao
SQL
결과를 가공하기 위해서 조회된 데이터(JSP)를 WebServer로 제공
-
WebServer(Response)
넘어온 데이터를 반복문을 통해 html, js로 가공 후 Browser로 보냄 자바에선 jsp만 받는다.
-
Browser
받은 파일 중 html을 먼저 화면에 뿌려준 뒤 js를 한 줄씩 컴파일한다.
참고 링크 : https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
그럼 두 가지가 꼭 필요한 이유?
- 정적 콘텐츠 동적 콘텐츠에 따라 서버의 대응을 구분하여 부하를 줄일 수 있다.
- 웹서버는 정적 콘텐츠 WAS는 정적 콘텐츠를 담당한다.
- WAS가 없었다면 사용자의 요청을 모두 미리 만들어 놔야 한다.
- 요청이 많아지게 되면 자원이 절대적으로 부족하다.
- 각자의 역할이 분명하기 때문에 효율성이 좋다.
- 물리적으로 떨어져 있기 때문에 보안이 강화됨.
- 빠른 응답이 가능
ANSI SQL
ANSI, American National Standards Institute(미국 표준 협회)가 각기 다른 DBMS(Oracle, MySQL 등)에서 공통적으로 사용할 수 있도록 고안한 표준 SQL문 작성방법입니다.
ANSI 조인 키워드
INNER JOIN
-
연결 조인을 만족하는 행동들을 포함
-
ex) 기존조인
SELECT e.employee_id , d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id
SELECT e.employee_id , d.department_name
FROM employees e INNER JOIN departments d
ON e.department_id = d.department_id
기존은 WHERE 절에서만 조인을 썼었는데 ANSI 조인은 FROM 절에서 INNER JOIN이랑 ON 이라는 새로운 명령어를 쓴다. WHERE 절은 원래대로 조건만 쓴다.
OUTER JOIN
참고 링크 : https://velog.io/@gillog/ANSI-SQL%EC%9D%B4%EB%9E%80
Subquery
| 서브쿼리 추천하는 곳 | O : 강추 X: 비추 △ : 보통 |
|---|
| SELECT | △ |
| FROM | O |
| WHERE | △ |
| ORDER BY | X |
| GROUP BY | X |
| HAVING | X |
- SELECT
- 스칼라서브쿼리(Scalar subqueries) 라고 불린다.
- SELECT 절에 오는 서브쿼리는 반드시 단일 값을 리턴해야 한다. SUM, COUNT, MIN, MAX 등과 같은 집계 함수가 많이 쓰이는 이유이다.
- 예제) 홍길동 학생의 학과를 조회한다고 가정하면 다음과 같다.
SELECT 학생이름,
( SELECT 학과.학과이름
FROM 학과
WHERE 학과.학과ID = 학생.학생ID ) AS 학과이름
FROM 학생
WHERE 학생이름 = '홍길동' ;
- FROM
- 인라인뷰 (Inline Views) 라고 불린다.
- 이 때, 서브쿼리의 결과는 반드시 하나의 테이블로 리턴되어야 한다.
- 예제) 수학 과목을 수강하는 학생들의 점수를 조회한다고 가정하면 다음과 같다.
SELECT 학생이름, 수학점수
FROM ( SELECT 학생.학생이름 AS 학생이름,
과목.과목점수 AS 수학점수
FROM 학생, 과목
WHERE 학생.학생이름 = 과목.학생이름
AND 과목.과목이름 = '수학' ) ;
- WHERE
- 중첩서브쿼리 (Nested Subqueries) 라고 불린다.
- 가장 자주 쓰이는 대중적인 서브쿼리이며 단일행과 복수행 둘 다 리턴이 가능하다.
- 예제) 수학 과목을 수강하는 학생들의 모든 정보를 조회한다고 가정하면 다음과 같다.
SELECT *
FROM 학생
WHERE 학생.학생이름 IN ( SELECT 과목.학생이름 FROM 과목 WHERE 과목.과목이름 = '수학' ) ;
단일행 서브쿼리
- 서브쿼리의 수행결과가 오직 하나의 ROW(행)만을 반환
- 이 하나의 겨로가를 가지고 메인쿼리는 비교연산자를 통해 쿼리를 수행함
- 비교연산자는 단일행 비교연산자를 사용 ( >, >=, <, <=, =, ...)
다중행 서브쿼리
- 서브쿼리의 수행결과가 두 건 이상의 데이터를 반환
- 비교연산자는 다중행 비교연산자를 사용 ( IN, ANY, SOME, ALL, EXISTS )
다중행 비교연산자
-
IN
- 메인쿼리의 비교조건이 서브쿼리의 결과중에서 하나라도 일치하면 참.
-
ALL
- 메인쿼리의 비교조건이 서브쿼리의 검색결과와 모든 값이 일치하면 참.
- 메인쿼리 < ALL ( 서브쿼리 ) : 서브쿼리의 결과와 비교하여 최소값 반환.
- 메인쿼리 > ALL ( 서브쿼리 ) : 서브쿼리의 결과와 비교하여 최대값 반환.
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ALL ( SELECT SAL
FROM EMP
WHERE DEPTNO = 30 );
-
ANY
-
메인쿼리의 비교조건이 서브쿼리의 검색결과와 하나 이상이 일치하면 참.
-
메인쿼리 < ANY ( 서브쿼리 ) : 서브쿼리의 결과와 비교해 메인쿼리의 데이터중 한개라도 서브쿼리 결과보다 작다면 최소값 반환.
-
메인쿼리 > ANY ( 서브쿼리 ) : 서브쿼리의 결과와 비교해 메인쿼리의 데이터중 한개라도 서브쿼리 결과보다 크다면 최대값 반환.
- EXISTS
- 메인쿼리의 비교조건이 서브쿼리의 검색결과중에 하나라도 만족하는 값이 존재하면 참.
- EXISTS 는 해당 로우가 존재하는지의 여부만 확인.
- IN은 실제 존재하는 데이터들의 모든 값까지 확인.
- NOT EXISTS는 메인쿼리의 컬럼명과 서브쿼리의 컬럼명을 비교하여 일치하지 않으면 메인쿼리 테이블의 모든 ROW(행)을 반환.
출처 : https://mjn5027.tistory.com/51
출처 : https://companion-tazo.tistory.com/83?category=854612