Home > Spring > πŸƒ[Spring] μ–Έμ œ `@Service`,`@Repository`,`@Controller`와 같은 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν• κΉŒ?

πŸƒ[Spring] μ–Έμ œ `@Service`,`@Repository`,`@Controller`와 같은 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν• κΉŒ?
Spring Framework

πŸƒ[Spring] μ–Έμ œ @Service,@Repository,@Controller와 같은 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν• κΉŒ?

@Service,@Repository,@Controller와 같은 μ–΄λ…Έν…Œμ΄μ…˜μ€ Spring Frameworkμ—μ„œ νŠΉμ • λ ˆμ΄μ–΄μ˜ 역할을 λͺ…ν™•νžˆ ν•˜κ³ , μžλ™μœΌλ‘œ λΉˆμ„ 등둝할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

이 μ–΄λ…Έν…Œμ΄μ…˜λ“€μ€ @Component μ–΄λ…Έν…Œμ΄μ…˜μ˜ νŠΉμˆ˜ν™”λœ λ²„μ „μœΌλ‘œ, 각각의 λ ˆμ΄μ–΄λ₯Ό κ΅¬λΆ„ν•˜μ—¬ Spring μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 더 κ΅¬μ‘°ν™”ν•˜κ³ , μ±…μž„μ„ λͺ…ν™•ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

1️⃣ @Service

  • μ‚¬μš© μ‹œμ 
    • λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•˜λŠ” μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • μ„€λͺ…
    • @ServiceλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ— λΆ™μž…λ‹ˆλ‹€.
    • 이 계측은 μ»¨νŠΈλ‘€λŸ¬μ—μ„œ μ „λ‹¬λœ μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³ , 데이터λ₯Ό μ‘°μž‘ν•˜κ±°λ‚˜ λ‹€λ₯Έ λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ μ μš©ν•©λ‹ˆλ‹€.
    • λ˜ν•œ, 이 계측은 νŠΈλžœμž­μ…˜ κ΄€λ¦¬λ‚˜ μ˜ˆμ™Έ μ²˜λ¦¬μ™€ 같은 μ€‘μš”ν•œ μž‘μ—…λ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ
    @Service
    public class UserService {
      public User findUserById(Long id) {
          // λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 처리
          return userRepository.findById(id).orElseThrow();
      }
    }
    
  • μ‚¬μš© λͺ©μ 
    • @Serviceλ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ‹΄λ‹Ήν•˜λŠ” μ„œλΉ„μŠ€ κ³„μΈ΅μ˜ 역할을 ν•œλ‹€λŠ” 점을 λͺ…ν™•νžˆ ν•˜κ³ , Spring μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ μžλ™μœΌλ‘œ 빈으둜 λ“±λ‘λ˜κ²Œ ν•©λ‹ˆλ‹€.
    • λ˜ν•œ, @Service μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 Spring이 ν•΄λ‹Ή ν΄λž˜μŠ€μ— λŒ€ν•΄ 좔가적인 처리λ₯Ό μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€(예: νŠΈλžœμž­μ…˜ 관리).

2️⃣ @Repository

  • μ‚¬μš© μ‹œμ 
    • 데이터 μ ‘κ·Ό 계측(DAO, Data Access Object) μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • μ„€λͺ…
    • @RepositoryλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•˜λŠ” μ˜μ†μ„± κ³„μΈ΅μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • 보톡 λ°μ΄ν„°λ² μ΄μŠ€ CRUD μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©°, λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ 직접적인 μ—°κ²°, 쿼리 μ‹€ν–‰, κ²°κ³Ό 처리 등을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.
    • Springμ—μ„œλŠ” @Repositoryλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ μ˜ˆμ™Έλ₯Ό Spring μ˜ˆμ™Έλ‘œ λ³€ν™˜ν•˜λŠ” λ“±μ˜ 좔가적인 κΈ°λŠ₯도 μ œκ³΅ν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ
    @Repository
    public interface UserRepository extends JpaRepository<User, Long> {
      // λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ μœ„ν•œ λ©”μ„œλ“œ μ •μ˜
    }
    
  • μ‚¬μš© λͺ©μ 
    • @RepositoryλŠ” ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•˜λŠ” DAO 역할을 ν•œλ‹€λŠ” 점을 λͺ…ν™•νžˆν•˜κ³ , μžλ™μœΌλ‘œ 빈으둜 λ“±λ‘λ˜κ²Œ ν•©λ‹ˆλ‹€.
    • λ˜ν•œ, @RepositoryλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ™€ κ΄€λ ¨λœ μ˜ˆμ™Έλ₯Ό ν‘œμ€€ν™”λœ Spring μ˜ˆμ™Έλ‘œ λ³€ν™˜ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

3️⃣ @Controller

  • μ‚¬μš© μ‹œμ 
    • μ›Ή 계측(ν”„λ ˆμ  ν…Œμ΄μ…˜ 계측) μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • μ„€λͺ…
    • @ControllerλŠ” μ‚¬μš©μž μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³ , μ μ ˆν•œ 응닡을 λ°˜ν™˜ν•˜λŠ” 역할을 ν•˜λŠ” μ›Ή 컨트둀러 ν΄λž˜μŠ€μ— μ‚¬μš©λ©λ‹ˆλ‹€.
    • 주둜, Spring MVC μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©λ˜λ©°, ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ„ λ°›μ•„ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•˜κ³ , κ²°κ³Όλ₯Ό HTML νŽ˜μ΄μ§€λ‚˜ JSON ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ
    @Controller
    public class UserController {
      @GetMapping("/user/{id}")
      public String getUser(@PathVariable Long id, Model model) {
          User user = userServie.findUserById(id);
          model.addAttribute("user", user);
          return "userDetail";
      }
    }
    
  • μ‚¬μš© λͺ©μ 
    • @ControllerλŠ” ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ μ›Ή μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” μ»¨νŠΈλ‘€λŸ¬μž„μ„ λͺ…ν™•νžˆ ν•˜λ©°, Spring μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ μžλ™μœΌλ‘œ 빈으둜 λ“±λ‘λ©λ‹ˆλ‹€.
    • μ›Ή μš”μ²­μ„ λ°›μ•„μ„œ μ²˜λ¦¬ν•˜κ³ , 응닡을 μƒμ„±ν•˜λŠ” 역할을 ν•˜κΈ° λ•Œλ¬Έμ— μ‚¬μš©μžμ™€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°„μ˜ μΈν…ŒνŽ˜μ΄μŠ€ 역할을 ν•©λ‹ˆλ‹€.

4️⃣ @RestController

  • μ‚¬μš© μ‹œμ 
    • RESTful μ›Ή μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • μ„€λͺ…
    • @RestControllerλŠ” @Controller와 @ResponseBodyκ°€ κ²°ν•©λœ μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ, 주둜 JSON λ˜λŠ” XML ν˜•μ‹μ˜ 데이터λ₯Ό λ°˜ν™˜ν•˜λŠ” RESTful APIλ₯Ό λ§Œλ“€ λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • Spring MVCμ—μ„œ 데이터λ₯Ό μ§λ ¬ν™”ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 전솑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ
    @RestController
    public class UserRestController {
      @GetMapping("/api/users/{id}")
      public User getUser(@PathVariable Long id) {
          return userService.findUserById(id);
      }
    }
    
  • μ‚¬μš© λͺ©μ 
    • @RestControllerλŠ” 주둜 REST API λ₯Ό κ°œλ°œν•  λ•Œ μ‚¬μš©λ˜λ©°, μ»¨νŠΈλ‘€λŸ¬μ—μ„œ λ°˜ν™˜ν•˜λŠ” 데이터λ₯Ό HTML νŽ˜μ΄μ§€κ°€ μ•„λ‹Œ JSONμ΄λ‚˜ XMLκ³Ό 같은 ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • REST API 섀계λ₯Ό ν•  λ•Œ 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ 개발자의 μ˜λ„λ₯Ό λͺ…ν™•νžˆ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.

5️⃣ μ–Έμ œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€?

  • @Service
    • λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ‹΄λ‹Ήν•˜λŠ” ν΄λž˜μŠ€μ— μ‚¬μš©ν•©λ‹ˆλ‹€.
    • 데이터 μ ‘κ·Ό κ³„μΈ΅μ—μ„œ κ°€μ Έμ˜¨ 데이터λ₯Ό κ°€κ³΅ν•˜κ±°λ‚˜ κ·œμΉ™μ„ μ μš©ν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” κ³³μž…λ‹ˆλ‹€.
  • @Repository
    • λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ μ²˜λ¦¬ν•˜λŠ” ν΄λž˜μŠ€μ— μ‚¬μš©ν•©λ‹ˆλ‹€.
    • 주둜 데이터 μ €μž₯, μˆ˜μ •, 쑰회, μ‚­μ œμ™€ 같은 μ˜μ†μ„± 둜직이 ν¬ν•¨λœ DAO λ˜λŠ” 리포지토리에 λΆ™μž…λ‹ˆλ‹€.
  • @Controller
    • μ‚¬μš©μžλ‘œλΆ€ν„° HTTP μš”μ²­μ„ λ°›μ•„ 응닡을 μƒμ„±ν•˜λŠ” μ›Ή μ»¨νŠΈλ‘€λŸ¬μ— μ‚¬μš©ν•©λ‹ˆλ‹€.
    • 주둜 Spring MVCμ—μ„œ 동적인 μ›Ή 페이즈λ₯Ό λžœλ”λ§ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • @RestController
    • RESTful μ›Ή μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” μ»¨νŠΈλ‘€λŸ¬μ— μ‚¬μš©ν•©λ‹ˆλ‹€.
    • 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μ›Ή μš”μ²­μ„ μ²˜λ¦¬ν•œ ν›„ JSON λ˜λŠ” XML ν˜•μ‹μ˜ 데이터λ₯Ό λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

6️⃣ κ²°λ‘ 

  • 이 μ–΄λ…Έν…Œμ΄μ…˜λ“€μ€ 각각의 ν΄λž˜μŠ€κ°€ μ–΄λ–€ 역할을 λ‹΄λ‹Ήν•˜λŠ”μ§€ λͺ…ν™•νžˆ ꡬ뢄해 쀌으둜써, Spring μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ꡬ쑰화와 관리에 도움을 μ€λ‹ˆλ‹€.
  • Spring μ»¨ν…Œμ΄λ„ˆλŠ” 이 μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 ν΄λž˜μŠ€λ“€μ„ μžλ™μœΌλ‘œ κ°μ§€ν•˜μ—¬ 빈으둜 λ“±λ‘ν•˜κ³ , ν•„μš”ν•œ 곳에 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•΄μ€λ‹ˆλ‹€.