CrudRepository<Member, Long>
에서 Member는 Member 엔티티 클래스를 가르키고, Long은 Member 엔티티 클래스에서 @Id
애너테이션이 붙은 멤버 변수의 타입을 가르킨다.Spring Data JDBC에서는
find+By+SQL 쿼리문에서 WHERE 절의 컬럼명 + (WHERE 절 칼럼의 조건이 되는 데이터)
형식으로 쿼리메서드를 정의하면 조건에 맞는 데이터를 테이블에서 조회
findById(ID id) 사용 테이블에서 기본키를 WHERE 절의 조건으로 지정해 데이터를 조회할 수 있는 쿼리 메서드
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) 주문한 커피 정보 조회
OrderService
주문 정보가 저장되기 전 주문 정보의 회원이 존재하는 회원인지 (1)과 같이 검증 필요
주문하려는 커피 정보 역시 테이블에 존재하는지 (2) 와 같이 검증
findVerifiedCoffee(coffeeRef.getCoffeeId())
메서드를 통해 coffeeId에 해당하는 커피 정보가 유효한지 검증(4)와 같이 OrderStatus가 주문 요청 단계를 넘어가면 주문 정보를 변경할 수 없음.