[시작하기]_01_소개

3 minute read

환경

  • 자바 8 이상
  • Maven, 또는 Gradle

스프링부트 소개

스프링부트 소개 DOC

  • opinionated view : 스프링부트가 가진 컨벤션을 의미

스프링부트가 널리 쓰이는 설정이라고 생각하는 설정들을 (사용자가 일일히 설정하지 않고 사용할 수 있도록) 기본적으로 제공한다.

스프링 플랫폼(스프링 프레임워크를 설정하는 값)에 대한 뷰도 제공해준다.

third-party libraries 제 3의 라이브러리에 대한 설정도 제공해준다. (ex. 톰캣 설정 - 8080 포트를 띄워서 기본적으로 제공해준다.)

그렇기 때문에 사용자가 바로 프로젝트를 쉽게 시작할 수 있다.

스프링 목적

모든 스프링 개발을 할 때 더 빠르고 더 폭넓은 사용성을 제공한다.

컨벤션 설정을 제공해준다. (일일이 설정하지 않아도 이미 컨벤션으로 정해져있는 설정을 제공해준다.)

★ 하지만 사용자가 원하는 대로 이러한 설정들을 쉽게 변경할 수 있다. ★

비즈니스 로직에 필요한 기능뿐아니라 non-functional features 기능도 제공해준다.

더이상 XML 설정을 사용하지 않고, code generation1도 하지 않는다. (그래서 오히려 더 쉽고, 명확하고, 커스터마이징하기 쉽다.)


스프링부트 시작하기

스프링부트 프로젝트 기본 셋팅

  1. [Create New Project] > [Maven]

    • GroupId : 패키지명
    • ArtifatId : 프로그램명

    Enable Auto-Import 선택 : 인텔리제이에서 pom.xml 파일을 변경할 때 마다 자동으로 변경사항을 import 해준다. (디팬던시 추가, 프로퍼티 변경 등)

  2. pom.xmlspring-boot-starter-parent 의존성 추가

    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.3.RELEASE</version>
    </parent>
    

    maven 안에 프로젝트간의 계층 구조를 만들 수 있다. 이 프로젝트의 부모 프로젝트spring-boot-starter-parent 프로젝트로 지정해준 것이다.

    스프링부트가 제공하는 의존성 관리와 매우 관련이 깊은 설정이다.

  3. spring-boot-starter-web 의존성 추가

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    
  4. build에 spring-boot-maven-plugin 플러그인 추가

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
  5. main 작성

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
       
    @SpringBootApplication
    public class Application {
       
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    ⇒ 웹 브라우저에서 localhost:8080 으로 접속해보면 Whitelabel Error Page 가 나오면서 서버가 동작 중인 것을 확인할 수 있다.

  6. 패키지파일 생성

터미널에서 mvn package 명령 실행

※ mvn package 명령어

- 컴파일된 결과물을 패키지 파일로 생성

- 컴파일, 테스트, 빌드를 수행하여 패키지 파일을 생성한다.

- 프로텍트 이름, 버전, 패키징 옵션에 맞게 파일이 생성된다.

- pom에서 아래와 같이 설정하면 결과 파일은 test-1.0-SNAPSHOT.war 로 생성된다.

<artifactId>test</artifactId> 
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

image-20200824152518507

지금 만든 프로젝트는 웹프로젝트가 아니라 Maven기반은 Java프로젝트 이므로 jar 패키지파일이 생성된다.

  1. jar 파일 실행

※ jar 파일 위치 : target 디렉토리

java -jar /path/of/jar/xxx.jar

image-20200824153003571

tomcat이 8080 포트로 시작되었고, 시작하는데 2초가 걸렸다.

웹브라우저에서 8080포트 접속하면 서버 실행된 것 확인 가능

image-20200824153244796

스프링 부트 원리 에서 배울 내용

  1. 스프링 MVC가 동작하려면 여러가지 Dependency가 필요한데, 우리가 넣어준 의존성은 spring-boot-starter-web 밖에 없다.

    어떻게 해서 수많은 의존성이 들어왔을까?

  2. 스프링 MVC 앱 설정 - 디스패처 서블릿, 리스너에 웹 애플리케이션 컨텍스트 어떤 것을 쓸지 설정, 빈 설정파일 제공 (어디서 부터 빈 설정을 읽어야 하는지 등등) 이러한 설정들을 안했는데 동작한다.

    SpringBootApplication 에 들어있다. @EnableAutoConfiguration 어노테이션과 밀접한 관계가 있다.

  3. Spring Application의 run을 실행하면 어떠한 동작으로 내장 톰캣이 뜨는 것인가?


스프링 부트 프로젝트 생성기

start.spring.io

  1. start.spring.io 에서 프로젝트 생성

  2. maven, gradle 프로젝트, 스프링 부트 버전, java 버전, 의존성 추가 > [GENERATE] > zip 아카이브 파일이 다운로드 된다.

    image-20200824160106212

  3. 다운로드된 zip 파일을 압축해제(unzip) 후, Intellij에서 open

⇒ 의존성 확인

앞서 추가해준 의존성에 몇가지만 더 추가되어 있다.

  • properties - UTF0-8

  • spring-boot-starter-test

    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
    </properties>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    

Spring console

  • 프로젝트 생성을 위해 이 명령어를 설치하는 것은 비효율적이니깐.. (다른 기능도 있긴 함) 있다는 것만 알려주고 넘어감

스프링 부트 프로젝트 구조

Maven Java 기본 프로젝트의 구조와 동일

  • src > main > java : java 소스 코드

  • src > main > resources : java 소스 코드를 제외한 모든 것

    • Class Path Root 가 되는 위치
    • Java Application에서 이 위치(resources)를 기준으로 파일들을 참조할 수 있다.
    • spring resource abstraction에서 어떻게 참조하는지? hint. class path 라는 prefix를 붙인다.
  • test > java > resources : 테스트와 관련된 리소스 (java파일 제외)

  • 스프링 부트에서 딱 하나 추천하는 main Application 클래스의 위치

    • @SpringBootApplication 어노테이션을 붙인 main 클래스

    • Default Package(최상위 패키지 경로)에 바로 위치시키는 것을 추천한다.

    • 컴포넌트 스캐닝이 여기(@SpringBootApplication가 달려있는 위치)서부터 진행된다.

    • 이 패키지(dev.solar)부터 시작해서 패키지 하위의 모든 패키지 않의 모든 빈을 등록한다.

      image-20200824164503982

    • 만약 src > main > java 아래에 바로 main 클래스가 위치한다면???

      모든 패키지를 스캐닝하게 된다. 그럴 필요가 없기 때문에…

    ※ 참고 : using-boot-locating-the-main-class

  1. 프로그래머가 Program code를 직접 작성하지 않고 자동으로 code를 생성해 내는 것