스프링 프레임워크
Spring Framework는 모든 종류의 배포 플랫폼에서 최신 Java 기반 엔터프라이즈 애플리케이션을 위한 포괄적인 프로그래밍 및 구성 모델을 제공합니다.
Spring의 핵심 요소는 애플리케이션 수준의 인프라 지원입니다. Spring은 팀이 특정 배포 환경에 불필요한 연결 없이 애플리케이션 수준 비즈니스 로직에 집중할 수 있도록 엔터프라이즈 애플리케이션의 "배관"에 중점을 둡니다.
스프링 부트 아키텍처
•
비즈니스 계층 - spring boot
•
프레젠테이션 계층 - front
•
퍼시스턴스 계층 - storage logic
•
데이터베이스 계층 - DB
스프링부트 플로우 아키텍처
•
클라이언트는 HTTP 요청(GET, PUT, POST등)을 수행한다.
•
HTTP 요청이 컨트롤러로 전달되며 컨트롤러가 요청을 매핑한다. 핸들을
처리하고 서버 로직을 호출한다.
•
비즈니스 로직은 서비스 계층에서 수행된다. 스프링 부트는 JPA(Java Persistence Library)를 통해 스프링 부트 모델 클래스에 매핑된 데이터베이스의 데이터에 대한 모든 논리를 수행한다.
•
JSP 페이지는 컨트롤러로부터 응답으로 반환된다. -> JSON처리로 변환
•
DI(dependency injection) - 스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입 기능으로, 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입 시켜주는 방식이다. 클래스 많아져..? 사용자 많아져..? 내가 객체 관리해줄게.!!
DI(의존성 주입)를 통해서 모듈 간의 결합도가 낮아지고 유연성이 높아진다.
•
AOP(Aspect Oriented Programming) - 관점 지향 프로그래밍. 직접 AOP 구현보다는(문법), 기존 어노테이션들에 AOP가 엄청 녹아있음.!!
◦
@Exceptional
◦
@Transactional
•
IOC -
•
Web(MVC) - DispatcherServlet
의존성이란?
스프링 클라우드 컴포넌트 구성 예
•
Config-server: 분산환경의 구성
•
Eureka: 마이크로서비스 디스커버리
•
RabbitMQ: 동적구성 업데이트
•
Spring Security: 인증, 인가, JWT
•
Spring Cloud APIGW: 라우팅
•
Sleuth & Zipkin: 분산 트레이싱
REST API
REpresentational State Transfer API
•
HTTP 메소드
•
Serialization(직렬화) → object를 json으로 만드는 것
•
JSON
- 주요 어노테이션
@RestController
@RequestMapping
@RequestBody
@PostMapping
@PutMapping
@GetMapping
@DeleteMapping
@GetMapping("/user/{userId}")
public ResponseEntity<Object>
getUser(@PathVariable int userId) {
UserEntity user = userService.getUser(userId);
return new ResponseEntity<>(user, HttpStatus.OK);
}
Java
복사
•
HTTP 상태 코드
◦
200: Success
◦
201: Created
◦
401: Unauthorized
◦
404: Resource Not Found
◦
500: Server Error
스프링 HATEOAS
Hypermedia As The Engine Of Application State
REST 표현을 쉽게 생성할 수 있는 몇가지 API를 제공한다. 응답받은 JSON의 링크영역에 기능에 대한 API링크를 제공한다.
•
Spring Boot HATEOAS 의존성
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
Java
복사
스프링 데이터
Spring Data의 임무는 기본 데이터 저장소의 특별한 특성을 유지하면서 데이터 액세스를 위한 친숙하고 일관된 Spring 기반 프로그래밍 모델을 제공하는 것입니다. 데이터 액세스 기술, 관계형 및 비관계형 데이터베이스, 맵 축소 프레임워크, 클라우드 기반 데이터 서비스를 쉽게 사용할 수 있습니다.
•
Spring Data Commons - 모든 Spring Data 모듈을 뒷받침하는 핵심 Spring 개념이다.
•
Spring Data JDBC - JDBC에 대한 Spring Data 저장소 지원.
•
Spring Data JPA - JPA에 대한 Spring Data 저장소 지원.
•
Spring Data REST - Spring Data 저장소를 하이퍼미디어 기반 RESTful 리소스로 내보낸다.
•
Spring Data Redis - Spring 애플리케이션에서 Redis를 쉽게 구성하고 액세스할 수 있다.
스프링 데이터 REST
Spring Data 저장소 위에 하이퍼미디어 기반 REST 웹 서비스를 쉽게 구축할 수 있게 해줍니다. Spring Data REST는 Spring Data 저장소 위에 구축되어 애플리케이션의 도메인 모델을 분석하고 모델에 포함된 집계에 대한 하이퍼미디어 기반 HTTP 리소스를 노출합니다.
Spring MVC패턴에서는 Domaiin, Controller, Repository, Service(옵션)의 구조로 서비스를 제공하였는데, Spring Data Rest 구조에서는 Domain과 Repository만을 가지고 REST API 서버를 구현할 수 있습니다.
@RepositoryRestResource 어노테이션을 추가하여 Controller, Service 없이 미리 내부적으로 정의되어 있는 로직에 따라 처리되어 더욱 쉽게 REST API 서버를 구축할 수 있다.
JPA
•
ORM은 Java 클래스와 관계 관계를 매핑하는 기술이다 .
•
JPA는 ORM 기술 중 대표적인 기술이다.
•
JPA는 저장소 유형에 대한 인터페이스를 제공하고 Hibernate는 JPA의 구현체(쿼리로 구현)이다.
JPA 연동 의존성 라이브러리
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId> </dependency>
<dependency>
<groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope></dependency>
Java
복사
JPA 연동을 위한 설정파일
# resources/application.yml
Server:
port: 8082
Spring:
application:
name: userservice
datasource:
url: jdbc:mysql://127.0.0.1:3306/gcu-mall?createDatabaseIfNotExist=true& useUnicode=true &characterEncoding=UTF-8&characterSetResults=UTF-8&allowPublicKeyRetrieval=true&useSSL=false
username: root
password: 1111
driver.class.name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl auto: create
data:
rest:
base-path: /api
default-page-size: 10
max-page-size: 10
YAML
복사