Intellij IDEA
- 2023.1.3
- 인코딩 설정
https://www.lesstif.com/java/intellij-file-console-encoding-121012310.html#:~:text=1. Settings → Editor →
Java
- JDK 1.8.0_192
Java 8이 LTS중 가장 긴 지원기간(~2030)을 가짐
SpringBoot
- 2.7.14
Swagger
- 2.9.2
MySQL
- 8.0.33
- 설치가이드 ( ID: root, PW: root ) MySQL 다운로드 및 설치하기(MySQL Community 8.0) (hanbit.co.kr)
Build 툴
- Gradle - kotlin

Spring Boot Dependency 설정
- Spring Boot DevTools : 편하게 개발에 집중할 수 있도록 도움, 캐시를 사용하여 성능을 올려줌, 파일 저장시(파일 변경시) 자동 재시작
- Lombok: 클래스의 Getter/Setter 등을 자동으로 생성
- Spring Web: WEB MVC를 사용하여 웹 어플리케이션을 만드는 데에 필요한 스프링부트의 기본적인 요소, 내장형 컨테이너로 톰캣을 기본으로 탑재
- Spring Security: 서버의 보안 관련된 디펜던시
- Spring Data JPA: ORM으로 데이터에 접근하기 위해서는 JPA를 사용
- MySQL Driver: MySQL과 연동하기 위해 필요한 드라이버

- SpringBoot 버전: 2.7.14
annotation processors → enable 체크
MySQL & swagger 설정
application.yml
- mysql 설정
- swagger 설정 추가
# MySQL 설정
server:
address: localhost
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/intobook?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&useSSL=true
username: root
password: root
jpa:
database: mysql
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
show_sql: true
format_sql: true
mvc:
pathmatch:
matching-strategy: ant_path_matcher
# createDatabaseIfNotExist: 데이터베이스가 존재하지 않으면 자동으로 생성
# useUnicode: 유니코드 사용 여부 설정
# characterEncoding: 문자열 인코딩 종류 설정
# characterSetResult: 결과값의 인코딩 종류 설정
# useSSL: SSL 사용여부 설정
# spring.jpa.properties.hibernate.show_sql : 하이버네이트가 실행한 모든 SQL문을 콘솔로 출력
# spring.jpa.properties.hibernate.format_sql : SQL문을 가독성 있게 표현
swagger:
project:
base-package: com.reboot.intobook.controller.api
build.gralde.kts
- mysql 설정
- swagger 설정
plugins {
java
id("org.springframework.boot") version "2.7.14"
id("io.spring.dependency-management") version "1.0.15.RELEASE"
}
group = "com.reboot"
version = "0.0.1-SNAPSHOT"
java {
sourceCompatibility = JavaVersion.VERSION_1_8
}
configurations {
compileOnly {
extendsFrom(configurations.annotationProcessor.get())
}
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-web")
compileOnly("org.projectlombok:lombok")
developmentOnly("org.springframework.boot:spring-boot-devtools")
runtimeOnly("com.mysql:mysql-connector-j")
annotationProcessor("org.projectlombok:lombok")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.security:spring-security-test")
// <https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui>
implementation("io.springfox:springfox-swagger-ui:2.9.2")
implementation("io.springfox:springfox-swagger2:2.9.2")
// implementation("io.springfox:springfox-boot-starter:3.0.0")
}
tasks.withType {
useJUnitPlatform()
}
SwaggerConfiguration.java
package com.reboot.intobook;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Value("${swagger.project.base-package}")
private String basePackage;
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage(this.basePackage))
.paths(PathSelectors.ant("/**"))
.build()
// .host(this.externalHost)
.apiInfo(this.apiInfo())
.useDefaultResponseMessages(false);
}
/**
* API Documents Information
* @return
*/
private ApiInfo apiInfo() {
String title = "Swagger API Documents"; // 스웨거 UI 타이틀
String version = "1.0.0";
String license = "Dongmin All rights reserved";
return new ApiInfoBuilder()
.title(title)
.version(version)
.license(license)
.build();
}
}
서버 스타트
- swagger API 접속
<http://localhost:8080/swagger-ui.html>
Swagger 문서 관리
Swagger DTO 필드 세팅
import io.swagger.annotations.ApiModelProperty;
public class Request {
@ApiModelProperty(value = "이름", example = "KIM", required = true)
private String name; // 필수값
@ApiModelProperty(value = "나이", example = "5")
private Integer age;
}
public class Response {
@ApiModelProperty(value = "회사명", example = "CJ")
private String company;
@ApiModelProperty(value = "부서", example = "개발팀")
private String department;
}
- required = true 로 설정한 필드는 필수 값이다. 디폴트: required = false
컨트롤러 설명 추가하기
@Api(tags = "나의 컨트롤러")
@RestController
@RequestMapping("/api")
public class MyController {
...
}
컨트롤러 엔드포인트 API 설명 및 메소드 파라미터 설명 추가하기
@Api(tags = "나의 컨트롤러")
@RestController
@RequestMapping("/api")
public class MyController {
@ApiOperation(value = "Swagger 예시 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "param1", value = "1번파라미터", required = true, dataType = "string", example = "12345"),
@ApiImplicitParam(name = "param2", value = "2번파라미터", required = false, dataType = "int", example = "100"),
})
@GetMapping("/example")
public ResponseEntity<String> example(@RequestParam String param1, @RequestParam String param2) {
// code
}
}
컨트롤러 메소드의 일부 파라미터 스웨거 문서에서 제외하기
해당 파라미터에 @ApiIgnore 추가
@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/example")
public ResponseEntity<String> example(@RequestParam String param1, @ApiIgnore @RequestParam String param2) {
// code
}
}
스웨거 문서에서 엔드 포인트 제외하기
단일 메소드
@RestController
@RequestMapping("/api")
public class MyController {
@ApiIgnore
@GetMapping("/example")
public ResponseEntity<String> example(@RequestParam String param1, @RequestParam String param2) {
// code
}
}
클래스 단위
@ApiIgnore
@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/example")
public ResponseEntity<String> example(@RequestParam String param1, @RequestParam String param2) {
// code
}
}
참고
[Spring] Swagger 3.0 with Spring boot 2.X :: springfox
Intellij IDEA
- 2023.1.3
- 인코딩 설정
https://www.lesstif.com/java/intellij-file-console-encoding-121012310.html#:~:text=1. Settings → Editor →
Java
- JDK 1.8.0_192
Java 8이 LTS중 가장 긴 지원기간(~2030)을 가짐
SpringBoot
- 2.7.14
Swagger
- 2.9.2
MySQL
- 8.0.33
- 설치가이드 ( ID: root, PW: root ) MySQL 다운로드 및 설치하기(MySQL Community 8.0) (hanbit.co.kr)
Build 툴
- Gradle - kotlin
Spring Boot Dependency 설정
- Spring Boot DevTools : 편하게 개발에 집중할 수 있도록 도움, 캐시를 사용하여 성능을 올려줌, 파일 저장시(파일 변경시) 자동 재시작
- Lombok: 클래스의 Getter/Setter 등을 자동으로 생성
- Spring Web: WEB MVC를 사용하여 웹 어플리케이션을 만드는 데에 필요한 스프링부트의 기본적인 요소, 내장형 컨테이너로 톰캣을 기본으로 탑재
- Spring Security: 서버의 보안 관련된 디펜던시
- Spring Data JPA: ORM으로 데이터에 접근하기 위해서는 JPA를 사용
- MySQL Driver: MySQL과 연동하기 위해 필요한 드라이버
- SpringBoot 버전: 2.7.14
annotation processors → enable 체크
MySQL & swagger 설정
application.yml
- mysql 설정
- swagger 설정 추가
# MySQL 설정
server:
address: localhost
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/intobook?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&useSSL=true
username: root
password: root
jpa:
database: mysql
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
show_sql: true
format_sql: true
mvc:
pathmatch:
matching-strategy: ant_path_matcher
# createDatabaseIfNotExist: 데이터베이스가 존재하지 않으면 자동으로 생성
# useUnicode: 유니코드 사용 여부 설정
# characterEncoding: 문자열 인코딩 종류 설정
# characterSetResult: 결과값의 인코딩 종류 설정
# useSSL: SSL 사용여부 설정
# spring.jpa.properties.hibernate.show_sql : 하이버네이트가 실행한 모든 SQL문을 콘솔로 출력
# spring.jpa.properties.hibernate.format_sql : SQL문을 가독성 있게 표현
swagger:
project:
base-package: com.reboot.intobook.controller.api
build.gralde.kts
- mysql 설정
- swagger 설정
plugins {
java
id("org.springframework.boot") version "2.7.14"
id("io.spring.dependency-management") version "1.0.15.RELEASE"
}
group = "com.reboot"
version = "0.0.1-SNAPSHOT"
java {
sourceCompatibility = JavaVersion.VERSION_1_8
}
configurations {
compileOnly {
extendsFrom(configurations.annotationProcessor.get())
}
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-web")
compileOnly("org.projectlombok:lombok")
developmentOnly("org.springframework.boot:spring-boot-devtools")
runtimeOnly("com.mysql:mysql-connector-j")
annotationProcessor("org.projectlombok:lombok")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.security:spring-security-test")
// <https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui>
implementation("io.springfox:springfox-swagger-ui:2.9.2")
implementation("io.springfox:springfox-swagger2:2.9.2")
// implementation("io.springfox:springfox-boot-starter:3.0.0")
}
tasks.withType {
useJUnitPlatform()
}
SwaggerConfiguration.java
package com.reboot.intobook;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Value("${swagger.project.base-package}")
private String basePackage;
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage(this.basePackage))
.paths(PathSelectors.ant("/**"))
.build()
// .host(this.externalHost)
.apiInfo(this.apiInfo())
.useDefaultResponseMessages(false);
}
/**
* API Documents Information
* @return
*/
private ApiInfo apiInfo() {
String title = "Swagger API Documents"; // 스웨거 UI 타이틀
String version = "1.0.0";
String license = "Dongmin All rights reserved";
return new ApiInfoBuilder()
.title(title)
.version(version)
.license(license)
.build();
}
}
서버 스타트
- swagger API 접속
<http://localhost:8080/swagger-ui.html>
Swagger 문서 관리
Swagger DTO 필드 세팅
import io.swagger.annotations.ApiModelProperty;
public class Request {
@ApiModelProperty(value = "이름", example = "KIM", required = true)
private String name; // 필수값
@ApiModelProperty(value = "나이", example = "5")
private Integer age;
}
public class Response {
@ApiModelProperty(value = "회사명", example = "CJ")
private String company;
@ApiModelProperty(value = "부서", example = "개발팀")
private String department;
}
- required = true 로 설정한 필드는 필수 값이다. 디폴트: required = false
컨트롤러 설명 추가하기
@Api(tags = "나의 컨트롤러")
@RestController
@RequestMapping("/api")
public class MyController {
...
}
컨트롤러 엔드포인트 API 설명 및 메소드 파라미터 설명 추가하기
@Api(tags = "나의 컨트롤러")
@RestController
@RequestMapping("/api")
public class MyController {
@ApiOperation(value = "Swagger 예시 API")
@ApiImplicitParams({
@ApiImplicitParam(name = "param1", value = "1번파라미터", required = true, dataType = "string", example = "12345"),
@ApiImplicitParam(name = "param2", value = "2번파라미터", required = false, dataType = "int", example = "100"),
})
@GetMapping("/example")
public ResponseEntity<String> example(@RequestParam String param1, @RequestParam String param2) {
// code
}
}
컨트롤러 메소드의 일부 파라미터 스웨거 문서에서 제외하기
해당 파라미터에 @ApiIgnore 추가
@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/example")
public ResponseEntity<String> example(@RequestParam String param1, @ApiIgnore @RequestParam String param2) {
// code
}
}
스웨거 문서에서 엔드 포인트 제외하기
단일 메소드
@RestController
@RequestMapping("/api")
public class MyController {
@ApiIgnore
@GetMapping("/example")
public ResponseEntity<String> example(@RequestParam String param1, @RequestParam String param2) {
// code
}
}
클래스 단위
@ApiIgnore
@RestController
@RequestMapping("/api")
public class MyController {
@GetMapping("/example")
public ResponseEntity<String> example(@RequestParam String param1, @RequestParam String param2) {
// code
}
}
참고
[Spring] Swagger 3.0 with Spring boot 2.X :: springfox
디펜던시 설정MavenGradleYaml 설정application.yml서버 스타트아래 URL 접속https://localhost:8080/swagger-ui/required = true 로 설정한 필드는 필수 값이다. 디폴트: required = false
velog.io
'ssafy 공통프로젝트' 카테고리의 다른 글
| react에서 axios interceptor를 사용해서 header에 token 삽입하기 (0) | 2023.08.06 |
|---|---|
| JWT에서 claim과 name을 추출하는 방법 (소셜로그인을 활용한 로그인 구현) (0) | 2023.08.06 |
| JWT 및 OAuth2 과정 (소셜로그인을 활용한 로그인 구현) (0) | 2023.08.06 |
| 컨벤션 (1) | 2023.07.26 |
| JWT 구현(1) (소셜로그인을 활용한 로그인 구현) (0) | 2023.07.26 |