공부/Spring

Spring Framework 각 계층의 역할 / 비즈니스 로직은 누구의 역할일까?

린구 2024. 7. 8. 16:22
반응형

 

 

 

 

Spring 프레임워크에서 애플리케이션을 구조화하는 데 사용되는 주요 레이어는 `Domain`, `Repository`, `Service`, `Controller`이다.
각 레이어는 특정한 역할을 담당하여 애플리케이션의 모듈화와 유지보수성을 높인다.
각 레이어의 역할은 다음과 같다.

 

📌 각 계층의 역할

`Domain`

도메인 계층은 애플리케이션의 `핵심 비즈니스 로직과 엔티티`를 포함한다. 주로 비즈니스 객체, 엔티티, 밸류 객체 등을 정의한다.

 

`Repository`

레포지토리 계층은 데이터 저장소와의 상호 작용을 담당한다. 주로 데이터베이스에 접근하여 CRUD 작업을 수행한다.

 

`Service`

서비스 계층은 애플리케이션의 비즈니스 로직을 포함한다. 여러 `도메인 객체와 레포지토리의 조합을 통해 비즈니스 연산`을 수행한다.

 

`Controller`

컨트롤러 계층은 `사용자의 요청을 처리`하고, 적절한 서비스 메서드를 호출하여 결과를 클라이언트로 전달한다.

 

 

`도메인`과 `서비스` 계층은 모두 애플리케이션의 비즈니스 로직을 포함하지만, 그 역할과 책임은 다르다.

📌 도메인, 서비스 계층 비교

도메인

- 애플리케이션의 `핵심 비즈니스 개념과 규칙`을 포함한다.

- 현실에 있는 개념을 나타내는 객체와 엔티티, 그리고 이들의 속성과 행동을 정의한다.

ex) 유효성 검사, 상태 전이, 비즈니스 계산 등

⭐ 가장 중요한 `비즈니스 로직`은 도메인이 할 일이다.

public class User {
    private Long id;
    private String name;
    private String email;

    // 유효성 검증!
    private void validateEmail(String email) {
        if (!email.matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}")) {
            throw new IllegalArgumentException("Invalid email format");
        }
        this.email = email;
    }
}

 

서비스

- 도메인 객체들을 이용하여 비즈니스 로직을 구현한다.

- 도메인 객체와 레포지토리 간 `상호작용`을 관리하고, 트랜잭션과 같은 애플리케이션 로직을 처리한다.

- 도메인 객체를 생성, 수정, 삭제, 조회하는 작업을 레포지토리를 통해 수행한다.

⭐ 로직에 해당하는 `메서드를 호출`하는 것은 서비스가 할 일이다.

 

@Transactional
public Long participate(CopurchasingParticipateRequest request) {
    final Copurchasing copurchasing = copurchasingRepository.findById(request.getCopurchasingId())
            .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 공동구매 게시물입니다."));

    final User participant = userRepository.findById(request.getParticipantId())
            .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 사용자입니다."));

    final int paymentCost = copurchasing.getPaymentCost(request.getPurchaseNumber());
    participant.pay(paymentCost);  // 비즈니스 로직에 해당하는 메서드 호출
    ...

}

 

 

❗ 결론

`Service`: 도메인을 가지고 로직의 메서드 호출

`Domain`: 가장 중요한 비즈니스 로직, validation

 

 


앞으로 핵심 로직은!! 도메인에 넣어야겠다..

이전에 진행했던 코드들을 보니 나는 지금까지 코딩을 개떡같이 했구나!!!!!!!!!!!!!!!!!!!!!를 깨달았다

이제부터라도 오늘 정리한 내용을 생각하면서 코딩하자 크하하

 

 

반응형