SpringBoot 시작하기

김주언·2022년 10월 23일
0

Spring Boot

목록 보기
1/8
post-thumbnail

스프링부트 개요

스프링부트는 스프링 프레임워크의 서브 프로젝트로, 스프링 프레임워크를 사용가능한 상태로 만들어 주는 도구와 같다. 왜 사용가능한 상태로 만들어주냐묜? 그냥 스프링을 쓰면 설정할게 넘흐나 많아서 힘들어잉

스프링은 다른 프레임워크와 통합을 지향 → 다른 프레임워크와 연동이 쉽다.
화면 UI는 스트러츠로, 비즈니스 영역은 스프링으로, 데이터 영역은 JPA 쓰던가 이런 방식으로..

이러다보니 설정을 위해서 라이브러리와 XML 등 관리할 게 넘흐 많아잉~ 그래서 스프링부트가 나옴

스프링부트 특징

  1. 라이브러리 관리 자동화
    : 스타터를 이용한 라이브러리 의존성 처리

  2. 설정 자동화
    : 라이브러리 기반으로 실행 환경을 자동으로 설정한다

  3. 라이브러리 버전 자동 관리
    : 스프링부트 버전에 해당하는 스프링 라이브러리, 서드파티 라이브러리들을 호환되는 버전으로 자동 관리

  4. 테스트 환경과 내장 톰갯
    : 테스트관련 라이브러리가 기본적으로 포함되어 있으며 톰캣 서버를 내장하고 있다.

  5. 독립적 실행 가능한 JAR
    : 웹 애플리케이션을 WAR가 아닌 JAR 파일로 패키징 가능


실습

프로젝트 생성

실습 환경

  • macOS
  • IntelliJ
  1. 인텔리제이 새 프로젝트 생성창을 열고 Spring initializr 클릭 → NEXT
  2. 의존성 추가 ( 가장 기본적인 Web만 추가해둠 ) 후 Finish

알아서 샥샥 만들어준다. 감사하다~



프로젝트 구조

얘네들은 전부 정해진 규칙을 따르고 있기 때문에 마음대로 바꾸면 안된다잉

스프링부트로 생성한 프로젝트는 기본적으로 메이븐 프로젝트 구조를 따른다.

  • src/main/java : 일반적인 자바 소스 등록
  • src/main/resources : 자바 소스가 아닌 XML 또는 프로퍼티 파일 등록
  • src/test/java : JUnit 기반의 테스트 케이스 작성

이 중 resources가 기존 메이븐 기반 프로젝트와 다르게 구성된다. xml 파일은 없고 static, template폴더가 있음

  • static : HTML과 같은 정적 웹리소스 저장
  • templates : 템플릿 기반 웹리소스 저장
  • application.properties : 프로젝트 전체에서 사용할 프로퍼티 정보 저장


프로젝트 실행

스프링부트 애플리케이션을 실행하기 위해서는 메인 클래스가 필요한데, src/main/java에 이미 작성되어 있음. main() 메소드를 가진 실행파일이다. 얘를 실행하면 됨

스프링부트로 만든 애플리케이션 실행 방법

  • 일반 자바 애플리케이션으로 실행
  • 웹 애플리케이션으로 실행
    : 기본 제공된 메인클래스 실행 시 웹 애플리케이션으로 실행된다 ( 내장 톰캣 실행 )

웹 애플리케이션으로 실행

src/main/java 폴더 아래 SpringbootTestApplication

package com.example.springboottest;

// import..

@SpringBootApplication
public class SpringbootTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootTestApplication.class, args);
    }
}
  • @SpringBootApplication
    : 해당 클래스가 스프링부트로 만든 애플리케이션의 시작 클래스임을 나타낸다

그냥 이 클래스 실행하면 됨

요래 콘솔에 뜬다잉? 그리고 localhost:8080 들어가보면

요래 뜬다잉? 아무것도 설정 안 해놔서 그럼

그런데!! 콘솔을 보면 톰캣이 실행되고 있다.. 톰캣을 설정한 적이 없는데 어떻게 서버가 알아서 구동이 된거냐!!

처음 프로젝트 생성 시 의존성으로 Spring Web 추가했는데, 그러면 스프링부트가 알아서 웹 프로젝트 환경에 최적화된 라이브러리들을 등록함. 이 때 톰캣 라이브러리가 같이 다운로드 된 것


자바 애플리케이션으로 실행

SpringbootTestApplication 수정 후 재실행 해야함

package com.example.springboottest;

// import ...

@SpringBootApplication
public class SpringbootTestApplication {

    public static void main(String[] args) {
//        SpringApplication.run(SpringbootTestApplication.class, args);
        
        SpringApplication app = 
                new SpringApplication(SpringbootTestApplication.class);
        app.setWebApplicationType(WebApplicationType.NONE);
        app.run(args);
    }

}

SpringApplication 객체의 run() 메소드를 정적 호출방식이 아닌 객체 생성을 통한 호출 방식으로 수정한다. 그리고 run() 메소드 호출 전 SpringApplication의 WebApplicationType을 NONE 설정 → 일반 자바 애플리케이션으로 실행됨. ( 톰캣도 구동 안 됨 )

WebApplicationType 설정 가능 타입

  • NONE : 웹으로 동작 하지 않도록
  • SERVLET : 스프링 MVC 기반 웹 애플리케이션으로 구동
  • REACTIVE : 비동기 처리와 논블로킹 입출력을 지원하는 웹플럭스(WebFlux) 적용 시 사용

외부 프로퍼티 사용

src/main/resources 폴더의 application.properties 파일
→ 전체 프로젝트의 프로퍼티 정보를 관리하는 설정파일

## WebApplicationType Settings
spring.main.web-application-type=none

요래 쓰면 SpringbootTestApplication 클래스에서 WebApplicationType을 SERVLET으로 해놔도 웹 애플리케이션이 아닌 일반 자바 애플리케이션으로 실행됨

→ 자바소스보다 application.properties 가 우선순위가 높다


스프링부트 기초

  • 기본 제공 배너 변경
  • 톰캣 외의 다른 서버 사용
  • 서버 포트 설정 변경
  • etc..

스프링부트는 이러한 다양한 설정을 프로퍼티 파일을 통해 처리한다

배너 관련

src/main/resources/application.properties

## WebApplicationType Settings
spring.main.web-application-type=none

## Banner Settings
spring.main.banner-mode=off		## 배너 감추기

자바 클래스에서 설정

package com.example.springboottest;

// import ...
@SpringBootApplication
public class SpringbootTestApplication {
    public static void main(String[] args) {
    // 생략
        app.setBannerMode(Banner.Mode.OFF);	// 배너 감추기
        app.run(args);
    }
}

사용자 정의 배너 적용

  1. src/main/resources 소스 폴더 아래에 banner.txt 파일 작성
  2. 스프링 부트는 src/main/resources 소스 폴더 아래에 banner.txt 파일이 존재 할 시 해당 파일을 배너로 설정한다.

* 배너파일의 위치를 다른 곳으로 두는 것도 가능하다! ↓

## Banner Settings
## 배너 보이기
spring.main.banner-mode=console		
## 배너 파일 위치 설정
spring.banner.location=banner/banner.txt  	
## 이미지 배너 파일 위치 설정
spring.banner.image.location=banner/spring_boot.png		
spring.banner.image.height=10
spring.banner.image.width=80

톰캣 관련

서버 포트 변경

application.properties

web-application 타입을 servlet으로 설정해줘야 한다!

💡 application.properties 파일에 설정한 프로퍼티 정보들은 실제 해당 Properties 객체의 Setter 메소드가 호출되어 의존성이 주입된 것!

실제로 ServerProperties 클래스로 이동해보면 아래와 같다

@ConfigurationProperties(
    prefix = "server",
    ignoreUnknownFields = true
)
public class ServerProperties {
    private Integer port;
    // 생략

    public ServerProperties() {
        // 생략
    }

    public Integer getPort() {
        return this.port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }
  // ...
}

prefix = "server" : server 접두사로 시작하는 프로퍼티를 설정하는 것 = 내부적으로 ServerProperties 객체의 setPort() 메소드를 호출하는 것

profile
학생 점심을 좀 차리시길 바랍니다

0개의 댓글