plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '3.2.8'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'education'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api'
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
implementation 'jakarta.servlet:jakarta.servlet-api'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
tasks.named('test') {
useJUnitPlatform()
}
public class BookRepository {
private final ConcurrentMap<Long, Book> bookMap = new ConcurrentHashMap<>();
private static Long bookIndex = 0L;
// 싱글톤 인스턴스를 위한 static 변수
private static final BookRepository instance = new BookRepository();
// private 생성자: 외부에서 인스턴스 생성 불가
private BookRepository() {}
// 유일한 인스턴스를 반환하는 메서드
public static BookRepository getInstance() {
return instance;
}
// CREATE: Book 객체 저장
public Book save(Book book) {
book.setId(++bookIndex);
bookMap.put(book.getId(), book);
return book;
}
// READ: ID로 책 검색
public Optional<Book> findById(Long id) {
return Optional.ofNullable(bookMap.get(id));
}
// READ: 모든 책 리스트 반환
public List<Book> findAll() {
return new ArrayList<>(bookMap.values());
}
// UPDATE: 기존 책 정보 수정
public Optional<Book> update(Long id, Book updatedBook) {
if (bookMap.containsKey(id)) {
updatedBook.setId(id); // 기존 ID 유지
bookMap.put(id, updatedBook);
return Optional.of(updatedBook);
}
return Optional.empty();
}
// DELETE: ID로 책 삭제
public boolean delete(Long id) {
return bookMap.remove(id) != null;
}
}