@Service는 스프링 프레임워크에서 비즈니스 로직을 처리하는 클래스를 표시하는 어노테이션입니다.
@Component의 특화된 형태로, 비즈니스 로직을 포함하는 클래스임을 명시적으로 나타냅니다.@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User createUser(User user) {
// 사용자 생성 로직
return userRepository.save(user);
}
public User getUserById(Long id) {
// 사용자 조회 로직
return userRepository.findById(id)
.orElseThrow(() -> new UserNotFoundException("User not found with id: " + id));
}
// 기타 비즈니스 메서드...
}
@Transactional 어노테이션과 함께 사용되어 트랜잭션을 관리합니다.@Controller)과 데이터 액세스 계층(@Repository) 사이에 위치합니다.@Service는 @Component의 특화된 형태입니다. 기능적으로는 동일하지만, 의미론적인 차이가 있습니다:
@Component: 일반적인 스프링 관리 컴포넌트@Service: 비즈니스 로직을 처리하는 서비스 계층 컴포넌트@Component
public class GenericComponent {
// 일반적인 컴포넌트
}
@Service
public class BusinessService {
// 비즈니스 로직을 처리하는 서비스
}
스프링 컨테이너는 @Service 어노테이션이 붙은 클래스의 인스턴스를 생성하고 관리합니다:
@Service 클래스의 인스턴스를 생성합니다.@PostConstruct 메서드가 있다면 호출합니다.@PreDestroy 메서드가 있다면 호출합니다.@Service 클래스는 주로 트랜잭션 관리와 함께 사용됩니다:
@Service
public class TransferService {
@Autowired
private AccountRepository accountRepository;
@Transactional
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
Account fromAccount = accountRepository.findById(fromId)
.orElseThrow(() -> new AccountNotFoundException("Account not found: " + fromId));
Account toAccount = accountRepository.findById(toId)
.orElseThrow(() -> new AccountNotFoundException("Account not found: " + toId));
fromAccount.withdraw(amount);
toAccount.deposit(amount);
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
}
}
@Service 클래스는 단위 테스트와 통합 테스트의 주요 대상이 됩니다:
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@MockBean
private UserRepository userRepository;
@Test
void createUser_ShouldReturnCreatedUser() {
User user = new User("John Doe", "john@example.com");
when(userRepository.save(any(User.class))).thenReturn(user);
User createdUser = userService.createUser(user);
assertNotNull(createdUser);
assertEquals("John Doe", createdUser.getName());
assertEquals("john@example.com", createdUser.getEmail());
verify(userRepository).save(user);
}
}
UserService, OrderProcessingService).@Service 어노테이션은 스프링 애플리케이션의 비즈니스 로직을 구조화하고 관리하는 데 중요한 역할을 합니다. 이를 통해 관심사를 분리하고, 코드의 재사용성과 유지보수성을 향상시킬 수 있습니다. 서비스 계층은 애플리케이션의 핵심 기능을 담당하므로, 잘 설계된 서비스 클래스는 전체 애플리케이션의 품질과 성능에 큰 영향을 미칩니다.