우노
[Kotlin] @Service vs @Component 본문
@Service
- 의미: 서비스 계층(비즈니스 로직을 처리하는 계층)을 나타내는 클래스에 사용합니다.
- 사용 목적: 애플리케이션의 핵심 비즈니스 로직을 담당하는 클래스임을 명확히 하기 위해 사용됩니다.
- 주요 역할:
- 비즈니스 규칙 및 트랜잭션 관리.
- 다른 계층(@Repository, @Component)의 Bean을 사용하여 로직을 조합.
- 데이터와 사용자 인터페이스 사이를 연결하는 가교 역할.
@Component
- 의미: 특정 계층에 속하지 않는 일반적인 클래스를 Spring Bean으로 등록할 때 사용합니다.
- 사용 목적: 유틸리티, 공통 로직, 지원 클래스 등 다양한 곳에서 재사용될 수 있는 Bean을 등록합니다.
- 주요 역할:
- 특정 계층(Service, Controller, Repository)에 명시적으로 속하지 않는 클래스.
- 범용적인 기능(예: 문자열 처리, 포맷팅, 데이터 변환)을 제공.
비유로 이해하기
- 스프링 애플리케이션을 하나의 조직으로 생각해 봅시다.
- @Service
- "비즈니스 로직을 수행하는 핵심 부서의 직원"
- 예를 들어, 사용자의 주문을 처리하거나 결제 시스템과 상호작용하는 업무 담당자입니다.
- @Component
- "특정 부서에 속하지 않고 여러 부서를 지원하는 지원 직원"
- 예를 들어, 모든 부서에서 사용하는 공용 도구(문서 양식 변환기, 데이터 계산기) 같은 역할을 합니다.
- 다른 계층 어노테이션과의 비교
- @Controller: 사용자와 직접 소통하는 프런트라인 직원(예: 사용자 요청을 받고 결과를 반환).
- @Repository: 데이터베이스를 관리하는 기록 담당자(예: 데이터 저장소와 직접 상호작용).
- @Service
@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를 사용하세요.
- 이렇게 하면 코드의 가독성이 향상되고 역할이 명확해져 유지보수와 협업이 쉬워집니다.
'Web_App > Kotlin' 카테고리의 다른 글
[Kotlin] @Transactional, Service vs Repository 어디에 적용할까? (0) | 2024.12.26 |
---|---|
[Kotlin] @Transactional (0) | 2024.12.23 |
[Kotlin] Controller와 Service의 계층 구조 (0) | 2024.12.20 |
[Kotlin] @SqlResultSetMapping (0) | 2024.12.20 |
[Kotlin] ORM, JPA, Spring Data JPA (1) | 2024.12.18 |
Comments