Post

Mapstruct Utility Library, Swagger

๐Ÿ‘Ž๐Ÿป ๊ธฐ์กด ์ฝ”๋“œ ํ•œ๊ณ„:

DTO, Entity๋ฅผ ๋ฌด์กฐ๊ฑด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜๋‹ค๋ณด๋‹ˆ,
์‚ฌ์‹ค ๋‘ ํŒŒ์ผ ๊ฐ„ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์€๋ฐโ€ฆ๋‘ ํด๋ž˜์Šค ๊ฐ„ ์ฝ”๋“œ๊ฐ€ ๋น„์Šทํ•จ.
๋˜ ๋‘ ํŒŒ์ผ ๊ฐ„ ์ƒ์„ฑ์ž๊ฐ€ ๋น„์Šทํ•จ.

๐Ÿ‘Œ๐Ÿป Mapstruct์œผ๋กœ ํ•ด๊ฒฐ!
๐Ÿ•ต๐Ÿปโ€โ™‚๏ธ Mapstruct์€ runtime meta programming
annotation ํ”„๋กœ์„ธ์„œ๊ฐ€ ์ปดํŒŒ์ผ ์ดํ›„ ์ž๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.

๐Ÿ”— Mapstruct

๋ชฉ์ : ๊ฐ์ฒด ๊ฐ„ ํŽธ์•ˆํ•œ ๋งคํ•‘
Mapstruct๋Š” ์ด๋ฆ„์ด ๊ฐ™์€ ํ•„๋“œ๋Š” ์ž๋™์œผ๋กœ ๋งคํ•‘์„ ํ•ด ์ค€๋‹ค.
Mapstruct์€ interface
โ—๏ธโ—๏ธโ—๏ธ ์ƒ์„ฑํ•˜๋Š” target์€ setter๊ฐ€ ๋ฌด์กฐ๊ฑด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ’ก default๊ฐ’์„ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
default value: ์ด ํ•„๋“œ ๊ฐ’์ด ์—†์„ ๋•Œ ๊ธฐ๋ณธ์œผ๋กœ ์ž…๋ ฅ๋˜๋Š” ๊ฐ’
๐Ÿ’ก custom ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    //๐Ÿ”—Mapstruct์ „์— ์ด๋ ‡๊ฒŒ ์„ ์–ธ๋˜์–ด ์žˆ์—ˆ์Œ
    //itemEntity์™€ Item์ด ๋งค์šฐ ๋น„์Šทํ•˜๋‹ค.
    //itemEntity๋ฅผ ๋ฐ›์•„ Item์œผ๋กœ ๋งŒ๋“ค๊ธฐ
    //โญ๏ธ ์ƒ์„ฑ์ž๋กœ db์—์„œ ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ JAVA์—์„œ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค๊ธฐ
    public Item (ItemEntity itemEntity){
        this.id= itemEntity.getCapacity();
        this.type= itemEntity.getType();
        this.price= itemEntity.getPrice();
        this.name= itemEntity.getName();
        this.spec= new Spec(itemEntity.getCpu(), itemEntity.getCapacity());
    }


    //๐Ÿ”—Mapstruct์„ ์‚ฌ์šฉํ•ด ItemMapper์„ ๋งŒ๋“ ๋‹ค.
@Mapper
public interface ItemMapper {
    //์‹ฑ๊ธ€ํ†ค
    ItemMapper INSTANCE= Mappers.getMapper(ItemMapper.class);
    //๋ฉ”์†Œ๋“œ
    //item์„ ๋ฐ›์•„์„œ itemEntity์— ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•ด ๋งŒ๋“ค์–ด์ค€๋‹ค.
    @Mapping(target= "spec.cpu", source= "cpu")
    @Mapping(target= "spec.capacity", source= "capacity")
    Item itemEntityToItem(ItemEntity itemEntity);
    //๊ทผ๋ฐ Item ์ƒ์„ฑ์ž๋ณด๋ฉด spec์˜ ๊ฒฝ์šฐ ์ข€ ํŠน์ดํ•จ. spec์•ˆ์— Cpu, Capacity์žˆ์Œ
    //this.spec= new Spec(itemEntity.getCpu(), itemEntity.getCapacity());
    //์ด๋ ‡๊ฒŒ getCpu๋ž‘ getCapacity๋ฅผ ํ•ฉ์ณ์•ผ ํ•œ๋‹ค.
    //๋”ฐ๋ผ์„œ annotatoin์— ๋ช…์‹œํ•ด์ฃผ๊ธฐ @Mapping
}

//์ด์ œ ItemEntity๋ฅผ Item์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ์—์„œ ๐Ÿ”—Mapstruct ์‚ฌ์šฉ
public class ElectronicStoreItemService {
    public List<Item> findAllItem() {
        List<ItemEntity> itemEntities= electronicStoreItemRepository.findAllItems();
        //๐Ÿ”—Mapstruct
        return itemEntities.stream().map(ItemMapper.INSTANCE::itemEntityToItem).collect(Collectors.toList());
    }

    public List<Item> findAllItemsByIds(List<String> ids) {
        List<ItemEntity> itemEntities = electronicStoreItemRepository.findAllItems();
        return itemEntities.stream()
        //์ด๋ ‡๊ฒŒ ๐Ÿ”— Mapstruct ์‚ฌ์šฉ
                .map(ItemMapper.INSTANCE::itemEntityToItem)
                .filter((item)->ids.contains(item.getId()))
                .collect(Collectors.toList());
    }

    public Item findItemById(String id) {
        Integer idInt= Integer.parseInt(id);
        ItemEntity itemEntity= electronicStoreItemRepository.findItemById(idInt);
        //๐Ÿ”—Mapstuct
//        Item item= new Item(itemEntity); //๊ธฐ์กด ์ฝ”๋“œ
        Item item= ItemMapper.INSTANCE.itemEntityToItem(itemEntity);

        return item;
    }
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//ticket๊ณผ airline Ticket์ด ๋งค์šฐ ๋น„์Šทํ•จ
//๐Ÿ”—Mapstruct๋กœ ์—ฐ๊ฒฐ
@Mapper
public interface TicketMapper {
    //singleTon
    TicketMapper INSTANCE= Mappers.getMapper(TicketMapper.class);
    //method
    @Mapping(target= "depart", source="departureLocation")
    @Mapping(target= "arrival", source="arrivalLocation")
    @Mapping(target= "departTime", source="departureAt")
    @Mapping(target= "returnTime", source="returnAt")

    Ticket airlineTicketToTicket(AirlineTicket airlineTicket);
}

//@mapping ์ด์œ 
//AirlineTicket์ด๋ž‘ Ticket์ด๋ž‘ ์กฐ๊ธˆ ๋‹ค๋ฅธ๋ฐ ๋งž์ถฐ์ฃผ๊ธฐ ์œ„ํ•ด์„œ
public class AirlineTicket {
    private Integer ticketId;
    private String ticketType;
    private String departureLocation;
    private String arrivalLocation;
    private LocalDateTime departureAt;
    private LocalDateTime returnAt;
}

public class Ticket {
    private String depart;
    private String arrival;
    private String departureTime;
    private String returnTime;
    private Integer ticketId;

//์•— ๊ทผ๋ฐ departureTime, returnTime์›ํ•˜๋Š” ํ˜•์‹์ด ์žˆ์Œ
//๐Ÿ’ก custom ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    private static DateTimeFormatter formatter= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    public Ticket(AirlineTicket airlineTicket) {
        this.depart = airlineTicket.getDepartureLocation();
        this.arrival = airlineTicket.getArrivalLocation();
        this.departureTime = airlineTicket.getDepartureAt().format(formatter); //์›ํ•˜๋Š” ํ˜•์‹์ด ์žˆ์Œ
        this.returnTime = airlineTicket.getReturnAt().format(formatter);} //์›ํ•˜๋Š” ํ˜•์‹์ด ์žˆ์Œ
}

//๐Ÿ’ก custom ํ•จ์ˆ˜๋ฅผ Mapper์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •
@Mapper
public interface TicketMapper {
    //singleTon
    TicketMapper INSTANCE= Mappers.getMapper(TicketMapper.class);
    //method
    @Mapping(target= "depart", source="departureLocation")
    @Mapping(target= "arrival", source="arrivalLocation")
    @Mapping(target= "departTime", source="departureAt", qualifiedByName = "convert") //๐Ÿ’ก custom ํ•จ์ˆ˜ ์ถ”๊ฐ€
    @Mapping(target= "returnTime", source="returnAt", qualifiedByName = "convert") //๐Ÿ’ก custom ํ•จ์ˆ˜ ์ถ”๊ฐ€

    Ticket airlineTicketToTicket(AirlineTicket airlineTicket);
    // ๐Ÿ’ก formatter๋ฅผ ๋จผ์ € ์ถ”๊ฐ€ํ•˜๊ณ 
    static DateTimeFormatter formatter= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    //๐Ÿ’ก custom ํ•จ์ˆ˜ ์ถ”๊ฐ€
    @Named("convert")
    static String localDateTimeToString(LocalDateTime localDateTime){
        return localDateTime.format(formatter);
    }
}


This post is licensed under CC BY 4.0 by the author.