IntelliJ

[ IntelliJ ] 인텔리제이로 스프링 프로젝트 생성하기 ( with Gradle )

자바니또 2021. 3. 9. 14:13

인텔리제이로 스프링 부트 프로젝트 시작하기

시작에 앞서 `Gradle`의 버전은 4.10.2 이고, `Spring Boot`의 버전은 2.1.7입니다.

목차

  • 인텔리제이 소개
  • 그레이들 프로젝트를 스프링 부트 프로젝트로 변경하기
  • mavenCentral 과 jcenter
  • 스프링부트 프로젝트 실행하기

인텔리제이 소개

개발에 있어 대표적인 개발 도구로는 이클립스가 있다. 필자 또한 학교를 다니는 4년동안 이클립스만 사용했었고, 이 책을 통해 인텔리제이를 사용해 보게 되었다.

이클립스에 비해 인텔리제이가 갖는 강점은 다음과 같다.

  • 강력한 추천 기능(Smart Completion)
  • 훨씬 더 다양한 리팩터링기능과 디버깅 기능
  • 이클립스의 Git에 비해 훨씬 높은 자유도
  • 프로젝트 시작할 때 인덱싱을 하여 파일을 비롯한 자원들에 대한 빠른 검색 속도
  • HTML과 CSS, JS, XML에 대한 강력한 기능 지원
  • 자바, 스프링 부트 버전업에 맞춘 빠른 업데이트

인텔리제이는 유료버전인 얼티메이트 버전과 무료 버전인 커뮤니티 버전이 있다. 당연히 유료버전인 얼티메이트 버전이 더 많은 기능을 가지고 있다. 대표적으로 JavaScript, TypeScript지원 여부와 Database Tools 지원 여부가 있다.

하지만 커뮤니티 버전도 자바 개발에 대한 모든 기능을 지원하고 Maven, Gradle과 같은 빌드 도구 기능과 깃과 깃허브 같은 VCS기능, 스프링 부트의 경우 톰캣과 같은 별도의 외장 서버 없이 실행할 수 있도록 지원하기 때문에 웹 개발에 있어서는 크게 어려움이 없다.

그레이들 프로젝트를 스프링 부트 프로젝트로 변경하기

프로젝트를 생성할 때 그레이들을 선택하였다면 그레이들 프로젝트가 만들어진 것이다. 그레이들 프로젝트를 스프링 부트프로젝트로 변경하기 위해서는 build.gradle 을 수정해주어야 한다.

스프링 이니셜라이저를 이용한다면 쉽게 build.gradle을 얻을 수 있겠지만, 여기서는 의존성과 build.gradle의 코드가 무슨 역할을 하는지 알아보기 위해서 사용하지 않는다.

스프링 부트 프로젝트로 만든 build.gradle은 다음과 같다.

buildscript {
    ext {        // (1)
        springBootVersion = '2.1.7.RELEASE'
    }
    repositories {    
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }

    // (2) start
    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'
    // (2) end

    group 'io.github.brandpark'
    version '1.0-SNAPSHOT'
    sourceCompatibility = 1.8

    repositories {    // (3)
        mavenCentral()
    }

    dependencies {    // (4)
        compile('org.springframework.boot: spring-boot-starter-web')
        testCompile('org.springframework.boot:spring-boot-starter-test')
    }
}

(1) ext

ext라는 키워드는 build.gradle에서 사용하는 전역변수를 설정하겠다는 의미인데, 여기서는 springBootVersion 전역변수를 생성하고 그 값을 '2.1.7.RELEASE'로 하겠다는 의미이다.

(2) apply plugin: *

apply plugin은 플러그인을 추가하겠다는 의미이다. 그 중 io.spring.dependency-management 플러그인은 스프링 부트의 의존성들을 관리해 주는 플러그인이라 꼭 추가해야만 한다.

(3) respositories

repositorties는 각종 의존성(라이브러리)들을 어떤 원격 저장소에서 받을지를 정한다. 기본적으로 mavenCentral을 많이 사용하지만, 최근에는 라이브러리 업로드 난이도 때문에 jcenter도 많이 사용한다.

(4) dependencies

dependencies는 프로젝트 개발에 필요한 의존성들을 선언하는 곳이다. 만약 인텔리제이를 사용한다면 메이븐 저장소의 데이터를 인덱싱해서 관리하기 때문에 의존성 자동완성이 가능하다. 의존성을 선언할 때 주의할 것은 특정 버전을 명시하면 안 된다. 그래야만 맨 위에 작성한 'org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}'의 버전을 따라가게 된다. 특정 버전을 명시하면 명시한 버전으로 오버라이드 되어 버전 충돌이 발생할 가능성이 생긴다.

mavenCentral과 jcenter

mavenCetral은 이전부터 많이 사용하는 저장소지만, 본인이 만든 라이브러리를 업로드하기 위해서는 정말 많은 과정과 설정이 필요하다. 최근에 나온 jcenter는 이런 문제점으 ㄹ개선하여 라이브러리 업로드를 간단하게 하였다. 또한, 여기서 한 걸음 더 나아가 jcenter에 라이브러리를 업로드하면 mavenCentral에도 업로드 될 수 있도록 자동화를 할 수 있다. 그러다 보니 개발자들의 라이브러리가 점점 jcenter로 이동하고 있다. 여기서는 mavenCentral, jcenter 둘 다 등록해서 사용한다.

스프링부트 프로젝트 실행하기

스프링부트 프로젝트는 @SpringBootApplication을 사용하여 구동부인 코드를 작성하면, 별도의 설정없이 바로 실행 가능하다.

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        // (1)
        SpringApplciation.run(Application.class, args);
        // (2)
        SpringApplication app = new SpringApplication(Application.class);
        app.run(args);
    }
}

보통 (1)으로 사용하고 좀 더 커스터마이징을 할 때 (2)을 사용한다. @SpringBootApplication을 통해 스프링부트의 자동 설정, 스프링Bean 읽기와 생성을 모두 자동으로 설정된다. 주의 할 것은 @SpringBootApplication이 있는 위치부터 설정을 읽어가기 때문에 이 클래스는 항상 프로젝트의 최상단에 위치해야 한다.

@SpringBootApplication@Configuration@ComponentScan, @EnableAutoConfiguration을 합한 것이다. 위의 코드를 예로 들어 의미를 해석하자면 "Application.java를 Config파일로 인식시키고, 패키지 내 모든 Component를 스캔하며, 필요한 자동 설정을 하라"이다.

@EnableAutoConfiguration에 대해 좀 더 알아보자. 가져온 외부 라이브러리 목록을 보면 org.springframework.boot:spring-boot-autoconfigure 패키지가 있다. 해당 패키지 내 META-INF/spring.factories 를 보면 자동 설정 대상이 되는 클래스들이 정의되어 있다. 여기서 자동 설정이란, 조건에 따른 Bean 등록, Path 설정 등의 기본 설정을 말한다. 이는 미리 정의 해 놓은 값이다. (편의를 위해 스프링 부트가 미리 해놓은 설정)

run메서드는 스프링부트가 가지고 있는 내장 WAS를 실행하는 메서드이다. 스프링부트는 내장 WAS를 사용하는 것을 권장하는데, 이유는 언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있기 때문이다. 외장 WAS를 사용한다면 모든 서버는 WAS의 종류와 버전, 설정을 일치시켜야만 한다. 새로운 서버가 추가되면 모든 서버가 같은 WAS환경을 구축해야만 한다.

참고