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