SEB_BE 48일차 - JDBC 기반 데이터 액세스 계층3

subimm_·2022년 11월 1일
0

코드스테이츠

목록 보기
48/83

💡 오늘의 학습목표

  • Spring Data JDBC 데이터 액세스 계층 구현 - 서비스, 리포지토리
  • 페이지 네이션 실습

📔 Spring Data JDBC 데이터 액세스 계층 구현 - 서비스, 리포지토리

  • 데이터 액세스 계층에서 데이터베이스와 상호작용하는 역할을 하는 인터페이스를 리포지토리 라고 함.

📖 리포지토리(Repository) 인터페이스 정의

  • MemberRepoitory
    • (1)의 CrudRepository<Member, Long> 에서 Member는 Member 엔티티 클래스를 가르키고, Long은 Member 엔티티 클래스에서 @Id 애너테이션이 붙은 멤버 변수의 타입을 가르킨다.
    • (2)는 쿼리 메서드 정의를 이용한 데이터 조회 메서드를 정의

      Spring Data JDBC에서는 find+By+SQL 쿼리문에서 WHERE 절의 컬럼명 + (WHERE 절 칼럼의 조건이 되는 데이터) 형식으로 쿼리메서드를 정의하면 조건에 맞는 데이터를 테이블에서 조회

    • (2) 에서는 email 컬럼을 WHERE 절의 조건으로 지정해서 MEMBER 테이블에서 하나의 row를 조회하겠다. 로 정의
      (이미 테이블에 등록된 이메일 주소가 있는지 확인하는 용도)
    • (2) 의 리턴값으로 SQL 질의를 통한 결과 데이터를 Member 엔티티 클래스의 객체로 지정
      Optional 지원하여 리턴 값을 Optional로 래핑 가능

  • CoffeeRepository
    • (1) WHERE 절에서 COFFEE_CODE를 조건으로 질의하게 해줌.
    • (2) COFFEE 테이블에 질의하기 위해 @query 애너테이션 사용
      직접 쿼리문을 작성해서 질의 (:coffeeId는 동적 쿼리 파라미터)

      findById(ID id) 사용 테이블에서 기본키를 WHERE 절의 조건으로 지정해 데이터를 조회할 수 있는 쿼리 메서드

  • OrderRepository

📖 서비스(Service) 클래스 구현

  • MemberService

  • (1) 과 같이 생성자를 통해 MemberRepository 인터페이스를 DI 받는다.
    Spring Data JDBC 내부적으로 MemberRepository 인터페이스의 구현 클래스 객체 생성해줌.

  • (2) 이미 등록된 이메일 검증 여부를 위해 (11) 메서드 사용
    (11) 메서드는 MemberRepoitory에 정의되어 있는 findByEmail() 쿼리 메서드로 이메일에 해당하는 회원이 있는지 조회, 리턴값이 Optional 이기 때문에 isPresent() 를 통해 결과 값이 존재하면 예외를 던짐.

  • (5) 에서는 회원 존재 여부 검증에 통과한 회원이라면 이름과 주소 정보를 setter 메서드를 통해 변경
    ✔ Optional.ofNullable(..)을 사용하는 이유
    선택적 수정이 가능하기 때문에 name 멤버 변수가 null일 수도 있고 다른게 null일 수도 있다.
    멤버 변수값이 null일 경우에는 null값 허용 가능.

  • (6) name 또는 phone 멤버 변수의 수정된 값이 적용되어 테이블에서 회원 정보 업데이트
    @Id 애너테이션이 추가된 엔티티 클래스의 멤버 변수 값이 0또는 null 이면 신규 데이터로 판단하여 테이블에 insert 쿼리 전송

  • (9) 특정 회원 정보 삭제 (실무에서는 데이터 자체 삭제보다는 상태 값 변경)

  • (10) 이미 존재하는 회원인지 검증 후 회원 정보 리턴
    객체가 null이 아니라면 해당 객체를 리턴하고 null이면 예외던지기

  • CoffeeService

  • (1) 영문으로 구성된 커피코드를 대문자로 변경(사용자 편의성을 높여주는 기능)

  • (2) 주문한 커피 정보 조회

    • Order객체는, memberId와 orderStatus 값만 얻을 수 있고 실제 회원이 주문한 커피정보는 얻을 수 없다. 따라서 getOrderCoffees()를 통해서 주문한 구체적인 커피 정보를 얻어와야함.
  • OrderService

  • 주문 정보가 저장되기 전 주문 정보의 회원이 존재하는 회원인지 (1)과 같이 검증 필요

  • 주문하려는 커피 정보 역시 테이블에 존재하는지 (2) 와 같이 검증

    • order.getOrderCoffees()를 통해서 Set<CoffeeRef>를 가져온 후, 스트림으로 각각의 커피Id를 얻은 후에 findVerifiedCoffee(coffeeRef.getCoffeeId()) 메서드를 통해 coffeeId에 해당하는 커피 정보가 유효한지 검증
  • (4)와 같이 OrderStatus가 주문 요청 단계를 넘어가면 주문 정보를 변경할 수 없음.

profile
코린이의 공부 일지

0개의 댓글