본문 바로가기
개발관련 이것저것

고수준 & 저수준

by 이상한나라의개발자 2024. 5. 24.

고수준 모듈과 저수준 모듈을 구분하는 것은 소프트웨어 시스템 설계에서 중요한 개념입니다. 이를 이해하려면 각 모듈의 역할과 시스템 내에서의 위치를 고려해야합니다.

 

고수준 모듈 (High-level Module)

고수준 모듈은 시스템의 주요 로직이나 정책을 포함하는 모듈입니다. 이 모듈은 시스템이 수행해야 할 큰 그림을 담당합니다.

  • 비즈니스 로직, 애플리케이션의 주요 기능을 포함합니다.
  • 다른 모듈의 동작을 지시하거나 조정합니다. ( 다른 모듈을 호출하거나 상호작용하는 주요 진입점 )
  • 일반적으로 인터페이스를 통해 다른 모듈과 상호 작용합니다. ( 구체적인 세부 사항을 다루지 않음 )
  • 컨트롤러(OrderController, UserController), 서비스 레이어 (OrderService, UserService..)

저수준 모듈 (Low-level Module)

저수준 모듈은 시스템의 세부 사항을 구현하는 모듈입니다. 이 모듈은 실제 작업을 수행하는 코드로 구성됩니다.

  • 데이터베이스 접근, 파일 I/O, 네트워크 통신 등 구체적인 작업을 수행합니다. ( 기술에 종속적이다.)
  • 구체적인 구현 세부 사항을 포함합니다.
  • 고수준 모듈의 요청을 실제로 수행합니다.
  • 데이터 접근 객체(DAO, OrderRepository, UserRepository)
  • 유틸 클래스 (FileUtil)

레이드 아키텍처에서의 관계

// 도메인 모델 (엔티티)
@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String product;
    private int quantity;
    
    // getters and setters
}

// 데이터 접근 레이어 (저수준 모듈)
@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
    // 기본 CRUD 메서드 제공
}

// 서비스 레이어 (고수준 모듈)
@Service
public class OrderService {
    private final OrderRepository orderRepository;

    @Autowired
    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    public Order createOrder(String product, int quantity) {
        Order order = new Order();
        order.setProduct(product);
        order.setQuantity(quantity);
        return orderRepository.save(order);
    }

    public List<Order> getAllOrders() {
        return orderRepository.findAll();
    }
}

// 프레젠테이션 레이어 (고수준 모듈)
@RestController
@RequestMapping("/orders")
public class OrderController {
    private final OrderService orderService;

    @Autowired
    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    @PostMapping
    public ResponseEntity<Order> createOrder(@RequestBody Order order) {
        Order createdOrder = orderService.createOrder(order.getProduct(), order.getQuantity());
        return ResponseEntity.status(HttpStatus.CREATED).body(createdOrder);
    }

    @GetMapping
    public ResponseEntity<List<Order>> getAllOrders() {
        List<Order> orders = orderService.getAllOrders();
        return ResponseEntity.ok(orders);
    }
}

 

스프링 레이드 아키텍처에서는 프리젠테이션 레이어, 서비스 레이어가 고수준 모듈의 역할을 수행하고, 데이터 접근 레이어가 저수준 모듈 역할을 수행합니다. 이를 통해 스스템의 모듈 간 결합도를 낮추고, 유연성과 유지보수성을 높을 수 있습니다.