실제 프로젝트를 작성할 경우 엔티티 객체를 영속 계층 바깥쪽에서 사용하는 방식 보다는 DTO(Data Transfer Object)를 이용하는 방식을 권장한다.
DTO는 엔티티 객체와 달리 각 계층끼리 주고받는 우편물이나 상자의 개념이다. 순수하게 데이터를 담고 있다는 점에서 엔티티 객체와 유사하지만, 목적 자체가 데이터의 전달이므로 읽고,쓰는 것이 모두 허용되는 점이 가능하고 일회성으로 사용되는 성격이 강하다.
JPA의 엔티티 객체는 단순히 데이터를 담는 객체가 아니라 실제 DB와 관련이 있고, 내부적으로 엔티티 매니저가 관리하는 객체이다.
DTO의 장점
- 엔티티 객체의 범위를 한정 지을 수 있어 안전한 코드를 작성할 수 있다.
- 화면과 데이터를 분리하려는 취지에 걸맞는 방식이다.
DTO의 단점
- Entity와 유사한 코드를 중복으로 개발한다.
- 엔티티 객체를 DTO로 변환하거나 반댈 DTO 객체를 엔티티로 변환하는 과정이 필요하다.
서비스 계층 작성
예제로 서비스 계층을 생성하고 해당 계층에서 DTO로 파라미터와 리턴 타입을 처리하도록 구성한다.
dto 패키지를 생성한 뒤 DTO클래스를 선언하고 필드들을 선언하고, service 패키지를 생성한 뒤 DTO의 필요한 내용을 전달받고, 반환하도록 처리하는데 필요한 Service 인터페이스와 ServiceImpl 클래스를 생성한다.
DTO클래스는 엔티티 클래스인 Guestbook과 거의 동일한 필드들을 가지고 있고, getter/setter를 통해 자유롭게 값을 변경할 수 있게 구성한다.
GuestbookSerivce 인터페이스는 DTO를 엔티티 타입의 객체로 변환하는 메서드를 작성한다.
(Java8 버전부터는 인터페이스의 실제 내용을 가지는 코드를 dafault 키워드로 생성할 수 있다. 이는 기존에 추상 클래스를 통해서 전달 해야하는 실제 코드를 인터페이스에 선언할 수 있다. 이를 통해서 '인터페이스->추상 클래스->구현 클래스'의 형태로 구현되던 방식에서 추상 클래스를 생략하는 것이 가능하다.)
ServiceImpl 클래스에서는 이를 활용하여 파라미터로 전돨되는 DTO를 변환한다.
JPA 처리를 위해서 Repository를 주입하고 클래스 선언 시에 @RequiredArgsConstructor를 이용하여 자동으로 주입한다.
register() 내부에서는 save()를 통해서 저장하고, 저장된 후에 해당 엔티티가 가지는 gno값을 반환한다.
테스트 폴더에 테스트 폴더를 작성한다.
테스트 코드를 실행한다.
위와 같이 gno가 301인 데이터가 들어온 것을 볼 수 있다.
'코드로 배우는 스프링부트 웹 프로젝트' 카테고리의 다른 글
Springboot) GET & POST 방식의 차이점 / 등록 페이지와 등록 처리 (1) | 2021.12.09 |
---|---|
Springboot) 목록 처리 (0) | 2021.12.06 |
Springboot) 동적 쿼리 처리를 위한 Querydsl 설정과 사용 (0) | 2021.12.02 |
Springboot) 자동으로 처리되는 날짜/시간 설정 , JPA객체의 범위 (0) | 2021.12.02 |
Springboot)Thymeleaf 의 사용법 (0) | 2021.11.26 |