1. SpringBoot 구조 및 흐름
💡SpringBoot의 흐름
- 스프링은 Domain → Repository → Service → DTO → Controller 구조로 되어 있으며, 코드를 작성하는 순서도 이와 같다
- Domain에서 DB와 관련된 클래스를 작성하고, Repository로 Domain에 작성된 필드 접근을 위한 CRUD를 작성하고 DTO로 어떤 테이블에 어떤 필드로 접근할지 정의한다
- Service는 외부에서 해당 기능을 사용할 수 있도록 비즈니스 로직을 구현하고, 외부에서 요청이 오면 Controller를 통해서 Service로 DB에 접근하여 요청을 처리하게 된다
💡SpringBoot 구조 살펴보기
- java 파일은 우리가 소스코드 적는 파일로 스프링 부트는 목적에 따라 여러 패키지를 생성하여 소스코드를 관리함
-
Domain(Entity)
-
Repository
-
Dto
-
Service
-
Controller
보통 위의 구조로 구성됨
- resources/template은 사용자에게 보여주는 뷰를 위한 템플릿임
2. 컨트롤러
- 제일 앞단에서 HTTP의 요청과 응답을 위한 클래스
- Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller와 @RestController가 있음
- 전통적인 Spring MVC의 컨트롤러인 @Controller와 Restful 웹서비스의 컨트롤러인@RestController의 주요한 차이점은 HTTP Response Body가 생성되는 방식
💡@Controller
💡@RestController
- @ResponseBody + @Controller
- @Controller에 @ResponseBody가 추가된 것으로 클라이언트에게 Json 형태로 객체 데이터를 반환할 때 주로 쓰임 (Json형식으로 프론트에게 API 제공)
- 최근에 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환
- 동작과정의 경우 @Controller에 @ResponseBody를 붙인 것과 동일
💡매핑의 종류
- HTTP 요청을 매핑하는 여러가지 방법
- @RequestMapping(value = ”url”, method = RequestMethod.GET)
- @GetMapping(“url”)
- @PostMapping
- @DeleteMapping
- @PutMapping
3. JPA와 ORM
웹서비스는 데이터를 처리할 때 대부분 데이터베이스를 사용한다. 그런데 데이터베이스를 사용하려면 SQL 쿼리(query)라는 구조화된 질의를 작성하고 실행하는 등의 복잡한 과정이 필요함. 이때, ORM을 이용하면 자바 문법만으로도 데이터베이스를 다룰 수 있다. 즉, ORM을 이용하면 개발자가 쿼리를 직접 작성하지 않아도 데이터베이스의 데이터를 처리할 수 있다.
💡ORM(Object Relational Mapping)
- 객체와 관계형 데이터베이스 매핑, 객체와 DB의 테이블이 매핑을 이루는 것
- SQL query가 아닌 직관적인 코드로서 데이터를 조작할 수 있다
- 객체와 쿼리를 분리하여 복잡도를 줄이고, 트랜잭션 처리나 기타 데이터베이스 관련 작업들을 좀 더 편리하게 처리할 수 있는 방법
- 장점
- ORM을 이용하면 데이터베이스 종류에 상관 없이 일관된 코드를 유지할 수 있어서 프로그램을 유지·보수하기가 편리하다. 또한 내부에서 안전한 SQL 쿼리를 자동으로 생성해 주므로 개발자가 달라도 통일된 쿼리를 작성할 수 있고 오류 발생률도 줄일 수 있다
💡JPA
- Java Persistence API로 자바 ORM기술에 대한 API표준 명세
- ORM을 사용하기 위한 인터페이스를 모아둔 것으로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
- JPA는 어플리케이션과 JDBC 사이에서 동작
- JDBC란?
- DB에 접근할 수 있도록 자바에서 제공하는 API
- 그림처럼 JPA는 JDBC를 통해 DB와 통신한다.
- 인터페이스 이므로, JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus와 같은 ORM 프레임워크를 사용해야 함!
💡JPA 데이터베이스 방언
- JPA는 어플리케이션이 직접 JDBC 레벨에서 SQL을 작성하는 것이 아니라 JPA가 직접 SQL을 작성하고 실행하는 형태이다
- 그런데, 수많은 DBMS 종류가 있고 각 종류마다 사용하는 SQL 문법이 다르므로 종류에 맞게 사용할 필요가 있음
- JPA에서는 이를 Dialect라는 추상화된 방언 클래스를 제공하여 각 DBMS 벤더에 맞는 구현체를 제공
4. 엔티티(도메인)
- 데이터베이스 테이블과 매핑되는 자바 객체
- DB의 테이블과 컬럼, 타입 및 크기 등을 설정할 수 있음
💡어노테이션 정리
- @Entity - 테이블과 1:1로 핑되는 어노테이션으로 해당 어노테이션을 클래스에 붙이면 jpa가 해당 클래스를 관리한다.
- @Column - 필드에 붙이는 어노테이션으로 해당 어노테이션을 붙이면 컬럼으로 인식한다.
- @Id - PK를 지정하는 어노테이션이다.
- @GeneratedValue - pk가 중복되는것을 방지하기 위해 작성하는 어노테이션. strategy 파라미터로 GenerationType.IDENTITY를 주게되면 PK로 인식하여 Auto Increament로 설정된다.
- @Builder - Builder 패턴을 사용하기 위한 어노테이션. @Builder 어노테이션을 사용하게되면 객체를 생성할때 생성자를 통해서 객체를 생성하는게 아니라 도메인.builder().필드(값).필드(값).build(); 를 통해 필드에 대한 값을 좀더 명시적으로 넣을 수 있음
- @OneToMany: 1:N 연관관계를 가짐 (질문에서 답변으로)
- @ManyToOne: N:1 연관관계를 가짐 (답변에서 질문으로)
(참고)
https://goodgid.github.io/What-is-Dialect/
https://may9noy.tistory.com/868