2022. 05. 26(목) TIL

Dylan·2022년 5월 26일

뉴딜일자리

목록 보기
4/4
post-thumbnail

뉴딜일자리

Protocol, HTTP, TCP/IP

Protocol

  • 통신 규약
  • 보내고 받는 것을 해석하여 처리하는 것

HTTP

  • HyperText Transfer Protocol
  • Request
    • userAgent에서 기기와 브라우저를 구분
  • 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

  • 참고 링크 : https://brunch.co.kr/@wangho/6
  • TCP/IP 는 패킷 통신 방식의 인터넷 프로토콜인 IP (인터넷 프로토콜)와 전송 조절 프로토콜인 - TCP (전송 제어 프로토콜)로 이루어져 있다.
  • TCP는 IP 위에서 동작하는 프로토콜로 데이터의 전달을 보증하고 보낸 순서대로 받게 해 준다.
  • FTP ( File Transfer Protocol ) 참고 링크 : https://namu.wiki/w/FTP

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

  1. Browser(Request)
    서버에 요청

  2. WebServer
    요청받은 주소를 중계, 해석 후 WAS에 해석한 요청(주소)을 넘김

  3. WAS
    요청받은 것을 처리한다 (아래를 포함)
    Java Class File
    Xml
    Controller
    Service
    Dao
    SQL
    결과를 가공하기 위해서 조회된 데이터(JSP)를 WebServer로 제공

  4. WebServer(Response)
    넘어온 데이터를 반복문을 통해 html, js로 가공 후 Browser로 보냄 자바에선 jsp만 받는다.

  5. 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
  • ex2) ANSI조인
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

  • 연결 조건을 만족하는 행들과 연결된 테이블 중 한 테이블의 남은 행을 포함

  • 한 테이블에 있는 행에는 제한 조건을 가하지 않는 반면에 다른 테이블에 대해서는 행에 제한을 한다.

  • LEFT OUTER JOIN

    • FROM 절에 LEFT OUTER JOIN을 명시해주면 된다.
    • 이때 OUTER를 생략하고 LEFT JOIN을 명시해도 적용 된다.
    • 왼쪽 테이블을 기준으로 데이터가 출력되고 조건에 맞는 오른쪽 테이블의 컬럼이 같이 출력된다.
    • 왼쪽 테이블은 전체가 출력되므로, 오른쪽 테이블에 참조할 값이 없으면 NULL이 나온다.
    • 만약 조건에 맞는 오른쪽 컬럼 값이 다수인 경우 오른쪽 컬럼이 여러개 출력된다.
  • RIGHT OUTER JOIN

    • FROM 절에 RIGHT OUTER JOIN을 명시해주면 된다.
    • 이때 OUTER를 생략하고 RIGHT JOIN을 명시해도 적용 된다.
    • 오른쪽 테이블을 기준으로 데이터가 출력되고 조건에 맞는 왼쪽 테이블의 컬럼이 같이 출력된다.
    • 오른쪽 테이블은 전체가 출력되므로, 왼쪽 테이블에 참조할 값이 없으면 NULL이 나온다.
    • 만약 조건에 맞는 왼쪽 컬럼 값이 다수인 경우 왼쪽 컬럼이 여러개 출력된다.
  • FULL OUTER JOIN

    • ANSI에서만 지원하며, LEFT OUTER JOIN 과 RIGHT OUTER JOIN을 합친 것으로, 양쪽 모두 조건이 일치하지 않는 것까지 모두 결합해 출력한다.

참고 링크 : https://velog.io/@gillog/ANSI-SQL%EC%9D%B4%EB%9E%80

Subquery

서브쿼리 추천하는 곳O : 강추 X: 비추 △ : 보통
SELECT
FROMO
WHERE
ORDER BYX
GROUP BYX
HAVINGX
  • 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 ( 서브쿼리 ) : 서브쿼리의 결과와 비교하여 최대값 반환.
// ex ) 30번 소속 사원들 중 급여를 가장 많이 받는 사원보다 더 많은 급여를 받는 사람의 이름과 급여를 출력
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

0개의 댓글