오늘은 부트캠프 42일차이다. 오늘은 오전에 알고리즘 1문제와 자바 기본 문법을 복습하였고, 오후에는 프로젝트 하기 전 스프링부트 프로젝트를 빠르게 한번 만들어보는게 도움이 될 거 같아서 시작하였다. 내일 모레까지 나만의 셀렉샵 프로젝트를 완성하는 것이 목표이다. 최대한 흐름과 구조를 파악하는 것이 프로젝트를 할 때 도움이 많이 될 거 같다.
오늘 배운 것
1. SpringBoot의 흐름
-스프링은 Domain->Repository->DTO->Service->Controller구조로 되어 있으며 코드를 작성하는 순서도 이와 같다.
-Domain에서 DB와 관련된 클래스를 작성하고 Repository로 Domain에 작성된 필드 접근을 위한 CRUD를 생성하고 DTO로 어떤 테이블에 어떤 필드로 접근할지 정의한다.
-Service에서 외부에서 해당 기능을 사용할 수 있도록 메서드를 정의하고 외부에서 요청이 오면 Controller를 통해서 Service로 DB에 접근하여 요청을 처리하게 된다.2. 코드 작성을 위한 프로젝트 구조
-스프링 부트는 목적에 따라 여러 패키지를 생성하여 소스코드를 관리한다.
- Domain
- Repository
- Dto
- Service
- Controller
2-1. Domain(Entity)
-DB의 테이블과 직접적으로 맴핑되는 클래스이다.
-DB의 테이블과 컬럼 그리고 타입 및 크기 등을 설정할 수 있다.2-1-1. Domain클래스에서 자주 사용되는 어노테이션
-@Entity : 테이블과 1:1로 맵핑되는 어노테이션으로 해당 어노테이션을 클래스에 붙이면 JPA가 해당 클래스를 관리한다.
-@Column : 필드에 붙이는 어노테이션으로 해당 어노테이션을 붙이면 컬럼으로 인식한다.
-@Id : PK를 지정하는 어노테이션이다.
-@GeneratedValue : pk가 중복되는 것을 방지하기 위해 작성하는 어노테이션이다. strategy 파라미터로 GenerationType.IDENTITY를 주게되면 PK로 인식하여 Auto Increament로 설정된다.
-@Builder : Builder 패턴을 사용하기 위한 어노테이션이다. @Builder 어노테이션을 사용하게되면 객체를 생성할 때 생성자를 통해서 객체를 생성하는게 아니라 도메인.builder().필드(값).build(); 를 통해 필드에 대한 값을 좀더 명시적으로 넣을 수 있다.2-2. Repository
-DB에 접근하는 소스코드를 모아둔 Interface이다.
-JPA는 Create, Update, Delete와 같은 다른 테이블간의 조인을 잘 수행하지 않을 때는 그대로 사용 하지만 여러 테이블과 조인 연산이 필요한 경우에는 @Query 어노테이션으로 직접 쿼리를 작성하여 사용하거나 querysl과 같은 동적쿼리를 생성해주는 라이브러리를 같이 사용하게 된다.
*동적쿼라 : 미리 작성해둔 SQL이 아니라 코드 실행 시점에 동적으로 구성되고 실행되는 쿼리이다.2-3. DTO
-데이터 전송 객체이다.
-Service나 Controller에서 DB에 접근할 때 사용하는 클래스이다.
-해당 테이블에서 실제로 CRUD를 할 필드를 정의해둔 것이라고 보면 된다.2-4. Service
-Repository와 DTO를 통해 DB에 접근하여 직접적인 데이터 연산을 수행하는 역할을 한다.
-@Service 어노테이션을 붙여주게 되면 스프링 빈에 등록되고 스프링에서 관리하는 객체가 된다.
-DB와 실제적인 접근을 명령하는 소스코드를 작성하는 클래스이고, DTO에 작성된 메서드를 기반으로 소스코드를 작성하게 된다.2-5. Controller
-제일 앞단에서 HTTP 요청과 응답을 위한 클래스이다.
-@Controller 어노테이션을 붙여주면 스프링 빈에 등록되고 스프링에서 관리하는 객체가 된다.
-@GetMapping("주소")와 같이 http 메서드 명과 함께 주소를 작성해주게 되면 해당 주소로 요청받을 수 있게 된다.
-Service를 사용하여 DB에 접근하게 되고 model을 사용하여 파라미터를 view단으로 넘길 수 있고 template 이름만 문자열로 반환하게 되면 View Resolver가 자동으로 해당 template을 찾아 사용자에게 화면 페이지를 전달한다.2-6. 주요 Lombok의 Annotation
-@Getter : 클래스 필드의 getter 메서드를 자동으로 생성해준다.
-@NoArgsConstructor : 클래스에 존재하는 필드의 생성자를 자동으로 생성해준다.