개발/부트캠프

본캠프 : Spring 기초_1주차

EJ EJ 2025. 1. 20. 21:03

<네트워크>

❓ 네트워크 지식이 왜 필요한가요?

  1. 우리는 사용자가 요청을 했을 때 해당 요청에 대한 응답을 수행하는 프로그램 즉, 서버를 개발하게 됩니다.
  2. 사용자의 요청에서 시작하여 우리가 만든 서버에 도착하고 다시 사용자에게 응답이 되돌아가는 흐름을 잘 파악하고 있다면 서버 개발에 큰 도움이 됩니다.
  3. 인터넷 브라우저(클라이언트)와 서버가 데이터를 주고받는 통신 방법인 HTTP(HyperText Transfer Protocol)는 결국, Web 기반에서 동작하기 때문에 네트워크에 대한 지식은 필수입니다.

▶ 프로토콜(Protocol)이란? 복잡한 인터넷 세상에서 컴퓨터와 컴퓨터끼리 데이터를 주고받기 위하여 정한 통신규약.

-Java 백엔드 웹 개발자라면 대부분 IntelliJ 혹은 Eclipse를 사용합니다. IntelliJ는 개발자의 생산성을 높여주도록 코드 제안, 자동 완성, 다양한 플러그인을 지원하며 Eclipse의 경우 전자정부 프레임워크를 공식적으로 지원합니다.

 

여러분 인터넷에 대해서 설명하실 수 있나요? 우리의 삶에 빼놓을 수 없는 인터넷은 과연 무엇이고 어떻게 동작할까요?

인터넷(Internet)은 인터넷 프로토콜 스위트(TCP/IP)를 기반으로 하여 전 세계적으로 연결되어있는 컴퓨터 네트워크 통신망을 일컫는 말이다. → 인터넷을 활용하여 멀리 있는 컴퓨터 간의 통신도 가능해졌다! 해저 광케이블로 물리적인 연결이 되어있다. & 인공위성을 통해 무선 통신도 가능하다. 유/무선 방식으로 이름에 걸맞은 World Wide Web(WWW)가 구축되었다.

 

-인터넷 프로토콜 IP(Internet Protocol) : 인터넷 프로토콜은 인터넷이 통하는 네트워크에서 어떤 정보를 수신하고 송신하는 통신에 대한 규약을 의미한다.

 

IP? 들어본 적 있는데 192.168.0.1과 같은 숫자가 작성된 주소가 아닌가요? 

-> 알고 계신 것은 IP 자체가 아닌 IP에 필요한 고유 주소인 IP 주소를 알고 계신 거에요! IP 주소를 쉽게 말하면 각 기기 간의 통신을 식별할 수 있는 전화번호입니다. 

 

복잡한 인터넷 세상에서 데이터를 안전하게 전달하기 위해서 최소한의 규칙이 필요합니다. IP 주소는 쉽게 말하면 각 기기 간의 통신을 식별할 수 있는 전화번호입니다. 앞서 설명한 최소한의 규칙을 지킬 수 있는 이유는 여러분들이 잘 아시는 IP 주소 덕분입니다.

 

-인터넷 통신 시에는 지정한 IP 주소에 데이터를 Packet 이라는 단위로 전달합니다. 패킷(Packet)은 소스 IP(출발지), 대상 IP(도착지)를 포함하고 있어서 어떤 컴퓨터에 데이터를 전송할지 판별할 수 있습니다. Packet은 크게 헤더, 페이로드, 트레일러(수신여부 포함)로 구분됩니다. 데이터를 주기만 하는 것이 아닌 받고 응답합니다.

 

인터넷 세상에서 인터넷 프로토콜(IP)을 사용하여 데이터를 통신할 수 있게 되었다. 하지만, 과연 IP만으로 모든것이 해결될까요? IP 방식의 문제점들(애플리케이션 비구분, 비연결성, 비신뢰성)을 해결해주는 것이 바로 TCP 프로토콜 입니다.

 

 TCP(Transmission Control Protocol) : 서버와 클라이언트 간에 데이터를 신뢰성 있게 전달하기 위해 만들어진 프로토콜. 

 

IP방식에서는 패킷이 손실되거나 오류가 생겨도 데이터를 재전송 하지 않는 등의 문제가 있었어요. 그렇다면 TCP는 어떻게 데이터를 신뢰성 있게 전달할까요? -> 3 Way HandShake(SYN 접속 요청 / ACK 요청 수락 → ACK가 없다면 연결 실패 / ACK → ACK 함께 데이터 전송 가능), 데이터 전송 여부 응답 반환, 패킷 순서 보장

 

TCP는 신뢰성이 있지만 연결하는 과정, 데이터 전송에 시간이 많이 소요된다. TCP는 현재 단계 이상의 최적화를 하기 힘들다. (최소한의 논리적인 연결이 필요하기 때문) → 3 way handshake 과정을 거치는 만큼 속도가 느리다.

 

 UDP(User Datagram Protocol) : UDP는 비연결형, 신뢰성이 없는 전송 프로토콜.

TCP의 신뢰성 보장 기능은 많은 애플리케이션에 유용했지만, 실시간 통신이나 스트리밍 애플리케이션에서는 빠른 전송이 중요했기 때문에 UDP는 이러한 요구를 충족하기 위해 개발되었다.

 

현대에서는 UDP를 많이 사용하는 추세이다. HTTP3 에서 채택한 방식, HTTP에도 버전이 있다!

ex) 실시간 스트리밍 서비스, 온라인 게임, 인터넷 전화

*특징 : 실시간성 보장 중요

 

UDP는 IP 방식과 거의 비슷하지만 차이점으로 PORT 가 존재한다.

 

 PORT : 같은 IP 내에서 프로세스 구분을 하기 위해서 사용한다.

 

같은 IP에서 동시에 여러가지 프로그램이 실행되고 있다면 IP 주소가 같은데, 패킷의 도착지를 어떻게 식별할 수 있을까요?

현재 전송하고자 하는 패킷이 어떤 곳에 필요한 패킷인지 IP만으로는 해결이 되지 않습니다. 이때 프로그램을 구분하기 위해 사용되는 것이 바로 PORT입니다! 쉽게 말해서 PORT는 아파트 호수와 같은 역할을 수행한다. 

*자주 사용되는 PORT

  1. 0 ~ 65535 할당 가능
  2. 이미 사용되고 있는 포트 (0 ~ 1023) / HTTP - 80 (TCP) / HTTPS - 443 (TCP)

실제 개발을 진행할 때는 사용되지 않는 나머지 포트를 사용하여 개발하면 됩니다.

 

<Web 기초>

▶ DNS(Domain Name System) : 도메인 이름과 IP 주소를 서로 변환하는 역할을 수행한다. 즉, 사람이 읽을 수 있는 도메인 이름을 컴퓨터가 읽을 수 있는 IP 주소로 변환한다.

 

-DNS 동작 순서

  • 원하는 이름의 도메인을 구매 후, DNS 서버에 등록한다.
  • 도메인 명을 입력하면 DNS 서버는 IP 주소를 반환한다.
  • IP가 변경되면 DNS 서버에 등록된 IP 주소만 바뀌면 된다.
  • 우리는 IP주소의 형태가 아닌 https://spartacodingclub.kr/ 의 도메인 이름 형태로 웹에 접속한다.

일반적으로 URL이라 알고있는것이 바로 DNS를 활용한 예이다.

 

▶ URI(Uniform Resource Identifier) : 인터넷 자원(Resource)을 나타내는 고유 식별자(Identifier)를 뜻한다.

  • 인터넷 자원(Resource)을 식별할 수 있는 문자열을 뜻한다.
  • URI는 Locator, Name 혹은 둘 다 추가로 분류될 수 있다.

URI 안에 URL과 URN이 포함된다.

 

▶ URL(Uniform Resource Locator) : 프로토콜을 포함한, 자원(Resource)의 위치를 나타낸다.

  • 자원(Resource)의 위치를 의미한다. ex) 튜터가 있는곳은 사무실
  • 일반적으로 도메인주소로 알려져있다.
  • 프로토콜을 포함한다.(https://spartacodingclub.kr/)
  • URL의 한계를 극복하기 위해서 URN이 등장하게 되었다.

 URN(Uniform Resource Name)

  • 자원(Resource)의 이름(Name)을 의미한다. ex) 튜터
  • 리소스의 위치가 변경되어도 이름으로 리소스를 찾기 때문에 잘 동작한다.
  • 프로토콜을 포함하지 않는다.
  • URN으로 실제 리소스에 접근하는 방법은 대중화 되어있지 않다.

현재 대부분은 대중화된 URL을 사용하여, URI를 URL과 같은 의미로 사용한다.

 

-URL 구조

scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

https://www.google.com:443/search?q=스파르타+코딩클럽

  • scheme
    • 주로 프로토콜을 사용한다. 웹에서는 http, https, ftp를 주로 사용한다.
    • 참고 : http**s**는 http에 보안(Secure)을 추가한 것
  • user[:password]
    • 사용자 정보
    • URL은 보안에 취약하여 사용하지 않는다.
  • host[:port]
    • 호스트명 : 도메인 명(www.google.com) 또는 IP 주소를 직접 사용한다.
    • http : 80, https : 443 포트 사용
    • 포트는 일반적으로 생략한다.
  • [/path]
    • 리소스의 경로
    • 계층 구조로 구성되어있다.
    ex) 프로토콜://쇼핑몰주소/products/macbookPro

        ex) https://nbcamp.spartacodingclub.kr/backend

 

  • [?query]
    • key=value 형태로 구성된다.
    • Query Parameter, Query String 이라고도 한다.(두 가지 모두 같은 말입니다. 자주 혼용되는 단어이니 잘 기억해주세요.)
    • ?로 시작되고 &으로 구분된다.
    ex) ?key1=value1**&**key2=value2**&**key3=value

 

<정리>

브라우저에 URL을 입력하면 어떤일이?!?

1. https://www.google.com:443/search?q=스파르타+코딩클럽&hl=ko URL을 입력한다.

2. DNS 서버를 조회하여 www.google.com 에 해당하는 IP 주소를 응답받는다.

-포트 번호는 생략되어있다.

-https에서 사용되는 PORT는 443이다.

3. 웹 브라우저에서 HTTP 요청 메세지를 생성한다.

-스파르타 코딩클럽 검색해줘! 하는것과 같다.

4.요청 패킷(HTTP 메세지가 포함되어 있다)을 구글 서버로 전송한다.

5. 구글 서버에서 HTTP 요청 메세지를 기반으로 응답 HTTP 메세지를 만들어 응답한다.

-어디보자.. 스파르타 코딩클럽 검색해달라고? 그래 검색 결과는 이거야!

6. 응답패킷 도착 → HTML이 응답으로 온다.

-응답 결과가 브라우저에 그려진다.

 

<용어 모음집>

▶ JSON : 클라이언트와 서버가 통신할 때 사용하는 데이터 양식이다. 클라이언트와 서버가 사용하는 언어에 관계 없이 통일된 데이터를 주고받을 수 있도록 만들어준다.

-JSON은 사람, 기계 모두 이해하기 쉬우며 용량이 작다.

-XML을 대체해서 데이터 전송 등에 많이 사용한다.

-마치 전세계 공통어로 영어를 사용하는것처럼 Web의 세계에서는 JSON(JavaScript Object Notation)을 공통어로 사용한다.

 

*JSON 구조

  • snake_case, camelCase 모두 사용이 가능하다.(우리가 만드는 Application 내에서 변환해주는 무엇인가가 있다.)
  • key-value 형태로 구성되어 있다.
  • null, number, string, array, object, boolean 형태의 데이터를 사용할 수 있다.

{
  "user": [
    {
      "first_name": "wonuk",
      "last_name": "Hwang",
      "age": 100,
      "phone_agree": false,
      "hobby": ["Java", "Spring"]
    },
    {
      "firstName": "sparta",
      "lastName": "Team",
      "age": 200,
      "phone_agree": true,
      "hobby": ["React", "Spring", "Node"]
    },
  ]
}

 

▶ 서버의 성능 향상을 위한 두 가지 방법이 있다.

-Scale Up : 수직적 확장

  • 단일 서버의 하드웨어의 사용을 높인다. (CPU, Memory 등의 스펙을 높인다)
  • 요청에 대한 처리를 더욱 빠르게 할 수 있도록 만든다.

-Scale Out : 수평적 확장

  • 같은 사양의 서버(인스턴스)를 여러 대 배치한다.
  • 동시에 더 많은 사용자 요청을 처리할 수 있도록 만든다.

▶ 클라이언트와 서버간의 통신 상태(state) 유지 여부에 따라 나뉘는 특성이 있다.

-Stateful(상태 유지) : 클라이언트의 상태를 유지한다.

상담원은 수강생의 요청들을 기억(상태 유지)하여 다음 질문들에 대한 처리가 가능하다.

  • 같은 서버가 유지되어야 한다.
  • 서버는 다양한 이유로 동작하지 않을 수 있다. 시스템 에러, 비지니스 로직 문제, 리소스 부족 문제 등
  • 요청 트래픽이 몰리게되면 상태를 유지하는것에 Resource가 많이 소모된다. 리소스가 버티지 못하면 서버가 종료되거나, 다음 요청에 대한 처리가 느려진다.

-Stateless(무상태) : 클라이언트의 상태를 유지하지 않는다.

어떻게 서로 다른 상담원들이 수강생의 요청을 알 수 있을까요? 수강생이 요청사항을 저장하고 연결해서 전달해야 한다.

  • 장점
    • 같은 서버를 유지할 필요가 없다.
    • Scale Out 수평 확장성이 높다.
    • 갑자기 요청량이 증가하여도 서버를 증설하기 쉽다.
  • 단점
    • 클라이언트가 데이터를 추가적으로 전송해야 한다.
    • 전송되는 데이터의 양이 많아진다.
  • Stateless 방식의 한계점
    • WebApplication을 만들때 서버의 확장성을 고려하여 최대한 Stateless하게 만들어야 한다.
    • 하지만, 실제로는 로그인과 같은 상태를 유지해야하는 경우가 발생한다.
    • 추후에 배울 Cookie, Session, Token 등을 활용하여 이러한 한계를 극복한다.
    • 상태 유지를 최소화 시켜야 한다.

▶ 클라이언트와 서버 간의 연결(Connection) 유지 여부에 따라 나뉘는 특성이 있다.

-Connection(연결)

  • 서버는 클라이언트와 연결을 유지하기 위해서 자원을 소모한다.
  • 하지만, 수많은 사람들이 서비스를 이용해도 실제 서버에서 동시에 처리하는 요청은 작다.
  • 클라이언트 2, 3이 아무런 요청이 없어도 연결을 유지한다.
  • Connection 장단점
    • 장점
      • 새로운 연결 과정을 거치지 않아도 된다.
      • 그만큼 요청에 대한 응답 속도가 빨라진다.
    • 단점
      • 클라이언트가 지속적으로 요청을 보낼거라는 보장이 없다.
      • 즉, 연결을 위한 자원이 낭비된다.

-Connectionless(비연결)

  • 클라이언트와 서버는 연결을 유지하지 않는다.
  • 서버는 최소한의 자원만을 사용한다.
  • ex) 브라우저가 켜진 상태에서 인터넷이 종료되어도 홈페이지가 정상적으로 노출된다.
  • Connectionless 장단점
    • 장점
      • 서버 자원을 효율적으로 사용할 수 있다.
    • 단점
      • 요청이 추가적으로 오게되면 연결(3 way handshake)을 새로 해야한다.
      • → 요청에 대한 응답 시간이 증가한다.
      • 웹 사이트의 HTML, CSS, JS, 이미지 등의 정적 자원 모두를 다시 다운로드 한다.
      • 캐시, 브라우저 캐싱로 해결한다. 쉽게 말해 임시저장 (추후 다룰 예정)
      • 현재는 **HTTP 지속연결(Persistent Connections)**로 문제를 해결한다.

-HTTP 지속연결(Persistent Connections)

  • 하나의 요청에 필요한 요청들이 모두 응답될 때까지 연결을 유지한다.
  • 연결을 한번만 맺고 끊기 때문에, Connectionless 방식보다 연결 횟수가 적다.
  • → 그만큼 속도가 빨라졌다.
  • ex) HTML 요청 + CSS 요청 + JS 요청 + 이미지 요청