본문 바로가기

Backend/SpringBoot

Spring Boot Map Struct Gradle 사용해보기

Map Struct?

Map Struct란 자바 빈의 매핑(Entity - DAO)을 쉽게 하도록 도와주는 프래임워크

자세한 설명은 아래 링크를 참고해주세요! (공식 사이트)

MapStruct - Java bean mappings, the easy way!

 

MapStruct – Java bean mappings, the easy way!

Java bean mappings, the easy way! Get started Download

mapstruct.org

 

Gradle 환경에서 Map Struct을 사용한 Spring Boot 예제

Map Struct를 사용하면서 삽질을 많이 했기 때문에,

다른 분들은 저 같은 삽질은 하지 않았으면 좋겠는 마음으로 예제를 만들었습니다!

예제를 작성하다보니 본의아니게 예제가 길어졌습니다 (ㅜㅜ)

모든 소스코드는 깃허브에서 확인 가능합니다! :)

개발환경

  • IntelliJ
  • Gradle
  • Java 1.8
  • SpringBoot

의존성

  • Web
  • lombok
  • JPA
  • H2
  • thymeleaf

 

1. Map Struct 다운로드 & 의존성 추가 & 속성 변경

MapStruct Support
Lombok

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

 

h2-console

JDBC URL을 사진과 같이 바꿔주고 Connect를 눌러주세요!

 

h2-console

SELECT * FROM people;

위 쿼리문을 작성하고 Run을 눌러 결과를 확인해주세요

예제를 따라하면서 조금이라도 map struct에 대해 감이 잡히셨으면 좋겠습니다 :)

틀린 내용이나 보충해야될 내용이 있으면 알려주시면 감사하겠습니다!

모든 소스코드는 깃허브에서 확인 가능합니다! :)

 

참고 링크

MapStruct - Java bean mappings, the easy way!

MapStruct - @Mapper annotation don't create bean