본문 바로가기
(2024-10) 스파르타 내일배움캠프 - 백엔드/TIL

(2024-11-29) TIL

by 어뫄어뫄 2024. 11. 29.

 

 

 

1. (HTTP에서) 쿼리 스트링

쿼리 스트링 개요

쿼리 스트링은 HTTP 통신에서 URL의 일부로, 서버에 데이터를 전송하는 데 사용됨.

형식

  • 쿼리 스트링은 엔드포인트 주소 뒤에 ?로 시작함.
  • 파라미터는 parameter=value 형식으로 작성됨.
    • =을 통해 키와 값을 구분함
  • 여러 파라미터는 &로 구분하여 전달할 수 있음.
  • 형식 예:

endpoint_address?parameter=value&parameter=value

 

사용 예

  • 검색 쿼리: 사용자 입력에 따라 결과 필터링.
  • 페이지네이션: 결과의 특정 페이지 지정.
  • 정렬: 결과의 정렬 방식 지정.

 

2.JSON 구조 예시 그림으로 이해하기

그리는 도구: https://jsonviewer.stack.hu/

 

1) 가장 간단한 예시

{
  "name": "Alice",
  "age": 25
}

 

 

2) 배열 사용

{
  "fruits": ["apple", "banana", "orange"]
}

 

 

 

3) 중첩 객체

 

{
  "person": {
    "name": "Bob",
    "age": 30
  }
}

 

 

 

4) 배열 안에 객체 포함

 

{
  "students": [
    {
      "name": "Charlie",
      "age": 22
    },
    {
      "name": "David",
      "age": 23
    }
  ]
}

 

 

5) 복잡한 객체와 배열 조합

{
  "library": {
    "name": "City Library",
    "books": [
      {
        "title": "The Great Gatsby",
        "author": "F. Scott Fitzgerald",
        "year": 1925
      },
      {
        "title": "1984",
        "author": "George Orwell",
        "year": 1949
      }
    ]
  }
}

 

6) 다중 중첩 구조

{
  "company": {
    "name": "Tech Solutions",
    "location": "Seoul, South Korea",
    "employees": [
      {
        "id": 1,
        "name": "John Doe",
        "position": "Software Engineer"
      },
      {
        "id": 2,
        "name": "Jane Smith",
        "position": "Data Analyst"
      }
    ]
  }
}

 

 

7) 복잡한 구조

{
  "employees": [
    {
      "id": 1,
      "name": "John Doe",
      "age": 30,
      "position": "Software Engineer",
      "salary": 75000,
      "skills": ["Java", "Python", "JavaScript"]
    },
    {
      "id": 2,
      "name": "Jane Smith",
      "age": 28,
      "position": "Data Analyst",
      "salary": 65000,
      "skills": ["SQL", "Excel", "R"]
    },
    {
      "id": 3,
      "name": "Mike Johnson",
      "age": 35,
      "position": "Project Manager",
      "salary": 90000,
      "skills": ["Leadership", "Communication", "Agile"]
    }
  ],
  "company": {
    "name": "Tech Solutions",
    "location": "Seoul, South Korea",
    "established": 2015
  }
}

 

 

3. REST API? 

REST API 리소스 개요

  • 리소스 정의: REST에서 리소스는 문서, 이미지, 객체 등 이름이 있는 정보이며 URI로 표현됨.
  • 리소스 유형:
    • 싱글톤: 단일 항목 나타냄 (예: /customers/{id}).
    • 컬렉션: 항목 그룹 나타냄 (예: /customers).
    • 서브컬렉션: 특정 리소스 내 항목 나타냄 (예: /customers/{id}/accounts).

URI 설계 모범 사례

URI 설계 모범 사례

  • 명사 사용: URI는 명사로 리소스 나타내야 하고, 동사 사용하지 않음.
  • 명명 규칙:
    • 문서 리소스는 단수형 이름 사용.
    • 컬렉션 및 저장소는 복수형 이름 사용.
  • 일관성: 명확성과 유지 관리를 위해 명명 규칙 일관되게 유지.
    • 계층 구조는 슬래시(/)로 나타냄.
    • 마지막 슬래시는 사용하지 않음.
    • 가독성 위해 하이픈(-) 사용.
    • 언더스코어(_) 피하고 소문자 사용.
  • 파일 확장자 사용 안함: URI에 파일 확장자 사용하지 않고, 콘텐츠 유형은 HTTP 헤더에 의존.
  • URI에 CRUD 사용 안함: 작업 정의에 HTTP 메서드(GET, POST, PUT, DELETE) 사용.
  • 쿼리 매개변수 사용: 필터링 및 정렬에 쿼리 매개변수 사용하고 새로운 엔드포인트 안 만듦.

결론

  • 리소스를 명사로 다루고, HTTP 메서드로 작업 수행. URI에 동사 넣지 않도록 하여 REST 원칙 지켜야 함. 동사 사용 시 URI가 RPC 호출로 변하게 됨.

출처: https://restfulapi.net/resource-naming/

 

 

4. 통신의 기본 구조

 

 

출처: https://www.ncyte.net/faculty/cybersecurity-curriculum/college-curriculum/interactive-lessons/the-osi-model

OSI 7 Layers

 

 

1) IP

 

출처: https://networklessons.com/subnetting/internet-protocol 를 나름대로 정리.

내 언어로 정리한 내용이며, 내가 오해한 내용이 있을 가능성이 높으므로 유의.

 

가상의 코드 예제 또한 각 단계마다 아래 라이브러리를 참조해서 가상의 Java 코드로 예시를 구현함

참조: https://libtins.github.io/tutorial/sending/

 

① 아주 간단히 도식으로 이해

 

IP 주소는 데이터를 보내기 위한 정보를 포함하는 32비트 숫자이며, 네트워크와 호스트를 구분해 통신한다.

[ 송신지 (Source) ] 
     │
     ▼
(IP 주소: 32bit 짜리)
     │
     ▼
[ 수신지 (Destination) ]

 

 

  • Source: 데이터를 보내는 장치
  • Destination: 데이터를 받는 장치
  • IP: 출발지에서 목적지로 데이터를 전송하기 위한 주소 체계

 

 

② 조금 더 복잡하게 이해

 

IPv4는 데이터를 IP 패킷에 담아 전송하며, IP 주소는 32비트로 구성되어 네트워크 부분과 호스트 부분으로 나뉜다. 주소 체계는 A, B, C 등급으로 나뉘며, 각 등급은 네트워크와 호스트의 크기를 결정한다. 서브넷 마스크는 네트워크와 호스트를 구분하는 데 사용된다.

 

[ 송신지 (네트워크 + 호스트) ]  
 - < IP 패킷 생성 >  
     │  
     ▼  
(IP 주소)  
┌────────────────────────────┐  
│ 32비트:                    │
│네트워크(24비트) + 호스트(8비트) │
└────────────────────────────┘  
- 서브넷 마스크로 네트워크/호스트 구분
- A/B/C 등급 기반 경로 지정  
     │  
     ▼  
[ 수신지 (네트워크 + 호스트) ]

 

 

- 기본 패킷 전송

// 기본 패킷 전송 예시
PacketSender sender = new PacketSender();
IPPacket pkt = new IPPacket("192.168.0.1");
sender.send(pkt);

주소를 찍어서 보낸다.

 

 

 

③ IP 주소 체계?

 

 

 각 부분마다 1바이트(=8비트=2^8= 0~255) 만큼의 숫자를 가져서 주소가 구분됨

 

 

④ 비연결형 프로토콜

[송신자] -----> (패킷 1) ----->      [수신자]
             -----> (패킷 2) -----> 
             -----> (패킷 3) ----->

* 각 패킷은 독립적으로 전송됨.
* [네트워크]에서는 패킷이 서로 다른 경로로 전송될 수 있음.
* 패킷의 순서가 뒤바뀌거나 일부 패킷이 손실될 수 있음.

 

⑤ 패킷?

 

- 전송할 데이터에 보내는 사람과 받는 사람 주소를 붙임 → 어디로 찾아가야 될지 알게 됨

 

 

 

⑥ 설명

 

IPv4는 OSI 모델의 네트워크 계층에서 작동하며, 연결 없이 패킷을 독립적으로 처리한다. IP 주소는 32비트이며, 네트워크를 나타내는 부분과 각 네트워크 내 장치를 구별하는 호스트 부분으로 나뉜다. 서브넷 마스크는 네트워크와 호스트 영역을 구분하는 역할을 한다. 주소는 공용(인터넷용)과 사설(LAN용)로 구분되며, 특정 주소는 네트워크 정의나 브로드캐스트 용도로 예약되어 있다.

 

 

붉은 색 부분이 Layer에서 전후 관계를 비유적으로 잘 보인다.

 

 

 

- TCP와 Raw 데이터 추가

// TCP와 Raw 데이터 추가
PacketSender sender = new PacketSender();
IPPacket pkt = new IPPacket("192.168.0.1")
                    .addLayer(new TCPLayer(22))
                    .addLayer(new RawDataLayer("foo"));
sender.send(pkt);

 

- 네트워크 인터페이스 지정

 

// 네트워크 인터페이스 지정
PacketSender sender = new PacketSender();
EthernetPacket pkt = new EthernetPacket()
                            .addLayer(new IPPacket())
                            .addLayer(new TCPLayer())
                            .addLayer(new RawDataLayer("foo"));
sender.send(pkt, "eth0"); // eth0 인터페이스를 통해 전송

 

 

 

 

'(2024-10) 스파르타 내일배움캠프 - 백엔드 > TIL' 카테고리의 다른 글

(2024-12-02) TIL  (0) 2024.12.02
(2024-11-28) TIL  (0) 2024.11.28
(2024-11-27) TIL  (1) 2024.11.27
(2024-11-26) TIL  (0) 2024.11.26
(2024-11-25) TIL  (0) 2024.11.25