JDBC-Practice service๊ณ์ธต ๊ตฌํ +Optional
Categories: Spring
๐ ๊ฐ์ธ์ ์ธ ๊ณต๊ฐ์ผ๋ก ๊ณต๋ถ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ณต์ตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ธ๋ก๊ทธ์
๋๋ค.
์ ํํ์ง ์์ ์ ๋ณด๊ฐ ์์ ์ ์์ผ๋ ์ฐธ๊ณ ๋ฐ๋๋๋ค :๐ธ
[ํ๋ฆฐ ๋ด์ฉ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๋ณต๋ฐ์ผ์ค๊ฑฐ์์]
Optional Class
https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
Optional ํด๋์ค์ ์ฃผ์ ๊ธฐ๋ฅ๊ณผ ์ฌ์ฉ๋ฒ
Optional ํด๋์ค๋ NullPointerException์ ๋ฐฉ์งํ๊ณ , ๋ช ์์ ์ผ๋ก ๊ฐ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ ์ฉํ ๋๊ตฌ
Optional
ํด๋์ค๋ ๋ชจ๋ ์ฐธ์กฐํ์
์ ์ฌ์ฉ ๊ฐ๋ฅ.
- Optional ๊ฐ์ฒด ์์ฑ
- Optional.of(T value): value๊ฐ null์ด ์๋์ด์ผ ํ๋ฉฐ, null์ด๋ฉด NullPointerException์ด ๋ฐ์
- Optional.ofNullable(T value): value๊ฐ null์ผ ์๋ ์๊ณ , null์ด ์๋์ด๋ ๋จ
- Optional.empty(): ๋น Optional ๊ฐ์ฒด๋ฅผ ์์ฑ
1 2 3 4
Optional<String> nonEmptyOptional = Optional.of("Hello"); Optional<String> nullableOptional = Optional.ofNullable(null); Optional<String> emptyOptional = Optional.empty();
- ๊ฐ ์กด์ฌ ์ฌ๋ถ ํ์ธ
- isPresent(): ๊ฐ์ด ์กด์ฌํ๋ฉด true, ์กด์ฌํ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํ
- ifPresent(Consumer<? super T> action): ๊ฐ์ด ์กด์ฌํ ๋๋ง ์ง์ ๋ ๋์์ ์ํ
1 2 3 4 5 6
if (nonEmptyOptional.isPresent()) { System.out.println("Value is present"); } nullableOptional.ifPresent(value -> System.out.println("Value: " + value));
- ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
- get(): ๊ฐ์ด ์กด์ฌํ๋ฉด ๊ฐ์ ๋ฐํํ๊ณ , ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด NoSuchElementException ๋์ง
- orElse(T other): ๊ฐ์ด ์กด์ฌํ๋ฉด ๊ฐ์ ๋ฐํํ๊ณ , ์กด์ฌํ์ง ์์ผ๋ฉด other๋ฅผ ๋ฐํ
- orElseGet(Supplier<? extends T> other): ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด Supplier๋ฅผ ํธ์ถํ์ฌ ๊ทธ ๊ฐ์ ๋ฐํ
- orElseThrow(Supplier<? extends X> exceptionSupplier): ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์ง์ ๋ ์์ธ๋ฅผ ๋์ง
1 2 3 4 5 6 7 8 9 10
String value1 = nonEmptyOptional.get(); String value2 = nullableOptional.orElse("Default Value"); String value3 = emptyOptional.orElseGet(() -> "Default Value"); try { String value4 = emptyOptional.orElseThrow(() -> new IllegalArgumentException("Value not present")); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); }
- ๊ฐ ๋ณํ
- map(Function<? super T, ? extends U> mapper): ๊ฐ์ด ์กด์ฌํ๋ฉด ์ฃผ์ด์ง ํจ์๋ฅผ ์ ์ฉํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ์๋ก์ด Optional์ ๋ฐํ
- flatMap(Function<? super T, Optional<โUโ> mapper): ๊ฐ์ด ์กด์ฌํ๋ฉด ์ฃผ์ด์ง ํจ์๋ฅผ ์ ์ฉํ์ฌ ๋ฐํ๋ Optional์ ํํํํ์ฌ ๋ฐํ
1 2 3 4 5 6
Optional<String> upperOptional = nonEmptyOptional.map(String::toUpperCase); upperOptional.ifPresent(System.out::println); // "HELLO" Optional<Integer> lengthOptional = nonEmptyOptional.flatMap(value -> Optional.of(value.length())); lengthOptional.ifPresent(System.out::println); // 5
-
? extends T
์ํ ์์ผ๋์นด๋์ด๋ฉฐ ๋งค๊ฐ๋ณ์ํ ๋ ์ ํ์ด โTโ๋๋ ํด๋น ํ์ ํด๋์ค ์ค ํ๋์์ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ
-
? super T
ํํ ๊ฒฝ๊ณ์ ์์ผ๋์นด๋์ด๋ฉฐ T์ ๊ทธ ์กฐ์๋ค๋ง ๊ฐ๋ฅ
-
<?>
์ ํ ์์ ๋ชจ๋ ํ์ ์ด ๊ฐ๋ฅ <? extends Object>์ ๋์ผ
์ค์ต (Service ๊ตฌํํ๊ธฐ)
Repository ํ์ฉํ์ฌ Service ๊ตฌํํ๊ธฐ.
MemberService
-
๋ถ์กฑํ ๋ถ๋ถ + ๊ผญ ์ตํ๊ธฐ
1 2 3 4 5 6 7 8 9 10 11
public Member updateMember(Member member) { // ์์ ํ๊ธฐ ์ ์ ํ์ํ ์์ - ์ ํจ์ฑ ๊ฒ์ฆ ํ์. - ๋ฉค๋ฒ๊ฐ ์๋์ง Member findMember=findVerifiedMember(member.getMemberId()); if(member.getName()!= null){ findMember.setName(member.getName()); } if(member.getPhone()!=null){ findMember.setPhone(member.getPhone()); } return memberRepository.save(findMember); }
- member๋ฅผ ์์ ํ๊ธฐ ์ ์ ํ์ํ ๊ฒ์ ์ ํจ์ฑ ๊ฒ์ฆ! โ member๊ฐ ์กด์ฌํ๋์ง ๊ฒ์ฆํ ๊ฒ.
- Member findMember=findVerifiedMember(member.getMemberId()); ์ฌ๊ธฐ์ ๊ฒ์ฆ ์คํจํ๋ฉด updateMember๋ฅผ ํธ์ถํ ๊ณณ์ผ๋ก ๊ฐ๊ฒ ๋จ. โ ๊ทธ๋ผ MemberController๋ก ๊ฐ๊ฒ๋๊ณ globalExcpetionAdvise๋ก ์ด๋ํด์ ์์ธ์ฒ๋ฆฌ
- ๋ง์ฝ ํต๊ณผํ๋ค๋ฉด ๋ฉค๋ฒ๊ฐ ์๋ค๋ ๊ฒ์ด๊ณ Member์๊ฒ๋ ์์ ํ ์ด๋ฆ ์ ๋ณด๋ ํด๋ํฐ ์ ๋ณด๊ฐ ํ์ํ๊ฒ ๋๋๋ฐ ํ๋๋ง ๋ณ๊ฒฝํ๋ฉด null์ด ๋ค์ด๊ฐ๊ฒ ๋จ.
-
๋๋ if๋ฌธ์ผ๋ก ์ ๋ฆฌํ๋๋ฐ Optional class๋ฅผ ํ์ฉํ๋ฉด ๋ ์ข์.
1 2 3 4
Optional.ofNullable(member.getName()) .ifPresent(name -> findMember.setName(name)); Optional.ofNullable(member.getPhone()) .ifPresent(phone -> findMember.setPhone(phone));
โก๋ฉค๋ฒ ๋ณ์ ๊ฐ์ด null์ผ ๊ฒฝ์ฐ์๋ Optional.of()๊ฐ ์๋ Optional.ofNullable()์ ์ด์ฉํด์ null ๊ฐ์ ํ์ฉํ ์ ์์.
โกname ๋๋ phone ๋ฉค๋ฒ ๋ณ์์ ๊ฐ์ด null์ด ์๋๋ผ๋ฉด) ifPresent() ๋ฉ์๋ ๋ด์ ์ฝ๋๊ฐ ์คํ์ด ๋๊ณ , ์์ ํ ๊ฐ์ด ์๋ค๋ฉด (name ๋๋ phone ๋ฉค๋ฒ ๋ณ์์ ๊ฐ์ด null์ด๋ผ๋ฉด) ์๋ฌด ๋์๋ ํ์ง ์์
๐ ์ฐธ๊ณ ๋ก Spring Data JDBC์์๋ @Id ์ ๋ํ ์ด์ ์ด ์ถ๊ฐ๋ ์ํฐํฐ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์ ๊ฐ์ด
- 0 ๋๋ null์ด๋ฉด โ ์ ๊ท ๋ฐ์ดํฐ๋ผ๊ณ ํ๋จํ์ฌ ํ ์ด๋ธ์ insert ์ฟผ๋ฆฌ๋ฅผ ์ ์ก
- 0 ๋๋ null์ด ์๋๋ผ๋ฉด โ ์ด๋ฏธ ํ ์ด๋ธ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ผ๊ณ ํ๋จํ์ฌ ํ ์ด๋ธ์ update ์ฟผ๋ฆฌ๋ฅผ ์ ์ก
CoffeeService
-
ํค๋งธ๋ ๊ตฌ๊ฐ
1 2 3 4 5 6 7 8 9 10 11
public Coffee updateCoffee(Coffee coffee) { Coffee findCoffee = verifyExistCoffee(coffee.getCoffeeId()); Optional.ofNullable(coffee.getCoffeeCode()) .isPresent(code -> findCoffee.setCoffeeCode(code)); Optional.ofNullable(coffee.getKorName()) .isPresent(name -> findCoffee.setKorName(name)); return coffeeRepository.save(findCoffee); }
- ์ด ๋ถ๋ถ์ code๋ name์ด ์๊พธ ๋นจ๊ฐ์ค ๋ ์ ์๊ทธ๋ฐ๊ฐ ํ๋๋ฐ isPresent๊ฐ ์๋๋ผ ifPresent ๋ฅผ ์ฌ์ฉํด์ผํ๋๋ฐ ์๋ชป ์ฌ์ฉํจ,
-
๊ฐ์ฅ ์ด๋ ค์ ๋ ๋ถ๋ถ
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// ์ฃผ๋ฌธ์ ํด๋นํ๋ ์ปคํผ ์ ๋ณด ์กฐํ public List<Coffee> findOrderedCoffees(Order order) { // Set<OrderCoffee>orderCoffees = order.getOrderCoffees(); // List<Coffee> coffees=new ArrayList<>(); // for(OrderCoffee ordercoffee: orderCoffees){ // Coffee findCoffee = verifyExistCoffee(ordercoffee.getCoffeeId()); // coffees.add(findCoffee); // } return order.getOrderCoffees() .stream() .map(orderCoffee -> verifyExistCoffee(orderCoffee.getCoffeeId())) .collect(Collectors.toList()); }
- ์ฒ์์ for๋ฌธ์ผ๋ก ํ ๋ฒ ๊ตฌํํ๊ณ ๊ทธ ๋ค์ Stream์ผ๋ก ๊ตฌํํด๋ด
- ํ ๋ฒ์ Stream์ ์์ง ๋ถ๊ฐ๋ฅํด์ for๋ฌธ ๋จผ์ ๋ง๋ค์ด๋ด,, ์ฌ์ค for๋ฌธ๋ ์กฐ๊ธ ํค๋งธ๊ธฐ ๋๋ฌธ์,,
- ๊ทธ๋๋ ํ ๋ฒ ๊ตฌํํ๋ Stream์ ๊ธ๋ฐฉ ๊ตฌํํจ!!!!
OrderService
-
๋ณด์ํ ์ฌํญ
1 2 3 4 5 6 7 8 9 10
public Order createOrder(Order order) { //๋ฉค๋ฒ๊ฐ ์กด์ฌํ๋์ง memberService.findMember(order.getMemberId()); //์ปคํผ๊ฐ ์กด์ฌํ๋์ง //List<Coffee>orderCoffees=coffeeService.findOrderedCoffees(order); for(Coffee coffee: coffeeService.findOrderedCoffees(order)){ coffeeService.verifyExistCoffee(coffee.getCoffeeId()); } return orderRepository.save(order); }
-
์ค๋ช ๋ฃ๋ค๊ฐ orderCoffee๊ฐ jointable์ด๋๊น orderCoffee๋ Coffee์ Order๋ฅผ ๋ค ์ฐธ์กฐํ ์ ์์. โ order๊ฐ Set
ordercoffees๋ฅผ ๋ฉค๋ฒ ๋ณ์๋ก ๊ฐ์ง๊ณ ์์. 1 2 3
for(OrderCoffee orderCoffee:order.getOrderCoffees()){ coffeeService.verifyExistCoffee(orderCoffee.getCoffeeId()); }
-
Stream
1 2 3 4
order.getOrderCoffees() .stream() .forEach(orderCoffee -> coffeeService.verifyExistCoffee(orderCoffee.getCoffeeId()));
-
-
ํ๋ฆฐ ๋ถ๋ถ
1 2 3 4 5 6 7 8 9 10
public void cancelOrder(long orderId) { //์ ํจํ ์ฃผ๋ฌธ์ธ์ง ์ฐพ๊ณ ์ญ์ +์ฃผ๋ฌธ์ํํ์ธ Order findOrder = verifiedOrder(orderId); int orderStatus = findOrder.getOrderStatus().getStepNumber(); if(orderStatus>=2){ throw new BusinessLogicException(ExceptionCode.CANNOT_CHANGE_ORDER); } findOrder.setOrderStatus(Order.OrderStatus.ORDER_CANCLE); orderRepository.save(findOrder);//(!) }
- (!) ์ฌ๊ธฐ ๋ถ๋ถ์ orderRepository.delete(findOrder); ๋ก ํ๋ฉด ์๋จ. โ ์ค๋ฌด์์๋ ์ด๋ ํ ๋ฐ์ดํฐ๋ ์ง์ฐ์ง ์์.
Stream์์ foreach์ map์ ์ฐจ์ด
forEach๋ ์ต์ข ์ฐ์ฐ์์ด๊ณ ๋ฐํ๊ฐ์ด void
map์ ์ค๊ฐ์ฐ์ฐ์์.
Comment
ํผ์์ ์ฝ๋ ์์ฑํ ๋๋ ์ ์ด๋ ๊ฒ ํ๋ ๊ฑด๊ฐ ํ๋ฉด์ ์๋ ์ธํ ๋ฆฌ์ ์ด๊ฐ ์๋์์ผ๋๊น
. ์น๋ฉด ๋ค ๋์ค๋๊น ์ฐ๊ฒฐ์ง์ด์ ํ๋๋ฐ ๋ง์ ๋ด๊ฐ ์น ์ฝ๋๋ฅผ ๋จ์๊ฒ ์ค๋ช ํ๋ ค๊ณ ํ๋ ๋ง์ด ์๋์์ ๋นํฉํ๋ค.. ๊ทธ๋์ ์์ ์๋ ์ฌ๋์๊ฒ ์ด ์ฝ๋๋ฅผ ์ ์ด๋ ๊ฒ ์ณ์ผํ๋์ง ์ด๊ฑธ ์๋ถ๋ฌ์์ผํ๋์ง ์ค๋ช ๊น์ง ์ํด์ผ ๋ด๊ฐ ๊ทธ ์ฝ๋๋ฅผ ์๋ฒฝํ๊ฒ ์ดํดํ ๊ฒ์ด ์๋๊น?
Leave a comment