./gradlew bootRun으로 기본 실행 확인spring-boot-starter-actuator 추가 → /actuator/health로 기동성 확인Gradle의 Spring Boot 플러그인이 제공하는 실행 태스크입니다.
소스코드를 컴파일하고(리소스 포함) 메인 클래스를 JVM에서 바로 띄웁니다. JAR로 패키징하지 않아도 개발 중 즉시 실행할 수 있습니다.
@SpringBootApplication이 붙은 클래스 기준build/classes/java/main + build/resources/main + 의존 라이브러리Spring Boot는 --key=value 형식을 인식합니다.
./gradlew bootRun --args='--spring.profiles.active=dev --server.port=8081'
./gradlew bootRun --args='--logging.level.root=debug'
메모리, 모듈 오픈, 디버깅 포트 등은 JVM 인자에 넣습니다.
# 한 번에 전달
./gradlew -Dspring-boot.run.jvmArguments="-Xms512m -Xmx1g" bootRun
# build.gradle.kts에 고정
tasks.bootRun {
jvmArgs("-Xms512m", "-Xmx1g")
}
Xms512m : JVM 힙(Heap)의 시작/최소 크기를 512MiB로 설정Xmx1g : JVM 힙의 최대 크기를 1GiB(=1024MiB)로 제한# 환경변수로
SPRING_PROFILES_ACTIVE=prod ./gradlew bootRun
# 또는 프로그램 인자로
./gradlew bootRun --args='--spring.profiles.active=prod'
# 또는 시스템 프로퍼티로
./gradlew -Dspring-boot.run.profiles=prod bootRun
# Gradle의 JavaExec 디버그(디폴트 5005, suspend=Y)
./gradlew bootRun --debug-jvm
# 혹은 JVM 인자 직접 지정(서버 모드, 비대기)
./gradlew -Dspring-boot.run.jvmArguments="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" bootRun
./gradlew bootRun --info
./gradlew bootRun --stacktrace
spring-boot-devtools 추가bootRun 실행 + 코드 저장 → DevTools가 자동 재시작./gradlew -t classes # 변경 감지하여 지속 컴파일
참고: Windows에선
gradlew.bat를 사용하세요.
파일 저장 → 자동 컴파일 → DevTools가 재시작되게 세팅합니다.
File > Settings > Build, Execution, Deployment > CompilerFile > Settings > Advanced SettingsBuild, Execution, Deployment > Build Tools > Gradle이제 Run(또는 Debug)로 띄운 뒤 코드 저장만 해도 자동 빌드→재시작이 됩니다.
-dev.yml, -test.yml, -prod.yml로 환경 분리spring:
profiles:
default: dev
server:
shutdown: graceful
compression:
enabled: true
# application-dev.yml
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
- org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
- org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
devtools:
restart:
# 파일 저장소 변경에 따른 재시작 루프 방지
additional-exclude: |
file-data-map/**,
**/*.ser
management:
endpoint:
health:
show-details: always
logging:
level:
com.sprint.mission.discodeit: DEBUG
app:
storage:
type: file
root-dir: file-data-map
@ConfigurationProperties(prefix = "app")
public record AppProperties(String name, String version) {}
@EnableConfigurationProperties(AppProperties.class)
@SpringBootApplication
class Application {}
app:
name: Discodeit
version: 1.0.0
plugins { id "com.diffplug.spotless" version "6.25.0" }
spotless {
java { googleJavaFormat().reflowLongStrings()
target 'src/**/*.java' }
}
try/catch 금지. @RestControllerAdvice로 모으고, Bean Validation 기본 세팅@RestControllerAdvice
class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
ResponseEntity<ApiError> handleValidation(MethodArgumentNotValidException e) {
var msg = e.getBindingResult().getFieldErrors().stream()
.map(err -> err.getField() + ": " + err.getDefaultMessage())
.toList();
return ResponseEntity.badRequest().body(new ApiError("VALIDATION_ERROR", msg));
}
record ApiError(String code, Object message) {}
}
@NotBlank @Email @Size 등을 바로 붙여 입력 경계부터 견고하게.implementation "org.springframework.boot:spring-boot-starter-security"
@Configuration
class SecurityConfig {
@Bean SecurityFilterChain filter(HttpSecurity http) throws Exception {
http.csrf(csrf -> csrf.disable())
.cors(Customizer.withDefaults())
.authorizeHttpRequests(auth -> auth
.requestMatchers("/actuator/**","/api/v1/ping").permitAll()
.anyRequest().authenticated())
.httpBasic(Customizer.withDefaults());
return http.build();
}
@Bean CorsConfigurationSource cors() {
var c = new CorsConfiguration();
c.setAllowedOrigins(List.of("http://localhost:3000"));
c.setAllowedMethods(List.of("GET","POST","PUT","PATCH","DELETE"));
c.setAllowedHeaders(List.of("*"));
var s = new UrlBasedCorsConfigurationSource();
s.registerCorsConfiguration("/**", c); return s;
}
}
logging.pattern.level: "%5p [%X{traceId:-} %X{spanId:-}]"
management.tracing.sampling.probability: 1.0 # 필요시 Micrometer Tracing
implementation "org.flywaydb:flyway-core"
src/main/resources/db/migration/V1__init.sql
/users의 POST/GET) 구현과 동시에@WebMvcTest) 검증@SpringBootTest(webEnvironment=RANDOM_PORT))POST /users → 입력 검증 → 저장 → 응답 매핑 → 예외/로그/테스트까지)