Skip to content

Commit

Permalink
Merge pull request #3 from f-lab-edu/feature/1
Browse files Browse the repository at this point in the history
[#1] 도서 대출 코드 및 테스트 수정
  • Loading branch information
shine-17 authored Dec 4, 2024
2 parents 1a11fee + 79795ea commit 1e041d8
Show file tree
Hide file tree
Showing 45 changed files with 1,096 additions and 294 deletions.
26 changes: 26 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,32 @@ dependencies {
// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation group: 'com.google.code.gson', name: 'gson', version: '2.10.1'

// https://mvnrepository.com/artifact/org.projectlombok/lombok
compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.30'
annotationProcessor('org.projectlombok:lombok')
testAnnotationProcessor('org.projectlombok:lombok')

// mapstruct
// https://mvnrepository.com/artifact/org.mapstruct/mapstruct-processor
// annotationProcessor("org.mapstruct:mapstruct-processor:1.5.3.Final")
// // https://mvnrepository.com/artifact/org.mapstruct/mapstruct-processor
// testAnnotationProcessor("org.mapstruct:mapstruct-processor:1.5.3.Final")
// // https://mvnrepository.com/artifact/org.mapstruct/mapstruct
// implementation("org.mapstruct:mapstruct:1.5.3.Final")
// // https://mvnrepository.com/artifact/org.projectlombok/lombok-mapstruct-binding
// implementation("org.projectlombok:lombok-mapstruct-binding:0.2.0")

// implementation 'org.mapstruct:mapstruct:1.5.5.Final'
// annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
// implementation 'org.mapstruct:mapstruct-jdk8:1.5.5.Final'
// implementation 'org.mapstruct:mapstruct-spring-extensions:1.5.5.Final'


implementation 'org.mapstruct:mapstruct:1.5.5.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'



}

tasks.named('test') {
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/com/study/bookcafe/common/JsonHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.study.bookcafe.common;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.ToNumberPolicy;

import java.time.LocalDate;

public class JsonHelper {
private static Gson gson;

public static Gson getGson() {
if(gson == null) {
gson = new GsonBuilder()
.registerTypeAdapter(LocalDate.class, new LocalDateAdapter())
.setPrettyPrinting()
.serializeNulls()
.disableHtmlEscaping()
.setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
.create();
}

return gson;
}
}
21 changes: 21 additions & 0 deletions src/main/java/com/study/bookcafe/common/LocalDateAdapter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.study.bookcafe.common;

import com.google.gson.*;

import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class LocalDateAdapter implements JsonDeserializer<LocalDate>, JsonSerializer<LocalDate> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;

@Override
public JsonElement serialize(LocalDate date, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(date.format(formatter)); // "yyyy-MM-dd" 형식으로 직렬화
}

@Override
public LocalDate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return LocalDate.parse(json.getAsString(), formatter); // JSON 문자열을 LocalDate로 역직렬화
}
}
43 changes: 43 additions & 0 deletions src/main/java/com/study/bookcafe/controller/MemberController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.study.bookcafe.controller;

import com.study.bookcafe.domain.Borrow;
import com.study.bookcafe.domain.Member;
import com.study.bookcafe.dto.BorrowDto;
import com.study.bookcafe.dto.MemberDto;
import com.study.bookcafe.dto.RequestBorrowDto;
import com.study.bookcafe.mapper.BorrowMapper;
import com.study.bookcafe.mapper.MemberMapper;
import com.study.bookcafe.service.MemberService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class MemberController {

private final MemberService memberService;
private final MemberMapper memberMapper;
private final BorrowMapper borrowMapper;

public MemberController(MemberService memberService, MemberMapper memberMapper, BorrowMapper borrowMapper) {
this.memberService = memberService;
this.memberMapper = memberMapper;
this.borrowMapper = borrowMapper;
}

@GetMapping("/member/{id}")
@ResponseBody
public ResponseEntity<MemberDto> member(@PathVariable long id) {
Member member = memberService.findById(id);
return ResponseEntity.ok(memberMapper.toMemberDto(member));
}

@PostMapping("/member/borrow")
@ResponseBody
public ResponseEntity<List<BorrowDto>> borrowBook(@RequestBody RequestBorrowDto requestBorrowDto) {
List<Borrow> borrowList = memberService.borrowBook(requestBorrowDto.getMemberId(), requestBorrowDto.getBookdIdList());
return ResponseEntity.ok(borrowMapper.toBorrowDtoList(borrowList));
}

}
22 changes: 0 additions & 22 deletions src/main/java/com/study/bookcafe/dao/BookDAO.java

This file was deleted.

10 changes: 10 additions & 0 deletions src/main/java/com/study/bookcafe/dao/BookRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.study.bookcafe.dao;

import com.study.bookcafe.entity.BookEntity;

import java.util.List;

public interface BookRepository {
BookEntity findById(long bookId);
List<BookEntity> findByIdList(List<Long> bookIdList);
}
25 changes: 0 additions & 25 deletions src/main/java/com/study/bookcafe/dao/BorrowDAO.java

This file was deleted.

13 changes: 13 additions & 0 deletions src/main/java/com/study/bookcafe/dao/BorrowRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.study.bookcafe.dao;

import com.study.bookcafe.entity.BorrowEntity;

import java.util.List;

public interface BorrowRepository {

BorrowEntity findById(long borrowId);
BorrowEntity save(BorrowEntity borrowEntity);
List<BorrowEntity> save(List<BorrowEntity> borrowEntityList);

}
23 changes: 0 additions & 23 deletions src/main/java/com/study/bookcafe/dao/GeneralMemberDAO.java

This file was deleted.

23 changes: 23 additions & 0 deletions src/main/java/com/study/bookcafe/dao/GeneralMemberRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.study.bookcafe.dao;

import com.study.bookcafe.domain.Level;
import com.study.bookcafe.entity.MemberEntity;
import org.springframework.stereotype.Repository;

import java.util.HashMap;
import java.util.Map;

@Repository
public class GeneralMemberRepository implements MemberRepository {

Map<Long, MemberEntity> members = new HashMap<>(){{
put(1L, MemberEntity.builder().id(1L).name("슈카").level(Level.BASIC).borrowCount(0).build());
put(2L, MemberEntity.builder().id(2L).name("머스크").level(Level.WORM).borrowCount(3).build());
put(3L, MemberEntity.builder().id(3L).name("트럼프").level(Level.LIBRARIAN).borrowCount(5).build());
}};

@Override
public MemberEntity findById(long memberId) {
return members.get(memberId);
}
}
7 changes: 0 additions & 7 deletions src/main/java/com/study/bookcafe/dao/MemberDAO.java

This file was deleted.

7 changes: 7 additions & 0 deletions src/main/java/com/study/bookcafe/dao/MemberRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.study.bookcafe.dao;

import com.study.bookcafe.entity.MemberEntity;

public interface MemberRepository {
MemberEntity findById(long memberId);
}
32 changes: 32 additions & 0 deletions src/main/java/com/study/bookcafe/dao/TestBookRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.study.bookcafe.dao;

import com.study.bookcafe.domain.Inventory;
import com.study.bookcafe.entity.BookEntity;
import org.springframework.stereotype.Repository;

import java.sql.Date;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Repository
public class TestBookRepository implements BookRepository {
public static Map<Long, BookEntity> books = new HashMap<>(){{
put(1L, BookEntity.builder().id(1L).ISBN(9788936433598L).title("채식주의자").author("한강").publisher("창비").publishDate(Date.valueOf(LocalDate.of(2007, 10, 30)))
.price(35000).inventory(new Inventory(5)).build());
put(2L, BookEntity.builder().id(2L).ISBN(9788954651134L).title("흰").author("한강").publisher("문학동네").publishDate(Date.valueOf(LocalDate.of(2018, 4, 25)))
.price(13000).inventory(new Inventory(0)).build());
}};

public BookEntity findById(long bookId) {
return books.get(bookId);
}

@Override
public List<BookEntity> findByIdList(List<Long> bookIdList) {
return bookIdList
.stream().filter(id -> books.containsKey(id))
.map(id -> books.get(id)).toList();
}
}
38 changes: 38 additions & 0 deletions src/main/java/com/study/bookcafe/dao/TestBorrowRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.study.bookcafe.dao;

import com.study.bookcafe.entity.BookEntity;
import com.study.bookcafe.entity.BorrowEntity;
import com.study.bookcafe.entity.MemberEntity;
import org.springframework.stereotype.Repository;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Repository
public class TestBorrowRepository implements BorrowRepository {
Map<Long, BorrowEntity> borrows = new HashMap<>(){{
put(1L, BorrowEntity.builder()
.member(MemberEntity.builder().id(1).build())
.book(BookEntity.builder().id(1).ISBN(9788936433598L).build()).build());
put(2L, BorrowEntity.builder()
.member(MemberEntity.builder().id(1).build())
.book(BookEntity.builder().id(2).ISBN(9788936433598L).build()).build());
put(3L, null);
}};

public BorrowEntity findById(long borrowId) {
return borrows.get(borrowId);
}

public BorrowEntity save(BorrowEntity borrowEntity) {
return borrowEntity;
}

@Override
public List<BorrowEntity> save(List<BorrowEntity> borrowEntityList) {
return borrowEntityList
.stream().filter(borrow -> borrows.containsKey(borrow.getId()))
.map(borrow -> borrows.get(borrow.getId())).toList();
}
}
28 changes: 28 additions & 0 deletions src/main/java/com/study/bookcafe/domain/Book.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.study.bookcafe.domain;

import lombok.Builder;
import lombok.Getter;

import java.sql.Date;

@Builder
@Getter
public class Book {
private long id; // 도서 번호
private long ISBN; // 국제표준도서번호
private String title; // 도서 명
private String author; // 저자 명
private String publisher; // 출판사
private Date publishDate; // 출판일
private double price; // 도서 가격
private Inventory inventory; // 도서 상태 정보 (재고, 대출, 예약)

/**
* 도서가 대출 가능한 상태인지 확인한다.
*
* @return 현재 도서의 대출 가능한 재고가 있는지 여부
*/
public boolean canBorrow() {
return this.getInventory() != null && this.getInventory().isOnStock();
}
}
34 changes: 34 additions & 0 deletions src/main/java/com/study/bookcafe/domain/Borrow.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.study.bookcafe.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.sql.Timestamp;

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Borrow {
private long id; // 대출 ID
private Member member; // 회원
private Book book; // 도서
private Timestamp borrowDate; // 대출 날짜
private Timestamp returnDate; // 반납 날짜

public Borrow(Member member, Book book) {
this.member = member;
this.book = book;
}

/**
* 대출이 성공했는지 확인한다.
*
* @param borrow 대출
* @return 대출이 성공했는지 여부
*/
public static boolean successBorrow(Borrow borrow) {
return borrow != null;
}
}
Loading

0 comments on commit 1e041d8

Please sign in to comment.