Controller와 Service, Repository는 각각 역할이 있다.
흐름은 위와 같다.
컨트롤러는 client와 소통을 하며 데이터를 받거나 넘겨주고 서비스에서는 비즈니스 로직만을 작성한다.
여기서 Dao가 DB와 연결하며 CRUD를 수행하는데 이를 Repository라고 보면 된다.
1. Controller
가장 큰 역할은 Client와의 소통이다.
Client로 부터 받은 데이터를 Service로 넘겨주어 Service가 비즈니스 로직을 수행하도록 한다.
그리고 Service로부터 데이터를 받아 Client로 넘겨준다.
@RestController
public class PostsApiController {
private final PostsService postsService;
@PostMapping("/api/v1/posts")
public Long save(@RequestBody PostsSaveRequestDto requestDto) {
return postsService.save(requestDto);
}
}
컨트롤러의 예시는 위와 같다.
Dto를 통해 데이터를 Service로 넘겨준다.
2. Service
서비스의 역할은 비즈니스 로직 수행이다.
비즈니스 로직은 무엇일까?
비즈니스 로직이란 데이터를 변경, 조작, 저장 등 데이터를 다루는 부분을 일컫는다.
그럼 왜 Controller 바로 데이터를 다루지 않고 굳이 Service에서 데이터를 다루는가?
나는 먼저 Controller와 Service의 탄생은 개발자들의 경험이 만들어낸 디자인 패턴이라고 생각한다.
그럼 왜 만들었을까를 생각해 본다면 데이터의 무결성을 위함이라고 생각한다.
Service에서는 Repository와 소통하며 데이터를 DB에 넣거나 가져온다.
이 과정에서 spring boot에서는 Transactional 어노테이션으로 Repository와의 소통을 확인한다.
만약 여기서 DB와의 소통이 이루어 지지 않았다면 롤백되어 그동안 실행되었던 DB와의 소통을 소통전으로 되돌린다.
Service의 또다른 존재 이유는 재사용성이라고 생각한다.
Service에서 간단한 CRUD를 하는 경우에 다른 Service에서 이를 가져다 써도 된다.
만약 Controller에서 직접 CRUD를 진행하면 재사용을 하지 못하기 때문이다.
@RequiredArgsConstructor
@Service
public class PostsService {
private final PostsRepository postsRepository;
@Transactional
public Long save(PostsSaveRequestDto requestDto) {
return postsRepository.save(requestDto.toEntity()).getId();
}
}
Service의 예시는 위와 같다.
이처럼 간단한 save 메소드는 다른 메소드에서도 충분히 활용이 가능하다.
3. Repository
Repository는 이름 그대로 저장소이다.
DB와 소통하는 역할을 한다.
Repository도 Entity를 받아 DB와의 연결만을 위하여 존재한다고 생각한다.
public interface PostsRepository extends JpaRepository<Posts, Long> {
@Query("""
SELECT p
FROM Posts p
ORDER BY p.id DESC
""")
List<Posts> findAllDesc();
}
위는 Repository 코드 예시이다.
Repository라는 인터페이스를 통해 DB에 쿼리를 날려 소통한다.
4. 결론
결론으로 Controller는 Client와의 소통을 위한 API의 시작과 끝이라고 생각한다.
Service는 비즈니스 로직 수행 공간이며 Repository는 DB와의 소통 공간이다.
이처럼 각자의 역할에만 충실하도록 코드를 작성한다면 자연스럽게 유지,보수도 쉬워 질것이라 생각한다.
참고
'개발 > Spring Boot' 카테고리의 다른 글
[Spring Boot] 어노테이션 정리 (0) | 2023.05.17 |
---|---|
[Spring Boot] Setter vs Constructor vs Builder (0) | 2023.05.16 |
[Spring Boot] DTO vs VO vs Entity (0) | 2023.05.14 |
[Spring Boot] DI 와 IoC는 무엇일까? (1) | 2023.05.11 |
[Spring Boot] mysql 연결 삽질기 (0) | 2023.04.16 |