![[Spring/기초] Service](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSReMb%2FbtsEyedN6ez%2FCzvTJs4dwAMRBgRWA3xQ2K%2Fimg.jpg)

Spring의 MVC중 하나인 Service에 대해서 알아보자
Service를 결론부터 설명하자면 애플리케이션의 비지니스 로직을 포함하며 프레젠테이션 계층과 데이터 접근 계층 사이에서 중간 역할을 수행한다. 즉 데이터가공하는 애플리케이션의 핵심 기능, 규칙을 구현한다.
데이터베이스에 직접 데이터를 가공하다간 원본 데이터가 손실, 손상될수 있음으로 계층을 둔다.
서비스 계층의 주요 기능과 특징
1. 비지니스 로직의 캡슐화:
서비스 곛층은 비지니스 로직이나 비지니스 규칙을 구현하고, 이를 프레젠테이션 계층과 분리해서 애플리케이션의 유지 보수성과 확장성을 향상시킨다.
2. 재사용성 :
비지니스 로직을 서비스 계층에 구현함으로써, 동일한 로직을 애플리케이션의 다른 부분에서 재사용 할 수 있다.
3. 트랜잭션 관리 :
Spring의 서비스 계층은 선언적 트랜잭션 관리를 제공한다.
4. 보안
Spring Security와 통합해서 서비스 계층에서 특정 메소드 호출에 대한 접근 제어를 구현할 수 있다.
5. 오류 처리
비지니스 로직을 실행하는 동안 발생할 수 있는 오류를 처리하고, 적절한 예외를 더니거나 사용자에게 의미 있는 피드백을 제공한다.
예시
@Service 어노테이션을 사용해서 service를 사용한다.
JPA리파지 토리등(데이터 접근 계층)에 의존성을 주입 받아서 데이터베이스와 상호작용 하게 된다.
@Service
public class MyService implements IMyService {
// 비즈니스 로직 구현
}
자주 사용하는 어노테이션
@Transactional
@Transactional
public void transferMoney(Long fromAccountId, Long toAccountId, Double amount) {
Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow(() -> new RuntimeException("계좌를 찾을 수 없습니다."));
Account toAccount = accountRepository.findById(toAccountId).orElseThrow(() -> new RuntimeException("계좌를 찾을 수 없습니다."));
fromAccount.withdraw(amount); // 송금자 계좌에서 금액 차감
toAccount.deposit(amount); // 수취인 계좌에 금액 추가
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
}
메소드 또는 클래스 레벨에서 트랜잭션 관리를 할수 있게 해준다.
트랜잭션이란 해당 매서드가 실행되는 동안 안에있는 작업이 모두 성공적으로 완료되어야 모두 완료된다는 것을 의미한다. 위 코드를 보면 송금자 계좌에서 금액 차감하는 기능과 수취인 계좌에서 금액이 추가되는 기능이 성공적으로 끝나야 함을 의미한다. 예외가 발생하면 롤백된다.
@Autowired
의존성 주입을 위해 사용된다. 어노테이션이 붙은 필드, 생성자, 세터 메소드에 자동으로 해당 타입의 빈을 주입힌다.
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@Qualifier
자동 주입될 빈이 여러개 있는 경우 특정 빈을 지정하는데 사용한다.
@Autowired
public UserService(@Qualifier("specificUserRepository") UserRepository userRepository) {
this.userRepository = userRepository;
}
@Async
메소드가 비동기적으로 실행되어야 함을 알린다. 해당 메소드는 별도의 스레드에서 실행된다.
@Async
public Future<User> findUser(String username) {
// 비동기적으로 사용자를 찾는 로직
}
@Cacheable
캐싱 기능을 적용할때 사용한다. 사용한 키에 대한 결과를 캐시에 저장하고 같은 요청이 들어올때 캐시에서 결과를 바로 반환해서 성능을 향상시킨다.
@Cacheable("users")
public User findUserById(Long id) {
// 사용자 검색 로직
}
'Spring > Spring 기초' 카테고리의 다른 글
[Spring/기초] RestController 완벽 정리 (return type, 파라미터, 추가 개념 및 기능) (0) | 2024.06.23 |
---|---|
[Spring/기초] 환경 변수 파일 사용하기 (env.properties) (0) | 2024.05.28 |
[Spring/기초] Repository (0) | 2024.01.23 |
[Spring/기초] TDD (0) | 2024.01.21 |
[Spring/기초] spring MVC (0) | 2024.01.21 |
Coding, Software, Computer Science 내가 공부한 것들 잘 이해했는지, 설명할 수 있는지 적는 공간