본문 바로가기

개발기술/Spring

스프링 부트와 프로젝트 초기 환경설정

스프링 부트의 핵심 목표

기능 설명
자동 설정 (Auto Configuration) 상황에 따라 필요한 설정을 자동으로 적용
내장 톰캣 제공 Tomcat, Jetty 같은 서버를 내장, 즉시 실행 가능
독립 실행 가능 JAR java -jar 하나로 바로 실행 가능
의존성 스타터 제공 필요한 라이브러리를 모은 starter 패키지로 간단하게 추가 가능
간편한 설정 application.yml 또는 .properties 한 파일로 대부분의 설정 처리 가능

 

자동 설정 (Auto Configuration)

  • Spring Boot는 spring-boot-starter-web를 추가하면, 내부적으로 WebMvcAutoConfiguration 클래스를 로딩.
  • 이 클래스는 "웹 애플리케이션에 필요한 기본 설정"을 자동으로 등록해주는 역할
  • @ConditionalOnClass(WebMvcConfigurer.class)란?
    • 이 애노테이션은 "조건부로 자동 설정"을 하겠다는 의미. WebMvcConfigurer.class가 classpath에 존재할 경우에만 WebMvcAutoConfiguration을 적용한다는 뜻.
@Configuration
@ConditionalOnClass(WebMvcConfigurer.class) // ✅ 이 클래스가 classpath에 있으면 자동 설정 수행
@EnableConfigurationProperties(WebProperties.class)
@Import(EnableWebMvcConfiguration.class)
public class WebMvcAutoConfiguration {
    // DispatcherServlet, HandlerMapping, HandlerAdapter 등 자동 등록
}

 

WebMvcAutoConfiguration이 해주는 일

기능 설명
DispatcherServlet 등록 HTTP 요청을 가로채는 프론트 컨트롤러
RequestMappingHandlerMapping @RequestMapping 붙은 핸들러 연결
HandlerAdapter 컨트롤러 메서드를 실제 호출
MessageConverter JSON ↔ Java 객체 자동 변환
Tomcat 내장 서버 자동 실행
정적 리소스 핸들러 /static, /public 등 자동 서빙

 

예전 Spring (Spring Boot 이전)의 웹 설정 방식

// WebConfig.java
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class WebConfig implements WebMvcConfigurer {

    // 1. ViewResolver 수동 등록
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    // 2. MessageConverter 수동 등록
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter()); // JSON 지원
    }

    // 3. Static resource 핸들링
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }

    // 기타 여러 WebMvcConfigurer 메서드 오버라이드 가능
}

이것과 별도로 web.xml 설정도 필요

        <!-- web.xml -->
        <servlet>
        <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

 

 

 

 

의존성 추상화(starter dependency)

spring-mvc 기능을 쓰기 위해서는 다음처럼 하위 라이브러리를 일일이 명시해야 했어요:

    <!-- Maven 예시 -->
        <dependency> 
        <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
<version>5.3.27</version>
</dependency>

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
        <version>2.14.2</version>
</dependency>

        <dependency>
        <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
// Gradle 예시
implementation 'org.springframework.boot:spring-boot-starter-web'

이 안에 다음이 자동 포함됨:

  • spring-webmvc
  • jackson-databind (JSON 컨버터)
  • tomcat-embed-core (내장 톰캣)
  • validation-api
  • slf4j, logback (로깅)

 

 

1. Project Structure & Build Tool

빌드관리도구 선택  : 라이브러리를 관리해주고 빌드 및 실행을 도와주는 주체

  • Gradle : 최신 gradle, 빌드속도가 빠름,
  • Maven : legacy

2. Java Version

  • Specify the Java version in your build tool config:
  • JDK : 코드 작성시에는 Java 버전 번호만 중요하고 특정 Vendor는 빌드할때에만 결과물에 영향을 미친다.
  • Usually follow team convention

3. 스프링부트 

  Spring Boot는 Spring Framework의 모든 기능을 포함하면서도, 개발자가 빠르게 개발을 시작할 수 있도록 추가적인 지원과 도구를 제공합니다. spring initializer(https://start.spring.io/)를 사용한자동 설정을 통해 Spring boot project의 구조를 알아서 만들어준다.  Spring 애플리케이션 구성을 간소화합니다. 반면, Spring Framework는 수동으로 빈을 구성하고 의존성을 주입해야 합니다.

 

스프링부트를 통한 프로젝트 생성

  • spring initializer : 스프링 기반으로 프로젝트를 만들어주는 스프링 부트 사이트 (https://start.spring.io/)
    • Project Metadata 
      • Group : 기업명 혹은 도메인 입력으로 artifact가 동일한 build 결과물 간의 이름을 구분하기 위해서 사용됨 
        • (com.naver.map) general한 것에서 좁은 범위로 나아가서 좁혀두는 것
      • artifact : build 결과물 파일의 이름. Intelij의 프로젝트 이름은 폴더이름임.
    • Packaging :  Java 애플리케이션을 배포하는 방법에 있어 패키징방식 
      • JAR : java archive ;  스탠드얼론 Java 애플리케이션을 단일 실행 가능 파일로 패키징하기 위해 사용됩니다. 이는 내장 HTTP 서버(예: Tomcat, Jetty, Undertow 등)를 포함하여 애플리케이션을 실행하는 데 필요한 모든 것을 포함합니다.
      • WAR : web application archive. war는 일반적으로 내장 HTTP 서버를 포함하지 않습니다. 대신, WAR 파일은 Servlet 컨테이너나 Java EE 애플리케이션 서버(예: Apache Tomcat, Jetty)에 배포되어 실행됩니다. 기업 환경에서 여러 애플리케이션을 중앙 서버에 배포하여 관리할 때 사용됩니다.
    • Dependency
      • 어떤 라이브러리를 불러와서 쓸 것인지 선택 ;Spring Web, Thymeleaf

 

스프링부트 패키지구조

디렉토리 트리구조 

  • .gradle : gradle 구동시점에 필요한 숨김파일
  • .idea : intellij 구동시점에 필요한 숨김파일
    • 숨김파일 프로젝트의 임시파일이나 구동시점에서만 필요한 파일들. 개발자가 들어가서 작업할 필요x
  • gradle : build.gradle이 동작한 빌드 결과값

src : 개발자가 작업할 공간

  •  main
    • java : 실제 소스파일
      • JavaSpringApplication  : @SpringbootApplication과 springapplication을 실행시 톰켓이라는 웹서버를  실행함.
      • Controller package : 웹 어플리케이션에서 첫진입점이됨.
    •  resources : html을 포함한 자바 외의 모든 파일
      • static directory에 'index.html'을 생성해주면 정적인 홈페이지를 만들어준다.
      • 동적인 홈페이지를 만들고 싶으면 thymeleaf를 사용해야함.
  • test : test와 main이 분리되어 있으며 이는 최근 test 코드를 중요시하는 트렌드를 반영함.
  •  gitignore : 깃에 올리기 위해서  불필요한 파일들을 제외하는 파일. (.idea나 .gradle처럼 구동시점에만 필요한 코드들 / 개인의 환경설정에 관여하는 코드들)
  • build.gradle : 스프링 부트에서 설정된 셋팅들과 버전설정 및 라이브러리 호출하는 파일로, 프로젝트 첫 빌드시 실행시킴.

 

프로젝트 환경 설정

 

  application.yml 또는 application.properties 파일은 Spring Boot 애플리케이션의 설정 정보로서 Spring 동작의 Parameter역할을 하고 있다고 생각하면 된다.  본 파일을 통해 애플리케이션의 동작 방식을 설정할 수 있다. 여기에는 데이터베이스 연결 정보, JPA 설정, 서버 포트, 로깅 설정 등 다양한 애플리케이션 관련 설정이 포함될 수 있습니다.

 

환경 프로파일 설정

  환경은 일반적으로 로컬환경, 개발테스트환경, 실제운영환경 보통 3가지 환경이 존재하며, 각 환경마다 바라보는 DB와 같은 설정이 다르다. 코드 상에서는 환경과 무관하게 작동하도록 작성하고, 환경별로 분리되는 내용은 환경설정인 (yml/properties) 값에 담는다.

    

프로파일 활성화방식

  Spring Boot는 **spring.profiles.active**라는 설정 값을 사용해 활성화할 프로파일(Profile)을 지정합니다. 설정값에 따라서 application-{profile}.yml 또는 application-{profile}.properties 파일을 선택적으로 읽어들인다.

 

  Spring Boot는 Profile을 활성화할 때, 각 설정 위치(JVM 프로퍼티, 환경 변수, 설정 파일, 코드 등)를 순차적으로 확인하고 우선순위에 따라 값을 적용합니다. 저장 위치가 다르기 때문에 Spring Boot는 각 데이터 소스를 확인하며 가장 높은 우선순위 값을 활성화합니다.

 

JVM 프로퍼티로 설정

  • 실행 시 JVM 프로퍼티를 사용해 프로파일을 활성화.
java -Dspring.profiles.active=dev -jar myapp.jar
 

환경 변수로 설정

  • 운영 체제의 환경 변수로 spring.profiles.active 값을 설정.
export SPRING_PROFILES_ACTIVE=prod

 

설정 파일에서 지정

  • application.yml에서 기본 프로파일을 지정.
spring:
  profiles:
    active: dev

 

코드에서 설정

  • SpringApplication을 통해 프로파일 활성화.
SpringApplication app = new SpringApplication(MyApplication.class);
app.setAdditionalProfiles("dev");
app.run(args);

 

 

데이터베이스 datasource 연결 정보

데이터베이스와 연결하기 위한 설정을 정의합니다. 이는 데이터베이스 URL, 사용자 이름, 비밀번호, 드라이버 클래스 등을 포함합니다.

 

spring:
  datasource:
    url: jdbc:h2:mem:test
    username: sa
    password:
    driverClassName: org.h2.Driver
  h2:
    console:
      enabled: true
  jpa:
    defer-datasource-initialization: true
    database-platform: H2
    hibernate:
      ddl-auto: create-drop
    open-in-view: false
    properties:
      hibernate:
        format_sql: true
        show_sql: true

 

spring.datasource Section

  •  url : JDBC connection URL로 JDBC (Java Database Connectivity) API에게 DB연결과 관련된 Parameter을 제공한다고 볼수 있다.  어떤 데이터베이스와 어떻게 연결할지에 대한 설정을 진행한다. 
    • JDBC URL은 일반적으로 다음과 같은 형태를 따른다. jdbc:[database-type]:[connection-details]
    • 여기서 jdbc:h2:mem:test : mem은 in-memory구조를 지칭하며, test는 테스트 목적임을 지칭한다. 이와 같이 jdbc url을 통해서 연결할 데이터베이스의 타입을 정할수 있다.
    • url다음에 ; 기호 뒤에 custom을 위한 특수한 파라미터가 올 수 있다.
      • DB_CLOSE_DELAY=-1: parameter specific to H2. It tells the database to remain open after the last connection is closed
      • INIT=RUNSCRIPT FROM 'classpath:sql/h2gis-init.sql' : INIT is an instruction to H2 that tells it to initialize , RUNSCRIPT FROM 'classpath:sql/h2gis-init.sql': This part specifies the location of the SQL script (h2gis-init.sql) in the classpath
  • username : DB의 사용자이름 
  • password : DB의 Pw
  • driver-class-name : 어떤 jdbc driver을 사용할지 선택해줌 (org.h2.Driver). If you specify the url (like jdbc:h2:mem:testdb), Spring Boot will automatically infer the correct JDBC driver from the URL. So, in many cases, you don’t need to explicitly specify the driver-class-name because Spring Boot can infer it from the URL.

 

spring.h2 section

  • h2
    • console :enabled : h2-console이라는 url을 통해서 h2 db 조작을 가능하게하는 콘솔창을 활성화할지 결정한다.

spring.jpa Section

  • JPA / Hibernate Settings :   how entities are managed and how schema generation is handled.  
    • defer-datasource-initialization : 테이블에 초기데이터/테이블 스키마를 메뉴얼로 설정해주고 싶을때 사용. 테이블이 생성될때까지 Sql 스크립트의 실행을 지연시키고 hibernate가 table을 생성한 후 작동하도록 조절함. 
      • resource아래에 두 파일이 위치해야만 springboot에서 파일을 인식하고 동작시킨다.
      • schema.sql: For schema-related SQL commands (e.g., table creation, indexes).
      • data.sql: For inserting initial data.
    • data-base-platform : Tells Hibernate to use the which DB dialect for generating SQL statements.
    • hibernate
      • ddl-auto:  data delete automation 테이블 및 스키마의 생성과 삭제를 자동으로 관리하는 기능 
        • create : :어플리케이션 가동 시점에 테이블 생성
        • create-drop  :어플리케이션 가동 시점에 테이블 생성, 종료시점에 테이블 삭제
        • validate : Hibernate는 애플리케이션에서 정의한 엔티티와 데이터베이스의 테이블이 일치하는지 검증합니다. 테이블과 스키마가 일치하지 않으면 오류를 발생시킵니다.
        • update : Hibernate가 데이터베이스 스키마와 애플리케이션 엔티티 간의 차이를 감지하고, 필요한 경우 스키마를 수정합니다. 그러나 기존 데이터를 삭제하지 않고 테이블이나 컬럼을 추가하거나 수정하는 방식으로 작동합니다.
      •  defer-datasource-initialization: true ensures that any SQL scripts (like schema.sql) run after Hibernate has created the tables.
    • properties
      • hibernate:
        • dialect : Tells Hibernate to use the which DB dialect for generating SQL statements.
        • format_sql : hibernate에서 실행하는 sql statement를 보기좋은 포맷으로 만듬
        • show_sql :  hibernate에서 실행하는 sql statement를 출력하여 보여줌
  • H2 연결설정 : h2: console : enabled : true

 

서버 포트 설정

애플리케이션이 실행되는 포트를 설정할 수 있습니다. 기본적으로 Spring Boot 애플리케이션은 포트 8080에서 실행됩니다.

Server Configuration : Basic server configurations such as port, context path, and session settings.

server:
  port: 8080
  servlet:
    context-path: /api
  tomcat:
    max-threads: 200
  • Security Settings: Configurations related to security, such as authentication methods, password encoding, and security headers.   
spring:
  security:
    user:
      name: admin
      password: admin123
    oauth2:
      client:
        registration:
          google:
            clientId: id
            clientSecret: secret



  • Logging Configuration : Define logging levels, log file paths, and configure different logging frameworks.

로깅 설정

애플리케이션의 로깅 수준과 형식을 설정할 수 있습니다. Spring Boot는 기본적으로 다양한 로깅 프레임워크를 지원합니다.

 

 

logging:
  level:
    org.springframework: DEBUG
    com.myapp: INFO
  file:
    path: /var/log/myapp.log
  • Profile-Specific Configuration : Manage settings for different environments using profiles, such as development, testing, and production.
spring:
  profiles:
    active: dev

---

spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password:

---

spring:
  config:
    activate:
      on-profile: prod
  datasource:
    url: jdbc:mysql://production-host/mydb
    username: produser
    password: prodpass
  • Messaging and Email Settings : Configuration for messaging systems like RabbitMQ, Kafka, or email services.
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

  mail:
    host: smtp.example.com
    username: user
    password: pass
    properties:
      mail:
        smtp:
          auth: true
          starttls: enable
  • External Service Configuration : Integrate with external services or APIs, including configuring API keys, endpoints, and other connection details.
app:
  weather-api:
    url: http://api.weatherapi.com/v1/current.json
    key: your-api-key
  • Application-Specific Custom Properties : Define custom application-level properties that are specific to the business logic or operational parameters.
app:
  pagination:
    default-size: 20
  feature:
    enable-new-feature: true

기타설정

  •  

1. 애플리케이션 설정

 

2. 환경별 설정

Spring Boot는 프로파일을 통해 환경별로 다른 설정을 적용할 수 있습니다. 예를 들어, 개발 환경에서는 application-dev.yml, 프로덕션 환경에서는 application-prod.yml 파일을 사용할 수 있습니다. 이를 통해 개발, 테스트, 운영 환경에서 다른 설정을 쉽게 적용할 수 있습니다.

고유Key설정

API Key값과 같이 환경마다 분리하여 관리하여야 하는 값이 있다면 property 파일에 해당 값을 설정하고, 변수위에 @value("${key이름.key}")로 맵핑 한다면 환경변수의 값에서 값을 injection 해준다. 참고적으로 "${key이름.key}"는 SpEL로 환경변수를 가져오는 것