본문 바로가기
IT개발/Spring Boot

Spring Boot 서비스 구조

by 시간기억자 2025. 1. 23.
반응형

 

 

스프링 부트의 서비스 구조

스프링 부트의 서비스 구조는 여러 컴포넌트로 구성되어 있으며, 각 컴포넌트는 서로 다른 책임을 가지고 있습니다. 이 구조를 통해 애플리케이션의 유지보수성과 확장성을 높일 수 있습니다. 

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;
    // 기타 필드

}

 

전체적인 흐름

  1. 클라이언트에서 요청이 발생하면 컨트롤러가 이를 수신합니다.
  2. 컨트롤러는 요청을 처리하기 위해 서비스를 호출합니다.
  3. 서비스는 필요한 경우 DAO를 호출하여 데이터베이스와 상호작용합니다.
  4. 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를 업데이트합니다. 예를 들어, 수정된 상품 목록을 다시 로드하거나, 성공 메시지

를 표시합니다.

 

전체적인 흐름 요약

  1. 클라이언트가 요청을 생성합니다.
  2. 컨트롤러가 요청을 수신하고 처리합니다.
  3. 서비스가 비즈니스 로직을 수행하고 필요한 DAO를 호출합니다.
  4. DAO가 데이터베이스에서 작업을 수행합니다.
  5. Entity가 DTO에서 변환되어 데이터베이스와 매핑됩니다.
  6. DB에서 결과를 반환하여 DAO가 처리합니다.
  7. 서비스가 최종 결과를 컨트롤러로 반환합니다.
  8. 컨트롤러가 클라이언트에 결과를 응답합니다.
  9. 클라이언트가 응답을 처리하여 UI를 업데이트합니다.

 

 

반응형

댓글