
Java 기반 애플리케이션 개발에서 Controller-Service-Repository 구조는 레이어드 아키텍처(Layered Architecture)의 대표적인 형태다. 이 구조는 각 계층의 역할을 명확히 구분하여 유지보수성을 향상시키고 코드의 가독성을 높이는 데 목적이 있다.
- 레이어드 아키텍쳐 : 애플리케이션을 역할별로 계층화하여 관리하는 소프트웨어 설계 방식

Spring MVC 기준으로 @RestController 또는 @Controller 애노테이션 사용.
요청 URL과 메서드를 매핑하기 위해 @RequestMapping 또는 @GetMapping, @PostMapping 등을 사용.
@RestController
@RequestMapping("/orders")
public class OrderController {
private final OrderService orderService;
public OrderController(OrderService orderService) {
this.orderService = orderService;
}
@PostMapping
public ResponseEntity<String> createOrder(@RequestBody OrderRequest orderRequest) {
orderService.createOrder(orderRequest);
return ResponseEntity.ok("Order created successfully!");
}
@GetMapping("/{id}")
public ResponseEntity<OrderResponse> getOrder(@PathVariable Long id) {
OrderResponse order = orderService.getOrderById(id);
return ResponseEntity.ok(order);
}
}
Spring에서는 @Service 애노테이션을 사용.
데이터를 처리하는 로직을 작성하고, Repository를 호출하여 데이터를 저장하거나 불러옴.
@Service
public class OrderService {
private final OrderRepository orderRepository;
public OrderService(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
public void createOrder(OrderRequest orderRequest) {
Order order = new Order(orderRequest.getItemName(), orderRequest.getQuantity());
orderRepository.save(order); // Repository를 통해 DB에 저장
}
public OrderResponse getOrderById(Long id) {
Order order = orderRepository.findById(id)
.orElseThrow(() -> new RuntimeException("Order not found"));
return new OrderResponse(order.getId(), order.getItemName(), order.getQuantity());
}
}
@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
// JpaRepository를 상속받아 기본적인 CRUD 메서드 사용 가능
}@PostMapping
public ResponseEntity<String> createOrder(@RequestBody OrderRequest orderRequest) {
orderService.createOrder(orderRequest); // 요리사에게 요청
return ResponseEntity.ok("Order created successfully!");
}
public void createOrder(OrderRequest orderRequest) {
Order order = new Order(orderRequest.getItemName(), orderRequest.getQuantity());
orderRepository.save(order); // 재료담당 직원에게 요청
}
@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {}
역할 구분을 엄격히 유지:
의존성 주입(DI) 사용:
비즈니스 로직 중복 방지:
여기서 레이어드 아키택쳐나 Spring MVC 애노테이션, 사용자 입력 검증 등에 대해 잘 모르겠으니 2탄에서 이어서 공부해 보겠다.