[Spring Boot] Controller, Service, Repository

2023. 5. 16. 22:00·개발/Spring Boot
728x90
반응형

Controller와 Service, Repository는 각각 역할이 있다.

https://youngjinmo.github.io/2021/04/dto-vo-entity/

흐름은 위와 같다.

컨트롤러는 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와의 소통 공간이다.

이처럼 각자의 역할에만 충실하도록 코드를 작성한다면 자연스럽게 유지,보수도 쉬워 질것이라 생각한다.

 

참고 

https://github.com/jojoldu/freelec-springboot2-webservice

https://velog.io/@jybin96/Controller-Service-Repository-%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

https://velog.io/@seungho1216/Spring-BootController-Service-Repository%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

728x90
반응형

'개발 > 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  (1) 2023.05.14
[Spring Boot] DI 와 IoC는 무엇일까?  (1) 2023.05.11
[Spring Boot] mysql 연결 삽질기  (0) 2023.04.16
'개발/Spring Boot' 카테고리의 다른 글
  • [Spring Boot] 어노테이션 정리
  • [Spring Boot] Setter vs Constructor vs Builder
  • [Spring Boot] DTO vs VO vs Entity
  • [Spring Boot] DI 와 IoC는 무엇일까?
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    node
    컨테이너
    go
    erc20
    30일 챌린지
    블록체인
    js
    node.js
    html
    mysql
    30일챌린지
    go언어
    nodejs
    도커
    CSS
    ERC721
    하이퍼레저
    React
    프로그래머스
    명령어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[Spring Boot] Controller, Service, Repository
상단으로

티스토리툴바