일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스프링
- OAuth
- apache
- RabbitMQ
- oauth2
- Security
- java
- jvm
- Producer
- 클린코드
- g1
- clean code
- assertj
- JPA
- 페이징
- Spring
- 스프링부트
- 스프링 부트
- spring boot
- 시큐리티
- JWT
- gdg
- Refactoring
- tomcat
- 페이스북
- 권한
- 리팩토링
- GC
- load balancing
- 비동기
Archives
- Today
- Total
허원철의 개발 블로그
Spring Boot - Data JPA & ModelMapper 본문
이번글은 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