GDSC web - Spring 프로젝트 설정 및 기본 & Swagger API 문서 적용

이유석·2022년 12월 8일
1

gdsc

목록 보기
2/6
post-thumbnail

카드뉴스

Spring, SpringBoot 란?

Spring

  • Java의 웹 프레임워크로 Java 언어를 기반으로 사용합니다.
    Java로 다양한 어플리케이션을 만들기 위한 프로그래밍 도구입니다.

  • Java의 활용도가 높아지면서, Java를 이용한 다양한 기술들이 생겨났습니다. (JSP, MyBatis, JPA 등)
    Spring 은 위와 같은 기술들을 더 쉽게 사용하도록 도와주는 오픈소스 프레임워크입니다.

JSP : Java Server Pages, HTML 코드에 Java 코드를 넣어 동적 웹 페이지를 생성하는 웹어플리케이션 도구
MyBatis : 객체 지향 언어인 Java의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는 개발 프레임워크
JPA : Java Persistence API, Java 프로그래밍에서 ORM 기술 표준으로 사용되는 인터페이스의 모음, 즉 Java 의 클래스와 관계형 데이터베이스의 테이블을 연결하는 기술

Spring 주요 특징

  • IoC (Inversion of Control, 제어의 역전)

    • 개발자는 기존 Java 코딩시 객체의 생성 및 호출, 소멸 을 직접 수행(코드를 작성)합니다.
      Spring 에서는 위 작업을 개발자 대신 스프링 컨테이너가 대신 수행합니다.

    • 즉, 스프링 컨테이너가 필요한 객체를 생성, 소멸하여 생명주기를 관리하는 것

  • IoC 예시
    @Component 애노테이션을 이용해 Entity의 객체를 생성하여 스프링 컨테이너에 Bean으로 등록하여 줍니다.

@Component
public class Entity {

	private Long id;
    
    private String content;

}
  • DI (Dependency Injection, 의존성 주입)

    • 코드 내에서 객체를 직접 생성하는 것이 아니라, 외부(스프링 컨테이너)에서 주입 받아서 사용하는 방식
  • DI 예시
    EntityService 에서 EntityRepository의 객체를 생성자 주입 방식으로 주입 받아서 사용하는 예제 입니다.

@Service
public class EntityService {

	private final EntityRepository entityRepository;
    
    public EntityService(EntityRepository entityRepository) {
    	this.entityRepository = entityRepository;
    }

}
  • AOP (Aspect Object Programming, 관점 지향 프로그래밍)

    • 로그, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용되는 기능을 분리하여 횡단 관점으로 관리하는 것 입니다.
  • AOP 예시
    많은 Entity의 공통 관심사인 Entity 생성 및 수정 시간 속성을 분리하여 공통적으로 적용될 수 있도록 하는 예제 입니다.

@MappedSuperClass
@EntityListeners(value = AuditingEntityListener.class)
public class BaseTimeEntity {

	@CreatedDate
    private LocalDateTime createdAt;
    
    @UpdatedDate
    private LocalDateTime updatedAt;

}
  • POJO (Plain Java Old Object, 오래된 방식의 간단한 Java 객체)

    • Java의 버전이 올라갈수록, Java에 존재하는 객체들은 다양한 기능들이 생기며 의존성이 높아졌습니다.

    • 의존성이 높아지며, Java의 객체지향의 성질을 잃어버린 Java를 되살리기 위해,
      특정 기술에 종속되지 않는 순수한 자바 객체를 POJO 라고 합니다.

  • POJO 예시
    DTO (Data Transfer Object)는 특정 기술에 종속되지 않는 순수한 자바 객체로 작성해보는 예제 입니다.

public class EntityDto {

	private String content;
    
    public String getContent() {
    	return content;
    }

	public void setContent(Content content) {
    	this.content = content;
    }
}

Spring Boot

  • Spring 을 더 쉽게 이용하기 위한 도구 입니다.

  • Spring 프로젝트 설정 시 복잡한 부분이 많이 존재하였지만,
    SpringBoot를 통해서 매우 간단하게 Spring 프로젝트 설정 가능해졌습니다.

  • 개발자가 Spring 실행환경, 의존성 관리 등의 인프라 설정이 아니라
    주요 비즈니스 서비스 코드 작성에 더 집중할 수 있도록 해줍니다.

Spring 프로젝트 생성 및 설정

Spring Initializr - start.spring.io

  • Spring 에서 제공하는 웹사이트를 통하여 Spring 프로젝트를 생성할 수 있는 방법입니다.

위 화면을 통하여 Spring 프로젝트의 빌드 관리 도구, 언어, Spring, Java 버전 등 Project의 기본 설정을 할 수 있습니다.

위 화면을 통하여 Spring 프로젝트에서 사용할 라이브러리 의존성을 추가할 수 있습니다.

추가되어진 라이브러리 의존성

  • Spring Web
    web 프로젝트를 위해 필수로 추가

  • Spring Data JPA
    Spring 에서 JPA를 편리하게 사용할 수 있는 도구

  • H2 Database
    프로젝트 데이터베이스를 H2 Database로 활용합니다.

    H2 Database : SpringBoot가 지원하는 InMemory 관계형 데이터베이스 입니다.

    • 인메모리로 띄우면 애플리케이션 재기동 때마다 초기화됩니다.
    • 로컬 환경, 테스트 환경에서 많이 쓰입니다.
  • Lombok
    반복되는 메서드를 Annotation을 이용하여 자동으로 작성해줍니다.

Project 구조 살펴보기

위 사진은 Spring Initializr 로 Project 생성 시, 볼 수 있는 프로젝트 구조 입니다.
  • src/main/java
    .java 파일이 모여있는 곳 (실제 코드를 작성)

  • src/main/resources
    java 클래스에서 사용하는 자원을 보관하는 곳

  • src/main/resources/application.yml
    프로젝트에서 사용하는 설정값들을 관리하는 곳

  • src/test
    테스트를 위한 java 코드와 resource를 보관하는 곳

  • gradle
    gradle 빌드 시, 필요로 하는 wrapper 파일을 보관하는 곳

  • build.gradle
    의존성 및 플러그인 설정 등을 위한 설정 파일

  • External Libraries
    스프링 프로젝트에 추가된 외부 라이브러리 파일을 보관하는 곳

위 사진은 build.gradel 파일의 일부분 입니다.
  • repositories {...}
    프로젝트 빌드에 필요한 dependencies 를 어디서 다운 받을 지
    즉, 각종 프로그램들이 저장되는 위치이다. 이 저장소는 "어떤 저장소를 사용하는지"를 빌드 파일에 작성하여 설정할 수 있다.
  • mavenCentral() : Apache Maven 중앙 저장소를 이용하기 위한 것

    Apache Maven
    자바 프로젝트들을 위한 빌드 자동화 도구이다.

  • dependencies {...}
    프로젝트 작업에 필요한 라이브러리 의존성을 관리하는 곳

의존성 추가하기 (Swagger API 문서)

위 사진은 Spring 프로젝트에 Swagger 의존성을 추가하기 위해 build.gradle 파일의 dependencies 부분에 작성한 코드 입니다.

의존성 추가하는 방법

  1. maven의 중앙 저장소에서 필요한 라이브러리의 저장소 주소를 찾음

  2. dependencies {...} 에 해당 저장소 주소를 추가

  3. Load gradle changes 버튼을 눌러 의존성 새로고침 수행

  4. Gradle 탭에서 추가한 의존성이 잘 추가되었는지 확인

위 사진을 통해서 Gradle 탭에 Swagger API 문서를 위한 springfox-boot-starter 의존성이 추가된것을 확인할 수 있다.

application.yml 을 통하여 기본 설정 하기

  • application.yml 을 통하여 프로젝트에서 사용하는 설정값들을 관리할 수 있다.
    인코딩 타입, 데이터베이스 접속 주소, 컬럼 이름 생성 규칙, 등 ...

.yml vs .properties : yml 확장자는 계층적 구성으로 설정파일을 구성할 수 있다.


위 사진은 인코딩 타입, DB 설정 (주소, 컬럼 이름 생성 규칙, sql 로그), Swagger 라이브러리를 설정한 코드 입니다.

MVC 패턴 적용

MVC 패턴

  • Application 을 3가지 역할로 구분한 디자인 패턴

  • Model
    application의 정보 및 데이터

  • View
    사용자 인터페이스 (화면)

  • Controller
    데이터와 사용자 인터페이스 요소들을 잇는 다리역할

  • 장점
    • 각 요소들 별로 분리되어 각자의 역할에 집중할 수 있도록 함
    • 유지보수성, 확장성, 유연성이 증가함

MVC 패턴 with Spring, React


위 사진은 Spring 프로젝트와 React 프로젝트를 MVC 패턴에 적용했을때 각 역할을 구분한 이미지 입니다.

GET Method 사용해보기

REST API 명세서

gdsc/blog/controller/TestController.java

@Controller // 해당 클래스를 Spring MVC 컨트롤러로 표시
public class TestController {
    @ResponseBody // return 값을 그대로 HTTP Response Body 전문에 담아 클라이언트에게 전달한다.
    @RequestMapping(value = "/hello", method = RequestMethod.GET) 
    // Controller에 들어온 요청을 특정 메서드와 매핑하기 위하여 사용
    // value : 요청받을 URL, method : 어떤 메서드의 요청을 받을지
    public String hello() {
       return "hello spring world";
    }
}

Swagger API 문서 적용

Swagger API 문서

  • API 들이 가지고 있는 스펙을 명세, 관리할 수 있는 프로젝트 / 문서

  • API 사용 방법을 사용자에게 알려주는 문서

  • SpringBoot 에서 Swagger를 사용하면, Controller에 명시된 Annotation을 해석하여 API 문서를 자동으로 생성

  • version 2.0 접속 url
    /swagger-ui.html

  • version 3.0 접속 url
    /swagger-ui/index.html

Swagger API 문서 적용
gdsc.blog.confing.SwaggerConfig.java

@Configuration // 설정 파일임을 명시하기 위한 annotation
public class SwaggerConfig {

    // Docket : Swagger 설정의 핵심이 되는 Bean (Bean : 스프링 컨테이너에 등록되어 관리되는 객체)
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.OAS_30)
                .useDefaultResponseMessages(false)
                .select()
			    // swagger 문서를 적용할 api 패키지 설정
                .apis(RequestHandlerSelectors.basePackage("gdsc.blog.controller")) 
                .paths(PathSelectors.any())
                .build()
                .apiInfo(apiInfo()); // 제목, 설명 등 문서에 대한 정보
    }
   
    private ApiInfo apiInfo() {
       return new ApiInfoBuilder()
               .title("GDSC API Docs") // API 문서 제목
               .description("API Document for GDSC Web Blog") // API 설명 
               .version("1.0") // API version
               .build();
    }

}
위 사진은 해당 프로젝트를 실행 후, http://localhost:8080/swagger-ui/index.html 로 접속했을 때 볼 수 있는 Swagger API 문서 입니다.
  • SwaggerConfig.java 파일에서 설정한 내용들이 적용되어 있습니다.
profile
https://github.com/yuseogi0218

0개의 댓글