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
앞으로 핵심 로직은!! 도메인에 넣어야겠다..
이전에 진행했던 코드들을 보니 나는 지금까지 코딩을 개떡같이 했구나!!!!!!!!!!!!!!!!!!!!!를 깨달았다
이제부터라도 오늘 정리한 내용을 생각하면서 코딩하자 크하하
'공부 > Spring' 카테고리의 다른 글
[Spring Cloud] 클라이언트 사이드 로드 밸런싱 (FeignClient와 Ribbon) (0) | 2024.08.05 |
---|---|
[Spring Cloud] MSA Spring Cloud (Eureka) (0) | 2024.08.01 |
Springboot 의존성 주입이란? @Autowired의 원리와 동작 과정 (0) | 2024.06.26 |
@Entity 에 @NoArgsConstructor, @AllArgsConstructor는 언제 붙이는걸까? (0) | 2024.06.20 |
[Spring Security] JWT 로그인 흐름 이해하기 (0) | 2024.06.11 |