오늘의 인기 글
최근 글
최근 댓글
Today
Total
01-02 02:44
관리 메뉴

우노

[Kotlin] @Service vs @Component 본문

Web_App/Kotlin

[Kotlin] @Service vs @Component

운호(Noah) 2024. 12. 23. 11:14

@Service

  • 의미: 서비스 계층(비즈니스 로직을 처리하는 계층)을 나타내는 클래스에 사용합니다.
  • 사용 목적: 애플리케이션의 핵심 비즈니스 로직을 담당하는 클래스임을 명확히 하기 위해 사용됩니다.
  • 주요 역할:
    • 비즈니스 규칙 및 트랜잭션 관리.
    • 다른 계층(@Repository, @Component)의 Bean을 사용하여 로직을 조합.
    • 데이터와 사용자 인터페이스 사이를 연결하는 가교 역할.

@Component

  • 의미: 특정 계층에 속하지 않는 일반적인 클래스를 Spring Bean으로 등록할 때 사용합니다.
  • 사용 목적: 유틸리티, 공통 로직, 지원 클래스 등 다양한 곳에서 재사용될 수 있는 Bean을 등록합니다.
  • 주요 역할:
    • 특정 계층(Service, Controller, Repository)에 명시적으로 속하지 않는 클래스.
    • 범용적인 기능(예: 문자열 처리, 포맷팅, 데이터 변환)을 제공.

비유로 이해하기

  • 스프링 애플리케이션을 하나의 조직으로 생각해 봅시다.
    • @Service
      • "비즈니스 로직을 수행하는 핵심 부서의 직원"
      • 예를 들어, 사용자의 주문을 처리하거나 결제 시스템과 상호작용하는 업무 담당자입니다.
    • @Component
      • "특정 부서에 속하지 않고 여러 부서를 지원하는 지원 직원"
      • 예를 들어, 모든 부서에서 사용하는 공용 도구(문서 양식 변환기, 데이터 계산기) 같은 역할을 합니다.
    • 다른 계층 어노테이션과의 비교
      • @Controller: 사용자와 직접 소통하는 프런트라인 직원(예: 사용자 요청을 받고 결과를 반환).
      • @Repository: 데이터베이스를 관리하는 기록 담당자(예: 데이터 저장소와 직접 상호작용).

@Component 예제

  • 아래는 특정 계층에 속하지 않는 문자열 포맷팅 유틸리티 클래스입니다.

      import org.springframework.stereotype.Component
    
      @Component
      class StringFormatter {
          fun capitalize(input: String): String {
              return input.replaceFirstChar { it.uppercaseChar() }
          }
      }
  • 특징:

    • 이 클래스는 비즈니스 로직이 아니며, 특정 계층에 속하지 않습니다.
    • 여러 계층에서 재사용될 수 있는 범용 유틸리티입니다.

@Service 예제

  • 아래는 비즈니스 로직을 처리하는 서비스 클래스입니다.

      import org.springframework.stereotype.Service
    
      @Service
      class GreetingService(private val stringFormatter: StringFormatter) {
          fun getGreeting(name: String): String {
              return "Hello, ${stringFormatter.capitalize(name)}!"
          }
      }
  • 특징:

    • GreetingService는 비즈니스 로직을 담당합니다.
    • 내부적으로 StringFormatter를 사용하여 문자열을 변환하는 로직을 조합합니다.
    • 서비스 계층에 적합한 작업(예: "환영 메시지 생성")을 수행합니다.

FAQ

  • @Component 대신 항상 @Service를 사용하면 안 되나요?
    • 가능은 하지만, @Service는 비즈니스 로직을 처리하는 클래스를 나타내기 위해 사용합니다.
    • 모든 클래스에 @Service를 사용하면 계층을 구분하는 의도가 모호해질 수 있습니다.
  • @Component와 @Service가 내부적으로 다른가요?
    • 내부적으로는 동일합니다. 둘 다 Spring Bean으로 등록되며, 동작에 차이는 없습니다.
    • 단지 코드의 의도를 명확히 하기 위해 @Service를 사용합니다.

결론

  • 비즈니스 로직을 처리하는 클래스에는 @Service를 사용하세요.
  • 특정 계층에 속하지 않고 범용적인 지원 역할을 하는 클래스에는 @Component를 사용하세요.
  • 이렇게 하면 코드의 가독성이 향상되고 역할이 명확해져 유지보수와 협업이 쉬워집니다.
Comments