JDBC-Practice service๊ณ„์ธต ๊ตฌํ˜„ +Optional

Updated:

Categories:

Tags: ,

๐Ÿ“Œ ๊ฐœ์ธ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๊ณต๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ณต์Šตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค :๐Ÿ˜ธ
[ํ‹€๋ฆฐ ๋‚ด์šฉ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ณต๋ฐ›์œผ์‹ค๊ฑฐ์—์š”]

Optional Class

https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

Optional ํด๋ž˜์Šค์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์šฉ๋ฒ•

Optional ํด๋ž˜์Šค๋Š” NullPointerException์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ’์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ๋„๊ตฌ

Optional ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์ฐธ์กฐํƒ€์ž…์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

  1. 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();
        
    
  2. ๊ฐ’ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
    • 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));
        
    
  3. ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
    • 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());
     }
        
    
  4. ๊ฐ’ ๋ณ€ํ™˜
    • 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. ๋ถ€์กฑํ•œ ๋ถ€๋ถ„ + ๊ผญ ์ตํžˆ๊ธฐ

    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. ํ—ค๋งธ๋˜ ๊ตฌ๊ฐ„

    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 ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๋ฐ ์ž˜๋ชป ์‚ฌ์šฉํ•จ,
  2. ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„

    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. ๋ณด์™„ํ•  ์‚ฌํ•ญ

    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๊ฐ€ Setordercoffees๋ฅผ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.

      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()));
      
  2. ํ‹€๋ฆฐ ๋ถ€๋ถ„

    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

ํ˜ผ์ž์„œ ์ฝ”๋“œ ์ž‘์„ฑํ•  ๋•Œ๋Š” ์•„ ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฑด๊ฐ€ ํ•˜๋ฉด์„œ ์›Œ๋‚™ ์ธํ…”๋ฆฌ์ œ์ด๊ฐ€ ์ž˜๋˜์žˆ์œผ๋‹ˆ๊นŒ

. ์น˜๋ฉด ๋‹ค ๋‚˜์˜ค๋‹ˆ๊นŒ ์—ฐ๊ฒฐ์ง€์–ด์„œ ํ–ˆ๋Š”๋ฐ ๋ง‰์ƒ ๋‚ด๊ฐ€ ์นœ ์ฝ”๋“œ๋ฅผ ๋‚จ์—๊ฒŒ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ๋ง์ด ์•ˆ๋‚˜์™€์„œ ๋‹นํ™ฉํ–ˆ๋‹ค.. ๊ทธ๋ž˜์„œ ์˜†์— ์žˆ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ด ์ฝ”๋“œ๋ฅผ ์™œ ์ด๋ ‡๊ฒŒ ์ณ์•ผํ•˜๋Š”์ง€ ์ด๊ฑธ ์™œ๋ถˆ๋Ÿฌ์™€์•ผํ•˜๋Š”์ง€ ์„ค๋ช…๊นŒ์ง€ ์ž˜ํ•ด์•ผ ๋‚ด๊ฐ€ ๊ทธ ์ฝ”๋“œ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•œ ๊ฒƒ์ด ์•„๋‹๊นŒ?

Spring ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด ๋‹ค๋ฅธ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

Leave a comment