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
프로젝트 생성
프로젝트 설정과 필요한 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
- Enter Plain Text to Encrypt : 암호화를 원하는 평문 입력
- Select Type of Encryption : Two Way Encryption 선택
- Enter Secret Key : 암호화 키 입력
- Encrypt 버튼 클릭
- 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 실행