본문으로 바로가기

[SPRING] Spring Security (1) 서버 구축하기

category SPRING/개발 TIP 2021. 3. 3. 01:12

스프링 시큐리티 역시 필수적으로 해야 할 소양이기 때문에 이전에 했던 기억은 모두 지우고

새롭게 다시 정리하려고 합니다.

  • 환경 구성

1. start.spring.io/ 에 접속

* 패스트 캠퍼스에서는 git에서 다운받고 clone을 하라고 했지만 아래와 같이

gradle: command not found 가 발생하였다...

gradle을 직접 설치하는 방법이 있었는데, 이것보단 직접 프로젝트를 다운받는게 낫다고 생각하여

아래와 같이 셋팅 하였습니다.

2. 위와 같이 설정을 잡아주고 프로젝트를 다운 받습니다. (세부 설정은 Gradle로 재 설정)

* 혹시 그래도 나는 git으로 clone 꼭 받고 싶다 하시는분들은 아래 링크보고 하시면 됩니다.

참고 사이트 : jtrimind.github.io/troubleshooting/2020/09/29/gradle-command-not-found.html

 

3. 기존에 인텔리제이가 구축 되어있다는 가정하에 순서를 진행하겠습니다.

 

순서 : 상위 탭 file -> open -> 해당 프로젝트 찾아서 OK

setting.gradle 셋팅

rootProject.name = 'SpringSecurityStudy'

["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
    }
}

build.gradle 셋팅

  • 루트 폴더의 build.gradle 에서는 전체 하위 프로젝트의 공통 설정에 대한 사항을 기술해 넣습니다.
buildscript {
    ext {
        spring = "2.4.1"
        boot = "org.springframework.boot"
        lombok = "org.projectlombok:lombok"
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("$boot:spring-boot-gradle-plugin:$spring")
    }
}

allprojects {
    group = "com.sp.fc"
    version = "1.0.0"
}

subprojects {

    apply plugin: "java"
    apply plugin: boot
    apply plugin: "io.spring.dependency-management"
    apply plugin: "idea"

    repositories {
        mavenCentral()
    }

    configurations {
//        developmentOnly
        runtimeClasspath {
            extendsFrom developmentOnly
        }
    }

    dependencies {
//        developmentOnly("$boot:spring-boot-devtools")
        implementation "$boot:spring-boot-starter-security"
        implementation 'com.fasterxml.jackson.core:jackson-annotations'

        compileOnly lombok
        testCompileOnly lombok
        annotationProcessor lombok
        testAnnotationProcessor lombok

        testImplementation "$boot:spring-boot-starter-test"
    }

    test {
        useJUnitPlatform()
    }

}


["comp", "web"].each {
    def subProjectDir = new File(projectDir, it)
    subProjectDir.eachDir {dir->
        def projectName = ":${it}-${dir.name}"
        project(projectName){
            bootJar.enabled(false)
            jar.enabled(true)
        }
    }
}
["server"].each {
    def subProjectDir = new File(projectDir, it)
    subProjectDir.eachDir {dir->
        def projectName = ":${it}-${dir.name}"
        project(projectName){

        }
    }
}

help.enabled(false)

gradle 셋팅이 정상적으로 됐다면 아래와 같이 빌드되어 디렉토리가 생성됩니다.

server -> basic-test -> build.gradle 에서 클래스파일 셋팅

dependencies {

    implementation("$boot:spring-boot-starter-web")

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

comp -> common-utils -> src -> java -> com -> sp -> fc -> Person.java 생성 및 샘플 데이터 작성

package com.sp.fc;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Person {

    private String name;

}

basic-test -> src -> test -> java -> com -> sp -> fc -> Test1.java 생성 및 테스트 작성

package com.sp.fc;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Test1 {

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

메인메서드로 검증

package com.sp.fc;

import ch.qos.logback.core.net.SyslogOutputStream;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BasicTestApplication {

    public static void main(String[] args) {

        // 공용 프로젝트 : comp-common-utils
        // 서버 프로젝트 : server-basiec-test
        // 분리된 server-basiec-test -> build.gradle 에서 compile project(":comp-common-utils") 선언
        Person person = Person.builder().name("test").build();
        System.out.println(person);

//        SpringApplication.run(BasicTestApplication.class, args);
    }

}

참고사이트 : 패스트 캠퍼스