실제 프로젝트 작성 시 엔티티 객체를 영속 계층 바깥쪽에서 사용하는 방식보다는 DTO(Data Transfer Object) 이용
DTO는 엔티티 객체와 달리 각 계층에서 주고 받는 우편물이나 상자의 개념
순수하게 데이터를 담고 있다는 점에서 엔티티 객체와 유사하지만 목적 자체가 데이터의 전달이므로 읽고 쓰기가 가능하고 일회성으로 사용되는 성격이 강함
JPA를 사용하면 엔티티 객체는 단순히 데이터를 담는 객체가 아니라 실제 데이터와 연관있고, 내부적으로 엔티티 매니저가 관리하는 객체이며, DTO가 일회성으로 데이터를 주고 받는 용도로 사용되는 것과 달리 생명주기도 달라 분리해서 처리하는 것을 권장
예제에서는 서비스 계층을 생성하고 서비스 계층에서는 DTO로 파라미터와 리턴 타입 처리
DTO를 사용하면 엔티티 객체의 범위를 한정 지을 수 있기 때문에 좀 더 안전한 코드 작성이 가능,
화면과 데이터를 분리하려는 취지에도 좀 더 부합
DTO를 사용하는 경우 가장 큰 단점은 Entity와 유사한 코드를 중복으로 개발한다는 점과,
엔티티 객체를 DTO로 변환하거나 DTO 객체를 엔티티로 변환하는 과정이 필요
1. GuestbookDTO 클래스 생성
package com.example.chapter4.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class GuestbookDTO {
private Long gno;
private String title;
private String content;
private String writer;
private LocalDateTime regDate, modDate;
}
2. GuestbookService 인터페이스 생성
package com.example.chapter4.service;
import com.example.chapter4.Entity.Guestbook;
import com.example.chapter4.dto.GuestbookDTO;
public interface GuestbookService {
Long register(GuestbookDTO dto);
}
3. GuestbookServiceImpl 클래스 생성
package com.example.chapter4.service;
import com.example.chapter4.Entity.Guestbook;
import com.example.chapter4.dto.GuestbookDTO;
import com.example.chapter4.repository.GuestbookRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
// @Service : 해당 클래스를 루트 컨테이너에 빈 객체로 생성
// 로직 처리(서비스 레이어, 내부에서 자바 로직 처리)
@Service
@Log4j2
public class GuestbookServiceImpl implements GuestbookService{
@Override
public Long register(GuestbookDTO dto) {
return null;
}
}
4. GuestbookService 인터페이스 수정
package com.example.chapter4.service;
import com.example.chapter4.Entity.Guestbook;
import com.example.chapter4.dto.GuestbookDTO;
public interface GuestbookService {
Long register(GuestbookDTO dto);
default Guestbook dtoToEntity(GuestbookDTO dto){
Guestbook entity = Guestbook.builder()
.gno(dto.getGno())
.title(dto.getTitle())
.content(dto.getContent())
.writer(dto.getWriter())
.build();
return entity;
}
}
5. GuestbookServiceImpl 클래스 수정
package com.example.chapter4.service;
import com.example.chapter4.Entity.Guestbook;
import com.example.chapter4.dto.GuestbookDTO;
import com.example.chapter4.repository.GuestbookRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
// @Service : 해당 클래스를 루트 컨테이너에 빈 객체로 생성
// 로직 처리(서비스 레이어, 내부에서 자바 로직 처리)
@Service
@Log4j2
public class GuestbookServiceImpl implements GuestbookService{
@Override
public Long register(GuestbookDTO dto) {
log.info("DTO------------------");
log.info(dto);
Guestbook entity = dtoToEntity(dto);
log.info("Entity---------------");
log.info(entity);
return null;
}
}
6. GuestbookServiceTests 클래스 생성
package com.example.chapter4.service;
import com.example.chapter4.dto.GuestbookDTO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class GuestbookServiceTests {
@Autowired
private GuestbookService service;
@Test
public void testRegister() {
GuestbookDTO guestbookDTO = GuestbookDTO.builder()
.title("Sample Title...")
.content("Sample Content...")
.writer("user0")
.build();
System.out.println(service.register(guestbookDTO));
}
}
7. GuestbookServiceImpl 클래스 수정
package com.example.chapter4.service;
import com.example.chapter4.Entity.Guestbook;
import com.example.chapter4.dto.GuestbookDTO;
import com.example.chapter4.repository.GuestbookRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
// @Service : 해당 클래스를 루트 컨테이너에 빈 객체로 생성
// 로직 처리(서비스 레이어, 내부에서 자바 로직 처리)
@Service
@Log4j2
@RequiredArgsConstructor // 의존성 자동 주입
public class GuestbookServiceImpl implements GuestbookService{
private final GuestbookRepository repository; // 반드시 final로 선언
@Override
public Long register(GuestbookDTO dto) {
log.info("DTO------------------");
log.info(dto);
Guestbook entity = dtoToEntity(dto);
log.info("Entity---------------");
log.info(entity);
repository.save(entity);
return entity.getGno();
}
}
8. 추가된 데이터 확인
'IntelliJ > Spring boot' 카테고리의 다른 글
[Springboot]게시판 만들기 2장 Querydsl 설정 및 테스트 - hoyhi (0) | 2021.04.25 |
---|---|
[Springboot]게시판 만들기 1장 프로젝트 설정 및 테이블 생성 - hoyhi (0) | 2021.04.25 |
[Spring boot] Entitiy, DTO, VO 차이 -hoyhi-tistory (0) | 2021.04.03 |
Spring Model 객체 (0) | 2021.02.21 |
스프링부트 프로젝트 생성 (0) | 2021.02.21 |