Client → Controller → Service → Repository → DB
↑ ↓
비즈니스 로직 CRUD
Controller → 요청 처리
Service → 핵심 로직
Repository → DB 접근
쉽게 비유
- 📞 Controller = 고객 전화 받는 상담원
- 🧠 Service = 문제 해결하는 전문가
- 📂 Repository = 정보 저장소, 데이터 담당 직원
왜 이 구조를 쓰나?
- 관심사 분리 (Separation of Concerns) → 유지보수 용이
- 테스트 용이 → 각 계층 단위 테스트 가능
- 재사용성 → 비즈니스 로직과 DB 로직 독립적
- 유연한 확장성 → 다른 DB, 외부 API 연동 쉽게 대체 가능
설명
Controller
- HTTP 요청 받기 (예: GET /users)
- 요청 파라미터 검증
- Service에 요청 위임
- Service 결과를 HTTP 응답으로 반환
- 예시
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
@GetMapping("/{id}")
public UserDto getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}
Service
- 비즈니스 규칙 처리
- 여러 Repository 호출하거나, 트랜잭션 관리
- 복잡한 계산, 도메인 모델 조작
- 예시
@Service
public class UserService {
private final UserRepository userRepository;
public UserDto getUserById(Long id) {
User user = userRepository.findById(id)
.orElseThrow(() -> new UserNotFoundException());
return new UserDto(user);
}
}
Repository
- DB와 직접 통신 (JPA, MyBatis 등)
- Entity CRUD 담당
- 예시:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
어노테이션
1. @RestController
✅ 역할:
- HTTP 요청을 받아 처리하는 클래스임을 Spring에게 알려줌.
- 클라이언트 → 서버 간 통신 담당 (API 엔드포인트)
✅ 포인트:
- 내부적으로 @Controller + @ResponseBody 조합
- 반환값은 JSON, XML 등으로 자동 변환되어 HTTP 응답 본문으로 전달됨.
✅ 주로 하는 일:
- URL 매핑 (@GetMapping, @PostMapping 등)
- 요청 파라미터 검증
- 서비스 계층 호출
- HTTP 응답 반환
2. @Service
✅ 역할:
- 비즈니스 로직을 수행하는 클래스임을 Spring에게 알려줌.
- Controller와 Repository 사이에서 핵심 기능 처리
✅ 포인트:
- 주로 트랜잭션 처리, 도메인 로직, 여러 Repository/외부 API 호출 등을 조합
- @Transactional 자주 사용
✅ 주로 하는 일:
- 특정 조건/규칙에 따른 로직 수행
- 데이터 가공, 계산
- 여러 데이터 소스 처리
3. @Repository
✅ 역할:
- 데이터베이스에 접근하는 클래스임을 Spring에게 알려줌.
- CRUD 기능 수행 (Create, Read, Update, Delete)
✅ 포인트:
- Spring Data JPA, MyBatis, JDBC 사용
- 데이터베이스 예외를 Spring이 DataAccessException으로 변환해줌 (예외 전환 기능)
✅ 주로 하는 일:
- Entity 조회, 저장, 삭제
- 쿼리 작성
'프레임워크 > Spring' 카테고리의 다른 글
의존, 의존성 주입(DI) (0) | 2025.03.25 |
---|---|
Spring Framework 개념 구조화 (0) | 2025.03.23 |
[김영한] 스프링 입문(5) - 회원 관리 예 - MVC 개발 (1) | 2024.08.30 |
[김영한] 스프링 입문(6) - 스프링 DB 접근 기술 (0) | 2024.08.22 |
[김영한] 스프링 입문(4) - 스프링 빈과 의존관계 (0) | 2024.08.20 |