728x90

 

 

URI ❓ URN ❓ URL ❓

 

URI(Uniform : 리소스 식별하는 통일된 방식 Resource : 자원, URI로 식별할 수 있는 모든 것(제한이 없음) Identifier : 다른 항목과 구분하는데 필요한 정보 )

URI는 인터넷에서 특정 리소스를 고유하게 식별하고 위치를 지정하는 문자열의 형식입니다. URI는 로케이터(locater), 이름(name) 또는 둘 다 추가로 분류될 수 있습니다. URI는 주로 웹에서 URL(Uniform Resource Locator)URN(Uniform Resource Name)의 개념으로 사용됩니다.

식별한다는 것은 주민번호를 식별할 수 있듯이 자원 자체를 식별하는 방법입니다. 해당 방법에는 URL, URN이 있는데 URL은 리소스가 있는 위치를 지정 , URN은 리소스에 이름을 부여해주는 것을 말합니다. 웹 브라우저에서 도메인으로 접속하기위해 적는 것은 URL을 말하며, 위치는 변할 수 있지만 이름은 변하지 않습니다. URN의 이름만으로 실제 리소스를 찾을 수 있은 방법이 보편화 되어있지 않습니다.

  • URL의 전체 문법 - scheme(스키마)://[userinfo@]host[:port][/path][?query][#fragment]URL 스키마는 주로 프로토콜을 사용하며 프로토콜은 어떤 방식으로 자원에 접근할 것인가 하는 약속 규칙 ( ex. http, https, ftp 등)
  • example : **https://www.google.com: 443 /search ?q=hello&hI=ko**
  1. 프로토콜(Protocol): 리소스에 접근하기 위해 사용되는 프로토콜을 나타냅니다. 예를 들어, "http://" 또는 "ftp://" 등이 프로토콜을 나타냅니다.
  2. 호스트(Host): 리소스가 위치한 서버의 도메인 이름이나 IP 주소를 나타냅니다. 예를 들어, "[www.example.com"이](http://www.example.㯘%22-ub50a/) 호스트입니다.
  3. 포트(Port): 리소스에 접근하기 위해 사용되는 포트 번호를 나타냅니다. 예를 들어, "[https://www.example.com:443"에서](https://www.example.com:443%22%EC%97%90%EC%84%9C/) 443은 포트 번호입니다. http는 80포트 https는 443포트를 주로 사용, 포트는 생략이 가능합니다.
  4. 경로(Path): 리소스의 위치나 계층 구조를 나타내는 경로를 나타냅니다. 예를 들어, "/index.html"이 경로입니다.
  5. 쿼리(Query): key=value의 형태이고 ?로 시작, &로 추가가 가능합니다. 추가적인 매개변수나 데이터를 전달하기 위해 사용되는 쿼리 문자열을 나타냅니다. query parameter, query string 등으로 불리며 웹 서버에 제공하는 파라미터 문자형태입니다. 예를 들어, "?id=12345"와 같은 형식으로 사용됩니다.

웹 브라우저가 URL을 입력하여 서버로 보내면 google 서버를 찾기 위해 DNS 서버를 조회하여 IP주소를 알게 됩니다. IP와 port를 알아낸 후 GET/serarch?q=hello%hi=ko HTTP/1.1 Host: www.google.com을 작성하여 HTTP 요청 메세지를 보내게 됩니다.

  1. 클라이언트 요청:
    • 클라이언트는 HTTP 프로토콜을 사용하여 서버에 요청을 보냅니다. 요청은 클라이언트가 수행하려는 작업을 나타내며, 주로 HTTP 메소드(GET, POST, PUT, DELETE 등)와 요청 URI(Uniform Resource Identifier)를 포함합니다.필요에 따라 헤더(Header)에 추가적인 정보를 포함할 수 있습니다.
  2. 서버 응답:
    • 서버는 클라이언트의 요청을 받고 처리한 후, 서버도 똑같이 HTTP 응답 메시지를 생성하여 클라이언트에게 전송합니다. 응답은 요청에 대한 처리 결과를 포함하며, 주로 상태 코드(예: 200 OK, 404 Not Found)와 응답 본문을 포함합니다. 헤더에도 추가적인 정보(예: 캐시 제어, 쿠키)를 포함할 수 있습니다.
  3. 데이터 전송:
    • 클라이언트와 서버 간에 데이터는 TCP/IP 기반의 연결을 통해 전송됩니다. 데이터는 요청과 응답의 본문에 포함되며, 일반적으로 텍스트나 이진 형식으로 전송됩니다. 전송 중에는 데이터의 무결성과 신뢰성을 위해 TCP 프로토콜이 패킷을 분할하고 재조립하며, 오류 검사와 재전송을 수행합니다.
  4. 연결 종료:
    • 데이터 전송이 완료되면 클라이언트나 서버는 연결을 종료합니다. 일부 경우(예: 지속적인 연결)에는 연결을 유지하고 추가적인 요청과 응답을 주고받을 수도 있습니다.

 

💡 모든 것이 HTTP

HTTP(Hypertext Transfer Protocol)인터넷에서 웹 페이지를 전송하는 데 사용되는 프로토콜입니다. HTTP는 클라이언트와 서버 간의 통신을 위한 규약으로, 클라이언트가 웹 서버에 요청을 보내고, 서버가 클라이언트에게 요청한 리소스(웹 페이지, 이미지, 동영상 등)를 제공하는 방식으로 동작합니다.

프로토콜이란 ? 서로간의 통신을 위한 약속, 규칙 / 주고 받을 데이터에 대한 형식을 정의한 것

클라이언트와 서버간의 소통을 위해서 미리 정해놓은 것입니다. 실생활에서 예를 들면, 편지를 보낼 때 받는 사람 , 주소, 날짜 등 정해진 형식이 있고, 편지봉투에도 보내는 사람 주소 받는 사람등의 작성의 사회적 합의로 편하게 사용이 가능합니다.

HTTP(Hyper Text Transfer Protocol)이란? 텍스트 기반의 프로토콜을 말합니다. 단순하고 읽기가 쉬우며, Human readable이라고도 합니다. HTTP의 큰 특징은 상태를 유지하지 않는 stateless 인데 , 클라이언트의 정보를 저장하지 않습니다. 같은 클라이언트가 요청을 2번 하더라도 서버는 구분하지 못합니다. 이런 점을 보완하기 위해 쿠키와 세션을 사용합니다. 확장이 가능한 특징도 있습니다. 커스텀 헤더(header)를 추가할 수 있는 기능이 있습니다. HTTP의 헤더는 헤더이름 : 값이 적힌 문장으로 적혀있으며, 헤더 이름은 대소문자를 구분하지 않아도 됩니다. 표준에 정해놓지 않는 헤더를 커스텀 헤더라고 하며, 서버와 클라이언트간에 서로 약속만 되어있다면 헤더의 사항들을 추가할 수 있습니다.

HTTP/1.1 1997 : 가장 많이 사용하고 우리에게 가장 중요한 버전

HTTP는 애플리케이션 계층(Application Layer)에서 작동하는 프로토콜로, TCP/IP 프로토콜 스택 위에서 동작합니다. HTTP는 클라이언트와 서버 사이에 상태를 유지하지 않는 비상태(Stateless) 프로토콜로, 각 요청은 독립적으로 처리되며 이전 요청과의 관계를 유지하지 않습니다. 이러한 특징으로 인해 HTTP는 간단하고 확장성이 높은 프로토콜로 널리 사용되고 있습니다.

HTTP는 주로 웹 브라우저와 웹 서버 간의 통신에 사용되며, 클라이언트가 웹 페이지를 요청할 때는 HTTP 요청 메서드(GET, POST, PUT, DELETE 등)를 사용하여 서버에 요청을 전송합니다. 서버는 해당 요청을 처리하고 요청한 리소스를 HTTP 응답으로 반환합니다. HTTP 응답은 상태 코드(200 OK, 404 Not Found 등)와 함께 클라이언트에게 전달되며, 클라이언트는 이를 받아 웹 페이지를 표시하거나 필요한 동작을 수행합니다.

 

📋 HTTP의 특징

  1. ‘클라이언트 서버 구조’
    Request-Response(요청-응답)
    는 클라이언트-서버 모델에서 가장 기본적인 통신 패턴입니다. 클라이언트가 서버에게 요청을 보내면, 서버는 해당 요청을 처리하고 클라이언트에게 응답을 반환합니다. 이러한 요청과 응답은 네트워크를 통해 이루어지며, 다양한 프로토콜과 방식으로 구현될 수 있습니다.
    클라이언트 서버 구조 개념적으로 분리를 한 후 비즈니스 로직, 데이터의 경우 전부 서버에 보관하고 클라이언트는 사용성, UI등에 집중합니다. 

    • 클라이언트는 서버에게 특정 동작을 수행하거나 원하는 정보를 요청하기 위해 요청 메시지를 생성하고 전송합니다. 서버는 클라이언트로부터 받은 요청을 처리하고, 요청에 따라 필요한 동작을 수행합니다. 서버는 요청을 분석하여 필요한 데이터를 검색하거나 처리하고, 그 결과를 응답 메시지에 담아 클라이언트에게 전송합니다.
    • Request-Response 패턴은 웹을 비롯한 다양한 분야에서 사용되는 통신 방식입니다. 웹 브라우저가 웹 서버에 웹 페이지를 요청하고, 서버는 해당 페이지를 제공하는 과정이 Request-Response 패턴으로 이루어집니다. 이 외에도 API 호출, 데이터 요청, 파일 전송 등 다양한 상황에서 클라이언트가 서버에게 요청을 보내고, 서버는 해당 요청을 처리하여 응답을 반환합니다.

  2. 무상태 프로토콜 ( Stateless)’
    HTTP (Hypertext Transfer Protocol)는 무상태(Stateless) 프로토콜입니다. 이는 HTTP 서버와 클라이언트 간의 통신에서 상태 정보를 유지하지 않는다는 의미입니다. 각각의 클라이언트 요청은 독립적으로 처리되며, 이전 요청과의 관련성이나 의존성이 없습니다.

    상태 유지 - Stateful 중간에 상태가 바뀔 경우 이전의 상태정보를 미리 알려줘야합니다. 클라이언트가 하나의 서버에게 오쳥하면 상태를 유지하게 되는데, 에러가 발생하면 클라이언트는 다시 처음부터 요청을 해야합니다.

    상태 정보의 저장 없음: 서버는 클라이언트의 상태 정보를 저장하지 않습니다. 이로 인해 서버 측에서 클라이언트 상태를 유지하거나 추적할 필요가 없어집니다. / scale out - 수평적 확장이 가능합니다.

 

  • 확장성과 부하 분산: 갑작스레 클라이언트의 요청이 증가하더라도 stateless 상태라면 서버의 대거 투입이 가능합니다. 응답 서버를 쉽게 바뀔 수 있습니다. 서버는 클라이언트의 상태를 유지하지 않기 때문에, 많은 수의 클라이언트 요청을 동시에 처리하는 확장성이 높아집니다. 또한, 여러 서버로 부하를 분산시킬 수 있어 대규모 시스템에서 효율적인 분산 처리가 가능합니다.
  • 클라이언트-서버 분리: 상태 정보를 유지하지 않는 HTTP는 클라이언트와 서버 간의 분리를 강조합니다. 서버는 단순히 클라이언트의 요청을 받아 처리하고, 클라이언트는 필요한 상태 정보를 요청에 포함하여 전달합니다. 이를 통해 서버와 클라이언트의 독립성과 유연성이 증가합니다.
  • 자유로운 요청 처리: 무상태 프로토콜은 클라이언트의 요청에 대해 서버가 즉시 응답을 반환하고 연결을 끊을 수 있습니다. 이로 인해 서버의 리소스를 효율적으로 사용할 수 있습니다.

 

무상태 프로토콜의 한계는 상태가 유지한 경우입니다. 예를 들어, 로그인 세션을 유지하거나 (로그인한 사용자의 경우 로그인 한 상태를 서버에 유지 등 ) 상태 정보에 기반한 작업을 수행하는 경우에는 별도의 메커니즘이 필요합니다. 일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 꼭 필요한 경우에만 최소한의 상태를 유지하여 사용합니다

728x90
반응형

'[HTTP]' 카테고리의 다른 글

[HTTP] HTTP 헤더  (0) 2023.07.27
[HTTP] HTTP 상태 코드  (0) 2023.07.26
[HTTP] HTTP 메서드의 속성  (0) 2023.07.15
[HTTP] Resource & HTTP 메서드  (0) 2023.07.07
[HTTP] 인터넷 통신  (0) 2023.06.25
728x90

SQL이란?



SQL은 Structured(구조화된) Query(질문하다) Language(언어)의 약자로, 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 관리하고 조작하기 위해 사용되는 프로그래밍 언어입니다.

SQL은 컴퓨터에게 데이터를 가져오는 일을 시킬 때 쓰는 언어입니다. 데이터베이스에서 데이터를 생성, 수정, 삭제, 검색하는 등 다양한 작업을 수행할 수 있습니다.
정리하면 SQL은 컴퓨터에게 ‘데이터 가져오는일 ( + 조작하는 일)을 시킬 때 쓰는 구조화된 질문을 하는 언어입니다.

 

💡 가장 기본적인 SQL(Read)의 형태 
           → select * from tableName;

- Select : 검색해보자
- * : 모든 정보 ! (와일드 카드라고 부릅니다)
- from : 어떤 저장소에서 가져와
- from 뒤에는 저장소 (table) 이름을 적어서 알려줍니다.

 

🎈 SQL의 4가지 분류

  1. 데이터 정의 언어(DDL, Data Definition Language): 데이터베이스의 구조를 정의하고 관리하는 명령어를 포함합니다. CREATE, ALTER, DROP 등의 명령어를 사용하여 테이블, 인덱스, 뷰 등을 생성하거나 변경할 수 있습니다.

  2. 데이터 조작 언어(DML, Data Manipulation Language): 데이터베이스에 저장된 데이터를 조작하는 명령어를 포함합니다. SELECT, INSERT, UPDATE, DELETE 등의 명령어를 사용하여 데이터를 조회, 삽입, 수정, 삭제할 수 있습니다.

  3. 데이터 제어 언어(DCL, Data Control Language): 데이터베이스의 보안과 권한을 관리하는 명령어를 포함합니다. GRANT, REVOKE 등의 명령어를 사용하여 사용자에게 권한을 부여하거나 회수할 수 있습니다

 

❓ DB(Data Base) 란 ? DB는 데이터를 통합하여 모아두는 공간

데이터베이스(Database)는 체계화된 데이터의 모임으로, 여러 사용자가 공유하여 사용할 수 있도록 구조화된 데이터의 집합입니다.
데이터베이스는 데이터의 저장, 관리, 조작을 위한 기능을 제공하여 사용자가 데이터에 접근하고 처리할 수 있도록 합니다.

데이터베이스는 일반적으로 테이블(Table)이라는 구조를 사용하여 데이터를 저장합니다.
테이블은 행(Row)과 열(Column)의 형태로 구성되어 있으며, 각 행은 레코드(Record)로 데이터의 한 개체를 나타내고,
각 열은 속성(Attribute)로 데이터의 특징을 나타냅니다. 테이블 간에는 관계(Relationship)를 설정하여
데이터들 간의 연결과 종속성을 나타낼 수 있습니다.

데이터베이스는 다양한 형태로 구현될 수 있으며, 주로 관계형 데이터베이스(RDBMS)와 비관계형 데이터베이스(NoSQL)로 분류됩니다.
관계형 데이터베이스는 테이블 간의 관계를 이용하여 데이터를 구성하고 SQL을 사용하여 데이터를 조작합니다.
현실 환경에서는 관계형 데이터베이스가 가장 널리 사용되고 있습니다. 비관계형 데이터베이스는 테이블과 관계 대신에
다른 구조를 사용하여 데이터를 저장하고, SQL 이외의 쿼리 언어나 API를 사용하여 데이터를 처리합니다.

 

✅ SQL 구문 파헤치기

 

SQL에 4가지의 목적을 가진 용법 (CRUD / Create, Read, Update, Delete)

데이터를 읽을 때는 (Read) ‘Select 구문’을 사용 select구문은 select/from/where/group by/having/order by 의 6가지 절로 이루어져 있습니다.

 

  • Select * from : SELECT * FROM은 SQL 문법에서 사용되는 구문으로, 데이터베이스 테이블에서 모든 컬럼의 데이터를 조회할 때 사용됩니다.
    은 와일드카드 문자로, 모든 컬럼을 의미합니다. 여러 개의 정보를 추출하기 위해서는 SELECT 문을 사용하고, 원하는 컬럼들을 명시적으로 지정해야 합니다. 각 컬럼은 쉼표로 구분하여 나열합니다. → SELECT 이름, 나이 FROM Customers;
  • 예를 들어, "Customers"라는 테이블에서 모든 데이터를 조회하고자 한다면 다음과 같이 SELECT * FROM Customers;와 같은 SQL 문을 사용할 수 있습니다.
    -- 데이터를 가져올 때 가장 먼저 알려주어야 하는 것(컴퓨터에게) 최소 2가지의 정보가 무엇일까요?
    -- 1. 가져와야 할 데이터가 어떤 것인지? -> Select
    -- 2. 그 데이터는 어디에 저장되어 있는지 ? -> From 절


    SELECT * FROM Customers;


    1. Select : ' ~을 가져와!' 라는 뜻입니다.
         - select 뒤에 어떤 것을 가져올지를 적어서 컴퓨터에게 알려줍니다.
       - * (와일드카드) : 모든 (컬럼)의 값을 가져와! 란 뜻입니다.
       - 컬럼(열 - 세로줄) 정보에 대해 원하는 부분을 적어줍니다.
       - select columnName1, columnName2와 같이 개별 컬럼명을 적어 줄 때는 콤마(,)로 구분해줍니다.


    2. From : 데이터를 어디서 가져올지 컴퓨터에게 알려주는 라인
        - select 구문을 실행하기 위한 필수 조건입니다
        - 데이터가 저장되어 있는 주소인 table 명을 적어주어야 하고, 
        - DB 종류에 따라 DB명과 Table 명을 같이 적어줘야 하는 경우도 존재합니다.
        - join명령도 from 절에 작성해서 컴퓨터에게 알려줍니다.

    SELECT *
    FROM Customers
    LIMIT 5;


    * SQL 문에서 결과를 제한하는데 사용되는 절입니다. 
        LIMIT 절은 추출하고자 하는 결과의 개수를 지정하여 해당 개수만큼의 행만 반환합니다.

 

  • 이렇게 작성된 SQL 문은 Customers 테이블의 모든 컬럼에 해당하는 데이터를 반환합니다.
    데이터베이스 시스템은 해당 테이블의 구조를 기반으로 모든 컬럼을 가져와 결과를 반환합니다.

  • 주의할 점은 SELECT * FROM을 사용할 때는 데이터베이스의 성능 측면을 고려해야 합니다.
    모든 컬럼을 조회하면 불필요한 데이터까지 가져올 수 있으며, 테이블에 많은 컬럼이 있는 경우 데이터를 가져오는 데 시간이 오래 걸릴 수 있습니다.
    또한, 테이블 스키마가 변경되었을 때 코드에 영향을 주는 등의 문제도 발생할 수 있습니다.
    따라서, 필요한 컬럼만 명시적으로 선택하여 조회하는 것이 좋습니다.
728x90
반응형

'[ DATABASE]' 카테고리의 다른 글

[SQL] 기본 문법  (0) 2023.07.20
728x90

 

💡 프로그램 vs 프로세스 vs 스레드의 차이 및 개념

 



프로그램(Program), 프로세스(Process), 스레드(Thread)는 컴퓨터에서 실행되는 작업 단위를 나타내는 용어입니다. 각각의 개념을 설명해보겠습니다:

  1. 프로그램(Program) : 프로그램은 실행 가능한 명령어들의 집합으로, 파일 시스템에 저장되어 있습니다.
    • 일반적으로 실행 파일 또는 실행 가능한 코드를 의미하며, 컴퓨터가 작업을 수행하는 데 필요한 지침을 포함합니다.
    • 예를 들어, 워드프로세서, 웹 브라우저, 게임 등은 각각 하나의 프로그램으로 볼 수 있습니다.

  2. 프로세스(Process) : 프로세스는 실행 중인 프로그램의 인스턴스로, 컴퓨터의 메모리에서 실행되고 있는 작업입니다.
    • 각각의 프로세스는 자체적인 메모리 공간, 자원 및 실행 상태를 가지고 있습니다.
    • 프로세스는 운영체제에 의해 생성되며, 각각 독립적으로 실행되어 다른 프로세스와는 분리되어 작동합니다.
    • 각 프로세스는 독립적인 실행 흐름을 가지며, 자신의 데이터와 자원에 접근할 수 있습니다.
    • 예를 들어, 워드프로세서가 실행 중일 때 해당 프로세스는 컴퓨터의 메모리에 로드되어 실행되고 있습니다.

  3. 쓰레드(Thread) : 스레드는 프로세스 내에서 실행되는 작은 작업 단위입니다.
    • 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 이러한 스레드들은 동시에 실행될 수 있습니다.
    • 스레드는 프로세스 내의 메모리와 자원을 공유하면서 실행됩니다.
    • 여러 스레드가 동시에 작업을 수행하므로, 프로세스의 성능을 향상시키고 동시성을 제공합니다.
    • 예를 들어, 워드프로세서의 프로세스 내에서 스레드를 사용하여 동시에 문서를 저장하거나 인쇄할 수 있습니다.

요약하자면, 프로그램은 실행 가능한 명령어의 집합이고, 프로세스는 실행 중인 프로그램의 인스턴스입니다.
프로세스는 독립적으로 실행되는 작업을 의미하며, 각각 자체적인 메모리와 자원을 가지고 있습니다.
쓰레드는 프로세스 내에서 실행되는 작은 작업 단위로, 프로세스의 자원을 공유하면서 동시에 실행될 수 있습니다.
쓰레드를 사용하여 프로세스의 성능을 향상시키고 동시성을 제공할 수 있습니다.

쓰레드란 ?


쓰레드(thread)는 프로그램 내에서 동시에 실행되는 작업의 단위
입니다. 쉽게 말하면, 하나의 프로세스(프로그램) 안에서 동시에 여러 작업을 수행할 수 있게 해주는 것입니다. 쓰레드는 프로그램의 실행 흐름을 독립적으로 제어하며, 각각의 쓰레드는 별도의 실행 경로를 가지고 작업을 수행합니다.

쓰레드의 기본 개념을 이해하기 위해 다음과 같은 비유를 생각해볼 수 있습니다. 하나의 프로그램은 여러 쓰레드로 이루어진 "일꾼들의 작업공장"이라고 생각할 수 있습니다. 각각의 쓰레드는 자신이 맡은 작업을 동시에 처리하며, 각각 독립적인 실행 흐름을 가지고 작업을 수행합니다. 이렇게 작업공장에 여러 일꾼(쓰레드)이 있다면 작업을 훨씬 효율적으로 처리할 수 있습니다.

쓰레드를 사용하는 이유는 다양합니다. 주요한 이유는 다음과 같습니다:

  1. 동시성(Concurrency): 여러 작업을 동시에 실행하여 처리 속도를 향상시킬 수 있습니다. 예를 들어, 웹 브라우저에서 동시에 여러 웹 페이지를 로드하거나, 게임에서 동시에 여러 플레이어가 동작하는 등의 상황에서 쓰레드를 사용하여 동시성을 구현할 수 있습니다.

  2. 응답성(Responsiveness): 쓰레드를 사용하면 프로그램이 여러 작업을 동시에 처리할 수 있으므로, 일부 작업이 블록되거나 시간이 오래 걸리는 작업이 있더라도 다른 작업을 수행할 수 있습니다. 이를 통해 사용자 인터페이스의 응답성을 유지하고, 장기 실행 작업이 프로그램의 전반적인 동작을 방해하지 않도록 할 수 있습니다.
  3. 병렬성(Parallelism): 멀티코어 프로세서에서 쓰레드를 사용하여 여러 작업을 병렬로 실행할 수 있습니다. 이를 통해 작업을 효율적으로 분산하고, 작업의 처리 속도를 향상시킬 수 있습니다. / 각각의 코어가 각각의 작업을 진행하기 때문에 동시 수행이며, 처리 속도가 빨라집니다.

쓰레드를 사용하여 프로그램을 개발할 때는 쓰레드 간의 동기화와 상호작용, 공유 자원에 대한 접근 등 다양한 쓰레드 관련 이슈를 고려해야 합니다. 쓰레드를 잘 이해하고 적절하게 활용하면 다양한 유형의 작업을 효율적으로 처리할 수 있습니다.

💡
Q1. 작업이 3개, 코어가 4개인 경우 (동시성 / 병렬성)
Q2. 작업이 4개, 코어가 1개인 경우 (동시성 / 병렬성)
Q3. 작업이 6개, 코어가 2개인 경우 (동시성 / 병렬성)

Q1의 경우 작업에 비해 코어의 수가 많아 작업의 수량에 맞게 CPU코어를 분배해줄 수 있기 때문에 병렬성이 적합합니다.
Q2의 경우 작업에 비해 코어의 수가 적기 때문에 하나의 코어에서 여러 작업을 처리할 수 있는 동시성이 적합합니다.
Q3의 경우 각각의 작업이 동일하다면 작업에 비해 코어의 수가 적지만 1개 이상의 코어를 가지고 있기 때문에 작업을 3개씩 2개의 코어로 나누는 병렬성이 일어나고, 해당 코어 내에서 여러 작업을 처리할 수 있게 동시성이 수행하도록 합니다.

💡 Java Program 상의 Thread에 대해서 알아보자

java에서 main 메서드의 작업을 수행하는 것도 쓰레드 입니다. 이를 main쓰레드라고 하고, JVM이 main method를 실행하는데 JVM은 main method를 찾아서 프로그램을 실행해줍니다.
main method는 제일 먼저 main Thread를 생성(=최초의)합니다. 시작 시점에는 단일 Thread (main Thread) 1개만 존재합니다. 이 후 main Thread에서 Thread를 생성 / 실행하게 되면 Multi-Thread가 됩니다.

❓ Multi-Thread란 ?

Multi-thread(다중 스레드)는 하나의 프로세스 내에서 여러 개의 스레드가 동시에 실행되는 프로그래밍 모델을 의미합니다. 다중 스레드를 사용하면 여러 작업을 동시에 처리하고 병렬로 실행할 수 있어 성능과 응답성을 향상시킬 수 있습니다.

모든 프로세스에는 반드시 하나 이상의 thread가 존재하며 이를 단일 쓰레드라고 합니다. 단일 스레드에서는 하나의 작업을 순차적으로 실행하며, 다른 작업을 처리하기 위해서는 현재 작업이 완료될 때까지 기다려야 합니다.

728x90
반응형
728x90

 

클라이언트와 서버가 바로옆에 근처에 있다면 케이블을 이용해서 소통을 할 수 있으나, 지역적으로 거리가 멀기 때문에 인터넷 망을 통해서 서로 메세지를 주고 받게됩니다. 인터넷을 통해 컴퓨터 간의 통신은 네트워크 프로토콜을 사용하여 이루어집니다.

 

 

🎈 IP (인터넷 프로토콜)

"IP (Internet Protocol)"은 인터넷에서 컴퓨터 간의 통신을 위한 프로토콜입니다.
IP는 패킷 스위칭 네트워크에서 데이터의 라우팅과 전달을 관리하는 역할을 합니다.

IP는 인터넷에서 데이터를 나누어 전송하기 위해 패킷(Packet)이라고 불리는 작은 단위로 데이터를 분할합니다.
이렇게 분할된 패킷은 각각에 목적지 IP 주소와 출발지 IP 주소를 부여하여 전송됩니다. 각 패킷은 독립적으로 전송되며, 도착지에서는 패킷을 수신하고 재조립하여 원래의 데이터로 복원합니다.

  • 패킷 (Packet) : 패킷은 컴퓨터 네트워크에서 데이터를 전송하는 데 사용되는 작은 단위입니다. 데이터를 전송할 때, 큰 데이터를 작은 조각으로 나누어 패킷으로 분할하여 전송합니다. 각각의 패킷은 목적지 주소, 출발지 주소, 제어 정보 및 실제 데이터로 구성됩니다.

  • 패킷은 네트워크를 통해 전송될 때 라우터, 스위치, 모뎀 등과 같은 네트워크 장비를 거쳐 목적지로 전송됩니다. 이러한 패킷 기반의 통신 방식은 데이터를 빠르고 효율적으로 전달할 수 있도록 도와줍니다. 패킷 단위로 데이터를 분할하여 전송하면, 네트워크의 혼잡 상태나 장애가 발생해도 일부 패킷의 손실이나 손상이 있더라도 다른 패킷들은 정상적으로 전송될 수 있습니다. 이렇게 패킷은 오류 복구 기능을 갖춘 네트워크 프로토콜인 TCP/IP에서 주로 사용됩니다.

클라이언트와 서버는 각각의 고유한 IP주소를 가지고 있는데, 패킷을 이용하여 출발지, 목적지와 메세지를 전달하면 사이의 많은 노드들을 거쳐 해당 목적지 IP와 일치하는 서버에 해당 메세지를 전달해주게 됩니다.

 

📋 IP프로토콜의 한계점

 

  1. 주소 고갈: IPv4 주소 고갈 문제는 가장 큰 한계점 중 하나입니다. IPv4는 32비트 주소 체계를 사용하며, 이는 약 42억 개의 주소를 나타낼 수 있습니다. 하지만 인터넷 사용량이 급증함에 따라 IPv4 주소가 고갈되었습니다. 이로 인해 주소 할당이 어려워지고, 주소 체계를 효율적으로 관리하기 위해 추가적인 방법이 필요해졌습니다.

  2. 보안 문제: IP는 기본적으로 데이터의 무결성, 기밀성, 인증 등과 같은 보안 기능을 제공하지 않습니다. 데이터가 IP 패킷으로 분할되어 전송되기 때문에 중간에 누군가가 패킷을 가로채거나 조작할 수 있는 가능성이 있습니다. 이로 인해 데이터의 안전성과 보안이 보장되지 않을 수 있습니다.

  3. 품질 제어의 부재: IP는 최선의 노력 전달 (Best Effort Delivery) 방식으로 동작합니다. 즉, 패킷의 전송 여부나 순서를 보장하지 않습니다. 따라서 네트워크 혼잡이나 오류로 인해 패킷의 일부가 손실되거나 도착 순서가 뒤섞일 수 있습니다. 이는 실시간 음성이나 영상과 같은 시간에 민감한 애플리케이션에는 문제가 될 수 있습니다.

  4. 확장성 제한: IP 프로토콜은 초기 설계 단계에서는 큰 규모의 네트워크를 고려하지 않았기 때문에 확장성에 제한이 있습니다. 네트워크 규모가 커지면 라우팅 테이블의 크기와 관리의 복잡성이 증가하여 성능 저하와 관리의 어려움을 초래할 수 있습니다. 전달되어야 할 메세지의 용량이 크다면 패킷을 나누어서 보내게되는데, 나누어진 패킷들은 같은 노드들로 이동한다는 보장이 없습니다.

  5. 다중화 문제: IP는 여러 개의 애플리케이션에서 동시에 사용할 수 있는 포트 번호를 제공합니다. 하지만 포트 번호의 개수는 제한되어 있어, 동시에 많은 애플리케이션이 사용될 경우 충돌이 발생할 수 있습니다.

 

 

🎈 TCP & UDP

  • 인터넷 프로토콜 스택 : 인터넷 프로토콜 스택은 네트워크 통신을 위한 계층화된 프로토콜 집합으로, 네트워크에서 데이터를 주고받기 위한 프로토콜을 계층별로 구분하여 정의합니다. 가장 일반적인 모델은 TCP/IP 모델이며, 이 모델은 4개의 계층으로 구성됩니다. 이를 TCP/IP 4계층이라고도 부릅니다. ip만으로 주고받기에 발생하는 문제점들을 보완하기 위해 TCP, UDP를 사용합니다.

 

 

 

채팅프로그램으로 미국에 있는 친구한테 Hello라는 메세지를 보내고 싶다면 Socket 라이브러리를 통해서 OS 계층으로 Hello라는 메세지를 전달합니다.
TCP계층에서 TCP정보로 씌우고 IP 패킷을 생성한 후 , 네트워크 인터페이스를 통해서 전송됩니다.

IP패킷의 경우에는 출발지 IP, 목적지 IP , 기타.. 로 씌우고 전송데이터를 담아서 전송하게 됩니다.

 

❓ Port란?

포트(Port)컴퓨터 네트워크에서 특정 프로세스나 서비스를 식별하기 위해 사용되는 숫자입니다. 네트워크 통신은 IP 주소를 사용하여 이루어지는데, IP 주소는 컴퓨터나 네트워크 장치를 식별하는 역할을 합니다. 하지만 컴퓨터나 네트워크 장치 내에서 여러 개의 프로세스나 서비스가 동시에 실행될 수 있기 때문에, 이를 구분하기 위해 포트 번호가 사용됩니다.

포트 번호는 0부터 65535까지의 범위를 가집니다. 이 중 0부터 1023까지의 포트 번호는 잘 알려진 포트(Well-known Port)로, 특정 프로토콜이나 서비스에 할당되어 있습니다. 예를 들면, 웹 서비스에는 보통 80번 포트가 사용되고, FTP에는 20번과 21번 포트가 사용됩니다. 다른 포트 번호들은 동적 포트(Dynamic Port)로, 애플리케이션이나 서비스가 필요에 따라 동적으로 할당받는 포트입니다.

포트 번호는 IP 주소와 함께 사용되어 네트워크 상에서 특정 프로세스나 서비스로 데이터를 전달하는 역할을 합니다. 예를 들어, 웹 브라우저는 웹 서버에 HTTP 요청을 보낼 때 해당 웹 서버의 IP 주소와 포트 번호를 사용합니다. 웹 서버는 해당 포트 번호로 전송된 요청을 받아들여서 적절한 처리를 수행하게 됩니다.

포트는 네트워크 통신의 핵심 요소로서, 다양한 프로토콜과 서비스들이 각각 고유한 포트 번호를 사용하여 통신하고 있습니다. 이를 통해 컴퓨터 네트워크에서 데이터를 정확하게 전송하고, 정확한 프로세스나 서비스로 전달할 수 있게 됩니다.

❓ DNS란 ?

DNS는 "Domain Name System"의 약어로, 인터넷에서 도메인 이름을 IP 주소로 변환하는 시스템입니다.
인터넷에서 컴퓨터나 네트워크 장치들은 고유한 IP 주소를 가지고 있어서 서로를 식별하고 통신할 수 있습니다.
하지만 IP 주소는 숫자로 이루어져 있어서 기억하기 어렵고 사용자 친화적이지 않습니다.

DNS는 이러한 문제를 해결하기 위해 도메인 이름을 사용합니다. 도메인 이름은 사람이 이해하기 쉬운 형식으로 되어 있으며, 예를 들면 "google.com"이나 "openai.com"과 같은 형태입니다. DNS는 이러한 도메인 이름을 해당하는 IP 주소로 변환해주는 역할을 합니다.

DNS는 도메인 이름을 IP 주소로 변환하는 과정을 수행합니다. 컴퓨터나 네트워크 장치에서 도메인 이름을 사용하여 특정 웹 사이트에 접속하려고 할 때,
운영체제나 웹 브라우저는 DNS 서버에 도메인 이름을 전송하여 해당하는 IP 주소를 받아옵니다. 이후에 통신은 해당 IP 주소를 사용하여 이루어지게 됩니다.

중간 전화번호부같은 서버 dns 서버에 도메인을 등록할 수 있는데 ( 도메인은 사서 등록해야함) 구글은 200.200.200.2 클라이언트가 도메인으로 접근을 하면
해당 도메인과 일치하는 ip주소를 dns서버가 전달해줍니다. 클라이언트는 dns가 전달해 준 ip 주소로 소통할 수 있습니다.

 

728x90
반응형

'[HTTP]' 카테고리의 다른 글

[HTTP] HTTP 헤더  (0) 2023.07.27
[HTTP] HTTP 상태 코드  (0) 2023.07.26
[HTTP] HTTP 메서드의 속성  (0) 2023.07.15
[HTTP] Resource & HTTP 메서드  (0) 2023.07.07
[HTTP] URI와 웹 브라우저 요청 흐름 (URL, HTTP)  (0) 2023.06.28
728x90

 

 

💡내부 클래스(Inner Class)

내부 클래스는 다른 클래스 내에 선언된 클래스로, 외부 클래스의 멤버에 직접 접근할 수 있습니다.
클래스 안의 클래스 / 각각 따로 클래스를 만드는 것이 아닌 class 안에 class를 넣을 수 있습니다.내부 클래스안에서 외부 클래스의 멤버들에 쉽게 접근이 가능합니다.


🎈 Java에서는 변수의 선언위치에 따라 4종류의 내부 클래스를 사용할 수 있습니다
  1. 인스턴트 내부 클래스(Instance Inner Class) : 외부 클래스의 멤버변수 선언 위치에 선언하며, 외부 클래스의 인스턴스가 생성된 후에만 인스턴스 내부 클래스의 객체를 생성할 수 있습니다.
    주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언됩니다. 인스턴스 내부 클래스는 외부 클래스의 멤버 변수와 메서드에 접근할 수 있습니다.
        **1. 인스턴스 내부 클래스 예제**


        **public class Outer** {  // outerMethod클래스와 innerMethod의 외부 클래스 
            private int x;


            public void outerMethod() { 
                // Outer (외부 클래스) 인스턴스 내부 클래스의 객체 생성
                Inner inner = new Inner();
                inner.innerMethod();
                    //outerMethod() 메서드 내에서 Inner 클래스의 객체를 생성하고, 
                    //이를 통해 innerMethod() 메서드를 호출하고 있습니다.
            }


            **public class Inner** { //Outer 클래스의 인스턴스 내부 클래스
                public void innerMethod() {
                    // 외부 클래스의 멤버에 접근
                    System.out.println(x);
                }
            }
        }

이 때, 내부 클래스인 Inner는 외부 클래스인 Outer를 제외하고는 다른 클래스에서 잘 사용되지 않는 것이어야 합니다.
내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있고, 코드의 복잡성을 줄일 수 있다는 장점이 있습니다.

  1. 정적 내부 클래스(Static Inner Class): 정적 내부 클래스는 외부 클래스의 인스턴스와 무관하게 독립적으로 생성될 수 있습니다.
    정적 내부 클래스는 외부 클래스의 정적 멤버에만 접근할 수 있습니다.
  2. 지역 내부 클래스(Local Inner Class): 메서드나 코드 블록 내에서 선언되는 클래스로, 해당 블록 내에서만 사용될 수 있습니다.
  3. 익명 내부 클래스(Anonymous Inner Class): 이름이 없는 클래스로, 인터페이스나 추상 클래스의 구현체를 정의하거나, 특정 클래스를 상속받아 재정의된 메서드를 가지는 객체를 생성할 때 사용됩니다.
    일회용으로 사용되는 클래스라고 보면 됩니다. GUI 프로그램에서 이벤트 처리 시 주로 사용됩니다.

 

변수가 선언된 위치에 따라 인스턴스 변수, 클래스(static)변수, 지역변수등으로 나뉘듯이 내부 클래스도 이와 마찬가지로 선언된 위치에 따라 달라집니다.
각 내부의 클래스 선원 이치에 따라 같은 선언위치의 변수와 동일한 유효범위(scope)와 접근성 (accessibility)을 갖게됩니다.

 

💡 내부 클래스의 제어자와 접근성

 

원래 class 앞에는 default(작성x), public 밖에 작성하지 못하는데, 내부 클래스에는 4가지의 제어자가 전부 사용가능합니다.

내부 클래스를 작성하는데, static 멤버가 필요하다면 내부클래스도 static으로 선언해주어야 합니다.
static 멤버라 함은 객체 생성없이 가능해야한는데, class 자체가 static이 아니라면 그 클래스는 인스턴스 클래스이기 때문에 객체 생성이 필요해지기 때문입니다.

        public class Ex_1_Inner {

            class InstanceInner {  //인스턴스 내부 클래스 
                int iv = 100;
                //static int cv = 100;
                final static int CONST = 100; 
                //다만 final과 static이 동시에 붙은 변수는 상수(constant) 이므로 모든 내부 클래스에서 정의가 가능하다.
            }

            static class StaticInner {   // static 내부 클래스
                int iv = 200;
                static int cv = 300;  //-> static class 만 static 멤버를 정의할 수 있다.
            }

            void myMethod() {  //인스턴스 메서드 (객체생성 필요)
                    class LocalInner {  //지역 내부 클래스
                        int iv = 300;
                        //static int cv = 300; -> static 변수 선언 불가능
                        final static int CONST = 300;
                    }
                    LocalInner in = new LocalInner();
                    System.out.println("외부클래스 안의 인스턴스 메서드 = "  + in.iv);
                    System.out.println("외부클래스 안의 인스턴스 메서드 = "  + in.CONST);

            }

            public static void main(String[] args) {
                System.out.println("내부 클래스 안의 멤버변수 = " + InstanceInner.CONST);
                System.out.println("내부 클래스 안의 멤버변수 = " + StaticInner.cv);

                //내부의 인스턴스 메서드를 사용하기 위해서 객체를 생성한 후 호출하였다.
                Ex_1_Inner ex1 = new Ex_1_Inner();
                ex1.myMethod();

            }
        }

        출력-> 내부 클래스 안의 멤버변수 = 100
                    내부 클래스 안의 멤버변수 = 300
                    외부클래스 안의 인스턴스 메서드 = 300
                    외부클래스 안의 인스턴스 메서드 = 300

 

InstanceInner 클래스의 CONST 변수는 final static변수로 선언되어 있어서, 클래스가 로드될 때 한 번 초기화되어 변경할 수 없는 상수입니다. 따라서 객체 생성 없이도 클래스 이름을 통해 직접 접근하여 사용할 수 있습니다. InstanceInner.CONST는 객체 생성과 무관하게 항상 같은 값을 갖는 상수이기 때문에 출력이 가능합니다.

 

💡 익명 이너 클래스(Anonymous Inner class)

 

다른 내부 클래스들과 달리 이름이 없고, 클래스의 선언과 객체의 생성을 동시에 하기때문에 단 한번만 사용될 수 있습니다. 오직 하나의 객체만을 생성할 수 있는 일회용 클래스입니다. 따라서, 생성자를 선언할 수도 없으며, 딱 한개의 클래스나 인터페이스를 상속받거나 구현할 수 있습니다.

        **// 익명 클래스는 선언과 동시에 생성하여 참조변수에 대입함.**

        **클래스이름 참조변수이름 = new 클래스이름(){

            // 메소드의 선언 (thread에서 자주 사용됨)

        };**

💡 예외 처리

프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있습니다. 이러한 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 합니다.

컴퓨터 시스템이 동작하는 도중에 예상하지 못한 상황이 발생하여 실행중인 프로그램이 영향을 받는 것을 에러(error)와 예외 (exception) 두가지로 구분할 수 있습니다.

  1. 에러 (error)는 프로그램 코드에서 의해서 수습될 수 없는 심각한 오류입니다. 시스템 레벨에서 프로그램에 심각한 문제를 발생시켜 실행 중인 프로그램을 종료시킵니다. 이러한 에러는 개발자가 미리 예측하여 처리할 수 없는 것이 대부분이므로, 오류에 대한 처리는 할 수 없습니다.
  2. 예외 (exception) 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류라고 하며, 에러와 마찬가지로 실행중인 프로그램을 비정상적으로 종료시키지만, 발생할 수 있는 상황을 미리 예측하여 처리할 수 있습니다. 따라서 개발자는 예외 처리(exception handling)를 통해서 예외 상황을 처리할 수 있도록 해야합니다. (대처 방안을 제시할 수 있는 error)
728x90
반응형
728x90

 

Welcome Page를 만들어보겠습니다. 프로그램이 실행될 때, 가장 먼저 실행되어 출력되는 Welcome page를 만들기 위해서는
src 폴더 / resources / static으로 접근하여 static에 index.html file을 생성합니다. (오른쪽 우클릭 후 나오는 file 생성 메뉴)

생성 후 출력물을 띄우기 위해서 간단한 html 코드를 작성 후 HelloSpringApplication을 실행 하고 , localhost:8080로 접속하면 작성된 Hello가 출력되는 지를 확인할 수 있습니다.

💡 Spring Boot가 제공하는 Welcome Page 기능


Spring은 실행 시 static폴더 내에 있는 index.html파일을 찾아서 동작하는 기능을 제공합니다.
이 때의 static에 있는 index.html은 그냥 화면에 입력된 마크다운 언어를 띄어주기만 하는 정적페이지인데,
템플릿 엔진을 사용하면 해당 파일을 동적으로 변화시킬 수가 있습니다.
- 스프링 공식 튜토리얼 : https://spring.io/guides
- 스프링 부트 메뉴얼 : https://docs.spring.io/spring-boot/docs/current/reference/html/

 

 

Spring Boot Reference Documentation

The reference documentation consists of the following sections: Legal Legal information. Getting Help Resources for getting help. Documentation Overview About the Documentation, First Steps, and more. Getting Started Introducing Spring Boot, System Require

docs.spring.io

 

hello.hellospring 안에 controller 패키지를 생성 후 HelloController 클래스를 생성

 

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model) {
    
        model.addAttribute("data","Hello!!");
        return "hello";
        
    }
}

 

먼저 package와 class 사이 공간에 @controller를 입력해주면 자동으로 상단에 import org.springframework.stereotype.Controller; 해당문구가 입력되며 Controller가 import 됩니다.

 

웹 브라우저에서 http://localhost:8080/hello로 입력하면 스프링 부트는 톰캣이라는 웹 서버를 내장하고 있는데,
그 서버에서 입력된 주소를 스프링으로 전달해주는데, helloController 클래스 내부에 작성된 @GetMapping(”hello”)로 인해 hello가 url에 매칭을 확인합니다.
public String hello(Model model) { model.addAttribute("data","Hello!!"); return "hello"; } → 해당 메서드를 실행하게 됩니다.

이 후 스프링이 Model을 생성하여 model에는 data:hello!! 담아두었습니다. return은 resources안에 templates내에 이름이 “hello”인 파일을 실행하게됩니다. 즉, templates/hello.html을 실행하게 되는 것입니다. ${data} → model에서 넘겨진 key값이다 (=hello!!)

 

💡 ViewResolver (뷰 리졸버)

View Resolver(뷰 리졸버)는 웹 애플리케이션에서 사용되는 MVC 패턴에서 컨트롤러가 처리한 결과를 어떤 뷰(View)로 보여줄지를 결정하는 역할을 합니다.

일반적으로 MVC 패턴에서 컨트롤러는 비즈니스 로직을 처리한 후에 클라이언트에게 결과를 보여줄 뷰를 선택해야 합니다.
이때 View Resolver는 컨트롤러의 처리 결과와 매핑되는 뷰를 찾아주는 역할을 수행합니다.

View Resolver는 컨트롤러가 반환한 뷰의 이름을 기반으로 실제 뷰 객체를 찾아내는 과정을 수행합니다.
이를 통해 컨트롤러와 뷰 사이의 강한 결합을 피하고, 유연한 뷰 선택을 가능하게 합니다.
또한 View Resolver는 뷰의 경로나 포맷에 대한 설정을 담당하여 개발자가 뷰의 경로를 하드코딩하는 것을 피할 수 있도록 합니다.

일반적으로 View Resolver는 설정 파일에 등록되며, 컨트롤러에서 반환하는 뷰의 이름을 기반으로 해당하는 뷰 객체를 찾아내는 방식으로 동작합니다.
View Resolver는 컨트롤러와 뷰 간의 인터페이스 역할을 수행하여, 컨트롤러의 처리 결과를 적절한 뷰로 매핑하여 클라이언트에게 보여줄 수 있도록 도와줍니다.

Spring Framework에서는 다양한 유형의 View Resolver를 제공하며, 개발자는 필요에 따라 해당 View Resolver를 선택하고 설정할 수 있습니다.
이를 통해 Spring MVC에서는 컨트롤러와 뷰 간의 느슨한 결합을 유지하면서 유연하고 확장 가능한 웹 애플리케이션을 개발할 수 있습니다.

 

작성한 project file을 터미널에 ./gradlew.bat build를 통해 빌드 후 실행을 확인합니다.
빌드 폴더 생성 시에는 경로로 설정 → PS D:\backend\Spring\hello-spring>./gradlew.bat build하면 빌드폴더가 생성되고
이 후 빌드를 지우고 싶으면 다시 이전 경로로 이동 후 ./gradlew build clean을 입력해주면 build 폴더 내에 build 되었던 데이터가 지워지게 됩니다.

728x90
반응형

+ Recent posts