Java의 웹 프레임워크로 Java 언어를 기반으로 사용합니다.
Java로 다양한 어플리케이션을 만들기 위한 프로그래밍 도구입니다.
Java의 활용도가 높아지면서, Java를 이용한 다양한 기술들이 생겨났습니다. (JSP, MyBatis, JPA 등)
Spring 은 위와 같은 기술들을 더 쉽게 사용하도록 도와주는 오픈소스 프레임워크입니다.
JSP : Java Server Pages, HTML 코드에 Java 코드를 넣어 동적 웹 페이지를 생성하는 웹어플리케이션 도구
MyBatis : 객체 지향 언어인 Java의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는 개발 프레임워크
JPA : Java Persistence API, Java 프로그래밍에서 ORM 기술 표준으로 사용되는 인터페이스의 모음, 즉 Java 의 클래스와 관계형 데이터베이스의 테이블을 연결하는 기술
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 을 더 쉽게 이용하기 위한 도구 입니다.
Spring 프로젝트 설정 시 복잡한 부분이 많이 존재하였지만,
SpringBoot를 통해서 매우 간단하게 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을 이용하여 자동으로 작성해줍니다.
src/main/java
.java 파일이 모여있는 곳 (실제 코드를 작성)
src/main/resources
java 클래스에서 사용하는 자원을 보관하는 곳
src/main/resources/application.yml
프로젝트에서 사용하는 설정값들을 관리하는 곳
src/test
테스트를 위한 java 코드와 resource를 보관하는 곳
gradle
gradle 빌드 시, 필요로 하는 wrapper 파일을 보관하는 곳
build.gradle
의존성 및 플러그인 설정 등을 위한 설정 파일
External Libraries
스프링 프로젝트에 추가된 외부 라이브러리 파일을 보관하는 곳
mavenCentral() : Apache Maven 중앙 저장소를 이용하기 위한 것
Apache Maven
자바 프로젝트들을 위한 빌드 자동화 도구이다.
dependencies {...}
프로젝트 작업에 필요한 라이브러리 의존성을 관리하는 곳
의존성 추가하는 방법
maven의 중앙 저장소에서 필요한 라이브러리의 저장소 주소를 찾음
dependencies {...} 에 해당 저장소 주소를 추가
Load gradle changes 버튼을 눌러 의존성 새로고침 수행
Gradle 탭에서 추가한 의존성이 잘 추가되었는지 확인
.yml vs .properties : yml 확장자는 계층적 구성으로 설정파일을 구성할 수 있다.
위 사진은 인코딩 타입, DB 설정 (주소, 컬럼 이름 생성 규칙, sql 로그), Swagger 라이브러리를 설정한 코드 입니다.
Application 을 3가지 역할로 구분한 디자인 패턴
Model
application의 정보 및 데이터
View
사용자 인터페이스 (화면)
Controller
데이터와 사용자 인터페이스 요소들을 잇는 다리역할
위 사진은 Spring 프로젝트와 React 프로젝트를 MVC 패턴에 적용했을때 각 역할을 구분한 이미지 입니다.
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";
}
}
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 문서 입니다.