오늘은 스프링 부트에서 Controller, Service, Repository의 각 역할과 상호작용에 대하여 간단히 포스팅해보도록 하겠다.
Controller
Client와 상호작용
사용자 요청을 받아 Service로 전달하며, 처리 결과를 응답하여 사용자에게 반환한다.
Front-end와 연관지어서 생각한다면, 프론트(웹)으로부터의 요청에서 데이터를 받은 후 Service에 넘기면서 Service를 호출한다고 보면 된다.
모든 로직이 수행된 이후에는, 그 결과가 화면에 나타나도록 View에 전달하는 역할도 한다.
@Controller
@RequiredArgsConstructor
public class MemberController {
// 생성자
private final MemberService memberService;
// 로그인 화면 요청하기
@GetMapping("/member/login")
public String loginRequest() {
return "login";
}
//중략
}
Service
비즈니스 로직 및 트랜잭션을 처리
DB의 데이터가 필요할 때 Repository에 데이터를 요청하는 등, Repository와 상호작용한다.
(Repository를 상속받아 Repository의 메서드들을 사용)
@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
//중략
}
Repository
DB와 상호작용
DAO와 거의 유사한 개념이라고 보면 된다. DB와 직접적으로 연결되어 있으며, 데이터를 가져오거나 저장한다.
Repository와 DAO의 차이를 정확하게 설명하자면,
Repository : 엔티티 객체를 보관 및 관리하는 저장소
DAO : Data Access Object, 실제로 DB에 접근. 데이터에 접근할 수 있도록 DB 접근과 관련된 로직들을 모아놓음
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
}
일반적으로 위처럼 JpaRepository를 상속받아 사용한다. (JPA에 관해서는 이후 자세하게 포스팅할 예정이다.)
이런 방식으로 사용하면 get(), findAll(), delete(), save() 등 기본적인 CRUD 기능들을 편하게 구현할 수 있다.
(즉, 복잡한 DB 코드 작성을 하지 않아도 된다. (entity 매니저 사용))
정리
Client - Controller - Service - Repository - DB를 식당에 비유하자면 아래와 같다.
Client | 식당에 방문한 손님 (요청을 보내고, 응답을 받는다) |
Controller | 식당 직원 (요청을 받고, 주방에 전달하고 결과물을 가져와 손님에게 전달) |
Service | 주방, 손님이 주문한 음식을 요리하는것 (요청을 처리) |
Repository | 냉장고 (필요한 데이터를 DB에서 가져오거나 데이터를 DB에 저장) |
DB | 식재료 저장소 (모든 데이터가 저장되는곳) |
실제 과정을 5단계로 정리하자면, 아래와 같다!
1. 사용자가 Controller에 요청을 보낸다.
2. Controller는 Service에 요청을 전달한다.
3. Service는 Repository를 사용하여 DB에서 정보를 가져온다.
4. 가져온 데이터를 DTO 형태로 변환 후, Controller에 전달한다.
5. 최종적으로 Controller가 Client에 응답을 보낸다.
'Spring boot' 카테고리의 다른 글
[Spring boot] - DTO와 Entity에 대해 (0) | 2025.02.12 |
---|---|
[Spring boot] - 스프링 부트 프로젝트 구조 (계층형 vs 도메인형) (0) | 2025.02.09 |
[Spring boot] - Entity 개념 정리 (0) | 2025.02.08 |
[Spring Boot] - application.yml 설정하기 (application.properties와의 차이점) (0) | 2025.02.06 |