Home > Spring > πŸƒ[Spring] κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜μ—μ„œ Controller의 μ—­ν• .

πŸƒ[Spring] κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜μ—μ„œ Controller의 μ—­ν• .
Spring Framework

πŸƒ[Spring] κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜μ—μ„œ Controller의 μ—­ν• .

Java λ°±μ•€λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜(Layerd Architecture) μ—μ„œ ControllerλŠ” μ‚¬μš©μž(ν΄λΌμ΄μ–ΈνŠΈ)λ‘œλΆ€ν„° μš”μ²­μ„ λ°›μ•„ μ²˜λ¦¬ν•˜κ³ , 그에 λŒ€ν•œ 응닡을 λ°˜ν™˜ν•˜λŠ” 역할을 λ‹΄λ‹Ήν•˜λŠ” μ€‘μš”ν•œ κ³„μΈ΅μž…λ‹ˆλ‹€.

ControllerλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ™ΈλΆ€ μΈν„°νŽ˜μ΄μŠ€λ‘œ μž‘λ™ν•˜λ©°, 주둜 μ›Ή μš”μ²­κ³Ό μ‘λ‹΅μ˜ 흐름을 μ œμ–΄ν•˜λŠ” 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

1️⃣ Controller의 μ£Όμš” μ—­ν• .

1. μš”μ²­ μˆ˜μ‹  및 응닡 λ°˜ν™˜.

  • ControllerλŠ” ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €, λͺ¨λ°”일 μ•± λ“±)둜 λΆ€ν„° HTTP μš”μ²­μ„ μˆ˜μ‹ ν•©λ‹ˆλ‹€.
  • 각 μš”μ²­μ€ URL 경둜 및 HTTP λ©”μ„œλ“œ(GET, POST, PUT, DELETE λ“±)에 따라 Controller의 νŠΉμ • λ©”μ„œλ“œμ— λ§€ν•‘λ©λ‹ˆλ‹€.
  • 이 λ©”μ„œλ“œλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ ν˜ΈμΆœν•˜κ³ , 처리 κ²°κ³Όλ₯Ό λ‹€μ‹œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ‘λ‹΅μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

2. μš”μ²­ 검증.

  • ControllerλŠ” ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° μ „λ‹¬λœ μš”μ²­ 데이터(쿼리 νŒŒλΌλ―Έν„°, 폼 데이터, JSON λ“±)λ₯Ό κ²€μ¦ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
  • 이 검증 μž‘μ—…μ€ 일반적으둜 μš”μ²­μ΄ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직으둜 μ „λ‹¬λ˜κΈ° 전에 μˆ˜ν–‰λ©λ‹ˆλ‹€.
  • 검증 μ‹€νŒ¨ μ‹œ, μ—λŸ¬ λ©”μ‹œμ§€λ‚˜ μƒνƒœ μ½”λ“œλ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ— λ°˜ν™˜ν•©λ‹ˆλ‹€.

3. λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 호좜.

  • ControllerλŠ” μ§μ ‘μ μœΌλ‘œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰ν•˜μ§€ μ•Šκ³ , Service κ³„μΈ΅μ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
  • 이 방식은 역할을 λΆ„λ¦¬ν•˜μ—¬ μœ μ§€λ³΄μˆ˜μ„±μ„ 높이고, μ½”λ“œκ°€ λ”μš± μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§Œλ“­λ‹ˆλ‹€.
  • Service 계측이 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•˜κ³  κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λ©΄, ControllerλŠ” 이λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ „λ‹¬ν•©λ‹ˆλ‹€.

4. λ·°μ™€μ˜ 톡신(View와 연동)

  • ControllerλŠ” View와 ν†΅μ‹ ν•˜μ—¬ μ μ ˆν•œ 응닡을 μƒμ„±ν•©λ‹ˆλ‹€.
  • μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” HTMLμ΄λ‚˜ JSON 데이터λ₯Ό λ°˜ν™˜ν•˜λŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, ν…œν”Œλ¦Ώ μ—”μ§„(Thymeleaf λ“±)을 μ‚¬μš©ν•΄ 동적인 HTML νŽ˜μ΄μ§€λ₯Ό λ Œλ”λ§ν•˜κ±°λ‚˜, API μ„œλ²„μ˜ 경우 JSON 포맷으둜 데이터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

5. HTTP μƒνƒœ μ½”λ“œ 관리.

  • ControllerλŠ” μš”μ²­ 처리 결과에 따라 μ μ ˆν•œ HTTP μƒνƒœ μ½”λ“œ(예: 200 OK, 400 Bad Request, 404 Not Found, 500 Internal Server Error λ“±) λ₯Ό μ„€μ •ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ— μ „λ‹¬ν•©λ‹ˆλ‹€.
  • 이둜써 ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ 처리 μƒνƒœλ₯Ό μ•Œ 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

6. μ˜ˆμ™Έ 처리

  • ControllerλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜κ±°λ‚˜, 전역적인 μ˜ˆμ™Έ 처리 λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•΄ μ˜ˆμ™Έλ₯Ό λ‹€λ£Ήλ‹ˆλ‹€.
  • 이λ₯Ό 톡해 μ μ ˆν•œ μ—λŸ¬ 응닡을 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°˜ν™˜ν•˜κ³ , μ—λŸ¬κ°€ λ°œμƒν–ˆμ„ λ•Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.

2️⃣ μ˜ˆμ‹œ μ½”λ“œ

Spring Boot μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œμ˜ Controller μ˜ˆμ‹œλ₯Ό 톡해 κ·Έ 역할을 더 ꡬ체적으둜 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

@RestController
@RequestMapping("/users")
public class UserController {
    
    private final UserService userService;
    
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
    
    @GetMapping("/{id}")
    public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
        UserDTO user = userService.getUserById(id);
        return ResponseEntity.ok(user);
    }
    
    @PostMapping
    public ResponseEntity<UserDTO> createUser(@RequestBody @Valid UserDTO userDTO) {
        UserDTO createdUser = userService.createUser(userDTO);
        return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
    }
}

3️⃣ μ„€λͺ….

  • @RestController
    • Springμ—μ„œ RESTful μ›Ή μ„œλΉ„μŠ€λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
    • JSON λ˜λŠ” XML 데이터λ₯Ό λ°˜ν™˜ν•˜λŠ” 컨트둀러λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
  • @RequestMapping
    • 이 μ»¨νŠΈλ‘€λŸ¬κ°€ \users κ²½λ‘œμ— λŒ€ν•œ μš”μ²­μ„ μ²˜λ¦¬ν•˜λ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€.
  • @GetMapping
    • HTTP GET μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” λ©”μ„œλ“œλ‘œ, id 경둜 λ³€μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” μ‚¬μš©μžλ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
  • @PostMapping
    • HTTP POST μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” λ©”μ„œλ“œλ‘œ, μƒˆλ‘œμš΄ μ‚¬μš©μžλ₯Ό μƒμ„±ν•˜κ³  κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • @RequestBody, @Valid
    • μš”μ²­ λ³Έλ¬Έ 데이터λ₯Ό 객체둜 λ§€ν•‘ν•˜κ³ , μž…λ ₯ 데이터λ₯Ό κ²€μ¦ν•©λ‹ˆλ‹€.
  • ResponseEntity
    • 응닡 λ³Έλ¬Έκ³Ό μƒνƒœ μ½”λ“œλ₯Ό 포함해 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 응닡을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

4️⃣ κ²°λ‘ 

ContollerλŠ” μ‚¬μš©μž μš”μ²­μ„ λ°›μ•„ Service 계측과 ν†΅μ‹ ν•˜λ©°, μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°˜ν™˜ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
μ΄λŸ¬ν•œ μ—­ν•  뢄리λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λ”μš± μœ μ—°ν•˜κ³  κ΄€λ¦¬ν•˜κΈ° μ‰¬μš΄ ꡬ쑰λ₯Ό κ°–μΆ”κ²Œ λ©λ‹ˆλ‹€.