REST API를 가지고, 프론트 단과 백 단이 서로 통신을 하는 것!
자바 파일을 작성하는 공간. Controller, Service, Repository, Entity, DTO 등이 들어간다.
자바를 제외한 HTML, CSS, JavaScrpit, Application/yml 파일을 작성하는 공간.
- static : 스타일시트(css), 자바스크립트(js), 이미지 파일(jpg,png) 등을 저장하는 공간.
- templates : 템플릿 파일을 저장한다. 이때 템플릿 파일은 HTML 파일 형태로 자바 객체와 연동되는 파일이다.
- application.yml / properties 파일 : 스프링 부트의 설정 정보를 관리하는 파일.
.properties에서 .yml로 변경한 이유 : yml이 properties보다 훨씬 가독성이 좋다.
Gradle이 사용하는 환경파일. 프로젝트를 위해 필요한 플러그인과 라이브러리 등을 기술한다.
Entity는 데이터베이스에 쓰일 필드와 여러 엔티티간 연관관계를 정의하는 역할을 한다.
쉽게 말해, 데이터베이스 테이블에 대응하는 하나의 클래스.
- @Entity: JPA를 사용해 테이블과 매핑할 클래스에 붙여주는 어노테이션.
- @Id: Primary Key(PK)로 지정할 필드 위에 붙여주는 어노테이션.
- @GeneratedValue(strategy = GenerationType.IDENTITY): 데이터를 저장할 때, 해당 속성에 값을 따로 세팅하지 않아도 1씩 자동으로 증가하여 저장되게 하는 어노테이션.
- 객체와 관계형 데이터베이스 간의 매핑을 자동으로 처리해주는 기술.
- ORM에서는 Entity들을 객체의 형태로 다룰 수 있게 해준다.
- Spring에서는 보통 JPA(Java Persisten API)를 이용한다.
- ORM기술에 대한 API 표준 명세.
- 쉽게 말해, 자바에서 ORM을 사용하기 위한 표준 인터페이스
- Spring Data JPA는 JPA를 쓰기 편하게 만들어 놓은 모듈이다.
- Spring Data JPA는 JPA를 Repository 기반으로 간편하고 효율적으로 사용할 수 있는 모듈.
- 사용자가 Repository에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어 Bean으로 등록해준다.
- Hibernate는 JPA(interface)의 구현체로서 가장 점유율이 높다.
DB 통신이 필요할 때 사용한다.
Repository는 특이하게 함수명으로 기능을 제작한다.
개별 interface를 만들고 JpaRepository라는 interface를 상속받는다.
JpaRepository의 제네릭 타입으로는 <Entity, PK의 타입>을 지정해주면, Spring Data JPA는 자동으로 스프링 빈(Bean)으로 등록된다.
JpaRepository를 단순히 상속하는 것만으로 인터페이스는 Entity에 대해 아래의 기능을 제공한다.
ddl-auto
- create: 실행될 때마다 기존 스키마를 삭제하고 새로운 스키마를 생성한다.
- create-drop: create와 동일하지만, 종료 시 스키마를 다시 삭제한다.
- update: 기존 스키마와 현재 Entity를 비교하고 변경점이 있으면 스키마에 반영한다.
- validate: 기존 스키마와 Entity를 비교하고 일치여부를 확인한다. 변경사항이 있으면 반영하지 않고 경고를 발생시키거나, 예외를 던진다.
- none: 자동으로 스키마를 생성하거나 업데이트하지 않는다. 개발자가 수동으로 관리해야한다.
Test할 때는 create 또는 update!
서버를 배포한 뒤에는 validate 또는 none!
사용자가 웹브라우저에서 Uri로 요청을 보내면, 그 요청을 Controller가 받는다.
사용자의 Request를 전달받아 요청의 처리를 담당하는 Service를 호출한다.
@Controller는 주로 View(화면)을 반환하기 위해 사용한다.
@RestController는 @Controller + @ResponseBody가 합쳐진 형태로 JSON 형태의 객체 데이터를 반환한다.
- JavaScript Object Notation 이며, 데이터를 저장하거나 전송할 때 많이 사용되는 Data 교환 형식.
- 특정 언어에 종속되지 않으며, 대부분의 프로그래밍 언어에서 다룰 수 있다.
프론트와 백을 나누어서 개발하려면 JSON으로 데이터를 전달하는 방법을 알아야 한다.
- PostMapping: Body를 통해 서버로 요청 데이터를 전송하는 메소드 (Create)
- GetMapping: 리소스 조회 메소드 (Read)
- PutMapping / PatchMapping: 리소스를 대체하는 메소드 (Update)
- DeleteMapping: 리소스를 제거하는 메소드 (Delete)
service에서는 비즈니스 로직을 주로 다룬다.
간단한 주문관리 시스템으로 예시를 들면,
1. 주문처리
2. 재고조회
3. 재고감소
4. 주문발송
등의 비즈니스 로직을 의미한다.
- @Service: 루트 컨테이너에 Bean 객체로 생성해준다. 이 루트 컨테이너에 Bean 객체로 등록을 해야 SpringBoot가 제공하는 기능들을 사용할 수 있다.
- @Transactional: 메소드에 Transactional 어노테이션을 붙이면 해당 범위 내 메소드가 Transactional이 되도록 보장해준다.
모든 작업들이 성공적으로 완료 되어야 DB에 반영을 하고, 중간에 문제가 발생하면 작업을 원상복구 할 수 있는 것.
그렇다면 Service를 굳이 쓰지 않고 Controller에서 바로 Repository로 접근해도 되지 않을까?
- Controller에서 바로 Repository로 연결해서 사용할 수 있지만, 그렇게 하면 중복코드가 발생할 수 있다.
- 코드 중복이 발생하고, 유지보수가 어려워지며, 재사용성이 저하하기 때문에 Service를 사용하는 것.
HTTP 테스트를 할 수 있는 소프트웨어. JSON을 사용해야 하기 때문에 꼭 다룰 줄 알아야한다.