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);
}
}