스프링 부트 백엔드 개발 강좌, 스프링 부트 프로젝트 디렉터리 구성하며 살펴보기

스프링 부트는 자바 기반의 애플리케이션을 쉽게 개발할 수 있도록 도와주는 프레임워크입니다. 최근 들어 많은 기업과 개발자들이 스프링 부트를 선택하고 있으며, 그 이유는 빠른 프로토타이핑, 편리한 설정, 강력한 기능 등 여러 가지 장점에 기인합니다. 이번 강좌에서는 스프링 부트를 이용한 백엔드 개발 과정 중 프로젝트 디렉터리를 구성하고, 각 디렉터리의 역할과 사용법을 자세히 설명하겠습니다.

스프링 부트란?

스프링 부트는 스프링 프레임워크를 기반으로 한 오픈소스 프레임워크로, 개발자가 애플리케이션을 더욱 빠르고 쉽고 효율적으로 개발할 수 있도록 돕는 기능을 제공합니다. 스프링 부트의 주요 특징 중 하나는 관습을 통한 설정입니다. 이를 통해 개발자는 최소의 설정으로도 애플리케이션을 실행할 수 있습니다. 또한, 다양한 스타터(Starter)를 제공하여 필요한 라이브러리와 설정을 손쉽게 추가할 수 있습니다.

스프링 부트 프로젝트 구조

스프링 부트 프로젝트는 전통적인 자바 프로젝트 구조와 유사하지만, 몇 가지 특유의 디렉터리와 파일들이 존재합니다. 스프링 부트를 사용하여 생성한 기본 프로젝트 구조는 다음과 같습니다:

project-root/
│
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── demo/
│   │   ├── resources/
│   │   │   └── application.properties
│   │   └── webapp/
│   └── test/
│       └── java/
└── pom.xml

1. src/main/java

이 디렉터리에는 애플리케이션의 Java 코드가 위치합니다. 보통 패키지 구조는 도메인 및 기능에 따라 설계되며, 일반적으로 도메인 모델, 서비스, 컨트롤러, 레포지터리 등의 패키지를 포함합니다. 예를 들어:

com/
└── example/
    └── demo/
        ├── controller/
        ├── service/
        ├── repository/
        └── model/

2. src/main/resources

이 디렉터리는 애플리케이션의 설정 파일 및 정적 리소스를 포함합니다. 가장 중요한 파일은 application.properties 또는 application.yml로, 애플리케이션의 동작을 제어하는 다양한 설정을 포함합니다. 여기에는 데이터베이스 연결 정보, 서버 포트, 로깅 설정 등이 포함됩니다.

application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret

3. src/test/java

단위 테스트 및 통합 테스트를 위한 Java 코드가 위치합니다. 스프링 부트는 JUnit 및 Mockito와 같은 다양한 테스트 프레임워크와 쉽게 통합될 수 있습니다. 이 공간에서 테스트를 설계하고 실행함으로써, 애플리케이션의 안정성을 높일 수 있습니다.

4. pom.xml or build.gradle

스프링 부트 애플리케이션은 Maven 또는 Gradle을 빌드 도구로 사용할 수 있습니다. 해당 파일에서는 프로젝트의 의존성과 빌드 설정을 정의합니다. Maven을 사용하는 경우 예시는 다음과 같습니다:


    4.0.0
    com.example
    demo
    0.0.1-SNAPSHOT
    jar
    demo
    Demo project for Spring Boot
    
        17
    
    
        
            org.springframework.boot
            spring-boot-starter
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

프로젝트 구성 예시: 간단한 REST API 만들기

이제, 스프링 부트를 이용하여 간단한 REST API를 만들어 보겠습니다. 필요한 디렉터리와 파일을 만들고, 각각의 역할을 설명하겠습니다.

1. 모델 클래스 생성

먼저, 애플리케이션에서 사용할 모델 클래스입니다. 예를 들어, Product 클래스를 생성하겠습니다. 이 클래스는 상품의 정보를 나타냅니다.

package com.example.demo.model;

public class Product {
    private Long id;
    private String name;
    private double price;

    // Getters and setters
}

2. 레포지터리 인터페이스 생성

데이터베이스와 상호작용하기 위한 레포지터리 인터페이스를 생성합니다. Spring Data JPA를 사용하여 레포지터리를 쉽게 설정할 수 있습니다.

package com.example.demo.repository;

import com.example.demo.model.Product;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository {
}

3. 서비스 클래스 생성

비즈니스 로직을 구현하기 위한 서비스 클래스를 추가합니다. 이곳에서는 상품에 대한 CRUD (Create, Read, Update, Delete) 작업을 처리합니다.

package com.example.demo.service;

import com.example.demo.model.Product;
import com.example.demo.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ProductService {
    @Autowired
    private ProductRepository productRepository;

    public List getAllProducts() {
        return productRepository.findAll();
    }

    public Product getProductById(Long id) {
        return productRepository.findById(id).orElse(null);
    }

    public void createProduct(Product product) {
        productRepository.save(product);
    }

    public void updateProduct(Long id, Product product) {
        Product existingProduct = productRepository.findById(id).orElse(null);
        if (existingProduct != null) {
            existingProduct.setName(product.getName());
            existingProduct.setPrice(product.getPrice());
            productRepository.save(existingProduct);
        }
    }

    public void deleteProduct(Long id) {
        productRepository.deleteById(id);
    }
}

4. 컨트롤러 클래스 생성

HTTP 요청을 처리하는 컨트롤러 클래스를 생성합니다. 이 클래스에서는 REST API의 엔드포인트를 정의합니다.

package com.example.demo.controller;

import com.example.demo.model.Product;
import com.example.demo.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/products")
public class ProductController {
    @Autowired
    private ProductService productService;

    @GetMapping
    public List getAllProducts() {
        return productService.getAllProducts();
    }

    @GetMapping("/{id}")
    public ResponseEntity getProductById(@PathVariable Long id) {
        Product product = productService.getProductById(id);
        if (product == null) {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
        return new ResponseEntity<>(product, HttpStatus.OK);
    }

    @PostMapping
    public ResponseEntity createProduct(@RequestBody Product product) {
        productService.createProduct(product);
        return new ResponseEntity<>(HttpStatus.CREATED);
    }

    @PutMapping("/{id}")
    public ResponseEntity updateProduct(@PathVariable Long id, @RequestBody Product product) {
        productService.updateProduct(id, product);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity deleteProduct(@PathVariable Long id) {
        productService.deleteProduct(id);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }
}

스프링 부트의 빌드 및 실행

이제 모든 구성 요소가 준비되었으므로, 애플리케이션을 빌드하고 실행해 보겠습니다. Spring Boot는 내장된 서버를 사용하여 애플리케이션을 실행하는 것을 매우 쉽게 만들어줍니다. 다음의 커맨드로 애플리케이션을 실행할 수 있습니다:

./mvnw spring-boot:run

애플리케이션이 시작되면, 브라우저나 API 테스트 도구(Postman 등)를 사용하여 http://localhost:8080/api/products 엔드포인트에 GET 요청을 보낼 수 있습니다.

결론

이번 강좌에서는 스프링 부트를 이용한 백엔드 개발의 기초를 배웠습니다. 프로젝트 디렉터리 구조를 이해하고, 간단한 REST API를 구현하는 과정을 통해 스프링 부트의 매력을 느낄 수 있었습니다. 앞으로 더 복잡한 기능들과 보안, 데이터베이스, 프론트엔드 연동 등 다양한 주제로 나아갈 수 있습니다.

스프링 부트는 매우 강력한 툴이며, 이러한 기초를 잘 쌓아둔다면 더욱 복잡한 어플리케이션을 개발하는 데 큰 도움이 될 것입니다. 여러분의 개발 여정에 대한 더 많은 질문이나 궁금증이 있다면, 주저하지 말고 댓글로 남겨 주시기 바랍니다!