Spring Boot 개발환경 설정, 포스트맨 테스트 & 깃 관리 정리
유레카 미니 프로젝트 진행 전, 개인 공부를 위해 작성한 자료입니다.
스프링부트란?
Spring Boot는 스프링 프레임워크의 복잡한 설정을 단순화하여 빠르고 효율적인 애플리케이션 개발을 가능하게 하는 프레임워크입니다. 주요 특징은 다음과 같습니다:
- 자동 설정(Auto Configuration): 애플리케이션 실행 환경에 맞게 필요한 설정을 자동으로 구성해줍니다.
- 독립 실행형 애플리케이션: 내장 톰캣, 제티 등 웹 서버를 포함하여 별도의 서버 설치 없이 애플리케이션을 실행할 수 있습니다.
- 프로덕션 친화적 기능: 모니터링, 로깅, 보안 등 프로덕션 환경에 필요한 다양한 기능을 제공합니다.
개발환경
개발환경에 따라 설정 방법에 차이가 있을 수 있으니 참고 부탁드립니다.
- 운영체제: macOS (M3 칩)
- IDE: IntelliJ IDEA Ulimate (버전 2024.03)
- Java 버전: Java 17
- 빌드 도구: Gradle (Groovy)
프로젝트 생성 시 설정
IntelliJ IDEA에서 새 프로젝트 생성 시 아래와 같이 설정합니다.
만약 Community이시면 Spring Initializr를 활용하여 다운로드받으시면 됩니다.
- 프로젝트 생성 경로:
- 상단 메뉴의 파일 → 새 프로젝트 또는 메인 창에서 새 프로젝트 생성 선택
- 프로젝트 기본 설정:
- 언어: Java
- 빌드 관리 도구: Gradle - Groovy (또는 Maven)
- 그룹 및 패키지 설정:
- Groiup은 보통 기업명 또는 도메인 (예:
com.example
)을 사용하고, Artifact는 결과물의 의미를 고려하여 작성합니다.
- Groiup은 보통 기업명 또는 도메인 (예:
- JDK 설정:
- Amazon Corretto 17 (arm64) 사용
- 패키지 유형:
- JAR 파일로 패키징
종속성 설정
- Spring Boot DevTools:
- 파일 변경 시 자동으로 애플리케이션을 재시작하는 라이브 서버 기능 제공
- Lombok:
- Getter, Setter, 생성자 등의 메서드를 어노테이션으로 자동 생성
- Spring Data JPA:
- 데이터베이스 관리를 위한 ORM 라이브러리 (Hibernate 포함)
- MySQL 드라이버:
- MySQL 데이터베이스 연동을 위한 라이브러리
- Spring Web:
- 웹 MVC 개발을 위한 기본 구성 요소와 내장 톰캣 서버 제공
- Spring Security:
- 애플리케이션 보안 기능(인증 및 권한 부여)을 지원
- OAuth2 Client / OAuth2 Resource Server:
- OAuth2 기반 로그인 및 리소스 서버 기능
- 소셜로그인, 인증 및 인가가 필요하다면 사용 가능
- H2 Database:
- 경량 데이터베이스로, 주로 개발 및 테스트 환경에서 사용
- MyBatis:
- SQL 매퍼 프레임워크로, 복잡한 쿼리 관리를 보다 용이하게 도와줌
초기 프로젝트 빌드 및 실행
실행하면 다음 화면이 뜨는데..
이는 Spring Security의 기본 설정 때문이므로, 이를 제외하기 위해 메인 함수 어노테이션에 다음 코드를 추가합니다.
// @SpringBootApplication
@SpringBootApplication(exclude ={SecurityAutoConfiguration.class} )
localhost:8080 접속 시 다음과 같은 화면이 뜨면 성공입니다.
Postman으로 REST API 설계하고 테스트하기
포스트맨(Postman)은 API 테스트를 간단히 해볼 수 있는 도구입니다.
특히 Rest API로 만들면 주소와 메서드만 보고도 요청 내용을 파악하기 용이합니다.
- 폴더 및 리퀘스트 생성:
- 프로젝트별 또는 기능별로 폴더를 생성하고, 그 안에 새로운 API 리퀘스트를 추가합니다.
- GET 요청 테스트:
- 별도의 요청 바디 없이 URL로 간단한 GET 요청을 전송하여 서버의 응답을 확인합니다.
- 만약 파라미터가 필요하다면 {{}} 내부에 파라미터 값을 넣어서 보내야 합니다.
- POST/PUT 요청 테스트:
- 요청 바디(Request Body)가 필요한 경우
raw
를 선택하고 JSON 형식을 선택한 후, {} 내부에 데이터를 입력하고 전송합니다.
- 요청 바디(Request Body)가 필요한 경우
먼저 mysql 데이터베이스에서 확인한 book 테이블은 다음과 같습니다.
이를 바탕으로 isbn을 key로 하여, 책 정보를 확인할 수 있도록 API를 설계하고 확인할 수 있습니다.
아주 간단한 Get 요청을 MVC 패턴으로 설계해서 확인해봅시다! 내용이 좀 많아서 간단히 설명하겠습니다..!
1️⃣ Controller 계층
HTTP 요청을 받고, 이 요청을 비즈니스 계층으로 전송하는 프레젠테이션 역할을 하는 계층이 컨트롤러입니다.
- URL의 {isbn} 값을 받아서
- 서비스 계층에서 책 정보를 조회한 후
- 조회된 Book 객체를 HTTP 200 응답과 함께 반환합니다.
2️⃣ Model
1. Dao
- @Repository 어노테이션을 통해 Spring이 DAO 객체를 관리하고 주입할 수 있도록 설정합니다. => 어노테이션 등록을 통해 데이터 액세스 객체(DAO) 임을 Spring에게 알려주는 역할을 합니다.
2. Dto
DTO(Data Transfer Object)는 다음과 같은 역할을 합니다
- 데이터 전송용 객체 → Controller, Service, DAO 간 데이터를 주고받을 때 사용하는 것들을 저장합니다.
- 로직을 제외하고 순수한 데이터만 담고 있으며, Getter/Setter 또는 Record 형태로 구성됩니다.
- Entity와 분리하여 보안 및 유지보수성을 높이며, 필요한 데이터만 전달하도록 분리해야 합니다.
Book 객체와 데이터베이스의 필드에 대한 게터, 세터 함수를 정의했습니다.
3. Service
서비스 계층은 비즈니스 로직 담당 계층입니다.
@Service 빈을 등록해야 하고, 해당 코드에서의 역할은 다음과 같습니다.
- DAO를 호출하여 데이터 조회 → dao.search(isbn)을 통해 DB에서 책 정보를 가져옴
- 비즈니스 로직 처리 → 조회된 책이 없으면 BookException을 발생시켜 예외 처리
- 예외 관리 → SQLException이 발생하면 BookException으로 변환하여 던짐
3️⃣ View
Spring Boot만으로 뷰를 확인하려면, 템플릿 엔진을 활용하여 서버 측에서 뷰를 렌더링해야 합니다.
보통 스프링부트는 API만 제공하는 서버로 작동하며, 프론트엔드와 연동해 뷰를 확인할 수 있습니다. 보통 포트번호가 다르기 때문에, CORS나 프록시 설정이 필요합니다. 지금은 RESTFul 설계에만 집중해보고, 바로 포스트맨 실습을 해보도록 하겠습니다.
새 폴더를 만들고, book으로 이름을 변경합니다.
항상 해당하는 도메인으로 설정해야 합니다.
이런식으로 New Request를 통해 새 요청을 만들고 isbn으로 설정합니다.
다음은 요청을 보낼 경로를 입력해줍니다.
주의할 점은 파라미터를 중괄호 2개로 감싸고, 안에 밸류값으로 테스트할 isbn 문자열을 넣어줘야 합니다.
✅ 성공인 경우 => 200 OK!
응답으로 JSON 형식의 해당 책 정보가 제대로 리턴됩니다.
아까 확인했던 데이터베이스의 정보와 일치하는 것을 확인할 수 있습니다!
❌실패일 경우 => 500 Error!
이번에는 데이터베이스에 존재하지 않는 번호를 파라미터에 넣어봤습니다.
아까 서비스 계층에서 설정해둔 대로, 등록되지 않은 번호라고 서버 에러 메시지가 뜨는 것을 확인할 수 있습니다.
깃허브에 업로드하기 위한 다양한 설정
버전관리 서비스에 업로드할때에는 아래 사항을 준수하여 깃을 효율적으로 관리해야 합니다.
- .gitignore 파일 생성:
- Toptal Gitignore Generator와 같은 사이트를 활용하여, 운영체제별, 언어별 불필요한 파일들을 자동으로 제외하는
.gitignore
파일을 생성합니다.
- Toptal Gitignore Generator와 같은 사이트를 활용하여, 운영체제별, 언어별 불필요한 파일들을 자동으로 제외하는
- 중요 파일 관리:
- application.properties이나 application.yml 와 같이 데이터베이스 비밀번호 등 민감한 정보가 포함된 파일은 원격 저장소(예: GitHub)에 업로드하지 않도록 주의합니다.
- 커밋 전 확인:
- 커밋 전에 불필요한 파일이나 민감 정보가 포함된 파일이 커밋 대상에 포함되지 않도록 꼼꼼히 확인합니다.
환경변수 보안 설정 및 Spring Boot 애플리케이션 실행
중요한 환경 변수 정보는 .gitignore 파일에 추가하여 Git에 올리지 않도록 보호해야 합니다.
1. .gitignore 설정
먼저, 중요한 환경 변수 파일은 Git에 올리지 않도록 .gitignore 파일에 추가해야 합니다. 예를 들어, .env 파일과 application.yml 파일을 .gitignore에 추가하여 로컬에서만 사용되도록 합니다.
저는 이그노어 파일 자동 생성 사이트를 활용해 복붙했습니다.
2. Gradle 설정 (build.gradle)
Gradle 빌드 파일에서 필요한 환경 변수 파일을 로드하고, 이를 애플리케이션에서 사용할 수 있도록 설정합니다.
서비스 형태에 따라 적절히 설정하면 됩니다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.3'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'org.test'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.4'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.h2database:h2'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.4'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
3. application.properties 설정
저는 아래와 같이 설정했습니다.
이 파일이나 환경변수 파일에 중요한 비밀번호가 있다면 업로드하지 않도록 주의 합니다!!
spring.application.name=SpringBootTest
server.servlet.context-path=/eureka
server.port=8080
# DataBase Settings : hikariCP : https://github.com/brettwooldridge/HikariCP
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/[DB명]?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8
spring.datasource.hikari.username=[유저네임]
spring.datasource.hikari.password=[비밀번호]
spring.datasource.hikari.pool-name=hikari-pool
# hikariCP property setting
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.minimum-idle=50
spring.datasource.hikari.connection-timeout=5000
spring.datasource.hikari.connection-init-sql=SELECT 1
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.auto-commit=true
#log level Setting
logging.level.root=info
logging.level.com.upluas.eureka=debug
logging.level.com.zaxxer.hikari.pool=info
#MyBatis Setting
#mybatis.type-aliases-package=com.uplus.eureka.*.model.dto
#mybatis.mapper-locations=mapper/*.xml
spring.mvc.pathmatch.matching-strategy = ANT_PATH_MATCHER
애플리케이션 실행
이제 프로젝트가 준비되었으므로, 애플리케이션을 실행할 수 있습니다.
./gradlew bootRun
애플리케이션이 정상적으로 실행되면, 설정한 환경 변수에 따라 데이터베이스 연결 정보가 적용되고, 애플리케이션이 구동됩니다.
bootRun 시 Gradle이 자동으로 애플리케이션을 컴파일하여 빌드하고, 필요한 모든 의존성도 로드한 뒤 애플리케이션을 바로 실행해 줍니다.
만약 실행 파일을 빌드한 후 실행하려면 ./gradlew build로 빌드하고, 그 후에 java -jar 명령어로 실행해야 합니다.
소스코드는 아래 깃허브 레포에서 확인하실 수 있습니다😊
GitHub - abyss-s/springboot-test
Contribute to abyss-s/springboot-test development by creating an account on GitHub.
github.com