728x90
반응형
≣ 목차
코드에 정답이 있는 건 아니지만 최대한 클린 코드 하려고 노력해보았다!
JPA 공부 후 적용해보기 :)
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
//Domain
package com.group.libraryapp.report.sec02.domain;
import lombok.Getter;
import org.hibernate.annotations.ColumnDefault;
import javax.persistence.*;
@Entity
@Getter
public class Fruit {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 20)
private String name;
@Column(nullable = false, length = 50, name = "warehousingDate")
private String warehousingDate;
@Column(nullable = false)
private Long price;
@ColumnDefault("0")
private int sell;
public Fruit() {
}
public Fruit(String name, String warehousingDate, Long price) {
this.name = name;
this.warehousingDate = warehousingDate;
this.price = price;
}
public void updateSell(int sell) {
this.sell = sell;
}
}
/* ****************************************************************** */
//Repository
package com.group.libraryapp.report.sec02.repository;
import com.group.libraryapp.report.sec02.domain.Fruit;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface FruitRepository extends JpaRepository<Fruit, Long> {
List<Fruit> findByName(String name);
List<Fruit> findByPriceGreaterThanEqual(Long price);
List<Fruit> findByPriceLessThanEqual(Long price);
}
/* ****************************************************************** */
//Controller
package com.group.libraryapp.report.sec02.controller;
import com.group.libraryapp.report.sec02.domain.Fruit;
import com.group.libraryapp.report.sec02.dto.FruitByPrice;
import com.group.libraryapp.report.sec02.service.FruitService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
public class FruitController {
private final FruitService service;
public FruitController(FruitService service) {
this.service = service;
}
//과일 정보 저장
@PostMapping("/api/v1/fruit")
public void save(@RequestBody Fruit fruit) {
service.save(fruit);
}
//팔린 과일 정보 기록
@PutMapping("/api/v1/fruit")
public void record(@RequestBody Fruit fruit) {
service.sellRecord(fruit);
}
//팔린 금액, 팔리지 않은 금액 조회
@GetMapping("/api/v1/fruit/stat")
public Map<String, Long> sellingAmount(@RequestParam String name) {
return service.searchAmount(name);
}
//이름별 과일 개수 조회
@GetMapping("/api/v1/fruit/count")
public Map<String, Integer> countNum(@RequestParam String name) {
return service.countNum(name);
}
//금액별 과일 목록 조회
@GetMapping("/api/v1/fruit/list")
public List<FruitByPrice> fruitByPrice(@RequestParam String option, Long price) {
return service.fruitByPrice(option, price);
}
}
/* ****************************************************************** */
//Service
package com.group.libraryapp.report.sec02.service;
import com.group.libraryapp.report.sec02.domain.Fruit;
import com.group.libraryapp.report.sec02.dto.FruitByPrice;
import com.group.libraryapp.report.sec02.repository.FruitRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class FruitService {
private final FruitRepository repository;
public FruitService(FruitRepository repository) {
this.repository = repository;
}
@Transactional
public void save(Fruit fruit) {
repository.save(new Fruit(fruit.getName(), fruit.getWarehousingDate(), fruit.getPrice()));
}
@Transactional
public void sellRecord(Fruit fruit) {
Fruit f = repository.findById(fruit.getId())
.orElseThrow(IllegalAccessError::new);
f.updateSell(1);
}
@Transactional
public Map<String, Long> searchAmount(String name) {
List<Fruit> fruits = repository.findByName(name);
long salesAmount = 0, notSalesAmount = 0;
for (Fruit fruit : fruits) {
if (fruit.getSell() == 1) {
salesAmount += fruit.getPrice();
} else {
notSalesAmount += fruit.getPrice();
}
}
Map<String, Long> amount = new HashMap<>();
amount.put("salesAmount", salesAmount);
amount.put("notSalesAmount", notSalesAmount);
return amount;
}
@Transactional
public Map<String, Integer> countNum(String name) {
List<Fruit> fruits = repository.findByName(name);
Map<String, Integer> count = new HashMap<>();
count.put("count", fruits.size());
return count;
}
public List<FruitByPrice> fruitByPrice(String option, Long price) {
List<Fruit> fruits = new ArrayList<>();
List<FruitByPrice> fruitList = new ArrayList<>();
switch (option) {
case "GTE":
fruits = repository.findByPriceGreaterThanEqual(price);
break;
case "LTE":
fruits = repository.findByPriceLessThanEqual(price);
break;
}
for (Fruit fruit : fruits) {
fruitList.add(
new FruitByPrice(
fruit.getName(),
fruit.getPrice(),
fruit.getWarehousingDate()
));
}
return fruitList;
}
}
/* ****************************************************************** */
//DTO
package com.group.libraryapp.report.sec02.dto;
import lombok.Getter;
@Getter
public class FruitByPrice {
private String name;
private Long price;
private String warehousingDate;
public FruitByPrice(String name, Long price, String warehousingDate) {
this.name = name;
this.price = price;
this.warehousingDate = warehousingDate;
}
}
|
cs |
더보기
더보기
Domain
package com.group.libraryapp.report.sec02.domain;
import lombok.Getter;
import org.hibernate.annotations.ColumnDefault;
import javax.persistence.*;
@Entity
@Getter
public class Fruit {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 20)
private String name;
@Column(nullable = false, length = 50, name = "warehousingDate")
private String warehousingDate;
@Column(nullable = false)
private Long price;
@ColumnDefault("0")
private int sell;
public Fruit() {
}
public Fruit(String name, String warehousingDate, Long price) {
this.name = name;
this.warehousingDate = warehousingDate;
this.price = price;
}
public void updateSell(int sell) {
this.sell = sell;
}
}
Repository
package com.group.libraryapp.report.sec02.repository;
import com.group.libraryapp.report.sec02.domain.Fruit;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface FruitRepository extends JpaRepository<Fruit, Long> {
List<Fruit> findByName(String name);
List<Fruit> findByPriceGreaterThanEqual(Long price);
List<Fruit> findByPriceLessThanEqual(Long price);
}
Controller
package com.group.libraryapp.report.sec02.controller;
import com.group.libraryapp.report.sec02.domain.Fruit;
import com.group.libraryapp.report.sec02.dto.FruitByPrice;
import com.group.libraryapp.report.sec02.service.FruitService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
public class FruitController {
private final FruitService service;
public FruitController(FruitService service) {
this.service = service;
}
//과일 정보 저장
@PostMapping("/api/v1/fruit")
public void save(@RequestBody Fruit fruit) {
service.save(fruit);
}
//팔린 과일 정보 기록
@PutMapping("/api/v1/fruit")
public void record(@RequestBody Fruit fruit) {
service.sellRecord(fruit);
}
//팔린 금액, 팔리지 않은 금액 조회
@GetMapping("/api/v1/fruit/stat")
public Map<String, Long> sellingAmount(@RequestParam String name) {
return service.searchAmount(name);
}
//이름별 과일 개수 조회
@GetMapping("/api/v1/fruit/count")
public Map<String, Integer> countNum(@RequestParam String name) {
return service.countNum(name);
}
//금액별 과일 목록 조회
@GetMapping("/api/v1/fruit/list")
public List<FruitByPrice> fruitByPrice(@RequestParam String option, Long price) {
return service.fruitByPrice(option, price);
}
}
Service
package com.group.libraryapp.report.sec02.service;
import com.group.libraryapp.report.sec02.domain.Fruit;
import com.group.libraryapp.report.sec02.dto.FruitByPrice;
import com.group.libraryapp.report.sec02.repository.FruitRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class FruitService {
private final FruitRepository repository;
public FruitService(FruitRepository repository) {
this.repository = repository;
}
@Transactional
public void save(Fruit fruit) {
repository.save(new Fruit(fruit.getName(), fruit.getWarehousingDate(), fruit.getPrice()));
}
@Transactional
public void sellRecord(Fruit fruit) {
Fruit f = repository.findById(fruit.getId())
.orElseThrow(IllegalAccessError::new);
f.updateSell(1);
}
@Transactional
public Map<String, Long> searchAmount(String name) {
List<Fruit> fruits = repository.findByName(name);
long salesAmount = 0, notSalesAmount = 0;
for (Fruit fruit : fruits) {
if (fruit.getSell() == 1) {
salesAmount += fruit.getPrice();
} else {
notSalesAmount += fruit.getPrice();
}
}
Map<String, Long> amount = new HashMap<>();
amount.put("salesAmount", salesAmount);
amount.put("notSalesAmount", notSalesAmount);
return amount;
}
@Transactional
public Map<String, Integer> countNum(String name) {
List<Fruit> fruits = repository.findByName(name);
Map<String, Integer> count = new HashMap<>();
count.put("count", fruits.size());
return count;
}
public List<FruitByPrice> fruitByPrice(String option, Long price) {
List<Fruit> fruits = new ArrayList<>();
List<FruitByPrice> fruitList = new ArrayList<>();
switch (option) {
case "GTE":
fruits = repository.findByPriceGreaterThanEqual(price);
break;
case "LTE":
fruits = repository.findByPriceLessThanEqual(price);
break;
}
for (Fruit fruit : fruits) {
fruitList.add(
new FruitByPrice(
fruit.getName(),
fruit.getPrice(),
fruit.getWarehousingDate()
));
}
return fruitList;
}
}
DTO
package com.group.libraryapp.report.sec02.dto;
import lombok.Getter;
@Getter
public class FruitByPrice {
private String name;
private Long price;
private String warehousingDate;
public FruitByPrice(String name, Long price, String warehousingDate) {
this.name = name;
this.price = price;
this.warehousingDate = warehousingDate;
}
}
728x90
반응형
'Back-End > Spring Boot' 카테고리의 다른 글
데이터베이스 decimal 타입 JPA 에서 표현하기 (0) | 2024.07.09 |
---|---|
@UniqueConstraint 와 @Colume 의 unique 속성 차이 (0) | 2024.07.09 |
JPA를 사용하는 이유 (0) | 2024.04.16 |
Spring Boot - 서버 (0) | 2022.08.31 |
Spring Boot - 서버 환경설정 및 구축 (0) | 2022.08.31 |
댓글