diff --git a/README.md b/README.md
new file mode 100644
index 000000000..cf89b3b7f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,24 @@
+# Spring JDBC
+
+
5단계 요구사항
+
+h2 데이터베이스를 활용하여 데이터를 저장하도록 수정
+- [x] gradle 의존성 추가
+- [x] 테이블 스키마 정의
+- [x] 데이터베이스 설정
+- [x] 요구 사항 테스트 진행
+
+6단계 요구사항
+
+예약 조회 API 처리 로직에서 저장된 예약을 조회할 때 데이터베이스를 활용하도록 수정
+- [x] 데이터를 조회하는 기능을 구현
+ - SQL - SELECT 쿼리
+ - JdbcTemplate
+- [x] 요구 사항 테스트 추가
+
+7단계 요구사항
+데이터 추가/삭제하기
+
+- [x] 예약 추가/취소 API 처리 로직에서 데이터베이스를 활용하도록 수정
+ - 기존에 사용하던 List 및 AtomicLong 제거
+- [x] 요구 사항 테스트 추가
diff --git a/build.gradle b/build.gradle
index 57267157c..2a6203bac 100644
--- a/build.gradle
+++ b/build.gradle
@@ -13,11 +13,18 @@ repositories {
}
dependencies {
+ implementation 'org.springframework.boot:spring-boot-starter-web'
+ implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter'
+ implementation 'org.springframework.boot:spring-boot-starter-jdbc'
+
+ testImplementation 'org.assertj:assertj-core:3.20.2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.rest-assured:rest-assured:5.3.1'
+
+ runtimeOnly 'com.h2database:h2'
}
test {
useJUnitPlatform()
-}
+}
\ No newline at end of file
diff --git a/src/main/java/roomescape/DAO/ReservationDAO.java b/src/main/java/roomescape/DAO/ReservationDAO.java
new file mode 100644
index 000000000..b23976a36
--- /dev/null
+++ b/src/main/java/roomescape/DAO/ReservationDAO.java
@@ -0,0 +1,64 @@
+package roomescape.DAO;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
+import org.springframework.stereotype.Repository;
+import roomescape.domain.Reservation;
+import roomescape.domain.Time;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+public class ReservationDAO {
+
+ private final JdbcTemplate jdbcTemplate;
+ private final SimpleJdbcInsert simpleJdbcInsert;
+
+ public ReservationDAO(DataSource dataSource) {
+ this.jdbcTemplate = new JdbcTemplate(dataSource);
+ this.simpleJdbcInsert = new SimpleJdbcInsert(jdbcTemplate)
+ .withTableName("reservation")
+ .usingGeneratedKeyColumns("id");
+ }
+
+ public List findAll() {
+ String sql = "SELECT r.id, r.name, r.date, t.id as time_id, t.time FROM reservation r INNER JOIN time t ON r.time_id = t.id";
+ return jdbcTemplate.query(sql, (rs, rowNum) -> {
+ long id = rs.getLong("id");
+ String name = rs.getString("name");
+ String date = rs.getString("date");
+ Time time = new Time(rs.getLong("time_id"), rs.getString("time"));
+ return new Reservation(id, name, date, time);
+ });
+ }
+
+ public Reservation findById(long id) {
+ String sql = "SELECT r.id, r.name, r.date, t.id as time_id, t.time FROM reservation r INNER JOIN time t ON r.time_id = t.id WHERE r.id = ?";
+ return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> {
+ long reservationId = rs.getLong("id");
+ String name = rs.getString("name");
+ String date = rs.getString("date");
+ Time time = new Time(rs.getLong("time_id"), rs.getString("time"));
+ return new Reservation(reservationId, name, date, time);
+ });
+ }
+
+ public long save(Reservation reservation) {
+ Map parameters = new HashMap<>();
+ parameters.put("name", reservation.getName());
+ parameters.put("date", reservation.getDate());
+ parameters.put("time_id", reservation.getTime().getId());
+
+ Number key = simpleJdbcInsert.executeAndReturnKey(parameters);
+ return key.longValue();
+ }
+
+ public long deleteById(long id) {
+ String sql = "DELETE FROM reservation WHERE id = ?";
+ int rowsAffected = jdbcTemplate.update(sql, id);
+ return rowsAffected > 0 ? id : -1;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/roomescape/DAO/TimeDAO.java b/src/main/java/roomescape/DAO/TimeDAO.java
new file mode 100644
index 000000000..01bf0caa1
--- /dev/null
+++ b/src/main/java/roomescape/DAO/TimeDAO.java
@@ -0,0 +1,48 @@
+package roomescape.DAO;
+
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
+import org.springframework.stereotype.Repository;
+import roomescape.domain.Time;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+public class TimeDAO {
+ private final JdbcTemplate jdbcTemplate;
+ private final SimpleJdbcInsert simpleJdbcInsert;
+
+ public TimeDAO(DataSource dataSource) {
+ this.jdbcTemplate = new JdbcTemplate(dataSource);
+ this.simpleJdbcInsert = new SimpleJdbcInsert(jdbcTemplate)
+ .withTableName("time")
+ .usingGeneratedKeyColumns("id");
+ }
+
+ public List