Map Struct?
Map Struct란 자바 빈의 매핑(Entity - DAO)을 쉽게 하도록 도와주는 프래임워크
자세한 설명은 아래 링크를 참고해주세요! (공식 사이트)
MapStruct - Java bean mappings, the easy way!
Gradle 환경에서 Map Struct을 사용한 Spring Boot 예제
Map Struct를 사용하면서 삽질을 많이 했기 때문에,
다른 분들은 저 같은 삽질은 하지 않았으면 좋겠는 마음으로 예제를 만들었습니다!
예제를 작성하다보니 본의아니게 예제가 길어졌습니다 (ㅜㅜ)
모든 소스코드는 깃허브에서 확인 가능합니다! :)
개발환경
- IntelliJ
- Gradle
- Java 1.8
- SpringBoot
의존성
- Web
- lombok
- JPA
- H2
- thymeleaf
1. Map Struct 다운로드 & 의존성 추가 & 속성 변경
File - Settings - Plugins 에 들어가서 MapStruct Support 를 다운로드 받아주세요.
Lombok이 안받아져 있으신 분은 Lombok도 다운로드 해주세요!
그 후에 Setting - Build, Execution, Deployment - Annotation Processors 에 들어가서
Enable annotation processing에 꼭! 체크를 해주세요
이제 의존성 추가를 해줄건데,
하나라도 빠트리시면 오류가 나니까(제가 그랬습니다 ㅠㅠ) 꼭 다 넣어주세요!
build.gradle
plugins {
...
id 'net.ltgt.apt' version '0.15'
}
...
apply plugin: "net.ltgt.apt"
...
dependencies {
...
compile('org.mapstruct:mapstruct:1.3.0.Beta2')
compileOnly('org.mapstruct:mapstruct-processor:1.3.0.Beta2')
annotationProcessor('org.mapstruct:mapstruct-processor:1.3.0.Beta2')
...
}
그 다음은 h2의 데이터베이스를 확인할 수 있게, 속성을 변경해주도록 하겠습니다!
application.propertise
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
2. Entity & DTO 만들기
간단하게 이름과 나이를 받는 Entity와 DTO를 만들었습니다.
entity/People.java
@Setter
@Getter
@Entity
public class People {
/**
*
* 유저의 아이디 (PK)
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 유저의 이름
*/
private String name;
/**
* 유저의 나이
*/
private String age;
}
service/dto/PeopleDTO.java
@Getter
@Setter
public class PeopleDTO {
/**
* 유저의 아이디 (PK)
*/
private Long id;
/**
* 유저의 이름
*/
private String name;
/**
* 유저의 나이
*/
private String age;
}
3. Repository 구현
CRUD 기능을 간편하게 사용할 수 있는 Repository를 구현하겠습니다.
repository/PeopleRepository.java
@Repository
public interface PeopleRepository extends JpaRepository<People, Long> {
}
의존성에 JPA를 추가했으니, JpaRepository를 상속 받겠습니다!
(물론 CrudRepositroy, PagingAndSortingRepository ... 무엇이든 생성(save)이 가능하면 상관없습니다!)
4. Mapper 구현
DTO를 Entity로, Entity를 DTO로 바꿔주는 Mapper를 구현해보겠습니다.
mapper/EntityMapper.java
public interface EntityMapper <D, E> {
E toEntity(D dto);
D toDto(E entity);
}
공통으로 사용할 수 있는 EntityMapper를 먼저 구현해줍니다.
이 EntityMapper는 언제든 상속해서 간편하게 사용할 수 있습니다!
mapper/PeopleMapper.java
@Mapper(componentModel = "spring")
public interface PeopleMapper extends EntityMapper<PeopleDTO, People> {
}
이런식으로 간단하게 구현이 가능합니다.
5. Service 구현
실제로 저장을 해주는 메소드를 작성해줍니다.
물론 interface를 만들고 상속받아 사용하는게 정석이지만,
소스코드를 조금이라도 줄이기위해 이 과정은 생략했습니다.
service/PeopleService.java
@Service
public class PeopleService {
@Autowired
PeopleRepository peopleRepository;
PeopleMapper peopleMapper;
public PeopleService(PeopleMapper peopleMapper) {
this.peopleMapper = peopleMapper;
}
/**
* 유저 저장
* @param peopleDTO peopleDTO
*/
public void save(PeopleDTO peopleDTO){
People people = peopleMapper.toEntity(peopleDTO); // DTO -> Entity
peopleRepository.save(people); // Entity를 저장
}
}
이런식으로 간편하게 사용이 가능합니다!
(아까 EntityMapper에서 toEntity뿐만 아니라 toDTO도 정의해놓았으니 필요하면 toDTO도 사용이 가능하겠죠!?)
6. Controller 구현
Controller는 간단하게 Service의 save 기능을 이용하게 구현을 해보겠습니다.
controller/PeopleController.java
@Controller
public class PeopleController {
@Autowired
PeopleService peopleService;
@GetMapping("/")
public String getPeople(){
return "hello";
}
@PostMapping("/")
@ResponseBody
public String postPeople(@ModelAttribute PeopleDTO peopleDTO, HttpServletResponse response){
peopleService.save(peopleDTO);
return "성공했습니다!";
}
}
7. view 구현
thymeleaf를 사용해서 간단하게 정보를 넘겨주는 View를 구현해보겠습니다.
template/hello.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>회원정보 입력</h2>
<form th:action="@{/}" th:method="POST">
이름 : <input type="text" name="name" id="name">
나이 : <input type="text" name="age" id="age">
<input type="submit">
</form>
</body>
</html>
이렇게 하면 ~ 완성입니다!
실행화면을 보도록 하겠습니다!
8. 실행화면
localhost:8080 에 접속하게 되면 아래와 같은 화면이 나옵니다!
이름과 나이를 채우고 제출을 눌러주세요 (성공했습니다! 가 나오면 됩니다!)
그 후에, 아래 링크로 접속합니다.
localhost:8080/h2-console
JDBC URL을 사진과 같이 바꿔주고 Connect를 눌러주세요!
SELECT * FROM people;
위 쿼리문을 작성하고 Run을 눌러 결과를 확인해주세요
예제를 따라하면서 조금이라도 map struct에 대해 감이 잡히셨으면 좋겠습니다 :)
틀린 내용이나 보충해야될 내용이 있으면 알려주시면 감사하겠습니다!
모든 소스코드는 깃허브에서 확인 가능합니다! :)
참고 링크
'Backend > SpringBoot' 카테고리의 다른 글
SpringBoot로 JSON 응답 보내는 방법 (GSON JsonObject, @ResponseBody, @RestController) (0) | 2019.12.26 |
---|---|
SpringBoot와 Thymeleaf를 이용하여 페이징하기 (1) | 2019.12.11 |
Spring Boot Validation을 사용하여 요청 값 검증하기 (0) | 2019.11.07 |
DAO, DTO 차이점 (0) | 2019.11.04 |
스프링부트의 디렉토리(패키지) 구조와 역할 (0) | 2019.04.19 |