오늘의 인기 글
최근 글
최근 댓글
Today
Total
12-21 08:06
관리 메뉴

우노

[Kotlin] Controller와 Service의 계층 구조 본문

Web_App/Kotlin

[Kotlin] Controller와 Service의 계층 구조

운호(Noah) 2024. 12. 20. 11:40

컨트롤러(Controller)와 서비스(Service)의 개념

  • Spring Framework에서 컨트롤러(Controller)와 서비스(Service)는 애플리케이션 아키텍처의 중요한 부분으로, 각각의 역할과 책임이 명확히 나뉘어 있습니다.
  • 이 둘은 Spring MVC(Model-View-Controller) 패턴의 일부로, 애플리케이션의 데이터 흐름을 구조화하고 유지보수를 용이하게 합니다.

컨트롤러(Controller)

  • 컨트롤러는 클라이언트의 요청을 받아 응답을 반환하는 역할을 합니다. 주로 RESTful API 개발에서 사용됩니다.

    • 역할

      • 사용자가 보낸 요청(Request)을 받고, 적절한 서비스를 호출하여 처리 결과를 반환(Response).
      • URL 경로를 매핑하고 HTTP 요청을 처리.
      • 데이터를 직접 처리하지 않고, 비즈니스 로직은 서비스에 위임.
    • 특징

      • 요청/응답 흐름을 관리.
      • REST API에서는 @RestController를 사용하여 JSON 데이터를 반환.
      • Spring MVC 뷰를 사용하는 경우 @Controller를 사용.
    • 예제

        import org.springframework.web.bind.annotation.*;
      
        @RestController
        @RequestMapping("/users") // 모든 요청이 /users로 시작
        public class UserController {
      
            private final UserService userService;
      
            public UserController(UserService userService) {
                this.userService = userService; // Service 의존성 주입
            }
      
            @GetMapping
            public List<User> getAllUsers() {
                return userService.getAllUsers(); // 서비스 호출
            }
      
            @GetMapping("/{id}")
            public User getUserById(@PathVariable Long id) {
                return userService.getUserById(id); // 서비스 호출
            }
      
            @PostMapping
            public User createUser(@RequestBody User user) {
                return userService.createUser(user); // 서비스 호출
            }
        }

서비스(Service)

  • 서비스는 비즈니스 로직을 처리하는 계층으로, 컨트롤러와 데이터 액세스 계층(Repository) 사이에서 중간 역할을 합니다.

    • 역할

      • 컨트롤러에서 받은 요청 데이터를 바탕으로 실제 처리 작업 수행.
      • 데이터베이스와의 직접적인 상호작용은 Repository에 위임.
      • 애플리케이션의 핵심 로직 구현 및 재사용 가능한 메서드 작성.
    • 특징

      • 데이터 검증, 트랜잭션 관리 등의 비즈니스 로직 포함.
      • 데이터 액세스 코드와 컨트롤러 코드를 분리하여 의존성을 줄임.
    • 예제

        import org.springframework.stereotype.Service;
      
        @Service
        public class UserService {
      
            private final UserRepository userRepository;
      
            public UserService(UserRepository userRepository) {
                this.userRepository = userRepository; // Repository 의존성 주입
            }
      
            public List<User> getAllUsers() {
                return userRepository.findAll(); // 데이터베이스에서 모든 유저 조회
            }
      
            public User getUserById(Long id) {
                return userRepository.findById(id)
                        .orElseThrow(() -> new RuntimeException("User not found"));
            }
      
            public User createUser(User user) {
                return userRepository.save(user); // 새로운 유저 저장
            }
        }

컨트롤러와 서비스의 계층 구조

  • Spring MVC 애플리케이션의 계층 구조는 아래와 같습니다
    • Controller Layer
      • 사용자의 요청을 받음 → 적절한 HTTP 응답 반환.
      • @RestController, @RequestMapping, @GetMapping 등을 사용.
    • Service Layer
      • 비즈니스 로직 처리.
      • @Service를 사용하여 선언.
    • Repository Layer
      • 데이터베이스와의 상호작용을 담당.
      • JpaRepository와 같은 인터페이스로 데이터 조회, 저장, 삭제.
  • 상단 예제 코드 기반 계층 구조 흐름
    1. Controller: GET /users 요청을 받으면, UserServicegetAllUsers() 호출.
    2. Service: getAllUsers()에서 UserRepository를 호출하여 데이터를 가져옴.
    3. Repository: findAll() 메서드를 통해 데이터베이스에서 데이터를 조회.

컨트롤러와 서비스를 분리하는 이유

  • 유지보수성 향상
    • 컨트롤러는 요청/응답만, 서비스는 비즈니스 로직만 관리.
    • 각 계층이 독립적이므로 코드 가독성과 유지보수성이 높아짐.
  • 재사용성
    • 서비스 계층은 여러 컨트롤러에서 공통적으로 호출 가능.
    • 동일한 비즈니스 로직을 중복 작성하지 않아도 됨.
  • 테스트 용이성
    • 역할 분리로 인해 컨트롤러와 서비스를 독립적으로 테스트하기 쉬움.
    • Mock 객체를 활용하여 단위 테스트 가능.

'Web_App > Kotlin' 카테고리의 다른 글

[Kotlin] @SqlResultSetMapping  (0) 2024.12.20
[Kotlin] ORM, JPA, Spring Data JPA  (0) 2024.12.18
[Kotlin] @Entity와 @Repository  (0) 2024.12.18
[Kotlin] DTO와 Entity의 관계  (0) 2024.12.17
[Kotlin] @Scheduled 란?  (0) 2024.12.02
Comments