프로젝트의 구조는 개발 과정에서 매우 중요한 부분이다. 잘 설계된 구조는 개발의 효율성을 높이고, 유지 보수를 용이하게 하며, 팀 구성원 간의 협업을 원활하게 한다. 이번 장에서 Spring Boot와 FastAPI를 사용할 때 일반적으로 나타나는 프로젝트 구조의 차이점에 대해 알아보자.
프로젝트 구조
FastAPI 프로젝트 구조
FastAPI는 비교적 자유로운 구조를 가지고 있으며, 개발자가 선호하는 방식으로 구조를 설정할 수 있다. 그러나 일반적으로 다음과 같은 구조를 따르는 것이 추천된다.
my-fastapi-app/
├── app/
│ ├── __init__.py # Python 파일로 애플리케이션 초기화
│ ├── main.py # FastAPI 앱 인스턴스 생성 및 설정
│ ├── dependencies.py # 의존성 관리 (예: 데이터베이스 세션)
│ ├── models/ # 모델 클래스 (Pydantic 모델 포함)
│ │ ├── __init__.py
│ │ ├── item.py
│ │ └── user.py
│ ├── schemas/ # 스키마 클래스 (입력/출력 모델)
│ │ ├── __init__.py
│ │ ├── item.py
│ │ └── user.py
│ ├── crud/ # CRUD 연산 함수
│ │ ├── __init__.py
│ │ ├── item_crud.py
│ │ └── user_crud.py
│ └── routers/ # 라우터 모듈
│ ├── __init__.py
│ ├── items.py
│ └── users.py
├── tests/
│ ├── __init__.py
│ ├── test_main.py
│ └── test_routers/
│ ├── __init__.py
│ ├── test_items.py
│ └── test_users.py
└── requirements.txt # 의존성 목록 파일
main.py
: 애플리케이션을 시작하는 메인 파일app/
: 애플리케이션의 소스 코드를 포함하는 디렉터리routers/
: 라우터 및 엔드포인트 정의를 포함models/
: 데이터 모델 정의를 포함schemas/
: 요청 및 응답 스키마 정의를 포함crud/
: 데이터베이스 CRUD(Create, Read, Update, Delete) 연산을 위한 함수를 포함dependencies.py
: 의존성 주입을 위한 함수를 포함
tests/
: 단위 및 통합 테스트 코드 위치
FastAPI 프로젝트 구조는 유연성을 제공하며, 특히 비동기 프로그래밍을 적극적으로 활용하는 프로젝트에 적합하다.
Spring Boot 프로젝트 구조
Spring Boot는 일반적으로 다음과 같은 구조를 가진다(Gradle
기준):
my-spring-boot-app/
├── gradlew
├── gradlew.bat
├── settings.gradle
├── build.gradle
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── mycompany/
│ │ │ └── myapp/
│ │ │ ├── controller/
│ │ │ ├── service/
│ │ │ ├── repository/
│ │ │ └── model/
│ │ └── resources/
│ │ ├── static/
│ │ ├── templates/
│ │ └── application.yml
│ └── test/
│ ├── java/
│ │ └── com/
│ │ └── mycompany/
│ │ └── myapp/
│ └── resources/
└── .gitignore
src/main/java/
: 애플리케이션의 주요 소스 코드 위치com.example.project
: 기본 패키지 디렉터리controller
: 웹 요청을 처리하는 컨트롤러 클래스 포함service
: 비즈니스 로직을 처리하는 서비스 클래스 포함repository
: 데이터베이스와의 상호작용을 담당하는 리포지토리 클래스 포함model
orentity
: 데이터 모델 클래스 포함
src/main/resources/
: 설정 파일 및 기타 리소스 파일 포함application.properties
orapplication.yml
: 애플리케이션 설정 파일
src/test/java/
: 단위 및 통합 테스트 코드 위치gradlew
와gradlew.bat
:Gradle
래퍼 파일로, 프로젝트에Gradle
이 설치되어 있지 않은 환경에서도 빌드할 수 있게 해준다.settings.gradle
: 프로젝트 설정을 담고 있으며, 프로젝트의 이름 또는 포함될 서브 프로젝트들을 설정할 수 있음build.gradle
: 프로젝트의 빌드 구성을 정의합니다. 의존성 관리, 플러그인 설정, 빌드 스크립트 등을 포함
이러한 구조는 MVC
(Model-View-Controller) 패턴을 따르며, 각 계층의 역할이 명확히 분리되어 있어 개발과 유지 보수가 용이하다.
프로젝트 시작
FastAPI 시작하기
FastAPI
프로젝트에서는 일반적으로 main.py
파일을 만들고, 이 파일 안에 FastAPI 앱 인스턴스를 생성하는 코드를 작성한다. 그 후, Uvicorn
이라는 ASGI
서버를 사용하여 앱을 실행한다. Uvicorn
은 비동기 서버 게이트웨이 인터페이스(ASGI)를 구현한 것으로, FastAPI
와 같이 비동기 프레임워크를 위해 설계되었다.
main.py
예시:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
이 코드는 루트 URL (/
) 에 접근했을 때 {"Hello": "World"}
를 JSON
형태로 반환하는 간단한 FastAPI
앱이다.
이 앱을 실행하기 위해서는 터미널에서 Uvicorn
을 사용한다.
아래 명령어는 개발용 서버를 시작하며, 코드 변경이 발생하면 자동으로 재시작한다.
uvicorn main:app --reload
Spring Boot 시작하기
Spring Boot 프로젝트에서는 @SpringBootApplication
어노테이션이 적용된 메인 클래스를 만들고, 이 클래스에서 SpringApplication.run()
메서드를 호출하여 애플리케이션을 시작한다.
Gradle
이나 Maven
을 사용한 빌드 툴 설정 파일(build.gradle
또는 pom.xml
)에 필요한 Spring Boot 의존성을 추가해야 한다.
MyApplication.java
예시:
package com.mycompany.myapp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
이 코드는 Spring Boot
애플리케이션을 시작하는 기본적인 예제다. @SpringBootApplication
어노테이션은 스프링 부트 애플리케이션의 핵심 설정을 활성화한다.
Spring Boot
프로젝트를 실행하는 방법은 여러 가지가 있지만, Gradle
을 사용하는 경우 다음과 같은 명령어를 사용할 수 있다.
./gradlew bootRun
또는 jar
파일을 만들어서 실행하는 방법도 있다. 이는 배포나 다른 환경에서 애플리케이션을 실행할 때 사용된다.
./gradlew build
위 명령어 실행시, build/libs
디렉토리에 실행 가능한 jar
파일이 생성된다.
jar
파일을 실행하려면 다음과 같은 명령어를 사용한다.
java -jar build/libs/myapplication-0.0.1-SNAPSHOT.jar
'프레임워크 > FastAPI로 이해하는 Spring Boot' 카테고리의 다른 글
(FastAPI로 이해하는 Spring Boot) 3. REST API 설계 (0) | 2024.05.06 |
---|---|
(FastAPI로 이해하는 Spring Boot) 1. 개발환경 비교 (0) | 2024.04.14 |
(FastAPI로 이해하는 Spring Boot) 0. 들어가면서 (1) | 2024.04.07 |