본문 바로가기

프로젝트 일지

#5. 싱글 프로젝트 일지 - Member 도메인

- Member 도메인 구조 -

Member 도메인은 회원 정보를 담당하는 곳이다. 

 

1. controller

A. 멤버 생성 메서드
도서관 별로 회원가입이 가능하므로, 파라미터로 도서관 Id 받음

- 로직 구성 -

#1. 받은 도서관 Id를 mapper를 사용하여 Dto->Entity 객체 생성하여 set으로 지정함.
#2. libraryId를 가진 Member 객체로 DB에 생성함.
#3. 도서관의 회원이므로, LibraryMember 객체를 생성.
#4. 생성한 libraryMember에 Member와 Library를 setter로 설정함.
#5. 맨처음 mapper로 생성했던 member 객체에 #3에서 생성한 LibraryMember를 .add() 메서드로 추가.
#6. 생성한 libraryMember 객체를 libraryMemberRepository를 통해 DB에 save 처리.
#7. 그 후 mapper 사용하여 Entity -> ResponseDto 객체로 반환하여 응답으로 전달.

 

 

B. 단일 멤버 조회 메서드
도서관에 상관없이 DB에 존재하는 회원 리스트 조회를 목적으로하므로, memberId만을 전달 받음.

- 로직 구성 -
#1
. 전달받은 memberId로 memberService에서 조회하여 Member 객체를 생성.
#2. 생성한 Member 객체를 mapper를 사용하여 Response 타입 객체 생성하여 응답으로 전달.

 

C. 멤버 삭제 메서드
멤버들은 도서관에 속해있으므로, libraryId와 memberId를 전달받음.
단, 해당 멤버가 대여중인 책이 있을 경우, 삭제 불가 조건이 있음.

- 로직 구성 - 
#1
. 전달받은 libraryId, memberId를 활용하여 도서관의 회원 조회. 찾아지는 데이터가 없다면 예외 처리.
#2. 대여중인 책 MemberBook을 주어진 memberId를 기준으로 조회. (JPQL 적용)

    @Query("SELECT mb FROM MemberBook mb WHERE mb.member.id =:memberId")
    List<MemberBook> findByMember_Id(@Param("memberId") Long memberId);

 

#3. MemberBook 객체가 비어있다면, 반납되지 않은 도서가 없는 관계로 탈퇴 처리.
#4. MemberBook 객체가 찾아질경우, 반납되지 않은 도서가 있다는 의미이므로 
stream 으로 BookTitle만 가져와 객체에 담아 탈퇴 요청 거절과 함께 응답으로 전달함.

List<MemberBook> existedRental = memberBookRepository.findByMember_Id(memberId);
        if(!existedRental.isEmpty()) {
            List<String> unreturnedBookTitles = existedRental.stream()
                    .map(x -> x.getBook().getBookTitle())
                    .collect(Collectors.toList());
            String message = "현재 {" + String.join(", ",unreturnedBookTitles) 
            + "} 도서가 반납되지 않아 탈퇴 처리가 불가능합니다.";
            return new ResponseEntity(message,HttpStatus.FORBIDDEN);
        }

 

 

 

D. 멤버 대여 기록 조회 메서드
멤버 대여 기록 조회의 경우, 도서관 구분없이 해당 회원의 모든 대여 기록을 조회하므로 memberId만 받음.

- 로직 구성 -
#1. 
Page<MemberBook> 타입으로 객체를 생성하여 대여 도서를 담음.
#2. 생성한 Page<MemberBook> 객체를 List 타입으로 변경.
#3. 조건문으로 List<memberBook> 객체가 비어있다면, 대여 기록이 없다. 응답 처리. 
#4. 
대여 기록이 있다면, PageInfo 의 페이징 객체 생성을 통해 페이징 처리시 나타낼 옵션들을 설정.
#5. 여러 대여 도서들을 표시하기 위함이므로 Response를 List 타입으로 생성해 응답 처리.
Dto.Response 에는 기록 조회에 필요한 정보를 전달.

@NoArgsConstructor
public class MemberBookDto {
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Response{
        private Long libraryId;
        private Long memberId;
        private Long bookId;
        private Long memberBookId;
        private String bookTitle;
        private LocalDate createdAt;
        private LocalDate dueReturnDate;
        private LocalDate returnedAt;
    }

 

2. dto

클라이언트 측에서 요청에 담아 보내는 데이터에 대한 유효성 검증을 담당하며,
서버측에서 응답으로 주는 데이터에 어떠한 데이터를 넣을지를 정하는 역할.

3. entity

1. DB에 생성될 Member 테이블의 컬림들을 설정한다.
2. 연관 관계에 있는 엔티티들을 관계에 따라 설정하는 곳.

4. mapper

mapper는 클라이언트와 서버측의 요청 데이터 처리 및 처리된 데이터를 응답으로 전달할 때
데이터 타입 변환을 자동으로 처리해주는 인터페이스 역할이다.

5. repository

회원 가입 혹은 회원 조회 메서드에서 요구하는 DB와의 통신에 필요한 메서드들을 설정해두는 곳.
Spring Data JPA를 상속하여 Spring Data JPA 에서 제공하는 자동완성 메서드의 네이밍 컨벤션대로 정한다.

6. service

Controller 계층에 있는 메서드들을 처리하기 위한 실질적인 로직을 가지고 있는 곳.
주로 Repository를 활용한 회원 생성, 회원 조회, 회원 삭제, 중복 이메일 검색 등의 메서드를 가지고 있다.