BE/Spring

스프링부트 프로젝트 초기 설정 (with Jasypt, Swagger, Querydsl)

dundun213 2024. 6. 30. 16:44

 

DateFilm Project Series 글 목록

 

 

시작

  • 프로젝트 생성
  • Jasypt 암호화
  • Swagger
  • Querydsl

프로젝트 구조

datefilm_server
├── config
├── constant
│    └── enum
├── controller
├── dto
├── exception
├── model
├── repository
└── service

프로젝트 생성

https://start.spring.io/

 

 

프로젝트 설정과 필요한 dependencies 를 추가합니다.
저는 기본적인 Spring Web, Lombok, JPA, Mysql 을 추가했습니다.


🔒 Jasypt 암호화

1. 암호화하는 이유

프로젝트 코드를 github 에 업로드 하는데, 서버 접속 정보같은 알려지지 않아야하는 정보또한 코드에 담겨있어서 이를 악용하는 것을 방지하기 위해 암호화를 진행합니다.

2. build.gradle Jasypt 의존성 추가

build.gradle 에 Jasypt 를 추가합니다.

dependencies {
    ...

    // Jasypt: DB 암호화
    implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
}

3. application.yaml 설정

3-1. application-secret.yaml 파일 생성

jasypt:
  encryptor:
    bean: jasyptSpringEncryptor
    password: jasypt-secret-key

3-2. application.yaml 수정

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: ENC(암호화된 url)
    username: ENC(암호화된 username)
    password: ENC(암호화된 pwd)

  profiles:
    include: secret

3-3. 암호화

암호화된 키는 이 사이트에서 확인하시면 됩니다.

https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

 

Jasypt Encryption and Decryption Online

Jasypt online free tool for encryption and decryption.This tool supports one way and two way password encryptor using Jasypt as well as matching encrypted password using Jasypt.

www.devglan.com

 

  1. Enter Plain Text to Encrypt : 암호화를 원하는 평문 입력
  2. Select Type of Encryption : Two Way Encryption 선택
  3. Enter Secret Key : 암호화 키 입력
  4. Encrypt 버튼 클릭
  5. Jasypt Encrypted String : 암호문 확인

4. config 코드

@Configuration
public class JasyptConfig {
    @Value("${jasypt.encryptor.password}")
    private String encryptKey;

    @Bean(name = "jasyptSpringEncryptor")
    public StandardPBEStringEncryptor jasyptStringEncryptor() {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setAlgorithm("PBEWithMD5AndDES");
        encryptor.setPassword(encryptKey);
        return encryptor;
    }
}

📄SWAGGER 설정

1. build.gradle 의존성 추가

SWAGGER 의존성 추가

dependencies {
    ...
    // swagger
    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

2. config 코드 (필수x)

Config 코드는 필요하면 추가하면 됩니다.

@Configuration
public class Swagger3Config {

    static {
        SpringDocUtils.getConfig()
                .replaceWithSchema(LocalDateTime.class, new StringSchema().example(LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)))
                .replaceWithSchema(LocalDate.class, new StringSchema().example(LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE)))
                .replaceWithSchema(LocalTime.class, new StringSchema().example(LocalTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME)));
    }


    @Bean
    public GroupedOpenApi publicApi(){
        return GroupedOpenApi.builder()
                .group("datefilm")
                .pathsToMatch("/**")
                .build();
    }

    @Bean
    public OpenAPI springShopOpenAPI(){

        Info info = new Info()
                .title("datefilm API")
                .description("datefilm 프로젝트 v1 API 명세서입니다.")
                .version("v0.0.1");

        return new OpenAPI()
                .info(info);
    }

}

3. 확인

설정한 API 문서는 링크에서 확인할 수 있습니다.
http://localhost:8080/api/swagger-ui/index.html


 

📝 Querydsl 설정

1. build.gradle 의존성 추가

querydsl 의존성 추가

dependencies {
    ...
    // querydsl
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"

}

def querydslSrcDir = 'src/main/generated'
clean {
    delete file(querydslSrcDir)
}
tasks.withType(JavaCompile) {
    options.generatedSourceOutputDirectory = file(querydslSrcDir)
}

2. config 코드

@Configuration
@Slf4j
public class QuerydslConfig {

    static{
        QUser user = QUser.user;
        QAlbum album = QAlbum.album;
        QNotification notification = QNotification.notification;
        QRecord record = QRecord.record;
        QReply reply = QReply.reply;

    }

    @Bean
    public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
        return new JPAQueryFactory(entityManager);
    }

}

3. compile 방법

Gradle > [프로젝트 이름] > Tasks > other > compileJava 실행