스프링 부트의 서비스 구조
스프링 부트의 서비스 구조는 여러 컴포넌트로 구성되어 있으며, 각 컴포넌트는 서로 다른 책임을 가지고 있습니다. 이 구조를 통해 애플리케이션의 유지보수성과 확장성을 높일 수 있습니다.
1. Client
정의: 클라이언트는 애플리케이션의 사용자 인터페이스로, 사용자와 상호작용하는 부분입니다.
역할: 웹 브라우저, 모바일 앱 또는 기타 사용자 인터페이스를 통해 사용자가 요청을 보냅니다. 예를 들어, 사용자가 웹 페이지에서 상품을 수
정하려고 할 때, 클라이언트에서 해당 요청을 생성합니다.
2. Controller
정의: 컨트롤러는 HTTP 요청을 처리하고, 적절한 서비스를 호출하여 응답을 생성하는 역할을 합니다.
역할:
- 요청 URL과 HTTP 메소드를 매핑하여 클라이언트의 요청을 받아 처리합니다.
- 요청에 대한 비즈니스 로직을 처리할 서비스 계층을 호출합니다.
- 최종적으로 응답을 생성하여 클라이언트에 반환합니다.
예시: 클라이언트에서 상품 수정 요청이 들어오면, 해당 요청을 처리하는 컨트롤러 메소드가 호출됩니다.
@Controller
@RequestMapping("/admin")
public class AdminProductController {
// 서비스 주입
private final ProductService productService;
@PostMapping("/product/modify")
public String modifyProduct(@ModelAttribute ProductDTO productDTO) {
productService.modifyProduct(productDTO);
return "redirect:/admin/product";
}
}
3. Service
정의: 서비스는 비즈니스 로직을 처리하는 계층으로, 주로 애플리케이션의 핵심 기능을 구현합니다.
역할:
- 컨트롤러에서 호출되어 비즈니스 로직을 수행합니다.
- 여러 DAO(Repository)를 호출하여 데이터를 가져오거나 저장합니다.
- 트랜잭션 관리와 같은 복잡한 비즈니스 로직을 처리합니다.
예시: 상품 정보를 수정하는 비즈니스 로직을 구현한 서비스 클래스입니다.
@Service
@RequiredArgsConstructor
public class ProductServiceImpl implements ProductService {
private final ProductRepository productRepository;
@Override
public void modifyProduct(ProductDTO productDTO) {
// 비즈니스 로직 처리
}
}
4. DAO (Repository)
정의: 데이터 접근 객체(DAO) 또는 리포지토리는 데이터베이스와의 상호작용을 담당합니다. 스프링 데이터 JPA를 사용하여 데이터베이
스 CRUD 작업을 수행합니다.
역할:
- 데이터베이스에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행합니다.
- 엔티티를 데이터베이스와 매핑하고, SQL 쿼리를 생성하여 실행합니다.
- @Repository 어노테이션을 사용하여 스프링이 자동으로 인식하도록 합니다.
예시: 상품 정보를 관리하는 리포지토리입니다.
@Repository
public interface ProductRepository extends JpaRepository<ProductEntity, Long> {
// 추가적인 쿼리 메소드 정의 가능
}
5. DB (Database)
정의: 데이터베이스는 애플리케이션에서 사용하는 데이터를 저장하는 시스템입니다.
역할: 데이터의 영속성을 보장하며, CRUD 작업을 통해 데이터를 저장하고 조회합니다. 일반적으로 관계형 데이터베이스(예: MySQL, PostgreSQL) 또는 비관계형 데이터베이스(예: MongoDB)를 사용합니다.
6. DTO (Data Transfer Object)
정의: 데이터 전송 객체(DTO)는 데이터 전송을 위한 간단한 객체입니다. 주로 클라이언트와 서버 간의 데이터 교환을 위해 사용됩니다.
역할:
- 필요한 데이터만 포함하여 전송하기 때문에 네트워크 효율성을 높입니다.
- 비즈니스 로직과는 분리되어 있습니다.
예시: 상품 정보를 담고 있는 DTO입니다.
@Data
public class ProductDTO {
private Long prodNo;
private String prodName;
private Double prodPrice;
// 기타 필드
}
7. Entity
정의: 엔티티는 데이터베이스의 테이블과 매핑되는 객체입니다. 데이터베이스의 구조를 반영합니다.
역할:
- 데이터베이스 테이블의 각 행을 객체로 표현합니다.
- JPA를 사용하여 데이터베이스의 CRUD 작업을 수행할 수 있도록 합니다.
예시: 상품 정보를 담고 있는 엔티티입니다.
@Entity
@Table(name = "product")
@Data
public class ProductEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long prodNo;
private String prodName;
private Double prodPrice;
// 기타 필드
}
전체적인 흐름
- 클라이언트에서 요청이 발생하면 컨트롤러가 이를 수신합니다.
- 컨트롤러는 요청을 처리하기 위해 서비스를 호출합니다.
- 서비스는 필요한 경우 DAO를 호출하여 데이터베이스와 상호작용합니다.
- DAO는 DB에서 데이터를 조회하거나 저장합니다.
서비스 또는 컨트롤러는 DTO를 사용하여 데이터 전송을 관리하고, 최종적으로 클라이언트에 응답을 반환합니다.
이러한 구조를 통해 스프링 부트 애플리케이션은 명확한 역할 분담과 높은 유지보수성을 갖추게 됩니다. 각 컴포넌트는 자신의 책임에 집중
하고, 서로 간의 의존성을 최소화하여 코드의 가독성과 테스트 용이성을 높입니다.
스프링 부트의 서비스 구조에서 일반적인 작업 흐름을 단계
1. 클라이언트 요청
행위: 사용자가 웹 애플리케이션의 UI에서 버튼 클릭 또는 링크 클릭 등의 행동을 통해 요청을 발생시킵니다. 예를 들어, 상품 수정 페이지에
서 "수정" 버튼을 클릭합니다.
2. 컨트롤러 수신
행위: 클라이언트의 요청이 웹 서버에 도착하면, 해당 요청을 처리할 컨트롤러가 호출됩니다.
역할:
- 요청 URL과 HTTP 메소드를 매핑하여 적절한 메소드를 실행합니다.
- 요청 파라미터를 읽고, 필요한 경우 DTO 객체로 변환합니다.
@PostMapping("/product/modify")
public String modifyProduct(@ModelAttribute ProductDTO productDTO) {
productService.modifyProduct(productDTO);
return "redirect:/admin/product"; // 수정 후 리다이렉트
}
3. 서비스 호출
행위: 컨트롤러는 비즈니스 로직을 처리하기 위해 서비스 계층을 호출합니다.
역할:
요청에 따라 비즈니스 로직을 수행하고, 필요에 따라 여러 DAO(Repository)를 호출합니다.
public void modifyProduct(ProductDTO productDTO) {
// 비즈니스 로직 처리
}
4. DAO(리포지토리) 호출
행위: 서비스는 데이터베이스와의 상호작용을 위해 DAO를 호출합니다.
역할:
데이터베이스에 대한 CRUD 작업을 수행합니다. 예를 들어, 상품 정보를 업데이트하거나 새로운 이미지를 저장합니다.
public void save(ProductEntity productEntity) {
productRepository.save(productEntity); // 데이터베이스에 저장
}
5. Entity의 생성 및 사용
행위: 서비스는 DTO를 사용하여 DB에 저장할 Entity 객체를 생성합니다.
역할:
- DTO에서 필요한 데이터를 가져와 Entity 객체를 생성하고, 이를 DAO에 전달하여 데이터베이스와 상호작용합니다.
Entity는 데이터베이스의 테이블과 매핑되어, 데이터의 구조를 정의합니다.
ProductEntity productEntity = productDTO.toEntity(mainImageName, subImageName);
6. 데이터베이스 작업
행위: DAO는 DB에 직접 쿼리를 실행하여 데이터의 저장, 조회, 수정, 삭제 작업을 수행합니다.
역할:
- Entity를 사용하여 데이터베이스의 테이블과 상호작용합니다.
- 데이터의 영속성을 보장하며, 애플리케이션의 데이터 상태를 유지합니다.
7. 응답 생성
행위: DAO에서 데이터베이스 작업이 완료되면, 결과를 서비스로 반환합니다.
역할:
서비스는 DAO에서 반환된 데이터를 기반으로 비즈니스 로직을 마무리하고, 필요한 경우 추가적인 처리를 합니다.
8. 컨트롤러에서 클라이언트로 응답
행위: 서비스에서 최종적으로 처리된 결과를 컨트롤러에 반환합니다.
역할:
컨트롤러는 최종 결과를 클라이언트에 응답합니다. 이때, 리다이렉트 또는 뷰 페이지를 반환할 수 있습니다.
return "redirect:/admin/product"; // 수정 후 상품 관리 페이지로 리다이렉트
9. 클라이언트로 결과 전달
행위: 클라이언트는 서버로부터 받은 응답을 처리하여 UI를 업데이트합니다. 예를 들어, 수정된 상품 목록을 다시 로드하거나, 성공 메시지
를 표시합니다.
전체적인 흐름 요약
- 클라이언트가 요청을 생성합니다.
- 컨트롤러가 요청을 수신하고 처리합니다.
- 서비스가 비즈니스 로직을 수행하고 필요한 DAO를 호출합니다.
- DAO가 데이터베이스에서 작업을 수행합니다.
- Entity가 DTO에서 변환되어 데이터베이스와 매핑됩니다.
- DB에서 결과를 반환하여 DAO가 처리합니다.
- 서비스가 최종 결과를 컨트롤러로 반환합니다.
- 컨트롤러가 클라이언트에 결과를 응답합니다.
- 클라이언트가 응답을 처리하여 UI를 업데이트합니다.
'IT개발 > Spring Boot' 카테고리의 다른 글
(React + Typescript) + (Spring Boot + JPA + MySQL) 프로젝트 세팅 / tailwind css 설치 오류 포함 (1) | 2025.02.12 |
---|---|
장바구니 상품삭제 Ajax 에러(해결)_(CSRF 토큰 관련) (0) | 2025.02.05 |
lombok 설치방법(IntelliJ & Eclipse), MacOS (0) | 2024.12.20 |
Spring Boot Entity 클래스(스프링/부트/자바/백엔드개발/프로그래밍/Java/backend) (1) | 2024.11.28 |
Spring Boot JPA Hibernate란?(자바/백엔드/개발/프로그래밍/스프링) (1) | 2024.11.25 |
댓글