본문 바로가기

⭐ SpringBoot/SpringBootFramework

SpringBoot 구조 정리

# SpringBoot의 흐름

- 스프링은 Domain → Repository → Service DTO → Controller구조로 되어 있으며 코드를 작성하는 순서도 이와 같다.

- Domain에서 DB와 관련된 클래스를 작성하고 Repository로 Doamin에 작성된 필드 접근을 위한 CRUD를 생성하고 DTO로 어떤 테이블에 어떤 필드로 접근할지 정의한다.

- Service에서 외부에서 해당 기능을 사용할 수 있도록 메소드를 정의하고 외부에서 요청이 오면 Controller를 통해서 Service로 DB에 접근하여 요청을 처리하게 된다.

# SpringBoot 구조정리

- 스프링 부트가 어떤 데이터 흐름을 가지고 데이터가 전달되는 순서와 각각의 패키지들이 어떤 역할을 하는지 정의

# 코드 작성을 위한 프로젝트 구조

스프링 부트는 목적에 따라 여러 패키지를 생성하여 소스코드를 관리한다.

- Domain(Entity)

- Repository

- Dto

- Service

- Controller

보통 위의 구조로 프로젝트가 이루어 진다.

자 그렇다면 위의 프로젝트 구성 요소를 하나씩 살펴보자.

1. Domain(Entity)

DB의 테이블과 직접적으로 맵핑되는 클래스 이다.

DB의 테이블과 컬럼 그리고 타입 및 크기등을 설정할 수 있다.

 

Domain 클래스에서 자주 사용되는 몇가지 어노테이션을 살펴보면 아래와 같다.

@Entity - 테이블과 1:1로 맵핑되는 어노테이션으로 
해당 어노테이션을 클래스에 붙이면 jpa가 해당 클래스를 관리한다.

@Column - 필드에 붙이는 어노테이션으로 해당 어노테이션을 붙이면 컬럼으로 인식한다.

@Id - PK를 지정하는 어노테이션이다.

@GeneratedValue - pk가 중복되는것을 방지하기 위해 작성하는 어노테이션 입니다. 
strategy 파라미터로 GenerationType.IDENTITY를 주게되면 PK로 인식하여 Auto Increament로 설정된다.

@Builder - Builder 패턴을 사용하기 위한 어노테이션 이다. 
@Builder 어노테이션을 사용하게되면 객체를 생성할때 생성자를 통해서 객체를 생성하는게 아니라 
도메인.builder().필드(값).필드(값).build(); 를 통해 필드에 대한 값을 좀더 명시적으로 넣을 수 있다.

2. Repository

repository는 DB에 접근하는 소스코드를 모아둔 Interface 이다.

JPA는 Create, Update, Delete와 같은 다른 테이블간의 조인 을 잘 수행하지 않을때는 그대로 사용 하지만

여러 테이블과 조인 연산이 필요한 경우에는 @Query 어노테이션으로 직접 쿼리를 작성하여 사용하거나

querydsl과 같은 동적쿼리를 생성해주는 라이브러리를 같이 사용하게 된다.

 

동적쿼리란?

- 동적 쿼리란 ? 미리 작성해둔 SQL이 아니라 코드 실행 시점에 동적으로 구성되고 실행되는 쿼리이다.

3. DTO

DTO는 Data Transfer Object로 직역하면 데이터 전송 객체이다.

Service나 Controller에서 DB에 접근할때 사용하는 클래스 이다.

위에서 설명한 Domain 클래스와 다른게 무엇인지 의문을 품을수 있는데 Domain은 DB 테이블에 대한 정보를 가지고 있는 클래스이고 DTO는 해당 테이블에서 실제로 CRUD를 할 필드를 정의해둔것이라고 보면 된다.

이렇게 Domain과 DTO를 나누어서 사용하는 이유는 소스코드 작성중에 디비에 접근할 필드의 변경이 생겼을 경우 Domain을 변경하여 DB에 접근하게 되면 테이블을 건드리게 되므로 위험하다.

그래서 테이블에 대한 정보를 작성하는 Domain 클래스와 DB에 접근하는 필드에 대한 DTO 클래스를 사용하게 된다.

Domain과 마찬가지로 Builder 패턴을 사용 할 수 있다.

4. Service

Repository와 DTO를 통해 DB에 접근하여 직접적인 데이터 연산을 수행하는 역할을 한다.

@Service 어노테이션을 붙여주게 되면 스프링 빈에 등록되고 스프링에서 관리하는 객체가 된다.

DB와 실제적인 접근을 명령하는 소스코드를 작성하는 클래이고, DTO에 작성된 메소드를 기반으로 소스코드를 작성하게 된다.

5. Controller

제일 앞단에서 HTTP 요청과 응답을 위한 클래스 이다.

@Controller 어노테이션을 붙여주면 스프링 빈에 등록되고 스프링에서 관리하는 객체가 된다.

@GetMapping(“주소”) 와같이 http 메소드 명과 함께 주소를 작성해주게 되면 해당 주소로 요청을 받을수 있게 된다.

Service를 사용하여 디비에 접근하게 되고 model을 사용하여 파라미터를 view단으로 넘길수 있고 template 이름만 문자열로 반환하게 되면 View Resolver가 자동으로 해당 template를 찾아 사용자에게 화면 페이지를 전달한다.

주요 Annotation 및 기타 내용

@Getter - 클래스 필드의 getter 메소드를 자동으로 생성해준다.

@NoArgsConstructor - 클래스에 존재하는 필드의 생성자를 자동으로 생성해준다.

@PathVariable - @PostMapping("/{userId}/orders") 와 같이 {userId} 형태의 파라미터를 받을때 선언해 줘야한다.

@RequestBody - 요청 본문(request body)에 담긴 값을 자바객체로 변환 한다.

<> 제네릭(Generic) - 어떤 자료구조를 만들때 String 타입도 지원하고싶고 Integer타입도 지원하고 싶고 많은 타입을 지원하고 싶다. 그러면 String에 대한 클래스, Integer에 대한 클래스 등 하나하나 타입에 따라 만들어야 하나? 너무 비효율적이다. 
이러한 문제를 해결하기 위해 제네릭이라는 것을 사용한다.

 

- 끝 -