Spring Boot 서비스 구조
Client, 즉 프론트 영역에서 Controller로 request를 한다. 이때 DTO 형식의 객체를 만들어 요청을 넣는다. 예를 들어 해당 요청이 회원 가입과 관련된 것이라면, 이름, 아이디, 비밀번호를 포함하는 DTO 객체를 만들어 컨트롤러로 요청을 한다.
컨트롤러는 해당 요청이 어떠한 요청인지, 회원가입 요청인지 판단하고 그것과 맞게 되는 서비스로 DTO 객체를 보낸다.
서비스는 이 비지니스 로직의 전반적인 내용을 처리하는 영역이다. 회원 정보에 이름, 아이디, 비밀번호뿐만 아니라 멤버 등급, 가입 날짜와 같은 추가적인 정보를 채워 넣는다. 이것을 바탕으로 Entity 객체를 만든다. Entity는 데이터베이스와 1대1 매핑이 되는, 즉 데이터베이스와 가장 가까운 객체라고 생각하면 된다. 그리고 DAO로 보낸다.
DAO(Repository)는 데이터베이스와 직접 통신을 하는 영역이다. Entity에 있는 값을 그대로 데이터베이스에 저장하거나 가져오거나 하는 역할을 한다.
ServiceImpl와 DAOImple은 뭘까? 보통 Service와 DAO는 인터페이스로 만들게 되는데, 실체 구현은 인터페이스를 상속받은 Impl에서 구현한다.
Entity (Domain)
데이터베이스에 쓰일 컬럼과 여러 엔티티 간의 연관관계를 정의한다.
데이터베이스의 테이블을 하나의 엔티티로 생각해도 무방하다. (1:1로 매핑됨)
이 클래스의 필드는 각 테이블 내부의 컬럼을 의미한다.
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name = "product")
public class ProductEntity {
@Id
String productId;
String productName;
Integer productPrice;
Integer productStock;
public ProductDto toDto(){
return ProductDto.builder()
.productId(productId)
.productName(productName)
.productPrice(productPrice)
.productStock(productStock)
.build();
}
}
@Entity 어노테이션을 붙이고, @Table 어노테이션을 통해 테이블명을 지정한다.
@Id는 테이블의 Primary 키를 지정하는 어노테이션이다.
Repository
Entity에 의해 생성된 데이터베이스 테이블에 접근하는 메소드를 사용하기 위한 인터페이스이다.
앞선 그림에서 봤듯이 Service와 DB를 연결하는 중간 다리 역할을 수행한다.
데이터베이스에 적용하고자 하는 CRUD를 정의하는 영역이다.
public interface ProductRepository extends JpaRepository<ProductEntity, String> {
}
JpaRepository를 상속하면 jpa가 기본적으로 제공하는 메소드를 사용할 수 있다.
여기서 첫 번째 값은 repository가 사용할 entity를 의미하고, 두 번째 값은 primary key의 data type을 의미한다.
DAO
Data Access Object의 줄임말로, 데이터베이스에 접근하는 객체를 의미한다. Persistance Layer이라고도 불린다.
Repository와 마찬가지로, Service와 DB에 연결할 수 있게 해주는 역할을 한다.
DB를 사용하여 데이터를 조회하거나 조작하는 기능을 전담한다.
즉, DB에 접근하는 본질은 Repository에 가지고 있고 메소드들을 활용해주는 것이 DAO라고 생각하면 된다.
public interface ProductDAO {
ProductEntity saveProduct(ProductEntity productEntity);
ProductEntity getProduct(String productId);
}
@Service
public class ProductDAOImpl implements ProductDAO {
ProductRepository productRepository;
@Autowired
public ProductDAOImpl(ProductRepository productRepository) {
this.productRepository = productRepository;
}
@Override
public ProductEntity saveProduct(ProductEntity productEntity) {
productRepository.save(productEntity);
return productEntity;
}
@Override
public ProductEntity getProduct(String productId) {
ProductEntity productEntity = productRepository.getById(productId);
return productEntity;
}
}
DTO
Data Transfer Object의 줄임말로, VO(Value Object)로 불리기도 하며 계층 간 데이터 교환을 위한 객체를 의미한다.
VO의 경우 Read Only의 개념을 가지고 있다.
Entity와 다른 점은 Entity는 데이터베이스와 동일하게 만들어져 있는 클래스이고, DTO는 Entity와 같은 필드 값을 가지고 있을 수 있지만 일반적으로 서비스에서 정보를 추가하거나 빼는 작업을 할 수 있기에 조금 더 DB의 컬럼과는 독립적이다.
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
public class ProductDto {
private String productId;
private String productName;
private int productPrice;
private int productStock;
public ProductEntity toEntity() {
return ProductEntity.builder()
.productId(productId)
.productName(productName)
.productPrice(productPrice)
.productStock(productStock)
.build();
}
}
설정
application.properties
## h2 데이터베이스 설정
## spring.h2.console.enabled=true
## Maria DB 데이터베이스 설정
spring.datasource.driverClassName=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/around_hub_shop
spring.datasource.username=root
spring.datasource.password=
## JPA 설정
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.7.3</version>
</dependency>
Reference
어라운드허브 스튜디오
'Back > spring' 카테고리의 다른 글
스프링부트 프로퍼티 암호화 (with. Jasypt) (0) | 2022.03.01 |
---|---|
Swagger 라이브러리 (0) | 2022.02.26 |
POST, GET, PUT, DELETE API (0) | 2022.02.21 |
스프링 웹 개발 기초 (0) | 2021.06.26 |