본문 바로가기
ssafy 공통프로젝트

프로젝트 환경 설정

by 펀구구 2023. 7. 25.

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

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

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