우노
[Kotlin] Controller와 Service의 계층 구조 본문
컨트롤러(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
와 같은 인터페이스로 데이터 조회, 저장, 삭제.
- Controller Layer
- 상단 예제 코드 기반 계층 구조 흐름
- Controller:
GET /users
요청을 받으면,UserService
의getAllUsers()
호출. - Service:
getAllUsers()
에서UserRepository
를 호출하여 데이터를 가져옴. - Repository:
findAll()
메서드를 통해 데이터베이스에서 데이터를 조회.
- Controller:
컨트롤러와 서비스를 분리하는 이유
- 유지보수성 향상
- 컨트롤러는 요청/응답만, 서비스는 비즈니스 로직만 관리.
- 각 계층이 독립적이므로 코드 가독성과 유지보수성이 높아짐.
- 재사용성
- 서비스 계층은 여러 컨트롤러에서 공통적으로 호출 가능.
- 동일한 비즈니스 로직을 중복 작성하지 않아도 됨.
- 테스트 용이성
- 역할 분리로 인해 컨트롤러와 서비스를 독립적으로 테스트하기 쉬움.
- 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