Home > Spring > πŸƒ[Spring] Controller, DTO, API λͺ…μ„Έ, `@GetMapping`, MIME, `@RequestParam`, 폼 데이터, `@RestController`

πŸƒ[Spring] Controller, DTO, API λͺ…μ„Έ, `@GetMapping`, MIME, `@RequestParam`, 폼 데이터, `@RestController`
Spring Framework

πŸƒ[Spring] Controller, DTO, API λͺ…μ„Έ, @GetMapping, MIME, @RequestParam, 폼 데이터, @RestController

1️⃣ Controller.

  • Controller λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 핡심 ꡬ성 μš”μ†Œλ‘œ, μ‚¬μš©μž μš”μ²­(URL μš”μ²­)을 λ°›μ•„ 이λ₯Ό μ²˜λ¦¬ν•œ ν›„ μ μ ˆν•œ 응닡(λ·° λ˜λŠ” 데이터λ₯Ό λ°˜ν™˜)을 μ œκ³΅ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
  • μ΄λŠ” 보톡 MVC(Model-View-Controller) νŒ¨ν„΄μ—μ„œ Controller 에 ν•΄λ‹Ήν•˜λ©°, ν΄λΌμ΄μ–ΈνŠΈμ˜ μž…λ ₯을 λ°›μ•„ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 μƒν˜Έμž‘μš©ν•˜κ³  κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ” 흐름을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

  • ControllerλŠ” 주둜 @Controller λ˜λŠ” @RestController μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μ •μ˜ λ©λ‹ˆλ‹€.

1. @Controller 와 @RestController μ• λ„ˆν…Œμ΄μ…˜μ˜ 차이점.

  • 1. @Controller
    • 일반적으둜 λ·°(View) λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • Thymeleaf와 같은 ν…œν”Œλ¦Ώ 엔진을 μ‚¬μš©ν•  λ•Œ HTML νŒŒμΌμ„ λ°˜ν™˜ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • 예: μ‚¬μš©μž μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³  HTML νŽ˜μ΄μ§€λ₯Ό λ Œλ”λ§ν•˜λŠ” 경우.
  • 2. @RestController
    • 주둜 JSON, XML λ“± 데이터 포맷으둜 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • @Controller 와 @ResponseBody λ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” 것과 λ™μΌν•œ 역할을 ν•©λ‹ˆλ‹€.
    • RESTful APIλ₯Ό κ΅¬ν˜„ν•  λ•Œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.

2. κΈ°λ³Έ μ˜ˆμ‹œ.

  • 1. @Controller λ₯Ό μ΄μš©ν•œ HTML νŽ˜μ΄μ§€ λ°˜ν™˜
@Controller
public class HomeController {
    
    @GetMapping("/home")
    public String homePage(Model model) {
        model.attribute("message", "Welcome to the home page!");
        return "home"; // resource/templates/home.html둜 연결됨(Thymeleaf와 같은 ν…œν”Œλ¦Ώ 엔진 μ‚¬μš©)
    }
}
  • 2. @RestController λ₯Ό μ΄μš©ν•œ JSON 응닡 λ°˜ν™˜
@RestController
public class ApiController {
    
    @GetMapping("/api/data")
    public ResponseEntity<String> getData() {
        return new ResponseEntity<>("Hello, this is JSON data!", HttpStatus.OK);
    }
}

3. Controller의 μ£Όμš” μ—­ν• .

  • μš”μ²­ 맀핑
    • URL을 νŠΉμ • λ©”μ„œλ“œμ— λ§€ν•‘ν•˜μ—¬ μ μ ˆν•œ 처리λ₯Ό ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.(@GetMapping, @PostMapping, @RequestMapping λ“± μ‚¬μš©)
  • λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 호좜
    • μ„œλΉ„μŠ€ 계측과 μƒν˜Έμž‘μš©ν•˜μ—¬ ν•„μš”ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • λͺ¨λΈκ³Ό λ·° 처리
    • 데이터λ₯Ό μ²˜λ¦¬ν•œ ν›„ 뷰둜 데이터λ₯Ό μ „λ‹¬ν•˜κ±°λ‚˜ JSON λ“±μ˜ ν˜•μ‹μœΌλ‘œ μ‘λ‹΅ν•©λ‹ˆλ‹€.

Spring Boot의 ControllerλŠ” μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 핡심 흐름을 μ œμ–΄ν•˜λ©°, μ›Ή μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” μ€‘μš”ν•œ 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

2️⃣ DTO(Data Transfer Object)

  • DTO(Data Transfer Object) λŠ” 계측 κ°„μ˜ 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.
  • 일반적으둜, λ°±μ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ—¬λŸ¬ 계측(Controller, Service, Repository λ“±) 간에 데이터λ₯Ό μ£Όκ³ λ°›κ²Œ λ˜λŠ”λ°, μ΄λ•Œ μ‚¬μš©μžκ°€ μ „λ‹¬ν•œ 데이터λ₯Ό λ‹΄κ±°λ‚˜ κ°€κ³΅λœ 데이터λ₯Ό μ „λ‹¬ν•˜κΈ° μœ„ν•΄ DTOλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

1. DTO의 μ£Όμš” λͺ©μ .

  • 1. 데이터 μΊ‘μŠν™”
    • DTOλŠ” νŠΉμ • 데이터 ꡬ쑰λ₯Ό μΊ‘μŠν™”ν•˜μ—¬ 외뢀에 λ…ΈμΆœλ©λ‹ˆλ‹€.
    • 이둜 인해 λΆˆν•„μš”ν•œ 데이터 λ…ΈμΆœμ„ 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 2. μ„±λŠ₯ μ΅œμ ν™”
    • λŒ€κ·œλͺ¨ 데이터λ₯Ό ν•œ λ²ˆμ— μ „μ†‘ν•˜λŠ” κ²ƒλ³΄λ‹€λŠ”, ν•„μš”ν•œ λ°μ΄ν„°λ§Œ DTOλ₯Ό 톡해 μ „μ†‘ν•˜λŠ” 것이 λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½ 및 μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.
  • 3. 계측 뢄리
    • DTOλŠ” 주둜 μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ 데이터λ₯Ό μ‘°μž‘ν•˜κ³ , 이λ₯Ό 컨트둀러 κ³„μΈ΅μœΌλ‘œ μ „λ‹¬ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 각 계측이 λͺ…ν™•ν•˜κ²Œ λΆ„λ¦¬λ˜λ©°, μœ μ§€λ³΄μˆ˜μ„±κ³Ό ν™•μž₯성이 ν˜•μ„±λ©λ‹ˆλ‹€.

2. DTO와 μ—”ν‹°ν‹°μ˜ 차이점.

  • μ—”ν‹°ν‹°(Entity)
    • μ—”ν‹°ν‹°λŠ” λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”κ³Ό 1:1둜 λ§€ν•‘λ˜λ©°, 주둜 μ˜μ†μ„±(Persistence)을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.
    • λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ κ΄€λ¦¬ν•˜λŠ” 역할을 ν•˜λ©°, λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ ν¬ν•¨ν•˜μ§€ μ•ŠλŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€.
  • DTO
    • DTOλŠ” 데이터λ₯Ό μ „λ‹¬ν•˜λŠ” 데 쀑점을 두며, 보톡 μ—”ν‹°ν‹°λ₯Ό λ³€ν™˜ν•˜κ±°λ‚˜ νŠΉμ • λ‘œμ§μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.
    • μ—”ν‹°ν‹°μ™€λŠ” λ‹€λ₯΄κ²Œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ§μ ‘μ μœΌλ‘œ λ§€ν•‘λ˜μ§€ μ•ŠμœΌλ©°, μ „μ†‘ν•˜κ³ μž ν•˜λŠ” λ°μ΄ν„°λ§Œμ„ ν¬ν•¨ν•©λ‹ˆλ‹€.

3. μ‚¬μš© μ˜ˆμ‹œ.

  • λ‹€μŒμ€ κ°„λ‹¨ν•œ User 엔티티와 UserDTO의 μ˜ˆμ‹œμž…λ‹ˆλ‹€.

  • User μ—”ν‹°ν‹°

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    private String email;
    
    // getters and setters
}
  • UserDTO
public class UserDTO {
    private String name;
    private String email;
    
    // μƒμ„±μž, getters, setters
}

이처럼 μ—”ν‹°ν‹°λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ—°κ²°λœ 객체이고, DTOλŠ” μ‚¬μš©μžμ—κ²Œ 데이터λ₯Ό μ „λ‹¬ν•˜κ±°λ‚˜ μš”μ²­μ„ λ°›μ•„μ˜¬ λ•Œ μ‚¬μš©λ˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.

3️⃣ API λͺ…μ„Έ(API Specification)

  • API λͺ…μ„Έ(API Specification) λŠ” API(Application Programming Interface)의 λ™μž‘ 방식, μš”μ²­ 및 응닡 ν˜•μ‹, μ‚¬μš© κ°€λŠ₯ν•œ λ©”μ„œλ“œ, νŒŒλΌλ―Έν„° 등을 λͺ…ν™•νžˆ μ„€λͺ…ν•œ λ¬Έμ„œμž…λ‹ˆλ‹€.
  • API λͺ…μ„ΈλŠ” API μ‚¬μš©μž(주둜 개발자)듀이 APIλ₯Ό μ •ν™•νžˆ μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” μ€‘μš”ν•œ λ¬Έμ„œμž…λ‹ˆλ‹€.

1. API λͺ…μ„Έμ˜ μ£Όμš” λ‚΄μš©.

  • 1. API κ°œμš”.
    • APIκ°€ μ–΄λ–€ λͺ©μ μ„ 가지고 μžˆλŠ”μ§€, 주둜 μ–΄λ–€ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ”μ§€ κ°„λ‹¨ν•œ μ„€λͺ…을 ν¬ν•¨ν•©λ‹ˆλ‹€.
  • 2. μ—”λ“œν¬μΈνŠΈ(Endpoint)
    • API의 μ ‘κ·Ό 경둜λ₯Ό μ˜λ―Έν•˜λ©°, 각 μ—”λ“œν¬μΈνŠΈλŠ” νŠΉμ • κΈ°λŠ₯을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄ GET /usersλŠ” μ‚¬μš©μžμ˜ λͺ©λ‘μ„ κ°€μ Έμ˜€λŠ” API μ—”λ“œν¬μΈνŠΈμΌ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 3. HTTP λ©”μ„œλ“œ
    • 각 μ—”λ“œν¬μΈνŠΈμ— μ‚¬μš©ν•  수 μžˆλŠ” HTTP λ©”μ„œλ“œ(GET, POST, PUT, DELETE λ“±)κ°€ λͺ…μ‹œλ©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, GET /usersλŠ” μ‚¬μš©μž λͺ©λ‘μ„ μ‘°νšŒν•˜κ³ , POST /usersλŠ” μƒˆ μ‚¬μš©μžλ₯Ό μƒμ„±ν•˜λŠ” APIλ₯Ό μ˜λ―Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 4. μš”μ²­(Request) νŒŒλΌλ―Έν„°
    • API μš”μ²­ μ‹œ 포함할 수 μžˆλŠ” νŒŒλΌλ―Έν„°λ‚˜ 데이터 ν˜•μ‹μ„ λͺ…μ‹œν•©λ‹ˆλ‹€.
    • νŒŒλΌλ―Έν„°λŠ” 경둜 λ³€μˆ˜(Path Variables), 쿼리 νŒŒλΌλ―Έν„°(Query Parameters), 헀더(Headers), λ˜λŠ” λ°”λ””(Body)에 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.
      • 경둜 λ³€μˆ˜ : GET /users/{id}μ—μ„œ {id}κ°€ 경둜 λ³€μˆ˜ μž…λ‹ˆλ‹€.
      • 쿼리 νŒŒλΌλ―Έν„° : GET /users?status=activeμ—μ„œ statusκ°€ 쿼리 νŒŒλΌλ―Έν„°μž…λ‹ˆλ‹€.
  • 5. μš”μ²­ λ³Έλ¬Έ(Request Body)
    • 주둜 POSTλ‚˜ PUT 같은 μš”μ²­μ—μ„œ μ‚¬μš©λ˜λ©°, JSON, XML λ˜λŠ” 폼 데이터 λ“±μœΌλ‘œ 전솑할 데이터λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžλ₯Ό μƒμ„±ν•˜λŠ” APIμ—μ„œλŠ” λ‹€μŒκ³Ό 같은 JSON μš”μ²­μ΄ 본문이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
{
    "name": "Jhon Doe",
    "email": "jhon@example.com"
}
  • 6. 응닡(Response)
    • API μš”μ²­μ— λŒ€ν•œ 응닡 ν˜•μ‹μ„ μ„€λͺ…ν•©λ‹ˆλ‹€.
    • 성곡적인 μš”μ²­μ΄λ‚˜ μ‹€νŒ¨ν–ˆμ„ λ•Œμ˜ 응닡 μ½”λ“œ(예: 200 OK, 404 Not Found)와 ν•¨κ»˜ 응닡 λ³Έλ¬Έ(Response Body) ν˜•μ‹λ„ λͺ…μ‹œλ©λ‹ˆλ‹€.
{
    "id": 1,
    "name": "Jhon Doe",
    "email" "jhon@example.com"
}
  • 7. μƒνƒœ μ½”λ“œ(Status Code)
    • 각 μ‘λ‹΅μ˜ κ²°κ³Όλ₯Ό λ‚˜νƒ€λ‚΄λŠ” HTTP μƒνƒœ μ½”λ“œλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
    • 일반적인 μƒνƒœ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
      • 200 OK : 성곡적인 μš”μ²­.
      • 201 Created : λ¦¬μ†ŒμŠ€ 생성 성곡.
      • 400 Bad Request : 잘λͺ»λœ μš”μ²­.
      • 401 Unauthorized : 인증 μ‹€νŒ¨.
      • 404 Not Found : λ¦¬μ†ŒμŠ€λ₯Ό 찾을 수 μ—†μŒ
      • 500 Internet Server Error : μ„œλ²„μ—μ„œ λ°œμƒν•œ 였λ₯˜
  • 8. μ˜ˆμ‹œ(Examples)
    • μ‹€μ œλ‘œ μš”μ²­μ„ λ³΄λ‚΄λŠ” 방법과 그에 λŒ€ν•œ 응닡을 λ³΄μ—¬μ£ΌλŠ” μ˜ˆμ‹œκ°€ 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, curl λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•œ HTTP μš”μ²­ 방법 등을 λͺ…μ‹œν•©λ‹ˆλ‹€.
curl -X POST https://api.example.com/users \
  -H "Content-Type: application/json" \
  -d '{"name": "John Doe", "email": "john.doe@example.com"}'

2. API λͺ…μ„Έμ˜ μ€‘μš”μ„±.

  • 개발자 κ°„μ˜ μ˜μ‚¬μ†Œν†΅
    • API λͺ…μ„ΈλŠ” APIλ₯Ό μ œκ³΅ν•˜λŠ” μΈ‘κ³Ό μ‚¬μš©ν•˜λŠ” μΈ‘ κ°„μ˜ μ›ν™œν•œ μ˜μ‚¬μ†Œν†΅μ„ κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.
    • λͺ…μ„Έκ°€ μ •ν™•ν• μˆ˜λ‘ APIλ₯Ό μ‚¬μš©ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” ν˜Όλž€μ΄λ‚˜ 였λ₯˜κ°€ μ€„μ–΄λ“­λ‹ˆλ‹€.
  • 일관성
    • λͺ¨λ“  μ—”λ“œν¬μΈνŠΈμ™€ μš”μ²­/응닡 ν˜•μ‹μ΄ μΌκ΄€λ˜κ²Œ μ„€κ³„λ˜κ³  κ΅¬ν˜„λ  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
  • μœ μ§€λ³΄μˆ˜
    • λͺ…μ„Έλ₯Ό κΈ°μ€€μœΌλ‘œ APIλ₯Ό λ³€κ²½ν•˜κ±°λ‚˜ ν™•μž₯ν•  λ•Œ, 이λ₯Ό μ°Έκ³ ν•˜μ—¬ κΈ°μ‘΄ μ‚¬μš©μžλ“€μ—κ²Œ 영ν–₯을 μ΅œμ†Œν™”ν•˜λ©΄μ„œ μ‹œμŠ€ν…œμ„ κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. API λͺ…μ„Έ 도ꡬ.

API λͺ…μ„ΈλŠ” λ‹€μ–‘ν•œ ν˜•μ‹μœΌλ‘œ μž‘μ„±λ  수 있으며, λŒ€ν‘œμ μΈ 도ꡬ와 ν‘œμ€€μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • OpenAPI(Swagger)
    • κ°€μž₯ 널리 μ‚¬μš©λ˜λŠ” API λͺ…μ„Έ ν‘œμ€€μœΌλ‘œ, Swagger UIλ₯Ό 톡해 μ‹œκ°ν™”μ™€ ν…ŒμŠ€νŠΈ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • Postman
    • API ν…ŒμŠ€νŠΈ 및 λͺ…μ„Έ μž‘μ„±μ„ μœ„ν•œ λ„κ΅¬λ‘œ, λ‹€μ–‘ν•œ HTTP λ©”μ„œλ“œλ₯Ό ν…ŒμŠ€νŠΈν•˜κ³  λͺ…μ„Έλ₯Ό μžλ™μœΌλ‘œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • RAML
    • RESTful API Modeling LAnguage의 μ•½μžλ‘œ, REST API λͺ…μ„Έ μž‘μ„±μ„ μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

API λͺ…μ„ΈλŠ” APIλ₯Ό μ‚¬μš©ν•˜λ €λŠ” λͺ¨λ“  κ°œλ°œμžμ—κ²Œ ν•„μˆ˜μ μΈ κ°€μ΄λ“œ 역할을 ν•˜λ©°, μ •ν™•ν•˜κ³  λͺ…ν™•ν•˜κ²Œ μž‘μ„±ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

4️⃣ @GetMapping μ• λ„ˆν…Œμ΄μ…˜.

  • @GetMapping μ• λ„ˆν…Œμ΄μ…˜ 은 Spring Frameworkμ—μ„œ HTTP GET μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
  • 주둜 Spring MVCμ—μ„œ 컨트둀러의 λ©”μ„œλ“œμ— λΆ™μ—¬μ„œ νŠΉμ • URL둜 λ“€μ–΄μ˜€λŠ” GET μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λ§€ν•‘ν•©λ‹ˆλ‹€.

1. @GetMapping의 κΈ°λ³Έ λ™μž‘.

  • Spring Boot μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œ GET μš”μ²­μ„ 보낼 λ•Œ ν•΄λ‹Ή μš”μ²­μ„ μ²˜λ¦¬ν•  컨트둀러 λ©”μ„œλ“œλ₯Ό μ§€μ •ν•˜κΈ° μœ„ν•΄ @GetMapping을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • 이 μ• λ„ˆν…Œμ΄μ…˜μ€ λ‚΄λΆ€μ μœΌλ‘œ @RequestMapping(method = RequestMethod.GET)κ³Ό λ™μΌν•œ 역할을 ν•©λ‹ˆλ‹€.

2. μ‚¬μš© μ˜ˆμ‹œ.

λ‹€μŒμ€ @GetMapping을 μ‚¬μš©ν•˜μ—¬ νŠΉμ • URLμ—μ„œ GET μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” κ°„λ‹¨ν•œ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

@RestController
public class UserController {
    
    // '/users' κ²½λ‘œμ— λŒ€ν•œ GET μš”μ²­ 처리
    @GetMapping("/users")
    public List<User> getAllUsers() {
        // μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ μ‚¬μš©μž λͺ©λ‘μ„ 가져와 λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œ
        return userService.getAllUsers();
    }
}

μœ„μ˜ μ½”λ“œμ—μ„œ

  • @GetMapping("/users")λŠ” /users 경둜둜 λ“€μ–΄μ˜€λŠ” GET μš”μ²­μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • λ©”μ„œλ“œ getAllUsers()λŠ” GET μš”μ²­μ„ μ²˜λ¦¬ν•˜λ©°, 보톡 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 데이터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • μ΄λ•Œ λ°˜ν™˜ν•˜λŠ” λ°μ΄ν„°λŠ” 기본적으둜 JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜λ©λ‹ˆλ‹€(Spring Bootμ—μ„œλŠ” @RestController μ‚¬μš© μ‹œ).

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

  • 1. HTTP GET μš”μ²­ 처리.
    • @GetMapping은 GET μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 데만 μ‚¬μš©λ˜λ©°, λ‹€λ₯Έ HTTP λ©”μ„œλ“œ(POST, PUT, DELETE λ“±) μš”μ²­μ€ μ²˜λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 2. 경둜 지정.
    • @GetMapping("/path") ν˜•μ‹μœΌλ‘œ 맀핑 경둜λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • κ²½λ‘œμ— κ³ μ •λœ URL뿐만 μ•„λ‹ˆλΌ 경둜 λ³€μˆ˜, 쿼리 νŒŒλΌλ―Έν„° 등도 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 3. 경둜 λ³€μˆ˜ μ‚¬μš©.
    • 경둜 λ³€μˆ˜(Path Variable)λ₯Ό μ‚¬μš©ν•˜μ—¬ λ™μ μœΌλ‘œ URL을 μ²˜λ¦¬ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
@GetMapping("/users/{id}")
public User getUserById(@PathVariable Long id) {
    return userService.getUserById(id);
}
  • μœ„ μ½”λ“œμ—μ„œ @PathVariable을 μ‚¬μš©ν•˜μ—¬ URL κ²½λ‘œμ— ν¬ν•¨λœ id 값을 λ©”μ„œλ“œ νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬λ°›μŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, /users/1이 μš”μ²­λ˜λ©΄ idκ°€ 1둜 μ„€μ •λ©λ‹ˆλ‹€.
  • 4. 쿼리 νŒŒλΌλ―Έν„° μ‚¬μš©.
    • 쿼리 νŒŒλΌλ―Έν„°(Query Parameter)λ₯Ό μ²˜λ¦¬ν•  λ•Œλ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
@GetMapping("/users")
public List<User> getUsersByStatus(@RequestParam String status) {
    return userService.getUsersByStatus(status);
}
  • μœ„ μ˜ˆμ‹œμ—μ„œ @RequestParam을 μ‚¬μš©ν•˜μ—¬ 쿼리 νŒŒλΌλ―Έν„° statusλ₯Ό λ©”μ„œλ“œ νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬λ°›μŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, /users?status=active둜 μš”μ²­ν•˜λ©΄ status 값은 β€œactive”가 λ©λ‹ˆλ‹€.

4. @GetMapping κ³Ό κ΄€λ ¨λœ μ£Όμš” μ˜΅μ…˜.

  • produces
    • μ‘λ‹΅μœΌλ‘œ μ œκ³΅ν•˜λŠ” λ°μ΄ν„°μ˜ MIME νƒ€μž…μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
      • 예λ₯Ό λ“€μ–΄, JSON, XML ν˜•μ‹μ˜ 응닡을 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
@GetMapping(value = "/users", produces = "application/json")
public List<User> getAllUsers() {
    return userService.getAllUsers();
}
  • params
    • νŠΉμ • 쿼리 νŒŒλΌλ―Έν„°κ°€ μ‘΄μž¬ν•˜λŠ” κ²½μš°μ—λ§Œ ν•΄λ‹Ή λ©”μ„œλ“œκ°€ λ§€ν•‘λ˜λ„λ‘ μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
@GetMapping(value = "/users", params = "active")
public List<User> getActiveUsers() {
    return userService.getActiveUsers();
}
  • μœ„ μ˜ˆμ‹œμ—μ„œ activeλΌλŠ” 쿼리 νŒŒλΌλ―Έν„°κ°€ μžˆμ–΄μ•Όλ§Œ 이 λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

5. @GetMapping VS @RequestMapping

  • @RequestMapping 을 μ‚¬μš©ν•˜λ©΄ HTTP λ©”μ„œλ“œλ₯Ό 지정해야 ν•©λ‹ˆλ‹€.
// @RequestMapping
@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<User> getAllUsers() {
    return userService.getAllUsers();
}

// @GetMapping
@GetMapping("/users")
public List<User> getAllUsers() {
    return userService.getAllUsers();
}
  • @GetMapping은 GET μš”μ²­ μ „μš©μœΌλ‘œ 보닀 κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆλŠ” λ°©λ²•μž…λ‹ˆλ‹€.

λ¦¬νŒ©ν† λ§ 포인트

  • 1. @RequestMapping 은 λ‹€μ–‘ν•œ HTTP λ©”μ„œλ“œ(GET, POST, PUT, DELETE λ“±)λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μ„€κ³„λœ λ²”μš© μ• λ„ˆν…Œμ΄μ…˜μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ GET μš”μ²­λ§Œμ„ μ²˜λ¦¬ν•  λ•ŒλŠ” @GetMapping을 μ‚¬μš©ν•˜μ—¬ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 2. method = RequestMethod.GET λŒ€μ‹  @GetMapping을 μ‚¬μš©ν•¨μœΌλ‘œμ¨ 더 직관적이고 κ°„λ‹¨ν•˜κ²Œ GET μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 3. @GetMapping은 기본적으둜 GET μš”μ²­μ„ μ²˜λ¦¬ν•˜λ―€λ‘œ value 속성에 경둜만 λͺ…μ‹œν•˜λ©΄ λ©λ‹ˆλ‹€.

6. μš”μ•½.

  • μ£Όμš” μ—­ν• 
    • HTTP GET μš”μ²­μ„ νŠΉμ • λ©”μ„œλ“œμ— λ§€ν•‘ν•˜μ—¬ μš”μ²­ 처리.
  • κ°„κ²°ν•œ 문법
    • @RequestMapping의 GET μš”μ²­ 처리λ₯Ό κ°„κ²°ν•˜κ²Œ λŒ€μ²΄.
  • 주둜 μ‚¬μš©λ˜λŠ” κ³³
    • λ¦¬μ†ŒμŠ€ 쑰회, 데이터 κ°€μ Έμ˜€κΈ° λ“±μ˜ 역할을 μˆ˜ν–‰ν•  λ•Œ μ‚¬μš©.

5️⃣ MIME(Mutipurpose Internet Mail Extensions) νƒ€μž….

  • MIME(Mutipurpose Internet Mail Extensions) νƒ€μž… 은 μΈν„°λ„·μ—μ„œ μ „μ†‘λ˜λŠ” λ°μ΄ν„°μ˜ ν˜•μ‹μ„ λ‚˜νƒ€λ‚΄λŠ” ν‘œμ€€μž…λ‹ˆλ‹€.
  • MIME νƒ€μž…μ€ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ 간에 μ£Όκ³ λ°›λŠ” 데이터가 μ–΄λ–€ ν˜•μ‹μΈμ§€ μ •μ˜ν•˜μ—¬, 이λ₯Ό 톡해 ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ € λ“±)λŠ” λ°μ΄ν„°μ˜ 처리λ₯Ό μ–΄λ–»κ²Œ ν•΄μ•Ό 헐지 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

1. MIME νƒ€μž…μ˜ ꡬ성.

MIME νƒ€μž…μ€ 크게 두 λΆ€λΆ„μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€.

  • νƒ€μž…(Type)
    • λ°μ΄ν„°μ˜ 일반적인 λ²”μ£Όλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.(예: text, image, application λ“±).
  • μ„œλΈŒνƒ€μž…(Subtype)
    • λ°μ΄ν„°μ˜ ꡬ체적인 ν˜•μ‹μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.(예: html, plain, json, jpeg λ“±).

ν˜•μ‹μ€ /(μŠ¬λž˜μ‹œ)둜 κ΅¬λΆ„λ˜λ©°, 예λ₯Ό λ“€μ–΄ text/html은 HTML λ¬Έμ„œλΌλŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

2. MIME νƒ€μž…μ˜ μ˜ˆμ‹œ.

  • 1. ν…μŠ€νŠΈ ν˜•μ‹.
    • text/plain
      • 일반 ν…μŠ€νŠΈ(ASCII λ˜λŠ” UTF-8둜 μΈμ½”λ”©λœ ν…μŠ€νŠΈ).
    • text/html
      • HTML λ¬Έμ„œ.
    • text/css
      • CSS 파일.
    • text/javascript
      • JavaScript 파일.
  • 2. 이미지 ν˜•μ‹.
    • image/jpeg
      • JPEG 이미지.
    • image/png
      • PNG 이미지.
    • image/gif
      • GIF 이미지.
  • 3. μ‘μš© ν”„λ‘œκ·Έλž¨ ν˜•μ‹.
    • application/json
      • JSON ν˜•μ‹μ˜ 데이터.
    • application/xml
      • XML λ¬Έμ„œ.
    • appliccation/pdf
      • PDF 파일.
    • application/octet-stream
      • 일반적인 λ°”μ΄λ„ˆλ¦¬ 데이터.
      • 파일 λ‹€μš΄λ‘œλ“œ μ‹œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 4. λ©€ν‹°λ―Έλ””μ–΄ ν˜•μ‹.
    • audio/mpeg
      • MP3 μ˜€λ””μ˜€ 파일.
    • video/mp4
      • MP4 λΉ„λ””μ˜€ 파일.
  • 5. 기타 ν˜•μ‹.
    • multipart/form-data
      • 주둜 파일 μ—…λ‘œλ“œλ‚˜ 폼 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©λ˜λŠ” ν˜•μ‹.

3. MIME νƒ€μž…μ˜ μ—­ν• .

MIME νƒ€μž…μ€ μ›Ή λΈŒλΌμš°μ €μ™€ 같은 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œλΆ€ν„° 받은 λ°μ΄ν„°μ˜ ν˜•μ‹μ„ μ΄ν•΄ν•˜κ³  μ μ ˆν•˜κ²Œ μ²˜λ¦¬ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄

  • text/html
    • λΈŒλΌμš°μ €λŠ” 이 MIME νƒ€μž…μ„ λ°›μœΌλ©΄ 이λ₯Ό HTML λ¬Έμ„œλ‘œ ν•΄μ„ν•˜κ³  화면에 λ Œλ”λ§ν•©λ‹ˆλ‹€.
  • application/json
    • λΈŒλΌμš°μ €λŠ” 이 MIME νƒ€μž…μ„ λ°›μœΌλ©΄ 이λ₯Ό JSON ν˜•μ‹μ˜ λ°μ΄ν„°λ‘œ μΈμ‹ν•˜κ³ , 보톡 개발자 λ„κ΅¬μ—μ„œ κ΅¬μ‘°ν™”λœ ν˜•μ‹μœΌλ‘œ λ³΄μ—¬μ€λ‹ˆλ‹€.
  • application/octet=stream
    • λ°”μ΄λ„ˆλ¦¬ 파일(예: ν”„λ‘œκ·Έλž¨ 파일, μ••μΆ• 파일)을 λ‹€μš΄λ‘œλ“œν•  λ•Œ μ‚¬μš©λ˜λ©°, ν΄λΌμ΄μ–ΈνŠΈλŠ” 이 데이터λ₯Ό 파일둜 μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4. MIME νƒ€μž… 지정.

  • μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ— 데이터λ₯Ό 보낼 λ•Œ MIME νƒ€μž…μ„ μ§€μ •ν•˜λŠ”λ°, HTTP 응닡 ν—€λ”μ˜ Content-Type ν•„λ“œλ₯Ό 톡해 MIME νƒ€μž…μ΄ μ •μ˜λ©λ‹ˆλ‹€.

μ˜ˆμ‹œ: Content-Type 헀더

HTTP/1.1 200OK
Content=Type: application/json

{
    "name": "John",
    "age": 30
}
  • μœ„ μ˜ˆμ‹œμ—μ„œλŠ” μ„œλ²„κ°€ JSON ν˜•μ‹μ˜ 데이터λ₯Ό μ‘λ‹΅ν•˜λ©°, Content-Type: application/json 을 톡해 MIME νƒ€μž…μ„ λͺ…μ‹œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

5. Springμ—μ„œμ˜ MIME νƒ€μž… 지정.

  • Springμ—μ„œλŠ” @GetMapping λ˜λŠ” @PostMaping κ³Ό 같은 μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  λ•Œ produces 속성을 톡해 MIME νƒ€μž…μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ : JSON ν˜•μ‹μ˜ 응닡 지정.

@GetMapping(value = "/users", produces = "application/json")
public List<User> getAllUsers() {
    return userService.getAllUsers();
}
  • μœ„ μ½”λ“œμ—μ„œλŠ” /users둜 λ“€μ–΄μ˜€λŠ” GET μš”μ²­μ— λŒ€ν•΄ JSON ν˜•μ‹ (application/json)으둜 데이터λ₯Ό μ‘λ‹΅ν•˜λ„λ‘ μ§€μ •ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

6. μš”μ•½.

  • MIME νƒ€μž… 은 μΈν„°λ„·μ—μ„œ μ „μ†‘λ˜λŠ” λ°μ΄ν„°μ˜ ν˜•μ‹μ„ λ‚˜νƒ€λ‚΄λŠ” ν‘œμ€€.
  • 주둜 ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ 간에 데이터λ₯Ό 주고받을 λ•Œ 데이터 ν˜•μ‹μ„ μ§€μ •ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ 이λ₯Ό 적절히 μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λ„μ™€μ€Œ
  • ν˜•μ‹ 은 νƒ€μž…/μ„œλΈŒνƒ€μž… 으둜 κ΅¬μ„±λ˜λ©°, 예λ₯Ό λ“€μ–΄ text/html 은 HTML λ¬Έμ„œλ₯Ό λ‚˜νƒ€λƒ„.
  • Springκ³Ό 같은 ν”„λ ˆμž„μ›Œν¬μ—μ„œλ„ 응닡 ν˜•μ‹μ— 따라 μ μ ˆν•œ MIME νƒ€μž…μ„ 지정할 수 있음.

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

  • @RequestParam μ• λ„ˆν…Œμ΄μ…˜ 은 Spring MVCμ—μ„œ HTTP μš”μ²­μ˜ 쿼리 νŒŒλΌλ―Έν„°, 폼 데이터 λ˜λŠ” URL에 ν¬ν•¨λœ νŒŒλΌλ―Έν„°λ₯Ό λ©”μ„œλ“œ νŒŒλΌλ―Έν„°μ— λ°”μΈλ”©ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 주둜 GET μš”μ²­μ—μ„œ 뭐리 슀트링의 νŒŒλΌλ―Έν„° 값을 κ°€μ Έμ˜€κ±°λ‚˜, POST μš”μ²­μ—μ„œ 폼 λ°μ΄ν„°λ‘œ μ „λ‹¬λœ νŒŒλΌλ―Έν„° 값을 μ²˜λ¦¬ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

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

  • @RequestParam 을 μ‚¬μš©ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ URL의 νŒŒλΌλ―Έν„° 값을 λ©”μ„œλ“œμ˜ 인자둜 받을 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžκ°€ GET /users?name=Jhon κ³Ό 같이 μš”μ²­ν•˜λ©΄ name νŒŒλΌλ―Έν„° 값을 λ©”μ„œλ“œμ—μ„œ 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ 1: 단일 쿼리 νŒŒλΌλ―Έν„° λ°›κΈ°.

@GetMapping("/users")
public String getUserByName(@RequestParam String name) {
    return "Requested user: " + name;
}

μœ„ μ½”λ“œμ—μ„œ

  • @RequestParam String name
    • 쿼리 νŒŒλΌλ―Έν„° name의 값을 λ°›μ•„μ„œ λ©”μ„œλ“œ νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.
      • 예λ₯Ό λ“€μ–΄ /users?name=Jhon으둜 μš”μ²­ν•˜λ©΄ name에 "John" 값이 λ“€μ–΄κ°‘λ‹ˆλ‹€.

μ˜ˆμ‹œ 2: μ—¬λŸ¬ 쿼리 νŒŒλΌλ―Έν„° λ°›κΈ°.

@GetMapping("/users")
public String getUser(@RequestParam String name, @RequestParam int age) {
    return "User: " + name + ", Age: " + age;
}
  • 이 μ½”λ“œλŠ” 두 갸의 쿼리 νŒŒλΌλ―Έν„°(nameκ³Ό age)λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈκ°€ /users?name=Jhon&age=25둜 μš”μ²­ν•˜λ©΄ name은 "Jhon", ageλŠ” 25κ°€ λ©λ‹ˆλ‹€.

3. 선택적 νŒŒλΌλ―Έν„°μ™€ κΈ°λ³Έκ°’.

  • @RequestParam의 속성을 μ΄μš©ν•˜λ©΄ 선택적인 νŒŒλΌλ―Έν„°λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • νŒŒλΌλ―Έν„°κ°€ 없을 경우 기본값을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ 3: κΈ°λ³Έκ°’ μ„€μ •.

@GetMapping("/users")
pulbic String getUser(@RequestParam(defaultValue = "Unknown") String name) {
    return "Requested user: " + name;
}
  • μœ„ μ½”λ“œμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ /users둜만 μš”μ²­μ„ 보내면, name의 κΈ°λ³Έκ°’μœΌλ‘œ "Unknown"이 μ„€μ •λ©λ‹ˆλ‹€.
  • /users?name=John으둜 μš”μ²­ν•˜λ©΄ name은 "John" 값이 λ©λ‹ˆλ‹€.

μ˜ˆμ‹œ 4: ν•„μˆ˜ μ—¬λΆ€ μ„€μ •.

  • required 속성을 μ‚¬μš©ν•˜λ©΄ νŒŒλΌλ―Έν„°κ°€ ν•„μˆ˜μΈμ§€ 선택적인지 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 기본적으둜 @RequestParam은 ν•„μˆ˜μž…λ‹ˆλ‹€.
    • ν•˜μ§€λ§Œ, required = false둜 μ„€μ •ν•˜λ©΄ νŒŒλΌλ―Έν„°κ°€ 없어도 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
      @GetMapping("/users")
      public String getUser(@RequestParam(required = false) String name) {
        return "Requested user: " + (name != null ? name : "Guest");
      }
      
  • 이 경우, ν΄λΌμ΄μ–ΈνŠΈκ°€ name νŒŒλΌλ―Έν„°λ₯Ό ν¬ν•¨ν•˜μ§€ μ•Šκ³  μš”μ²­ν•  경우 name 값은 null이 되고, Guest둜 λŒ€μ²΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

4. λ°°μ—΄ λ˜λŠ” 리슀트 νŒŒλΌλ―Έν„° 처리.

  • @RequestParam을 μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ 값을 ν•œ λ²ˆμ— 받을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ 5: λ°°μ—΄λ‘œ νŒŒλΌλ―Έν„° λ°›κΈ°.

@GetMapping("/users")
public String getUsersByNames(@RequestParam List<String> names) {
    return "Requested users: " + String.join(", ", names);
}
  • μœ„ μ½”λ“œμ—μ„œ /users?names=John&names=Janeκ³Ό 같이 μš”μ²­ν•˜λ©΄ namesλŠ” ["John", "Jane"] 리슀트둜 μ „λ‹¬λ©λ‹ˆλ‹€.

5. μš”μ•½.

  • @RequestParam은 URL 쿼리 νŒŒλΌλ―Έν„°λ‚˜ 폼 데이터λ₯Ό 컨트둀러 λ©”μ„œλ“œμ˜ νŒŒλΌλ―Έν„°λ‘œ λ§€ν•‘ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • ν•„μˆ˜ μ—¬λΆ€(required), κΈ°λ³Έκ°’(defaultValue) 섀정을 톡해 μœ μ—°ν•˜κ²Œ νŒŒλΌλ―Έν„°λ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ—¬λŸ¬ νŒŒλΌλ―Έν„°λ‚˜ λ°°μ—΄/리슀트 ν˜•νƒœμ˜ νŒŒλΌλ―Έν„°λ„ 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

7️⃣ 폼 데이터(Form Data).

  • 폼 데이터(Form Data) λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©μžκ°€ μ›Ή λΈŒλΌμš°μ €λ₯Ό 톡해 μ„œλ²„λ‘œ μ œμΆœν•˜λŠ” 데이터λ₯Ό λ§ν•©λ‹ˆλ‹€.
  • 주둜 HTML <form> μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μž μž…λ ₯을 μ„œλ²„λ‘œ μ „μ†‘ν•˜λ©°, μ‚¬μš©μžκ°€ μž…λ ₯ν•œ ν…μŠ€νŠΈ, 파일, μ„ νƒν•œ μ˜΅μ…˜ λ“±μ˜ λ‹€μ–‘ν•œ 데이터λ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

1. 폼 λ°μ΄ν„°μ˜ ꡬ성.

  • 폼 λ°μ΄ν„°λŠ” μ—¬λŸ¬ μ’…λ₯˜μ˜ μž…λ ₯ ν•„λ“œλ₯Ό 톡해 μƒμ„±λ˜λ©°, 전솑 방식에 따라 λ‹€λ₯΄κ²Œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
  • HTML <form> νƒœκ·Έλ₯Ό μ΄μš©ν•˜μ—¬ μž…λ ₯ 폼을 λ§Œλ“€κ³ , μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 데이터λ₯Ό μ„œλ²„λ‘œ 전솑할 수 μžˆμŠ΅λ‹ˆλ‹€.

HTML 폼의 μ˜ˆμ‹œ.

<form action="/submit" method="post">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name">
    
    <label for="age">Age:</label>
    <input type="number" id="age" name="age">
    
    <label for="file">Profile Picture:</label>
    <input type="file" id="file" name="profilePicture">
    
    <button type="submit">Submit</button>
</form>
  • 이 νΌμ—μ„œλŠ” λ‹€μŒκ³Ό 같은 데이터λ₯Ό μ„œλ²„λ‘œ 전솑할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • Name : ν…μŠ€νŠΈ μž…λ ₯.
    • Age : 숫자 μž…λ ₯.
    • Profile Picture : 파일 μ—…λ‘œλ“œ.

2. 폼 λ°μ΄ν„°μ˜ 전솑 방식.

1. GET λ©”μ„œλ“œ

  • 폼이 GET λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό 전솑할 λ•ŒλŠ” 데이터가 URL의 쿼리 슀트링(Query String)으둜 전달 λ©λ‹ˆλ‹€.
  • URL은 보톡 λ‹€μŒκ³Ό 같은 ν˜•μ‹μ„ κ°€μ§‘λ‹ˆλ‹€.
    • example.com/submit?name=Jhon&age=30
  • λ°μ΄ν„°λŠ” URL에 ν¬ν•¨λ˜κΈ° 떄문에 λ³΄μ•ˆμ— μ·¨μ•½ν•˜κ³ , 전솑 κ°€λŠ₯ν•œ λ°μ΄ν„°μ˜ 양이 μ œν•œμ μž…λ‹ˆλ‹€.
    • λ”°λΌμ„œ 검색 μΏΌλ¦¬λ‚˜ 필터와 같은 κ°„λ‹¨ν•œ 데이터λ₯Ό 전솑할 λ•Œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.
<form action="/submit" method="get">
    <!-- μž…λ ₯ ν•„λ“œ -->
    <button type="submit">Submit</button>
</form>

2. POST λ©”μ„œλ“œ

  • POST λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 데이터가 HTTP μš”μ²­ λ³Έλ¬Έ(Body)에 ν¬ν•¨λ˜μ–΄ μ „μ†‘λ©λ‹ˆλ‹€.
    • 이 방식은 URL에 데이터λ₯Ό λ…ΈμΆœν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 더 μ•ˆμ „ν•˜λ©°, λŒ€μš©λŸ‰ 데이터λ₯Ό 전솑할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 파일 μ—…λ‘œλ“œλ‚˜ λ―Όκ°ν•œ 정보λ₯Ό 전솑할 λ•Œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.
<form action="/submit" method="post">
    <!-- μž…λ ₯ ν•„λ“œ -->
    <button type="submit">Submit</button>
</form>

3. μ „μ†‘λ˜λŠ” 데이터 ν˜•μ‹.

폼 데이터가 전솑될 λ•Œ, λΈŒλΌμš°μ €λŠ” Content-Type 헀더λ₯Ό 톡해 μ„œλ²„μ— μ–΄λ–€ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μΈμ½”λ”©ν–ˆλŠ”μ§€ μ•Œλ €μ€λ‹ˆλ‹€.

폼 λ°μ΄ν„°μ˜ 인코딩 방식에 따라 μ„œλ²„μ—μ„œ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방식이 λ‹¬λΌμ§‘λ‹ˆλ‹€.

  • 1. application/x-www.form-urlencoded
    • κΈ°λ³Έ 폼 인코딩 λ°©μ‹μž…λ‹ˆλ‹€.
    • 폼 데이터λ₯Ό URL μΈμ½”λ”©ν•˜μ—¬ ν‚€-κ°’ 쌍으둜 μ „μ†‘ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, name=John&age=30처럼 킀와 값을 &둜 κ΅¬λΆ„ν•˜μ—¬ μ„œλ²„λ‘œ μ „μ†‘ν•©λ‹ˆλ‹€.
    • POST μš”μ²­μ˜ 본문에 이 ν˜•μ‹μœΌλ‘œ 데이터가 ν¬ν•¨λ©λ‹ˆλ‹€.
    • μ˜ˆμ‹œ
        name=Jhon&age=30
      
  • 2. multipart/form-data
    • 파일 μ—…λ‘œλ“œκ°€ ν¬ν•¨λœ 폼 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©λ˜λŠ” 인코딩 λ°©μ‹μž…λ‹ˆλ‹€.
    • 데이터와 νŒŒμΌμ„ μ—¬λŸ¬ λΆ€λΆ„μœΌλ‘œ λ‚˜λˆ„μ–΄ μ„œλ²„λ‘œ μ „μ†‘ν•©λ‹ˆλ‹€.
    • 파일뿐만 μ•„λ‹ˆλΌ ν…μŠ€νŠΈ ν•„λ“œλ„ ν•¨κ»˜ 전솑할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ˜ˆμ‹œ: λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ 파일과 데이터λ₯Ό ν•¨κ»˜ μ „μ†‘ν•©λ‹ˆλ‹€.
      ```plaintext
      –boundary
      Content-Disposition: form-data; name=”name”

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

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

  • 3. text/plain
    • 데이터λ₯Ό λ‹¨μˆœν•œ ν…μŠ€νŠΈ ν˜•μ‹μœΌλ‘œ μ „μ†‘ν•©λ‹ˆλ‹€.
    • 주둜 APIμ™€μ˜ κ°„λ‹¨ν•œ ν…μŠ€νŠΈ 전솑에 μ‚¬μš©λ˜λ©°, 폼 λ°μ΄ν„°λ‘œλŠ” 잘 μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

4. μ„œλ²„μ—μ„œ 폼 데이터 처리.

  • μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ „μ†‘ν•œ 폼 데이터λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, Spring Bootμ—μ„œλŠ” @RequestParam λ˜λŠ” @ModelAttribute 등을 μ‚¬μš©ν•˜μ—¬ 폼 데이터λ₯Ό μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ: Springμ—μ„œ 폼 데이터 λ°›κΈ°.

@PostMapping("/submit")
public String handleForm(@RequestParam String name, @RequestParam int age) {
    // 폼 데이터 처리
    return "Name: " + name + ", Age: " + age;
}
  • μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 보낸 폼 λ°μ΄ν„°μ—μ„œ nameκ³Ό age 값을 μΆ”μΆœν•˜μ—¬ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

5. μš”μ•½.

  • 폼 λ°μ΄ν„°λŠ” μ‚¬μš©μžκ°€ μ›Ή λΈŒλΌμš°μ €μ˜ 폼을 톡해 μ„œλ²„λ‘œ μ „μ†‘ν•˜λŠ” 데이터λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • 폼 λ°μ΄ν„°λŠ” GET λ˜λŠ” POST λ©”μ„œλ“œλ₯Ό 톡해 μ „μ†‘λ˜λ©°, URL 인코딩 λ°©μ‹μ΄λ‚˜ multipart/form-data λ°©μ‹μœΌλ‘œ μ„œλ²„μ— μ „λ‹¬λ©λ‹ˆλ‹€.
  • μ„œλ²„λŠ” ν•΄λ‹Ή 데이터λ₯Ό λ°›μ•„ μ²˜λ¦¬ν•˜μ—¬ μ‚¬μš©μž μš”μ²­μ— λ§žλŠ” κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

8️⃣ @RestController μ• λ„ˆν…Œμ΄μ…˜.

  • @RestController μ• λ„ˆν…Œμ΄μ…˜ 은 Spring Frameworkμ—μ„œ RESTful μ›Ή μ„œλΉ„μŠ€μ˜ 컨트둀러λ₯Ό μ •μ˜ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
  • 이 μ• λ„ˆν…Œμ΄μ…˜μ€ 컨트둀러 ν΄λž˜μŠ€μ— 뢙이며, 이 ν΄λž˜μŠ€κ°€ JSONμ΄λ‚˜ XMLκ³Ό 같은 데이터λ₯Ό HTTP 응닡 본문으둜 직접 λ°˜ν™˜ν•˜λ„λ‘ ν•΄μ€λ‹ˆλ‹€.

1. @RestController의 νŠΉμ§•.

1. @Controller + @ResponseBody의 κ²°ν•©.

  • @RestControllerλŠ” λ‚΄λΆ€μ μœΌλ‘œ @Controller와 @ResponseBody μ• λ„ˆν…Œμ΄μ…˜μ„ κ²°ν•©ν•œ κ²ƒμž…λ‹ˆλ‹€.
  • @ControllerλŠ” Spring MVCμ—μ„œ Viewλ₯Ό λ°˜ν™˜ν•˜λŠ” 전톡적인 컨트둀러λ₯Ό μ •μ˜ν•˜λŠ” 데 μ‚¬μš©λ˜μ§€λ§Œ, @RestControllerλŠ” Viewλ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šκ³ , κ°μ²΄λ‚˜ 데이터λ₯Ό 직접 HTTP 응닡 본문으둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • @ResponseBodyλŠ” λ©”μ„œλ“œκ°€ λ°˜ν™˜ν•˜λŠ” 객체λ₯Ό JSONμ΄λ‚˜ XML둜 μ§λ ¬ν™”ν•˜μ—¬ HTTP μ‘λ‹΅μ˜ 본문으둜 λ°˜ν™˜ν•˜λ„λ‘ ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
  • @RestControllerλŠ” 클래슀 λ ˆλ²¨μ—μ„œ λͺ¨λ“  λ©”μ„œλ“œμ— @ResponseBodyκ°€ μžλ™μœΌλ‘œ μ μš©λ©λ‹ˆλ‹€.

2. RESTful μ›Ή μ„œλΉ„μŠ€μ— 적합.

  • @RestControllerλŠ” 주둜 RESTful μ›Ή μ„œλΉ„μŠ€ κ°œλ°œμ— μ‚¬μš©λ˜λ©°, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œλΆ€ν„° JSON, XML λ“±μ˜ 데이터λ₯Ό 받을 수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • 전톡적인 MVC νŒ¨ν„΄μ—μ„œλŠ” 데이터λ₯Ό λ·° νŽ˜μ΄μ§€(HTML λ“±)둜 μ „λ‹¬ν•˜μ§€λ§Œ, RESTful μ›Ή μ„œλΉ„μŠ€μ—μ„œλŠ” 데이터 자체(JSON, XML λ“±)λ₯Ό μ‘λ‹΅μœΌλ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.

2. μ˜ˆμ‹œ μ½”λ“œ.

@RestController
public class UserController {
    
    @GetMapping("/users")
    public List<User> getAllUsers() {
        // μ‚¬μš©μž λͺ©λ‘μ„ λ°˜ν™˜ν•˜λŠ” μ˜ˆμ‹œ
        return userService.getAllUsers();
    }
    
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // μƒˆλ‘œμš΄ μ‚¬μš©μžλ₯Ό μƒμ„±ν•˜λŠ” μ˜ˆμ‹œ
        return userService.saveUser(user);
    }
}
  • @RestController
    • 이 ν΄λž˜μŠ€λŠ” RESTful 컨트둀러이며, λͺ¨λ“  λ©”μ„œλ“œλŠ” JSON λ˜λŠ” XMLκ³Ό 같은 데이터λ₯Ό HTTP 응닡 본문으둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • @GetMapping("/users")
      • GET μš”μ²­μ„ μ²˜λ¦¬ν•˜λ©°, List<User> 객체λ₯Ό JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • @PostMapping("/users")
      • POST μš”μ²­μ„ μ²˜λ¦¬ν•˜λ©°, ν΄λΌμ΄μ–ΈνŠΈκ°€ 보낸 User 데이터λ₯Ό λ°›μ•„ μƒˆλ‘œμš΄ μ‚¬μš©μžλ₯Ό μƒμ„±ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

3. @RestController와 일반 컨트둀러(@Controller)의 차이.

  • 1. 주된 λͺ©μ .
    • @RestControllerλŠ” 데이터(주둜 JSON, XML)λ₯Ό 직접 λ°˜ν™˜ν•˜λŠ” 데 μ‚¬μš©λ˜λ©°, API μ„œλ²„λ₯Ό ꡬ좕할 λ•Œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.
    • @ControllerλŠ” λ·°(HTML, JSP νŽ˜μ΄μ§€ λ“±)λ₯Ό λ°˜ν™˜ν•˜λŠ” 데 주둜 μ‚¬μš©λ˜λ©°, μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 화면을 보여쀄 λ•Œ μ ν•©ν•©λ‹ˆλ‹€.
  • 2. View 해석.
    • @RestControllerλŠ” 데이터λ₯Ό 응닡 본문에 λ°”λ‘œ μ „λ‹¬ν•˜λ©°, JSPλ‚˜ Thymeleaf 같은 λ·° ν…œν”Œλ¦Ώ 엔진을 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    • @ControllerλŠ” λ·° 이름을 λ°˜ν™˜ν•˜κ³ , Spring MVCλŠ” 이 λ·° 이름을 ν•΄μ„ν•˜μ—¬ JSPλ‚˜ Thymeleaf 같은 ν…œν”Œλ¦Ώ 엔진을 μ‚¬μš©ν•΄ 화면을 λ Œλ”λ§ν•©λ‹ˆλ‹€.
  • 3. @ResponseBody ν•„μš” μ—¬λΆ€.
    • @RestControllerλ₯Ό μ‚¬μš©ν•˜λ©΄ λ©”μ„œλ“œλ§ˆλ‹€ @ResponseBodyλ₯Ό 뢙일 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
      • 클래슀 λ ˆλ²¨μ—μ„œ μžλ™μœΌλ‘œ μ μš©λ©λ‹ˆλ‹€.
    • @Controllerλ₯Ό μ‚¬μš©ν•  경우, 데이터λ₯Ό λ°˜ν™˜ν•˜λ €λ©΄ λ©”μ„œλ“œλ§ˆλ‹€ @ResponseBodyλ₯Ό λΆ™μ—¬μ„œ 응닡 본문에 데이터λ₯Ό 보내도둝 λͺ…μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.
      • 일반 컨트둀러(@Controller) μ˜ˆμ‹œ
          @Controller
          public class ViewController {
                    
          @GetMapping("/home")
          public String home() {
              // "home.html"μ΄λΌλŠ” λ·°λ₯Ό λ°˜ν™˜ν•¨
              return "home";
          }
          }
        
      • 이 μ½”λ“œλŠ” β€œhomeβ€μ΄λΌλŠ” λ·° 이름을 λ°˜ν™˜ν•˜λ©°, Spring은 home.html λ˜λŠ” home.jspλ₯Ό μ°Ύμ•„μ„œ λ Œλ”λ§ν•˜κ²Œ λ©λ‹ˆλ‹€.

4. μš”μ•½.

  • @RestControllerλŠ” RESTful μ›Ή μ„œλΉ„μŠ€ κ°œλ°œμ— μ‚¬μš©λ˜λ©°, 데이터λ₯Ό JSONμ΄λ‚˜ XML λ“±μ˜ ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • @RestControllerλŠ” @Controller와 @ResponseBody의 κ²°ν•©μœΌλ‘œ, 데이터λ₯Ό 응닡 본문에 λ°”λ‘œ λ°˜ν™˜ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • Spring MVCμ—μ„œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ·°λ₯Ό λ Œλ”λ§ν•˜λŠ” @Controller 와 달리, @RestControllerλŠ” API κ°œλ°œμ— 더 μ ν•©ν•©λ‹ˆλ‹€.