허원철의 개발 블로그

Spring Boot - Data JPA & ModelMapper 본문

web

Spring Boot - Data JPA & ModelMapper

허원철 2017. 4. 30. 12:33
이번글은 Data JPA를 사용하면서 편하게 DTO를 만들 수 있도록 도와주는 라이브러리에 대한 글입니다.
 


JPA를 사용하다보면 난해한 부분이 있습니다. '나는 이 데이터를 보여주기 싫어' 라는 생각이 들 때가 많습니다. 예를 들면, 게시판에 대한 내용을 글 목록만 보여주는 페이지에 굳이 안보여질 내용까지 반환되어 나오는 상황이 생깁니다. 여러가지 방법이 있겠지만, Repository를 수정하지 않고 Service, Controller에서만 작업을 하고 싶다면 Dozer, ModelMapper를 사용하면 간단하게 DTO로 변환할 수 있습니다. 
 
Dozer와 ModelMapper 중 ModelMapper를 사용해보도록 하겠습니다. (개인적으로 더 간편해 보였습니다...ㅎ)
 
 
Gradle 설정
- dependency의 일부입니다.
  
1
2
3
4
5
6
7
dependencies {
//...
 
    compile('org.modelmapper:modelmapper:0.7.8')
 
//...
}
cs
   
 
Bean 등록
- ModelMapper를 Bean으로 등록해줍니다.

1
2
3
4
@Bean
public ModelMapper modelMapper() {
    return new ModelMapper();
}
cs
   
 
Notice Domain Class
- 게시판 용도의 Domain Class 입니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Data
@Entity
@Table(name = "NOTICE")
@JsonIgnoreProperties({"hibernateLazyInitializer""handler"})
public class Notice implements Serializable {
 
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "NOTICE_IDX")
    private Long idx;
 
    @NotNull
    private String title;
 
    @NotNull
    private String content;
 
    private LocalDateTime createDateTime;
 
    private LocalDateTime modifyDateTime;
 
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "EMAIL")
    private Member member;
 
    public Notice() {}
 
    public Notice(String title, String content) {
        this.title = title;
        this.content = content;
    }
}
cs

 
Notice DTO Class
- 게시판 용도의 DTO 클래스입니다. Domain에서 내용 부분만 빼고 DTO를 구성하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
@Data
public class NoticeDto {
 
    private Long idx;
 
    private String title;
 
    private LocalDateTime createDateTime;
 
    private LocalDateTime modifyDateTime;
 
    private Member member;
}
cs

 
Service
- JPA를 따로 설명을 하지 않을 것 이기 때문에, Service부분에서 ModelMapper를 적용한 일부만 발췌합니다.
- Java 8과 lamda 표현식으로 이용하면 매우 깔끔한 코드로 변환할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Service
@Transactional
public class NoticeServiceImpl implements NoticeService {
 
    @Autowired NoticeRepository noticeRepository;
 
    @Autowired ModelMapper modelMapper;
 
    @Override
    public Page<NoticeDto> findNoticePaging(Integer page, String type, String keyword) {
        return findNoticeByConditions(page, type, keyword)
                .map(notice -> modelMapper.map(notice, NoticeDto.class));
    }
 
    // ...
}
 
cs
 
 
참고
  
- 해당 예제는 개인프로젝트에서 진행한 소스 일부입니다. 자세한 사항은 깃헙 소스를 참고하시면 되겠습니다.

 

'web' 카테고리의 다른 글

Spring Boot - Async 제대로 사용하기  (407) 2017.05.18
Spring Boot - Excel Upload & Download  (418) 2017.05.05
Spring Boot - MyBatis  (396) 2017.04.13
Spring Boot + JPA + Time package Issue  (437) 2017.03.22
JPA - Persistence Context (영속성 컨텍스트)  (421) 2017.03.16
Comments