ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mapper
    공부/spring 2023. 5. 3. 15:40

    CoffeeService 구현

    • CoffeeService 클래스에서 사용하는 Coffee 엔티티(Entity) 클래스의 데이터는 다음으로 제한합니다.
      • coffeeId(커피 식별자): long
      • korName(한글 커피명): String
      • engName(영문 커피명): String
      • price(가격): int
    • 다음과 같이 총 다섯 개의 메서드를 구현합니다.
      • createCoffee(Coffee coffee)
        • 파라미터: 등록할 커피 정보(Coffee 클래스 객체)
        • 메서드 바디
          • 구현해야 될 내용 없습니다.
        • 리턴 값
          • 커피 정보: 파라미터로 전달받은 Coffee 클래스 객체를 그대로 리턴합니다.
      • updateCoffee(Coffee coffee)
        • 파라미터: 수정할 커피 정보(Coffee 클래스 객체)
        • 메서드 바디
          • 구현해야 될 내용 없습니다.
        • 리턴 값
          • 커피 정보: 파라미터로 전달받은 Coffee 클래스 객체를 그대로 리턴합니다.
      • findCoffee(long coffeeId)
        • 파라미터: 조회할 커피의 커피 식별자(long)
        • 메서드 바디
          • 구현해야 될 내용 없습니다.
        • 리턴 값
          • 커피 정보: 아래 Stub 데이터를 포함한 Coffee 클래스의 객체를 리턴합니다.
            • 커피 식별자: 파라미터로 전달받은 커피 식별자(coffeeId)를 포함합니다.
            • 한글 커피명: 아메리카노
            • 영문 커피명: Americano
            • 가격: 2500
      • findCoffees()
        • 파라미터: 없음
        • 메서드 바디
          • 구현해야 될 내용 없습니다.
        • 리턴 값
          • 커피 정보: 아래 Stub 데이터를 포함한 List를 리턴합니다.
            • 커피 정보 1
              • 커피 식별자(coffeeId): 1L
              • 커피명(한글): 아메리카노
              • 커피명(영문): Americano
              • 가격: 2500
            • 커피 정보 2
              • 커피 식별자(coffeeId): 2L
              • 커피명(한글): 캐러멜 라떼
              • 커피명(영문): Caramel Latte
              • 가격: 5000
      • deleteCoffee(long coffeeId)
        • 파라미터: 삭제할 커피의 커피 식별자(long)
        • 리턴 값: 없음
        • 메서드 바디
          • 구현해야 할 내용 없습니다.
    package com.codestates.coffee;
    
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class CoffeeService {
        public Coffee createCoffee(Coffee coffee) {
            //파라미터: 등록할 커피 정보(Coffee 클래스 객체)
            //
            //메서드 바디
            //
            //구현해야 될 내용 없습니다.
            //리턴 값
            //
            //커피 정보: 파라미터로 전달받은 Coffee 클래스 객체를 그대로 리턴합니다.
            Coffee createdCoffee = coffee;
            return createdCoffee;
        }
    
        public Coffee updateCoffee(Coffee coffee) {
            //파라미터: 수정할 커피 정보(Coffee 클래스 객체)
            //
            //메서드 바디
            //
            //구현해야 될 내용 없습니다.
            //리턴 값
            //
            //커피 정보: 파라미터로 전달받은 Coffee 클래스 객체를 그대로 리턴합니다.
            Coffee updatedCoffee = coffee;
            return updatedCoffee;
        }
    
        public Coffee findCoffee(long coffeeId) {
            //파라미터: 조회할 커피의 커피 식별자(long)
            //
            //메서드 바디
            //
            //구현해야 될 내용 없습니다.
            //리턴 값
            //
            //커피 정보: 아래 Stub 데이터를 포함한 Coffee 클래스의 객체를 리턴합니다.
            //
            //커피 식별자: 파라미터로 전달받은 커피 식별자(coffeeId)를 포함합니다.
            //
            //한글 커피명: 아메리카노
            //
            //영문 커피명: Americano
            //
            //가격: 2500
            Coffee coffee = new Coffee(coffeeId, "아메리카노", "Americano", 2500);
            return coffee;
        }
    
        public List<Coffee> findCoffees() {
            //파라미터: 없음
            //
            //메서드 바디
            //
            //구현해야 될 내용 없습니다.
            //리턴 값
            //
            //커피 정보: 아래 Stub 데이터를 포함한 List를 리턴합니다.
            //
            //커피 정보 1
            //커피 식별자(coffeeId): 1L
            //커피명(한글): 아메리카노
            //커피명(영문): Americano
            //가격: 2500
            //
            //커피 정보 2
            //커피 식별자(coffeeId): 2L
            //커피명(한글): 캐러멜 라떼
            //커피명(영문): Caramel Latte
            //가격: 5000
            List<Coffee> coffees = List.of(
                    new Coffee(1L, "아메리카노", "Americano", 2500),
                    new Coffee(2L, "카라멜 라떼", "Caramel Latte", 5000)
            );
            return coffees;
        }
    
        public void deleteCoffee(long coffeeId) {
            //파라미터: 삭제할 커피의 커피 식별자(long)
            //
            //리턴 값: 없음
            //
            //메서드 바디
            //
            //구현해야 할 내용 없습니다.
        }
    }

    CoffeeController 및 CoffeeMapper 구현

    • DTO 클래스 ↔ 엔티티 클래스 매퍼(Mapper) 구현
      • CoffeeController의 핸들러 메서드에서 DTO 클래스와 Coffee 엔티티 클래스 매핑에 사용될 CoffeeMapper를 MapStruct로 구현하세요.
    • CoffeeController 핸들러 메서드에서 CoffeeService 클래스의 메서드 호출 연동
      • CoffeeController 핸들러 메서드에서 CoffeeService 클래스의 메서드를 호출해서 결과 데이터(Coffee 엔티티 객체)를 받아오세요. (’→’는 메서드 호출을 의미합니다.)
        • postCoffee() → createCoffee()
        • patchCoffee() → updateCoffee()
        • getCoffee() → findCoffee()
        • getCoffees() → findCoffees()
        • deleteCoffee() → deleteCoffee()
      • coffeeService.deleteCoffee() 메서드의 경우 리턴값이 없으므로 결과 데이터를 받아올 수 없음을 참고하세요.
    • CoffeeController의 핸들러 메서드에 CoffeeMapper 적용
      • CoffeeController의 핸들러 메서드에 CoffeeMapper를 적용하세요.
      • 매퍼(Mapper)는 아래 상황에 필요합니다.
        • CoffeeController 클래스에서 CoffeeService 클래스의 createCoffee(), updateCoffee() 메서드 호출 시
        • CoffeeController 핸들러 메서드의 응답 데이터
    package com.codestates.coffee;
    
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.validation.annotation.Validated;
    import org.springframework.web.bind.annotation.*;
    
    import javax.validation.Valid;
    import javax.validation.constraints.Positive;
    import java.util.List;
    import java.util.stream.Collectors;
    
    @RestController
    @RequestMapping("/v5/coffees")
    @Validated
    public class CoffeeController {
        private final CoffeeService coffeeService;
        private final CoffeeMapper mapper;
    
        public CoffeeController(CoffeeService coffeeService, CoffeeMapper mapper) {
            this.coffeeService = coffeeService;
            this.mapper = mapper;
        }
        @PostMapping
        public ResponseEntity postCoffee(@Valid @RequestBody CoffeePostDto coffeePostDto)
        //@RequestBody 어노테이션을 사용하여 CoffeePostDto객체를 받아온후 유효성 검사 후
        {
            Coffee coffee = mapper.coffeePostDtoToCoffee(coffeePostDto);
            //mapper 객체를 이용하여 coffee 엔티티로 변환
    
            Coffee response = coffeeService.createCoffee(coffee);
            //coffeeService.createCoffee를 호출하여 Coffee엔티티를 저장한다
            return new ResponseEntity<>(mapper.coffeeToCoffeeResponseDto(response), HttpStatus.CREATED);
        }
    
        @PatchMapping("/{coffee-id}")
        public ResponseEntity patchCoffee(@PathVariable("coffee-id") @Positive long coffeeId,
                                          @Valid @RequestBody CoffeePatchDto coffeePatchDto)
                //@PathVariable : 경로 변수 받기
                //@Positive : 양수인지 검사
    
        {
            coffeePatchDto.setCoffeeId(coffeeId);
            //coffeePatchDto객체에 coffeeId설정
    
            Coffee coffee = mapper.coffeePatchDtoToCoffee(coffeePatchDto);
            //mapper 객체를 사용하여 coffeePatchDtoToCoffee객체로 변환
    
            Coffee response = coffeeService.updateCoffee(coffee);
            //변환된 Coffee엔티티를 coffeeService 객체의 updateCoffee() 메소드를 호출하여 업데이트
    
            return new ResponseEntity<>(mapper.coffeeToCoffeeResponseDto(response), HttpStatus.OK);
        }
    
        @GetMapping("/{coffee-id}")
        public ResponseEntity getCoffee(@PathVariable("coffee-id") long coffeeId)
        //@PathVariable로 경로 변수를 받아온후 long 타입의 coffeeId에 변수 저장
        {
            Coffee response = coffeeService.findCoffee(coffeeId);
            return new ResponseEntity<>(mapper.coffeeToCoffeeResponseDto(response), HttpStatus.OK);
        }
    
        @GetMapping
        public ResponseEntity getCoffees() {
            List<Coffee> response = coffeeService.findCoffees();
            List<CoffeeResponseDto> responses = response.stream()
                    //stream()를 이욯애 스트림으로 변환
                    .map(m -> mapper.coffeeToCoffeeResponseDto(m))
                    //map() 사용해 mapper 객체를 이용해 각각의 엔티티를 CoffeeResponseDto로 변환
                    .collect(Collectors.toList());
            //collect를 사용해 list 형태로 변환
            return new ResponseEntity<>(responses, HttpStatus.OK);
        }
    
        @DeleteMapping("/{coffee-id}")
        public ResponseEntity deleteCoffee(@PathVariable("coffee-id") long coffeeId) {
            coffeeService.deleteCoffee(coffeeId);
            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
        }
    }
    package com.codestates.coffee;
    
    import org.mapstruct.Mapper;
    
    @Mapper(componentModel = "spring")
    public interface CoffeeMapper {
        Coffee coffeePostDtoToCoffee(CoffeePostDto coffeePostDto);
        Coffee coffeePatchDtoToCoffee(CoffeePatchDto coffeePatchDto);
        CoffeeResponseDto coffeeToCoffeeResponseDto(Coffee coffee);
    }

    '공부 > spring' 카테고리의 다른 글

    프록시 서버  (0) 2023.06.02
    애플리케이션 예외  (0) 2023.05.04
    DTO  (0) 2023.05.01
    Controller  (0) 2023.04.28
    Spring Frmework 기본  (0) 2023.04.23
Designed by Tistory.