🥞 BE
home

Java Spring 기초

Date
2023/11/26
Category
Web
Tag
Spring
Detail

스프링 프레임워크

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
복사