본문 바로가기
스프링/한번에 끝내는 Java Spring 웹 개발 마스터 초격차 패키지

[Spring] Ch 01-1. 스프링 시큐리티를 위한 gradle 설정하기

by 책 읽는 개발자_테드 2022. 2. 11.
반응형

패스트캠퍼스"한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지" 강의의 "안정적인 서비스를 위한 스프링DATA와 Security - 스프링 시큐리티" 파트를 정리한 글입니다.

 

강의 관련 코드 https://github.com/jongwon/sp-fastcampus-spring-sec


다음 내용은 스프링 시큐리티 실습을 위한 프로젝트를 gradle 통해 구성하는 방법에 대해서 다룹니다.

 

gradle 프로젝트 구성하기

 settings.gradle

· settings.gradle에서는 전체 프로젝트의 구조를 빌드한다.

· 다음 설정으로 한개의 프로젝트를 구성할 수 있다.

rootProject.name="project-name"
include "project-name"

 

· 다음 설정으로 여러 모듈 프로젝트를 포함하도록 구성할 수 있다.

rootProject.name="project-name"
include ":sub-project1"
include ":sub-project2"

 

· 모듈 프로젝트들이 많아서 이들을 group으로 관리하고 싶다면, 다음과 같이 자동 빌드하는 스크립트를 쓰면 편리하다.

 

rootProject.name = 'security-gradle3'

["comp", "web", "server"].each {

    def compDir = new File(rootDir, it)
    if(!compDir.exists()){
        compDir.mkdirs()
    }

    compDir.eachDir {subDir ->

        def gradleFile = new File(subDir.absolutePath, "build.gradle")
        if(!gradleFile.exists()){
            gradleFile.text =
                    """

                    dependencies {

                    }

                    """.stripIndent(20)
        }

        [
                "src/main/java/com/sp/fc",
                "src/main/resources",
                "src/test/java/com/sp/fc",
                "src/test/resources"
        ].each {srcDir->
            def srcFolder = new File(subDir.absolutePath, srcDir)
            if(!srcFolder.exists()){
                srcFolder.mkdirs()
            }
        }

        def projectName = ":${it}-${subDir.name}";
        include projectName
        project(projectName).projectDir = subDir
    }
}

 

 

Gradle 설치하기

· gradle을 설치한다. (여기서는 맥 전용)

brew install gradle

 

Gradle 구성하기

· 깃헙의 소스코드를 가져온다. 

git clone https://github.com/jongwon/sp-fastcampus-spring-sec

 

· gradle 초기화하기 

gradle init

이때 프로젝트 타입을 basic, 빌드 스크립트 도메인 특화 언어(DSL)을 Groovy로 선택한다.

 

 

· 인텔리제이로 프로젝트 구성이 올바른가 확인한다.

 

· 프로젝트의 settings.gradle 파일을 클릭하고,  앞서 모듈 프로젝트를 group으로 관리하기 위한 설정에서 rootProject.name만 본인의 프로젝트 이름으로 바꿔서 다음과 같이 입력한다.

rootProject.name = 'sp-fastcampus-spring-sec'
["comp", "web", "server"].each {

    def compDir = new File(rootDir, it)
    if(!compDir.exists()){
        compDir.mkdirs()
    }

    compDir.eachDir {subDir ->

        def gradleFile = new File(subDir.absolutePath, "build.gradle")
        if(!gradleFile.exists()){
            gradleFile.text =
                    """

                    dependencies {

                    }

                    """.stripIndent(20)
        }

        [
                "src/main/java/com/sp/fc",
                "src/main/resources",
                "src/test/java/com/sp/fc",
                "src/test/resources"
        ].each {srcDir->
            def srcFolder = new File(subDir.absolutePath, srcDir)
            if(!srcFolder.exists()){
                srcFolder.mkdirs()
            }
        }

        def projectName = ":${it}-${subDir.name}";
        include projectName
        project(projectName).projectDir = subDir
    }
}

 

gradle을 refresh하면,

 

설정대로 comp, web, server 세 폴더가 생성된다.

 

이 중 server 폴더에 basic-test라는 폴더를 만들고, gradle을 refresh하면 설정한대로 server 프로젝트가 구성된다.

 

 

· 루트 프로젝트의 build.gradle의 설정을 구성한다.

 

// 별도의 외부 라이브러리를 가져와야 할 때 사용
buildscript {
    // build.gradle에서 사용하는 전역 변수 설정
    ext {
        spring = "2.4.1"
        boot = "org.springframework.boot"
        lombok = "org.projectlombok:lombok"
    }
    repositories {
        // mavenCentral 레퍼지토리 사용 https://mvnrepository.com/repos/central
        mavenCentral()
    }

    // 레파지토리에서 찾을 라이브러리 입력
   dependencies {
        // 스프링 부트를 gradle로 빌드할 때 사용하는 라이브러리
        classpath("$boot:spring-boot-gradle-plugin:$spring")
    }
}

// (rootproject 포함) 모든 프로젝트의 공통 내용
allprojects {
    // 모든 프로젝트에서 공통으로 사용될 그룹 id와 버전 id
    group = "com.sp.fc"
    version = "1.0.0"
}

// (rootproject 제외) 하위 프로젝트의 공통 내용
subprojects {
    apply plugin: "java" // 자바 플러그인
    // 스프링 관련 플로그인
    apply plugin: boot
    apply plugin: "io.spring.dependency-management"
    apply plugin: "idea"

    repositories {
        mavenCentral()
    }

    configurations {
        runtimeClasspath {
            extendsFrom developmentOnly
        }
    }

    dependencies {
        implementation "$boot:spring-boot-starter-security" // 스프링 시큐리티 관련 라이브러리
        implementation 'com.fasterxml.jackson.core:jackson-annotations' // json 관련 라이브러리

        compileOnly lombok
        testCompileOnly lombok
        annotationProcessor lombok
        testAnnotationProcessor lombok

        testImplementation "$boot:spring-boot-starter-test" // 단위 테스트를 위한 라이브러리
    }

    test {
        useJUnitPlatform()
    }
}

 

위 설정 후 comp 패키지의 common-utils 폴더를 만들고, gradle을 refresh한다. 그러면 자동으로 프로젝트가 구성된다. 

 

· server 프로젝트를 구성하자.

  server 프로젝트 build.gradle 파일에 아래 설정을 입력하고, gradle refresh한다.

 

dependencies {
    // 웹을 사용하기 위한 라이브러리
    implementation("$boot:spring-boot-starter-web")
}

 

프로젝트가 정상적으로 구성되었는지 확인하기 위해, java 패키지에 스프링부트 애플리케이션 역할을 하는 BasicTestApplication 클래스를 생성한다.

 

@SpringBootApplication
public class BasicTestApplication {
   public static void main(String[] args) {
      SpringApplication.run(BasicTestApplication.class, args);
   }
}

 

해당 코드를 실행하여, 성공을 확인한다.

 

 

다음으로 테스트가 정상적으로 작동하는지 확인한다. test 패키지에 Test1 클래스를 생성한다.

public class Test1 {
   @DisplayName("1. 테스트")
   @Test
   void test_1() {
      assertEquals("test", "test");
   }
}

 

해당 코드를 실행하여, 성공을 확인한다.

 

 

 

지금까지 작성한 server 프로젝트 구조는 다음과 같다.

 

· 방금 작성한 server 프로젝트에서 comp 프로젝트의 코드를 사용할 수 있도록 설정하자.  

 server 프로젝트의 build.gradle 파일의 dependencies에 다음 설정을 추가한다.

dependencies {
   ... 생략 ...

    implementation project(":comp-common-utils")
}

스프링 시큐리티란?

 

반응형

댓글