1. (HTTP에서) 쿼리 스트링
쿼리 스트링 개요
쿼리 스트링은 HTTP 통신에서 URL의 일부로, 서버에 데이터를 전송하는 데 사용됨.
형식
- 쿼리 스트링은 엔드포인트 주소 뒤에 ?로 시작함.
- 파라미터는 parameter=value 형식으로 작성됨.
- =을 통해 키와 값을 구분함
- 여러 파라미터는 &로 구분하여 전달할 수 있음.
- 형식 예:
endpoint_address?parameter=value¶meter=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. 통신의 기본 구조
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 |