Home > Spring > πŸƒ[Spring] HTTP Body, 메타데이터(Metadata), λ°”μ΄λ„ˆλ¦¬ 데이터(Binary Data), JSON(JavaScript Object Notation), `@PostMapping` μ• λ„ˆν…Œμ΄μ…˜, `@RequestBody` μ• λ„ˆν…Œμ΄μ…˜.

πŸƒ[Spring] HTTP Body, 메타데이터(Metadata), λ°”μ΄λ„ˆλ¦¬ 데이터(Binary Data), JSON(JavaScript Object Notation), `@PostMapping` μ• λ„ˆν…Œμ΄μ…˜, `@RequestBody` μ• λ„ˆν…Œμ΄μ…˜.
Spring Framework

πŸƒ[Spring] HTTP Body

1️⃣ HTTP Body.

  • HTTP Body λŠ” HTTP μš”μ²­ λ˜λŠ” μ‘λ‹΅μ—μ„œ μ‹€μ œ 데이터λ₯Ό ν¬ν•¨ν•˜λŠ” 뢀뢄을 λ§ν•©λ‹ˆλ‹€.
  • 주둜 ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 데이터 κ΅ν™˜μ„ μœ„ν•œ λͺ©μ μœΌλ‘œ μ‚¬μš©λ˜λ©°, μš”μ²­ λ³Έλ¬Έ(Request Body) κ³Ό 응닡 λ³Έλ¬Έ(Response Body) 으둜 λ‚˜λ‰©λ‹ˆλ‹€.

1. HTTP Body의 ꡬ쑰.

HTTP λ©”μ‹œμ§€μ˜ κ΅¬μ„±μš”μ†Œ.

  • 1. μš”μ²­/응닡 라인
    • HTTP λ©”μ„œλ“œ(GET, POST λ“±)λ‚˜ μƒνƒœ μ½”λ“œ(200, 404 λ“±)κ°€ ν¬ν•¨λœ 첫 번째 μ€„μž…λ‹ˆλ‹€.
  • 2. 헀더(Header)
    • 메타데이터(μš”μ²­/μ‘λ‹΅μ˜ 속성, 데이터 ν˜•μ‹, 인코딩 방식 λ“±)λ₯Ό ν¬ν•¨ν•˜λ©°, 각 ν•„λ“œκ°€ key-value ν˜•μ‹ 으둜 λ‚˜μ—΄λ©λ‹ˆλ‹€.
  • 3. λ³Έλ¬Έ(Body)
    • μ‹€μ œ 데이터가 λ“€μ–΄κ°€λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€.

HTTP BodyλŠ” μ΄λŸ¬ν•œ λ©”μ‹œμ§€μ˜ λ§ˆμ§€λ§‰ 뢀뢄에 μœ„μΉ˜ν•˜λ©°, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œ λ³΄λ‚΄λŠ” λ°μ΄λ„ˆνƒ€ μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈλ‘œ λ³΄λ‚΄λŠ” 데이터가 여기에 ν¬ν•¨λ©λ‹ˆλ‹€.

2. HTTP Body의 μ‚¬μš© λͺ©μ .

  • μš”μ²­(Request) Body
    • ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œ λ³΄λ‚΄λŠ” 데이터.
    • 주둜 POST, PUT, PATCH λ“±μ˜ μš”μ²­μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, μ‚¬μš©μž 둜그인 정보, 파일 μ—…λ‘œλ“œ, μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€ 생성 λ“±μ˜ 데이터λ₯Ό μ„œλ²„λ‘œ 보낼 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • 응닡(Response) Body
    • μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 응닡할 λ•Œ, ν•„μš”ν•œ 데이터λ₯Ό 본문에 ν¬ν•¨ν•˜μ—¬ λ³΄λƒ…λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, API ν˜ΈμΆœμ— λŒ€ν•œ 결과둜 JSON ν˜•μ‹μ˜ 데이터λ₯Ό λ°˜ν™˜ν•˜κ±°λ‚˜, HTML νŽ˜μ΄μ§€λ₯Ό λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. HTTP Bodyκ°€ μ—†λŠ” 경우.

일뢀 μš”μ²­μ€ Bodyλ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠκΈ°λ„ ν•©λ‹ˆλ‹€.

  • GET μš”μ²­
    • 주둜 데이터λ₯Ό μ„œλ²„λ‘œλΆ€ν„° μš”μ²­ν•˜λŠ” 데 μ‚¬μš©λ˜λ©° Bodyκ°€ ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • DELETE μš”μ²­
    • λ¦¬μ†ŒμŠ€λ₯Ό μ‚­μ œν•  λ•Œ μ‚¬μš©λ˜λ©°, 일반적으둜 Bodyκ°€ μ—†μŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ POST, PUT, PATCH μš”μ²­ 은 보톡 Body에 데이터λ₯Ό ν¬ν•¨ν•˜μ—¬ μ „μ†‘ν•©λ‹ˆλ‹€.

4. HTTP Body의 ν˜•μ‹.

  • HTTP BodyλŠ” λ‹€μ–‘ν•œ 데이터 ν˜•μ‹μ„ κ°€μ§ˆ 수 있으며, 데이터 ν˜•μ‹μ€ Content-Type 헀더에 μ˜ν•΄ μ •μ˜λ©λ‹ˆλ‹€.

자주 μ‚¬μš©λ˜λŠ” ν˜•μ‹.

  • 1. application/json
    • JSON ν˜•μ‹μ˜ 데이터λ₯Ό 전달할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ
        {
        "name": "Kobe"
        "email": "kobe@example.com"
        }
      
  • 2. application/x-www-form-urlencoded
    • HTML 폼 데이터λ₯Ό URL μΈμ½”λ”©ν•˜μ—¬ 전달할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • 폼 ν•„λ“œκ°€ key=value ν˜•μ‹μœΌλ‘œ μΈμ½”λ”©λ˜μ–΄ μ „μ†‘λ©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ
        name=Kobe&email=kobe%40example.com
      
  • 3. multipart/form-data
    • 파일 μ—…λ‘œλ“œμ™€ 같은 λ°”μ΄λ„ˆλ¦¬ 데이터가 ν¬ν•¨λœ 폼 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • 각 νŒŒνŠΈκ°€ μ—¬λŸ¬ λΆ€λΆ„μœΌλ‘œ λ‚˜λ‰˜μ–΄ μ „μ†‘λ©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ
      ```json
      –boundary
      Content-Disposition: form-data; name=”name”

    Kobe
    –boundary
    Content-Disposition: form-data; name=”file”; filename=”profile.jpg”
    Content-Type: image/jpeg

    [λ°”μ΄λ„ˆλ¦¬ 데이터]
    –boundary–
    ```

  • 4. text/plain
    • λ‹¨μˆœν•œ ν…μŠ€νŠΈ 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ
        Hello, this is a plain text message.
      
  • 5. 기타 λ°”μ΄λ„ˆλ¦¬ 데이터.
    • PDF, 이미지, λΉ„λ””μ˜€ λ“± λ‹€μ–‘ν•œ λ―Έλ””μ–΄ 파일이 Body에 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.
    • Content-Type 헀더에 맞게 데이터가 μΈμ½”λ”©λ©λ‹ˆλ‹€.

5. HTTP Body의 μ˜ˆμ‹œ.

μš”μ²­(Request) Body μ˜ˆμ‹œ (POST μš”μ²­)

POST /login HTTP/1.1

Host: www.example.com
Content-Type: application/json
Content-Length: 51

{
    "username": "Kobe",
    "password": "12345"
}
  • 헀더에 Content-Type: application/json이 λͺ…μ‹œλ˜μ–΄ 있으며, μ΄λŠ” Bodyκ°€ JSON ν˜•μ‹μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • Bodyμ—λŠ” 둜그인 정보λ₯Ό ν¬ν•¨ν•œ JSON 데이터가 담겨 μžˆμŠ΅λ‹ˆλ‹€.

응닡(Response) Body μ˜ˆμ‹œ.

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 85

{
    "status": "success",
    "data": {
        "id": 1,
        "name": "Kobe",
        "email": "kobe@example.com"
    }
}
  • 헀더에 Content-Type: application/json이 μ„€μ •λ˜μ–΄ 있으며, μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ JSON 데이터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • Bodyμ—λŠ” μ„œλ²„κ°€ μ‘λ‹΅μœΌλ‘œ 보낸 데이터가 JSON ν˜•μ‹μœΌλ‘œ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

6. μš”μ•½.

  • HTTP BodyλŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 데이터λ₯Ό μ „μ†‘ν•˜λŠ” λΆ€λΆ„μž…λ‹ˆλ‹€.
  • 주둜 POST, PUT, PATCH μš”μ²­μ—μ„œ 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©λ˜λ©°, μ„œλ²„μ˜ 응닡에도 데이터가 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 데이터 ν˜•μ‹μ€ Content-Type 헀더λ₯Ό 톡해 μ •μ˜λ˜λ©°, JSON, HTML, XML, λ°”μ΄λ„ˆλ¦¬ 데이터 λ“± λ‹€μ–‘ν•œ ν˜•μ‹μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

2️⃣ 메타데이터(Metadata)

  • 메타데이터(Metadata) λŠ” 데이터λ₯Ό μ„€λͺ…ν•˜λŠ” 데이터, 즉 데이터에 λŒ€ν•œ μΆ”κ°€ 정보λ₯Ό μ œκ³΅ν•˜λŠ” λ°μ΄ν„°μž…λ‹ˆλ‹€.
  • λ©”νƒ€λ°μ΄ν„°λŠ” νŠΉμ • 데이터가 무엇을 λ‚˜νƒ€λ‚΄λŠ”μ§€, μ–΄λ–»κ²Œ μ‚¬μš©λ˜μ–΄μ•Ό ν•˜λŠ”μ§€, 그리고 λ°μ΄ν„°μ˜ 속성에 λŒ€ν•œ λ‹€μ–‘ν•œ 정보λ₯Ό λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 데이터λ₯Ό 더 μ‰½κ²Œ μ΄ν•΄ν•˜κ³  관리할 수 있게 ν•©λ‹ˆλ‹€.

1. λ©”νƒ€λ°μ΄ν„°μ˜ μ—­ν• .

  • λ©”νƒ€λ°μ΄ν„°λŠ” 데이터 μžμ²΄μ— λŒ€ν•œ μ„€λͺ…을 μ œκ³΅ν•¨μœΌλ‘œμ¨, λ°μ΄ν„°μ˜ ꡬ쑰, 의미,λͺ©μ  등을 λͺ…ν™•νžˆ μ•Œλ €μ€λ‹ˆλ‹€.
  • λ©”νƒ€λ°μ΄ν„°λŠ” μ—¬λŸ¬ λ§₯λ½μ—μ„œ μ‚¬μš©ν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

메타 λ°μ΄ν„°μ˜ μ£Όμš”ν•œ μ—­ν• .

  • 1. 데이터 μ„€λͺ….
    • λ°μ΄ν„°μ˜ 의미, ν˜•μ‹, ꡬ쑰λ₯Ό μ„€λͺ…ν•΄ μ€λ‹ˆλ‹€.
  • 2. 데이터 검색.
    • 데이터λ₯Ό μ‰½κ²Œ κ²€μƒ‰ν•˜κ³  찾을 수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, λ„μ„œκ΄€μ˜ μΉ΄νƒˆλ‘œκ·Έμ—μ„œ 책을 μ°ΎκΈ° μœ„ν•΄ 제λͺ©, μ €μž, 좜판 연도 등을 검색할 수 μžˆλŠ” 것은 메타데이터 λ•λΆ„μž…λ‹ˆλ‹€.
  • 3. 데이터 관리.
    • 데이터λ₯Ό λΆ„λ₯˜ν•˜κ³  μ‘°μ§ν™”ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.
  • 4. 데이터 ν†΅μ œ.
    • 메타데이터λ₯Ό 톡해 λ°μ΄ν„°μ˜ μ ‘κ·Ό κΆŒν•œμ΄λ‚˜ μ‚¬μš© λ²”μœ„λ₯Ό 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

2. λ©”νƒ€λ°μ΄ν„°μ˜ μœ ν˜•.

  • λ©”νƒ€λ°μ΄ν„°λŠ” λ‹€μ–‘ν•œ μœ ν˜•μœΌλ‘œ λΆ„λ₯˜λ  수 있으며, κ·Έ λͺ©μ μ— 따라 λ‹€λ₯΄κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€.

일반으둜 많이 μ‚¬μš©λ˜λŠ” λ©”νƒ€λ°μ΄ν„°μ˜ μ„Έ 가지 μœ ν˜•.

  • 1. ꡬ쑰적 메타데이터(Structural Metadata)
    • λ°μ΄ν„°μ˜ κ΅¬μ‘°λ‚˜ ν˜•μ‹μ„ μ„€λͺ…ν•˜λŠ” μ •λ³΄μž…λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 각 ν…Œμ΄λΈ”μ˜ ν•„λ“œμ™€ 데이터 μœ ν˜•μ„ μ„€λͺ…ν•˜λŠ” 정보가 여기에 ν•΄λ‹Ήλ©λ‹ˆλ‹€.
  • 2. 기술적 메타데이터(Technical Metadata)
    • 데이터λ₯Ό μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데 ν•„μš”ν•œ 기술적인 정보λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
      • 파일의 생성 λ‚ μ§œ, μˆ˜μ • λ‚ μ§œ, 인코딩 방식 등이 여기에 ν•΄λ‹Ήλ©λ‹ˆλ‹€.
    • μ‹œμŠ€ν…œμ—μ„œ 데이터λ₯Ό μ²˜λ¦¬ν•˜κ±°λ‚˜ μ΄λ™μ‹œν‚€λŠ” 데 ν•„μš”ν•œ 정보가 ν¬ν•¨λ©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ: 파일 생성 일자, μˆ˜μ • 일자, 파일 μ†Œμœ μž, 인코딩 방식, 해상도.
  • 3. μ„€λͺ…적 메타데이터(Descriptive Metadata)
    • 데이터λ₯Ό μ„€λͺ…ν•˜λŠ” μ •λ³΄λ‘œ, λ°μ΄ν„°μ˜ λ‚΄μš©, 주제 ν‚€μ›Œλ“œ 등을 μ„€λͺ…ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
      • λ„μ„œκ΄€μ˜ μΉ΄νƒˆλ‘œκ·Έλ‚˜ λ―Έλ””μ–΄ 파일의 제λͺ©, μ €μž, 좜판 정보 등이 이에 ν•΄λ‹Ήλ©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ: λ„μ„œμ˜ 제λͺ©, μ €μž, 좜판일, ν‚€μ›Œλ“œ, μš”μ•½ 정보.

3. λ©”νƒ€λ°μ΄ν„°μ˜ μ˜ˆμ‹œ.

  • 1. μ›Ή νŽ˜μ΄μ§€μ˜ 메타데이터.
    • HTML λ¬Έμ„œμ—μ„œλŠ” <meta> νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ— λŒ€ν•œ 메타데이터λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
    • μ΄λŠ” 주둜 검색 엔진이 μ›Ή νŽ˜μ΄μ§€λ₯Ό 더 잘 μ΄ν•΄ν•˜κ³ , 인덱싱할 수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
      ```html

- `charset` : λ¬Έμ„œμ˜ 문자 인코딩 방식.
- `description` : μ›Ή νŽ˜μ΄μ§€μ˜ λ‚΄μš©μ— λŒ€ν•œ μ„€λͺ….
- `keyword` : μ›Ή νŽ˜μ΄μ§€μ™€ κ΄€λ ¨λœ ν‚€μ›Œλ“œ.
- `author` : λ¬Έμ„œ μž‘μ„±μž.

- **2. 이미지 파일의 메타데이터.**
    - 이미지 νŒŒμΌμ—λ„ 메타데이터가 ν¬ν•¨λ©λ‹ˆλ‹€.
    - 이미지 파일의 λ©”νƒ€λ°μ΄ν„°λŠ” 카메라 μ„€μ •, 촬영 μœ„μΉ˜, 해상도 λ“± λ‹€μ–‘ν•œ 정보λ₯Ό μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    - 이λ₯Ό **EXIF(Exchangeable Image File Format)** 메타데이터라고 λΆ€λ¦…λ‹ˆλ‹€.
```bash
μ˜ˆμ‹œ : 사진 메타데이터
- 카메라 μ œμ‘°μ‚¬: Nikon
- 카메라 λͺ¨λΈ: D3500
- 촬영 μΌμ‹œ: 2024-09-24
- 해상도: 6000 * 4000
- GPS μ’Œν‘œ: 촬영 μœ„μΉ˜ 정보
  • 3. λ„μ„œ 메타데이터.
    • λ„μ„œμ˜ λ©”νƒ€λ°μ΄ν„°λŠ” λ„μ„œκ΄€ μΉ΄νƒˆλ‘œκ·Έλ‚˜ μ „μžμ±… νŒŒμΌμ—μ„œ μ°Ύμ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, μ±…μ˜ 제λͺ©, μ €μž, μΆœνŒμ‚¬, ISBN 등이 λ©”νƒ€λ°μ΄ν„°μž…λ‹ˆλ‹€.
- 제λͺ©: "1984"
- μ €μž: 쑰지 μ˜€μ›°
- μΆœνŒμ‚¬: ν•˜νΌμ½œλ¦°μŠ€
- 좜판 연도: 1949
- ISBN: 978-0451524935
  • 4. λ™μ˜μƒ 메타데이터.
    • λ™μ˜μƒ νŒŒμΌμ—λ„ λ‹€μ–‘ν•œ 메타데이터가 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ™μ˜μƒμ˜ 제λͺ©, 길이, 해상도, λΉ„νŠΈλ ˆμ΄νŠΈ, μ œμž‘ λ‚ μ§œ 등이 여기에 ν•΄λ‹Ήλ©λ‹ˆλ‹€.
- 제λͺ©: "Vaction Highlights"
- 길이: 2μ‹œκ°„ 15λΆ„
- 해상도: 1920 * 1080
- λΉ„λ””μ˜€ 코덱: H.264
- 파일 크기: 1.2GB

4. λ©”νƒ€λ°μ΄ν„°μ˜ μ€‘μš”μ„±.

  • 1. 데이터 관리.
    • λ©”νƒ€λ°μ΄ν„°λŠ” 데이터λ₯Ό 효율적으둜 κ΄€λ¦¬ν•˜κ³  μœ μ§€ν•˜λŠ” 데 ν•„μˆ˜μ μž…λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, 검색 μ‹œλŠ₯을 ν–₯μƒμ‹œν‚€κ³ , 데이터λ₯Ό λΆ„λ₯˜ν•˜κ³  μ •λ¦¬ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.
  • 2. 데이터 검색 및 μ ‘κ·Όμ„±.
    • λ©”νƒ€λ°μ΄ν„°λŠ” λŒ€λŸ‰μ˜ 데이터λ₯Ό μ‰½κ²Œ νƒμƒ‰ν•˜κ³  μ›ν•˜λŠ” 데이터λ₯Ό λΉ λ₯΄κ²Œ 찾을 수 μžˆλ„λ‘ λ•μŠ΅λ‹ˆλ‹€.
    • 검색 엔진은 μ›ΉνŽ˜μ΄μ§€μ˜ 메타데이터λ₯Ό λΆ„μ„ν•˜μ—¬ 검색 κ²°κ³Όλ₯Ό λ”μš± μ •ν™•ν•˜κ²Œ μ œκ³΅ν•©λ‹ˆλ‹€.
  • 3. 데이터 보쑴.
    • 파일의 생성 일자, μˆ˜μ • 일자, 버전 정보 λ“±μ˜ λ©”νƒ€λ°μ΄ν„°λŠ” λ°μ΄ν„°μ˜ 이λ ₯을 μΆ”μ ν•˜λŠ” 데 μœ μš©ν•˜λ©°, 데이터λ₯Ό μž₯기적으둜 λ³΄μ‘΄ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€.

5. μš”μ•½.

  • λ©”νƒ€λ°μ΄ν„°λŠ” 데이터λ₯Ό μ„€λͺ…ν•˜λŠ” λ°μ΄ν„°λ‘œ, νŒŒμΌμ΄λ‚˜ 정보λ₯Ό 보닀 μ‰½κ²Œ μ΄ν•΄ν•˜κ³  관리할 수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
  • λ©”νƒ€λ°μ΄ν„°λŠ” μ—¬λŸ¬ μœ ν˜•μœΌλ‘œ λ‚˜λ‰˜λ©°, μ›ΉνŽ˜μ΄μ§€, 이미지, λ™μ˜μƒ, λ„μ„œ λ“± λ‹€μ–‘ν•œ ν˜•νƒœμ˜ 데이터에 μ μš©λ˜μ–΄ λ°μ΄ν„°μ˜ 검색, 관리, 보쑴에 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.

3️⃣ λ°”μ΄λ„ˆλ¦¬ 데이터(Binary Data)

  • λ°”μ΄λ„ˆλ¦¬ 데이터(Binary Data) λŠ” 0κ³Ό 1둜 κ΅¬μ„±λœ μ΄μ§„μˆ˜ ν˜•νƒœλ‘œ μ €μž₯된 데이터λ₯Ό λ§ν•©λ‹ˆλ‹€.
  • 컴퓨터 μ‹œμŠ€ν…œμ€ λͺ¨λ“  데이터λ₯Ό 기본적으둜 μ΄μ§„μˆ˜, 즉 λ°”μ΄λ„ˆλ¦¬ ν˜•νƒœλ‘œ μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λŠ” 컴퓨터가 이해할 수 μžˆλŠ” κ°€μž₯ 기본적인 데이터 ν˜•μ‹μž…λ‹ˆλ‹€.
  • ν…μŠ€νŠΈ λ°μ΄ν„°λŠ” μ‚¬λžŒμ΄ μ‰½κ²Œ 읽을 수 μžˆλŠ” ν˜•νƒœμΈ 반면, λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λŠ” μ‚¬λžŒμ΄ λ°”λ‘œ 읽을 수 μ—†λŠ” ν˜•μ‹μœΌλ‘œ μ €μž₯λ©λ‹ˆλ‹€.

1. λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°μ˜ νŠΉμ§•.

  • 1. μ΄μ§„μˆ˜λ‘œ ν‘œν˜„.
    • λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λŠ” 0κ³Ό 1둜 κ΅¬μ„±λœ μ΄μ§„μˆ˜λ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.
    • μ»΄ν“¨ν„°λŠ” λͺ¨λ“  데이터λ₯Ό μ „κΈ° μ‹ ν˜Έ(켜짐 = 1, 꺼짐 = 0)둜 μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ—, λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λŠ” μ»΄ν“¨ν„°μ˜ κΈ°λ³Έ 데이터 ν‘œν˜„ λ°©μ‹μž…λ‹ˆλ‹€.
  • 2. μ‚¬λžŒμ΄ 읽을 수 μ—†λŠ” ν˜•μ‹.
    • λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λŠ” μ‚¬λžŒμ΄ 직접 μ½κ±°λ‚˜ ν•΄μ„ν•˜κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, 이미지 νŒŒμΌμ΄λ‚˜ μ‹€ν–‰ 파일과 같은 λ°μ΄ν„°λŠ” 일반적으둜 λ°”μ΄λ„ˆλ¦¬λ‘œ μ €μž₯되며, 이λ₯Ό 직접 μ—΄λ©΄ μ•Œμ•„λ³Ό 수 μ—†λŠ” κΈ°ν˜Έλ“€μ΄ λ‚˜μ˜΅λ‹ˆλ‹€.
  • 3. 파일 ν˜•μ‹.
    • λŒ€λΆ€λΆ„μ˜ 파일 ν˜•μ‹μ΄ λ°”μ΄λ„ˆλ¦¬ ν˜•μ‹μœΌλ‘œ μ €μž₯λ©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, 이미지(JPEG, PNG), λΉ„λ””μ˜€(MP4), μ˜€λ””μ˜€(MP3), μ‹€ν–‰ 파일(EXE) 등은 λͺ¨λ‘ λ°”μ΄λ„ˆλ¦¬ ν˜•μ‹μœΌλ‘œ μ €μž₯되며, 이λ₯Ό μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜λ €λ©΄ νŠΉμ • ν”„λ‘œκ·Έλž¨μ΄λ‚˜ μ†Œν”„νŠΈμ›¨μ–΄κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

2. λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°μ˜ 예.

  • 1. 이미지 파일(JPEG, PNG λ“±)
    • 이미지 νŒŒμΌμ€ ν”½μ…€ 값듀이 0κ³Ό 1둜 κ΅¬μ„±λœ λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λ‘œ μ €μž₯λ©λ‹ˆλ‹€.
    • 이λ₯Ό μ—΄κ³  ν‘œμ‹œν•˜λ €λ©΄ 이미지 뷰어와 같은 μ†Œν”„νŠΈμ›¨μ–΄κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • 2. μ˜€λ””μ˜€ 파일(MP3, WAV λ“±)
    • μ˜€λ””μ˜€ νŒŒμΌμ€ 음ν–₯ μ‹ ν˜Έλ₯Ό λ””μ§€ν„Έν™”ν•œ λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λ‘œ μ €μž₯λ©λ‹ˆλ‹€.
    • μŒμ•… ν”Œλ ˆμ΄μ–΄ ν”„λ‘œκ·Έλž¨μ„ 톡해 이λ₯Ό μž¬μƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 3. λ™μ˜μƒ 파일(MP4, AVI λ“±)
    • λ™μ˜μƒ νŒŒμΌμ€ μ˜μƒκ³Ό 음ν–₯을 κ²°ν•©ν•œ λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λ‘œ μ €μž₯λ©λ‹ˆλ‹€.
    • 이λ₯Ό 보기 μœ„ν•΄μ„œλŠ” λΉ„λ””μ˜€ ν”Œλ ˆμ΄μ–΄κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • 4. μ‹€ν–‰ 파일(EXE, DLL λ“±)
    • 운영 μ²΄μ œμ—μ„œ μ‹€ν–‰ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ€ λ°”μ΄λ„ˆλ¦¬λ‘œ μ €μž₯λ©λ‹ˆλ‹€.
    • μ‚¬μš©μžκ°€ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄ μ»΄ν“¨ν„°λŠ” 이 λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό ν•΄μ„ν•˜μ—¬ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • 5. μ••μΆ• 파일(ZIP, RAR λ“±)
    • μ••μΆ• νŒŒμΌμ€ μ—¬λŸ¬ νŒŒμΌμ„ λ°”μ΄λ„ˆλ¦¬ ν˜•νƒœλ‘œ μ••μΆ•ν•˜μ—¬ ν•˜λ‚˜μ˜ 파일둜 묢은 κ²ƒμž…λ‹ˆλ‹€.
    • μ••μΆ• ν•΄μ œ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό 톡해 μ›λž˜ 파일둜 볡원할 수 μžˆμŠ΅λ‹ˆλ‹€.

3. λ°”μ΄λ„ˆλ¦¬ 데이터 VS ν…μŠ€νŠΈ 데이터.

  • ν…μŠ€νŠΈ 데이터
    • ν…μŠ€νŠΈ λ°μ΄ν„°λŠ” μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” ν˜•νƒœλ‘œ μ €μž₯된 λ°μ΄ν„°μž…λ‹ˆλ‹€.
    • 주둜 μ•ŒνŒŒλ²³, 숫자, 기호 λ“±μœΌλ‘œ κ΅¬μ„±λœ 문자λ₯Ό ν¬ν•¨ν•˜λ©°, 예λ₯Ό λ“€μ–΄ HTML, JSON, XML 파일 등이 μžˆμŠ΅λ‹ˆλ‹€.
    • ν…μŠ€νŠΈ λ°μ΄ν„°λŠ” 일반 ν…μŠ€νŠΈ νŽΈμ§‘κΈ°λ‘œ μ‰½κ²Œ μ—΄κ³  읽을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ°”μ΄λ„ˆλ¦¬ 데이터
    • λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λŠ” μ‚¬λžŒμ΄ μ‰½κ²Œ 읽을 수 μ—†λŠ” μ΄μ§„μˆ˜(0κ³Ό 1)의 μ‘°ν•©μœΌλ‘œ μ €μž₯된 λ°μ΄ν„°μž…λ‹ˆλ‹€.
    • 이미지, λ™μ˜μƒ, μ‹€ν–‰ 파일과 같은 λ°μ΄ν„°λŠ” μ΄μ§„μˆ˜λ‘œ μΈμ½”λ”©λœ λ°”μ΄λ„ˆλ¦¬ 데이터 ν˜•μ‹μœΌλ‘œ μ €μž₯λ©λ‹ˆλ‹€.

4. λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°μ˜ ν™œμš©.

  • 1. λ„€νŠΈμ›Œν¬ 전솑
    • λŒ€μš©λŸ‰ 파일(예: 이미지, λ™μ˜μƒ, μ†Œν”„νŠΈμ›¨μ–΄ λ“±)을 λ„€νŠΈμ›Œν¬λ₯Ό 톡해 전솑할 λ•Œ λ°”μ΄λ„ˆλ¦¬ ν˜•μ‹μœΌλ‘œ μ „μ†‘λ©λ‹ˆλ‹€.
    • λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λŠ” μ••μΆ• 및 인코딩을 톡해 효율적으둜 μ „μ†‘λ©λ‹ˆλ‹€.
  • 2. 파일 μ €μž₯
    • μ»΄ν“¨ν„°μ˜ μ €μž₯ μž₯치(HDD, SSD λ“±)μ—μ„œ λͺ¨λ“  λ°μ΄ν„°λŠ” λ°”μ΄λ„ˆλ¦¬ ν˜•μ‹μœΌλ‘œ μ €μž₯λ©λ‹ˆλ‹€.
    • ν…μŠ€νŠΈ, 이미지, μ˜€λ””μ˜€, λΉ„λ””μ˜€, μ‹€ν–‰ 파일 λ“± λͺ¨λ“  νŒŒμΌμ€ κ²°κ΅­ λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λ‘œ λ³€ν™˜λ˜μ–΄ μ €μž₯λ©λ‹ˆλ‹€.
  • 3. λ©€ν‹°λ―Έλ””μ–΄ 처리
    • 이미지, μ˜€λ””μ˜€, λΉ„λ””μ˜€ λ“±μ˜ λ©€ν‹°λ―Έλ””μ–΄ νŒŒμΌμ€ λͺ¨λ‘ λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λ‘œ μ €μž₯되며, μ΄λŸ¬ν•œ 데이터λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ μ ˆν•œ μ†Œν”„νŠΈμ›¨μ–΄μ™€ 코덱이 ν•„μš”ν•©λ‹ˆλ‹€.

5. λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법.

  • λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό μ²˜λ¦¬ν•˜λ €λ©΄ νŒŒμΌμ„ μ—΄μ–΄ μ΄μ§„μˆ˜ 데이터λ₯Ό 읽고 해석할 수 μžˆλŠ” μ†Œν”„νŠΈμ›¨μ–΄λ‚˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, Java, Python, C++ λ“± λ‹€μ–‘ν•œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό 읽고 μ“°λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ: Javaμ—μ„œ λ°”μ΄λ„ˆλ¦¬ 파일 읽기.

import java.io.FileInputStream;
import java.io.IOException;

public class BinaryFileReader {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("image.jpg")) {
            int byteData;
            while ((byteData = fis.read()) != -1) {
                // 1λ°”μ΄νŠΈμ”© μ½μ–΄λ“€μž„
                System.out.println(byteData);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • μœ„ μ˜ˆμ‹œμ—μ„œλŠ” FileInputStream을 μ‚¬μš©ν•˜μ—¬ λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ„ 1λ°”μ΄νŠΈμ”© μ½λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€.

6. μš”μ•½.

  • λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λŠ” 컴퓨터가 μ²˜λ¦¬ν•˜λŠ” κΈ°λ³Έ 데이터 ν˜•μ‹μœΌλ‘œ, 0κ³Ό 1의 μ΄μ§„μˆ˜λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.
  • 주둜 이미지, μ˜€λ””μ˜€, λΉ„λ””μ˜€, μ‹€ν–‰ 파일, μ••μΆ• 파일 λ“±μ—μ„œ μ‚¬μš©λ˜λ©°, μ‚¬λžŒμ΄ 직접 읽기 μ–΄λ ΅μŠ΅λ‹ˆλ‹€.
  • ν…μŠ€νŠΈ λ°μ΄ν„°μ™€λŠ” 달리, λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λŠ” 컴퓨터가 해석할 수 μžˆλŠ” ν˜•μ‹μœΌλ‘œ μ €μž₯되며, νŒŒμΌμ„ μ—΄κ³  μ²˜λ¦¬ν•˜λ €λ©΄ νŠΉμ • μ†Œν”„νŠΈμ›¨μ–΄κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

4️⃣ JSON(JavaScript Object Notation)

  • JSON(JavaScript Object Notation) 은 데이터λ₯Ό μ €μž₯ν•˜κ³  κ΅ν™˜ν•˜κΈ° μœ„ν•œ κ²½λŸ‰ 데이터 ν˜•μ‹μž…λ‹ˆλ‹€.
  • μ‚¬λžŒμ΄ 읽고 μ“°κΈ° μ‰¬μš°λ©°, 기계가 λΆ„μ„ν•˜κ³  μƒμ„±ν•˜κΈ°λ„ 쉽도둝 μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • JSON은 ν…μŠ€νŠΈ ν˜•μ‹μ΄λ―€λ‘œ λͺ¨λ“  ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ‰½κ²Œ νŒŒμ‹±ν•˜κ³  생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

1. JSON의 νŠΉμ§•.

  • 1. κ²½λŸ‰ 데이터 ν˜•μ‹.
    • JSON은 ꡬ쑰가 κ°„λ‹¨ν•˜κ³  μš©λŸ‰μ΄ μž‘μ–΄, 특히 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” 데 널리 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 2. μ–Έμ–΄ 독립적.
    • JSON은 νŠΉμ • ν”„λ‘œκ·Έλž˜λ° 언어에 μ˜μ‘΄ν•˜μ§€ μ•ŠμœΌλ©°, λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄μ—μ„œ JSON 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλŠ” λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
    • μžλ°”μŠ€ν¬λ¦½νŠΈ 문법을 기반으둜 ν•˜μ§€λ§Œ, Python, Java, C#, PHP λ“±μ—μ„œλ„ μ‰½κ²Œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • 3. ν…μŠ€νŠΈ 기반.
    • JSON은 ν…μŠ€νŠΈλ‘œ 이루어져 μžˆμ–΄ μ‚¬λžŒμ΄ 읽고 μ΄ν•΄ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.
    • μ΄λŠ” λ””λ²„κΉ…μ΄λ‚˜ λ°μ΄ν„°μ˜ 전솑 및 μ €μž₯에 맀우 μœ λ¦¬ν•©λ‹ˆλ‹€.

2. JSON의 ꡬ쑰.

JSON λ°μ΄ν„°μ˜ 기본적인 두 가지 ꡬ쑰.

  • 1. 객체(Object)
    • μ€‘κ΄„ν˜Έ {} 둜 감싸진 ν‚€-κ°’ 쌍의 집합.
      • ν‚€λŠ” λ¬Έμžμ—΄μ΄κ³ , 값은 λ¬Έμžμ—΄, 숫자 λΆˆλ¦¬μ–Έ, λ°°μ—΄, 객체 λ˜λŠ” null이 될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 2. λ°°μ—΄(Array)
    • λŒ€κ΄„ν˜Έ [] 둜 감싸진 κ°’λ“€μ˜ λͺ©λ‘.
      • λ°°μ—΄ μ•ˆμ˜ 값은 순차적으둜 μ €μž₯되며, 각 값은 λ¬Έμžμ—΄, 숫자, λΆˆλ¦¬μ–Έ, 객체, λ°°μ—΄ λ˜λŠ” null일 수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ: JSON 객체와 λ°°μ—΄.

{
    "name": "Kobe",
    "age": 30,
    "isStudent": false,
    "skills": ["Java", "JavaScript", "Swift"],
    "address": {
        "city": "Seoul",
        "zipcode": "12345"
    }
}
  • 객체
    • 이 μ˜ˆμ œμ—μ„œ 전체 λ°μ΄ν„°λŠ” JSON 객체둜, μ€‘κ΄„ν˜Έ {} μ•ˆμ— μ—¬λŸ¬ ν‚€-κ°’ 쌍이 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • λ°°μ—΄
    • skillsλŠ” λ°°μ—΄λ‘œ, μ‚¬μš©μžκ°€ 가진 ν”„λ‘œκ·Έλž˜λ° 언어듀을 리슀트둜 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • μ€‘μ²©λœ 객체
    • addressλŠ” 또 λ‹€λ₯Έ JSON 객체둜, μ€‘μ²©λœ ꡬ쑰λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

3. JSON의 데이터 νƒ€μž….

JSONμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” κΈ°λ³Έ 데이터 νƒ€μž…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 1. λ¬Έμžμ—΄(String)
    • 큰 λ”°μ˜΅ν‘œ"둜 감싸인 ν…μŠ€νŠΈ.
      • 예: "Kobe"
  • 2. 숫자(Number)
    • μ •μˆ˜ λ˜λŠ” μ‹€μˆ˜.
      • 예: 30, 3.14
  • 3. λΆˆλ¦¬μ–Έ(Boolean)
    • true λ˜λŠ” false
      • 예: true, false
  • 4. 객체(Object)
    • μ€‘κ΄„ν˜Έ {}둜 감싸인 ν‚€-κ°’ 쌍의 집합.
      • 예: {"name": "Kobe", "age": 30}
  • 5. λ°°μ—΄(Array)
    • λŒ€κ΄„ν˜Έ []둜 감싸인 κ°’λ“€μ˜ 리슀트.
      • 예: ["Java", "JavaScript", "Swift"]
  • 6. null
    • 값이 μ—†μŒμ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
      • 예: null

4. JSON의 μ‚¬μš© 예.

1. μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„ 데이터 전솑

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ 간에 JSON ν˜•μ‹μœΌλ‘œ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈν•  λ•Œ μ„œλ²„λ‘œ μ „μ†‘ν•˜λŠ” λ°μ΄ν„°λŠ” λ‹€μŒκ³Ό 같이 JSON ν˜•μ‹μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.

μš”μ²­(Request)

{
    "username": "kobe",
    "password": "12345"
}

응닡(Response)

{
    "status": "success",
    "userId": 101,
    "name": "kobe"
}

2. API 응닡 ν˜•μ‹

λ§Žμ€ RESTful APIλŠ” JSON을 응닡 ν˜•μ‹μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, 날씨 정보λ₯Ό μ œκ³΅ν•˜λŠ” APIλŠ” λ‹€μŒκ³Ό 같은 JSON 데이터λ₯Ό λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

{
    "location": "Seoul",
    "temperature": 23,
    "weather": "Sunny"
}

3. μ„€μ • 파일

JSON은 μ„€μ • 파일 ν˜•μ‹μœΌλ‘œλ„ 많이 μ‚¬μš©λ©λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, JavaScript ν”„λ‘œμ νŠΈμ˜ package.json νŒŒμΌμ€ ν”„λ‘œμ νŠΈμ˜ μ„€μ • 정보λ₯Ό JSON ν˜•μ‹μœΌλ‘œ μ €μž₯ν•©λ‹ˆλ‹€.

{
  "name": "my-project",
  "version": "1.0.0",
  "description": "A sample project",
  "dependencies": {
    "express": "^4.17.1"
  }
}

5. JSON νŒŒμ‹±κ³Ό 생성.

각 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λŠ” JSON 데이터룰 νŒŒμ‹±ν•˜κ³  μƒμ„±ν•˜λŠ” 방법을 μ§€μ›ν•©λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, JavaScript와 Python 그리고 Javaμ—μ„œ JSON을 μ²˜λ¦¬ν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

JavaScriptμ—μ„œ JSON 처리

// JSON λ¬Έμžμ—΄μ„ 객체둜 λ³€ν™˜ (νŒŒμ‹±)
let jsonString = '{"name": "John", "age": 30}';
let obj = JSON.parse(jsonString);

console.log(obj.name); // "John"

// 객체λ₯Ό JSON λ¬Έμžμ—΄λ‘œ λ³€ν™˜
let newJsonString = JSON.stringify(obj);
console.log(newJsonString); // '{"name":"John","age":30}'

Pythonμ—μ„œ JSON 처리

import json

# JSON λ¬Έμžμ—΄μ„ 객체둜 λ³€ν™˜ (νŒŒμ‹±)
json_string = '{"name": "John", "age": 30}'
data = json.loads(json_string)

print(data["name"])  # "John"

# 객체λ₯Ό JSON λ¬Έμžμ—΄λ‘œ λ³€ν™˜
new_json_string = json.dumps(data)
print(new_json_string)  # '{"name": "John", "age": 30}'

Javaμ—μ„œ JSON 처리

  • Javaμ—μ„œ JSON을 μ²˜λ¦¬ν•˜λŠ” 방법은 μ—¬λŸ¬ 가지 라이브러리λ₯Ό 톡해 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬λ‘œλŠ” Jackson, Gson 그리고 JSON.simple λ“± 이 μžˆμŠ΅λ‹ˆλ‹€.

Jackson을 μ‚¬μš©ν•œ JSON 처리

  • Jackson λΌμ΄λΈŒλŸ¬λ¦¬λŠ” JSON 데이터λ₯Ό 직렬화 및 μ—­μ§λ ¬ν™”ν•˜λŠ” 데 κ°•λ ₯ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 Java 객체λ₯Ό JSON ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜κ±°λ‚˜, JSON λ¬Έμžμ—΄μ„ Java 객체둜 λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1. Maven λ˜λŠ” Gradle에 Jackson 라이브러리 μΆ”κ°€.

// MAVEN
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version> <!-- μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” 버전 -->
</dependency>
// GRADLE
implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3'

2. Jackson을 μ‚¬μš©ν•˜μ—¬ JSON λ¬Έμžμ—΄μ„ Java 객체둜 λ³€ν™˜ (νŒŒμ‹±)

import com.fasterxml.jackson.databind.ObjectMapper;

class User {
    private String name;
    private int age;
    
    // κΈ°λ³Έ μƒμ„±μž, getter, setterκ°€ ν•„μš”ν•¨.
    public User() {}
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
}

public class JsonExample {
    public static void main(String[] args) {
        String jsonString = "{\"name\":\"Kobe\", \"age\":30}";
        
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            // JSON λ¬Έμžμ—΄μ„ Java 객체둜 λ³€ν™˜.
            User user = objectMapper.readValue(jsonString, User.class);
            
            System.out.println(user.getName()); // Kobe
            System.out.println(user.getAge()); // 30
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. Jackson을 μ‚¬μš©ν•˜μ—¬ Java 객체λ₯Ό JSON λ¬Έμžμ—΄λ‘œ λ³€ν™˜.

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonExample {
    public static void main(String[] args) {
        User user = new User();
        user.setName("Kobe");
        user.setAge(30);
        
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            // Java 객체λ₯Ό JSON λ¬Έμžμ—΄λ‘œ λ³€ν™˜
            String jsonString = objectMapper.writeValueAsString(user);
            
            System.out.println(jsonString); // {"name": "Kobe", "age": 30}
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Gson을 μ‚¬μš©ν•œ JSON 처리.

Gson은 Googleμ—μ„œ κ°œλ°œν•œ JSON 라이브러리둜, κ°„λ‹¨ν•˜κ²Œ Java 객체λ₯Ό JSON으둜 μ§λ ¬ν™”ν•˜κ±°λ‚˜ JSON λ¬Έμžμ—΄μ„ Java 객체둜 역직렬화할 수 μžˆμŠ΅λ‹ˆλ‹€.

1. Maven λ˜λŠ” Gradle에 Gson 라이브러리 μΆ”κ°€.

// MAVEN
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.8</version> <!-- μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” 버전 -->
</dependency>
// GRADLE
implementation 'com.google.code.gson:gson:2.8.8'

2. Gson을 μ‚¬μš©ν•˜μ—¬ JSON λ¬Έμžμ—΄μ„ Java 객체둜 λ³€ν™˜(νŒŒμ‹±)

import com.google.gson.Gson;

public class JsonExample {
    public static void main(String[] args) {
        String jsonString = "{\"name\":\"Kobe\", \"age\":30}";
        
        Gson gson = new Gson();
        
        // JSON λ¬Έμžμ—΄μ„ Java 객체둜 λ³€ν™˜
        User user = gson.fromJson(jsonString, User.class);
        
        System.out.println(user.getName()); // Kobe
        System.out.println(user.getAge()); // 30
    }
}

3. Gson을 μ‚¬μš©ν•˜μ—¬ Java 객체λ₯Ό JSON λ¬Έμžμ—΄λ‘œ λ³€ν™˜

import com.google.gson.Gson;

public class JsonExample {
    public static void main(String[] args) {
        User user = new User();
        user.setName("Kobe");
        user.setAge(30);
        
        Gson gson = new Gson();
        
        // Java 객체λ₯Ό JSON λ¬Έμžμ—΄λ‘œ λ³€ν™˜.
        String jsonString = gson.toJson(user);
        
        System.out.println(jsonString)l // {"name": "Kobe", "age": 30}
    }
}

6. JSONκ³Ό XML 비ꡐ

  • JSONκ³Ό XML은 λͺ¨λ‘ 데이터λ₯Ό κ΅¬μ‘°ν™”ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν¬λ§·μž…λ‹ˆλ‹€.
  • κ·ΈλŸ¬λ‚˜ JSON은 XML에 λΉ„ν•΄ 더 κ°„κ²°ν•˜κ³ , 읽기 쉽고 처리 속도가 λΉ λ₯΄λ‹€λŠ” μž₯점이 μžˆμ–΄ ν˜„λŒ€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 더 많이 μ‚¬μš©λ©λ‹ˆλ‹€.
비ꡐ ν•­λͺ© JSON XML
ꡬ쑰 ν‚€-κ°’ 쌍으둜 이루어진 κ°„κ²°ν•œ ꡬ쑰 νƒœκ·Έλ‘œ λ‘˜λŸ¬μ‹ΈμΈ 트리 ꡬ쑰
가독성 μ‚¬λžŒμ΄ 읽고 μ“°κΈ° 쉬움 μƒλŒ€μ μœΌλ‘œ 더 λ³΅μž‘ν•¨
데이터 크기 더 μž‘μ€ 크기 더 큰 크기
μœ μ—°μ„± 객체 및 λ°°μ—΄ ν‘œν˜„μ΄ 직관적 λ°°μ—΄ ν‘œν˜„μ΄ μƒλŒ€μ μœΌλ‘œ λ³΅μž‘ν•¨
지원 λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄ 및 ν”„λ ˆμž„μ›Œν¬μ—μ„œ 지원 였래된 μ‹œμŠ€ν…œκ³Όμ˜ ν˜Έν™˜μ„±μ΄ μ’‹μŒ

7. μš”μ•½.

  • Javaμ—μ„œλŠ” JSON 데이터λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ 주둜 Jacksonκ³Ό Gson 라이브러리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • 이 λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ€ Java 객체와 JSON κ°„μ˜ λ³€ν™˜μ„ κ°„λ‹¨ν•˜κ³  효율적으둜 ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
  • ObjectMapper(Jackson) λ˜λŠ” Gson 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ JSON 데이터λ₯Ό Java 객체둜 λ³€ν™˜ν•˜κ±°λ‚˜, λ°˜λŒ€λ‘œ JSON으둜 λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • JSON은 데이터λ₯Ό μ €μž₯ν•˜κ³  κ΅ν™˜ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” κ²½λŸ‰ ν…μŠ€νŠΈ ν˜•μ‹μž…λ‹ˆλ‹€.
  • κ΅¬μ‘°λŠ” 객체와 λ°°μ—΄λ‘œ κ΅¬μ„±λ˜λ©°, λ‹€μ–‘ν•œ 데이터 νƒ€μž…(λ¬Έμžμ—΄, 숫자, 객체, λ°°μ—΄ λ“±)을 μ§€μ›ν•©λ‹ˆλ‹€.
  • μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ 데이터 전솑에 널리 μ‚¬μš©λ©λ‹ˆλ‹€.
  • λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ‰½κ²Œ νŒŒμ‹±ν•˜κ³  생성할 수 μžˆλŠ” 라이브러리λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • κ°„κ²°ν•œ ꡬ쑰 덕뢄에 XML보닀 많이 μ‚¬μš©λ˜λ©°, 특히 RESTful APIμ—μ„œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.

5️⃣ @PostMapping μ• λ„ˆν…Œμ΄μ…˜.

  • @PostMapping μ• λ„ˆν…Œμ΄μ…˜ 은 Spring Frameworkμ—μ„œ HTTP POST μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
  • 주둜 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œ 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, 폼 λ°μ΄ν„°λ‚˜ JSON 데이터λ₯Ό μ„œλ²„λ‘œ μ œμΆœν•˜μ—¬ μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜λŠ” κ²½μš°μ— 많이 μ‚¬μš©λ©λ‹ˆλ‹€.

1. @PostMapping의 μ—­ν• .

  • HTTP POST μš”μ²­ 처리
    • @PostMapping은 POST μš”μ²­μ„ νŠΉμ • URL에 λ§€ν•‘ν•˜μ—¬ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
    • 주둜 데이터 생성(create) μž‘μ—…μ—μ„œ μ‚¬μš©λ˜λ©°, μ„œλ²„λ‘œλΆ€ν„° 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • RESTful APIμ—μ„œ 데이터 생성
    • RESTful APIμ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜λŠ” μž‘μ—…μ„ μ²˜λ¦¬ν•  λ•Œ POST μš”μ²­μ΄ μ‚¬μš©λ©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžλ₯Ό μƒμ„±ν•˜κ±°λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ— μƒˆλ‘œμš΄ ν•­λͺ©μ„ μΆ”κ°€ν•˜λŠ” λ“±μ˜ μž‘μ—…μ΄ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ μ‚¬μš©λ²•.

@RestController
public class UserController {
    
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // μ‚¬μš©μž 생성 둜직 처리
        return userService.saveUser(user); // μƒμ„±λœ μ‚¬μš©μž 객체 λ°˜ν™˜
    }
}

2. μ£Όμš” νŠΉμ§•.

  • 1. μš”μ²­ 데이터 전솑
    • @PostMapping은 주둜 μš”μ²­ λ³Έλ¬Έ(Body)에 데이터λ₯Ό ν¬ν•¨ν•˜μ—¬ μ „μ†‘ν•©λ‹ˆλ‹€.
    • μ΄λŠ” GET μš”μ²­κ³Ό 달리 URL에 데이터λ₯Ό 담지 μ•Šκ³ , HTTP μš”μ²­μ˜ Body에 데이터λ₯Ό λ‹΄μ•„ μ„œλ²„λ‘œ μ „μ†‘ν•©λ‹ˆλ‹€.
  • 2. @RequestBody와 ν•¨κ»˜ μ‚¬μš©
    • μ„œλ²„λ‘œ μ „λ‹¬λ˜λŠ” JSON λ˜λŠ” XML 데이터λ₯Ό Java 객체둜 λ³€ν™˜ν•˜λ €λ©΄ @RequestBody μ• λ„ˆν…Œμ΄μ…˜κ³Ό ν•¨κ»˜ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • @RequestBodyλŠ” μš”μ²­ 본문에 ν¬ν•¨λœ 데이터λ₯Ό Java 객체둜 λ§€ν•‘ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
  • 3. 폼 데이터 처리
    • HTML 폼을 톡해 데이터λ₯Ό 전솑할 λ•Œλ„ @PostMapping을 μ‚¬μš©ν•˜μ—¬ 폼 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ΄λ•ŒλŠ” @ModelAttribute λ˜λŠ” @RequestParam을 μ‚¬μš©ν•˜μ—¬ 폼 ν•„λ“œλ₯Ό λ°”μΈλ”©ν•©λ‹ˆλ‹€.

3. μ˜ˆμ‹œ 1: JSON 데이터λ₯Ό POST μš”μ²­μœΌλ‘œ 처리.

@RestController
public class UserController {
    
    // POST μš”μ²­μ„ μ²˜λ¦¬ν•˜λ©°, μš”μ²­ 본문을 Java 객체둜 λ³€ν™˜
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // user κ°μ²΄λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 보낸 JSON λ°μ΄ν„°λ‘œλΆ€ν„° 맀핑됨
        System.out.println("User created: " + user.getName());
        return userService.saveUser(user); // μƒˆλ‘œμš΄ μ‚¬μš©μž 객체 λ°˜ν™˜
    }
}
  • @PostMapping("/users)": /users URL둜 λ“€μ–΄μ˜€λŠ” POST μš”μ²­μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • @RequestBody: μš”μ²­ 본문에 ν¬ν•¨λœ JSON 데이터λ₯Ό User 객체둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈλŠ” μ•„λž˜μ™€ 같은 JSON 데이터λ₯Ό μ„œλ²„λ‘œ 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.
{
    "name": "Kobe",
    "age": 30
}

4. μ˜ˆμ‹œ 2: HTML 폼 데이터 처리.

@Controller
public class UserController {
    
    // HTML νΌμ—μ„œ 제좜된 데이터λ₯Ό 처리
    @PostMapping("/register")
    public String registerUser(@RequestParam String name, @RequestParam int age) {
        // 폼 데이터 처리 둜직
        System.out.println("User name: " + name + ", age: " + age);
        return "user_registered"; // 성곡 νŽ˜μ΄μ§€λ‘œ 이동
    }
}
  • @RequestParam: 폼 ν•„λ“œμ—μ„œ 제좜된 데이터λ₯Ό λ©”μ„œλ“œ νŒŒλΌλ―Έν„°λ‘œ λ°”μΈλ”©ν•©λ‹ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈλŠ” HTML 폼을 톡해 데이터λ₯Ό 전솑할 수 μžˆμŠ΅λ‹ˆλ‹€.

<form action="/register" method="post">
  <input type="text" name="name" placeholder="Enter your name">
  <input type="number" name="age" placeholder="Enter your age">
  <button type="submit">Register</button>
</form>

5. @PostMapping κ³Ό @RequestMapping 비ꡐ.

@PostMapping은 @RequestMapping(method = RequestMethod.POST)λ₯Ό κ°„λ‹¨ν•˜κ²Œ λŒ€μ²΄ν•  수 μžˆλŠ” λ°©λ²•μž…λ‹ˆλ‹€.

@RequestMapping(value = "/users", method = RequestMethod.POST)
public User createUser(@RequestBody User user) {
    return userService.saveUser(user);
}

μœ„ μ½”λ“œλ₯Ό @PostMapping으둜 λ¦¬νŒ©ν† λ§.

@PostMapping("/users")
public User createUser(@RequestBody User user) {
    return userService.saveUser(user);
}

6. μš”μ•½.

  • @PostMapping은 HTTP POST μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ• λ„ˆν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
  • 주둜 μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ μ„œλ²„λ‘œ 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • JSON 데이터λ₯Ό μ²˜λ¦¬ν•  λ•ŒλŠ” @RequestBody와 ν•¨κ»˜ μ‚¬μš©λ˜λ©°, 폼 λ°μ΄ν„°λŠ” @RequestParam λ˜λŠ” @ModelAttribute와 ν•¨κ»˜ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • @PostMapping은 @RequestMapping의 κ°„κ²°ν•œ λŒ€μ•ˆμœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

6️⃣ @RequestBody μ• λ„ˆν…Œμ΄μ…˜.

  • @RequestBody μ• λ„ˆν…Œμ΄μ…˜ 은 Spring Frameworkμ—μ„œ HTTP μš”μ²­μ˜ λ³Έλ¬Έ(λ°”λ””, Body) 에 λ‹΄κΈ΄ 데이터λ₯Ό Java 객체둜 λ³€ν™˜ν•΄μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€.
  • 주둜 POST, PUTκ³Ό 같은 μš”μ²­μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ JSON, XML λ˜λŠ” λ‹€λ₯Έ ν˜•μ‹μ˜ 데이터λ₯Ό 전솑할 λ•Œ 이λ₯Ό μ„œλ²„μ—μ„œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

1. @RequestBody의 μ£Όμš” μ—­ν• .

  • 1. μš”μ²­ λ³Έλ¬Έ(Request Body)을 Java 객체둜 λ³€ν™˜
    • @RequestBodyλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ 본문에 λ‹΄μ•„ 보낸 데이터λ₯Ό Java 객체둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
    • μ΄λ•Œ, Spring은 주둜 Jackson 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ JSON 데이터λ₯Ό Java 객체둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
  • 2. 주둜 POST, PUT μš”μ²­μ—μ„œ μ‚¬μš©
    • @RequestBodyλŠ” POSTλŠ” PUT μš”μ²­μ—μ„œ 데이터λ₯Ό μ„œλ²„λ‘œ 전솑할 λ•Œ 많이 μ‚¬μš©λ©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, ν΄λΌμ΄μ–ΈνŠΈκ°€ μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ 데이터λ₯Ό μ—…λ°μ΄νŠΈν•  λ•Œ JSON 데이터λ₯Ό 본문에 λ‹΄μ•„ 전솑할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 3. μžλ™ 역직렬화
    • ν΄λΌμ΄μ–ΈνŠΈκ°€ JSON ν˜•μ‹μœΌλ‘œ 데이터λ₯Ό 보내면, Spring은 이λ₯Ό μžλ™μœΌλ‘œ Java 객체둜 λ³€ν™˜(역직렬화) ν•΄μ€λ‹ˆλ‹€.

2. RequestBody의 μ‚¬μš©λ²•.

μ˜ˆμ‹œ 1: JSON 데이터λ₯Ό Java 객체둜 λ³€ν™˜.

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œ JSON 데이터λ₯Ό μ „μ†‘ν•˜κ³ , μ„œλ²„κ°€ 이λ₯Ό Java 객체둜 λ³€ν™˜ν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

@RestController
public class UserController {
    
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // μš”μ²­ λ³Έλ¬Έμ—μ„œ μ „μ†‘λœ JSON 데이터λ₯Ό User 객체둜 λ³€ν™˜
        System.out.println("User name: " + user.getName());
        System.out.println("User age: " + user.getAge());
        
        // User 객체λ₯Ό μ €μž₯ν•˜κ±°λ‚˜ μ²˜λ¦¬ν•œ ν›„ λ°˜ν™˜
        return userService.saveUser(user);
    }
}
  • @PostMApping("/users"): /users 경둜둜 λ“€μ–΄μ˜€λŠ” POST μš”μ²­μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • @RequestBody User user: μš”μ²­ 본문에 μžˆλŠ” JSON 데이터λ₯Ό User 객체둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ „μ†‘ν•˜λŠ” JSON 데이터 μ˜ˆμ‹œ

{
    "name": "Kobe",
    "age": 30
}

μœ„ JSON 데이터λ₯Ό μ„œλ²„λ‘œ 보내면, @RequestBodyκ°€ 이λ₯Ό User 객체둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

User 클래슀

public class User {
    private String name;
    private int age;
    
    // κΈ°λ³Έ μƒμ„±μž, getter, setter
    public User() {}
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
}

3. μ˜ˆμ‹œ 2: μš”μ²­ 본문에 ν¬ν•¨λœ JSON 데이터 μ‚¬μš©.

@RestController
public class ProductController {
    
    @PutMapping("/products/{id}")
    public Product updateProduct(@PathVariable Long id, @RequestBody Product product) {
        // μš”μ²­ λ³Έλ¬Έμ—μ„œ Product 객체둜 λ³€ν™˜λœ 데이터λ₯Ό μ‚¬μš©ν•΄ μ—…λ°μ΄νŠΈ 처리
        product.setId(id);
        return productService.updateProduct(product);
    }
}
  • @RequestBody: JSON 데이터λ₯Ό Java 객체인 Product둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
  • @PathVariable: URL κ²½λ‘œμ— ν¬ν•¨λœ 값을 λ©”μ„œλ“œ νŒŒλΌλ―Έν„°λ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€. μœ„ μ½”λ“œμ—μ„œλŠ” μ œν’ˆ IDλ₯Ό κ²½λ‘œμ—μ„œ μΆ”μΆœν•©λ‹ˆλ‹€.

4. μš”μ²­ 본문과의 관계.

HTTP μš”μ²­μ—μ„œ μš”μ²­ 본문은 μ‹€μ œλ‘œ μ „μ†‘λ˜λŠ” 데이터가 ν¬ν•¨λœ λΆ€λΆ„μž…λ‹ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œ 데이터λ₯Ό λ³΄λ‚΄λŠ” 방식.

  • 1. μš”μ²­ URL에 쿼리 νŒŒλΌλ―Έν„°λ‘œ 데이터λ₯Ό 포함(GET μš”μ²­ λ“±μ—μ„œ μ‚¬μš©)
  • 2. μš”μ²­ 본문에 데이터λ₯Ό 포함(POST, PUT μš”μ²­μ—μ„œ μ‚¬μš©)

@RequestBodyλŠ” 두 번째 경우인 μš”μ²­ 본문에 데이터λ₯Ό λ‹΄μ•„ λ³΄λ‚΄λŠ” μš”μ²­μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

5. 데이터 ν˜•μ‹.

@RequestBodyλŠ” JSON, XML λ“± λ‹€μ–‘ν•œ ν˜•μ‹μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
기본적으둜 Spring은 Jackson을 μ‚¬μš©ν•˜μ—¬ JSON 데이터λ₯Ό μ²˜λ¦¬ν•˜μ§€λ§Œ, XML λ“±μ˜ λ‹€λ₯Έ ν˜•μ‹λ„ μ§€μ›λ©λ‹ˆλ‹€.

  • JSON
    • λŒ€λΆ€λΆ„μ˜ 경우 JSON ν˜•μ‹μ˜ 데이터가 μš”μ²­ 본문에 담겨 μ „μ†‘λ˜λ©°, Spring은 이λ₯Ό μžλ™μœΌλ‘œ Java 객체둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
  • XML
    • ν•„μš”μ— 따라 XML 데이터λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ 있으며, Springμ—μ„œ XML을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 라이브러리λ₯Ό μΆ”κ°€ν•˜λ©΄ XML도 처리 κ°€λŠ₯ν•©λ‹ˆλ‹€.

6. μΆ”κ°€ 속성.

  • required 속성
    • @RequestBody λŠ” 기본적으둜 μš”μ²­ 본문에 데이터가 λ°˜λ“œμ‹œ ν¬ν•¨λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
    • ν•˜μ§€λ§Œ, required = false둜 μ„€μ •ν•˜λ©΄ μš”μ²­ 본문이 없어도 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
@PostMapping("/users")
public User createUser(@RequestBody(required = false) User user) {
    if (user == null) {
        // 본문이 없을 경우 처리 둜직
        return new User("Anonymous", 0);
    }
    return userService.saveUser(user);
}

7. μš”μ•½.

  • @RequestBody λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 보낸 HTTP μš”μ²­μ˜ 본문을 Java 객체둜 λ³€ν™˜ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 주둜 POST, PUT μš”μ²­μ—μ„œ JSON, XML λ“±μ˜ 데이터λ₯Ό μ„œλ²„λ‘œ 전솑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • Spring은 기본적으둜 Jackson 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ JSON 데이터λ₯Ό Java 객체둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
  • μš”μ²­ 본문에 ν¬ν•¨λœ 데이터λ₯Ό μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ 도와주며, RESTful API κ°œλ°œμ— 자주 μ‚¬μš©λ©λ‹ˆλ‹€.