Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Spring JDBC] 주병주 미션 제출합니다. #256

Open
wants to merge 6 commits into
base: gotobill
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,14 @@ repositories {

dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
runtimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
testImplementation 'io.rest-assured:rest-assured:5.3.1'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}

test {
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/roomescape/PreInit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package roomescape;

import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import roomescape.domain.Dto.RequestDto;
import roomescape.domain.Repository.ReservationRepository;

@Component
@RequiredArgsConstructor
public class PreInit {

private final ReservationRepository reservationRepository;
// @PostConstruct
// public void init() {
// RequestDto requestDto1 = new RequestDto();
// requestDto1.setName("ju");
// requestDto1.setTime("asdasd");
// requestDto1.setDate("asdasd");
// reservationRepository.save(requestDto1.toReservation());
//
// }
}
25 changes: 25 additions & 0 deletions src/main/java/roomescape/domain/Dto/RequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package roomescape.domain.Dto;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import roomescape.domain.Model.Reservation;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

@Data
public class RequestDto {
private String name;
private String date;
private String time;

public Reservation toReservation() {
LocalDateTime reservationDateTime = LocalDateTime.of(
LocalDate.parse(date),
LocalTime.parse(time)
);
return new Reservation(name, reservationDateTime);
}
}
34 changes: 34 additions & 0 deletions src/main/java/roomescape/domain/Dto/ResponseDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package roomescape.domain.Dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import roomescape.domain.Model.Reservation;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Data
public class ResponseDto {
private Long id;
private String name;
private String date;
private String time;

public ResponseDto(Long id, String name, String date, String time) {
this.id = id;
this.name = name;
this.date = date;
this.time = time;
}

public static ResponseDto makeResponse(Reservation reservation) {
LocalDateTime reservationDateTime = reservation.getLocalDateTime();
return new ResponseDto(
reservation.getId(),
reservation.getName(),
reservationDateTime.toLocalDate().toString(),
reservationDateTime.toLocalTime().toString()
);
}

}
26 changes: 26 additions & 0 deletions src/main/java/roomescape/domain/Model/Reservation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package roomescape.domain.Model;

import lombok.Data;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Data
public class Reservation {
private Long id;
private String name;
private LocalDateTime localDateTime;

public Reservation() {
}

public Reservation(Long id, String name, LocalDateTime localDateTime) {
this.id = id;
this.name = name;
this.localDateTime = localDateTime;
}
public Reservation(String name, LocalDateTime localDateTime) {
this.name = name;
this.localDateTime = localDateTime;
}
}
14 changes: 14 additions & 0 deletions src/main/java/roomescape/domain/Repository/BasicRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package roomescape.domain.Repository;

import roomescape.domain.Model.Reservation;

import java.util.List;


public interface BasicRepository {
public Reservation save(Reservation reservation);

public List<Reservation> findAll();

public void deleteReservation(Long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package roomescape.domain.Repository;

import lombok.RequiredArgsConstructor;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.stereotype.Repository;
import roomescape.domain.Model.Reservation;
import roomescape.domain.exception.NotFoundReservationException;

import java.sql.PreparedStatement;
import java.time.LocalDateTime;
import java.util.List;

@Repository
public class JdbcReservationRepository implements BasicRepository{
private final JdbcTemplate jdbcTemplate;

public JdbcReservationRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

@Override
public List<Reservation> findAll() {
String sql = "SELECT * FROM reservation";
return jdbcTemplate.query(sql, (rs, rowNum) -> new Reservation(
rs.getLong("id"),
rs.getString("name"),
rs.getObject("reservation_date_time", LocalDateTime.class)
));
}

@Override
public Reservation save(Reservation reservation) {
String sql = "INSERT INTO reservation (name, reservation_date_time) VALUES (?, ?)";

GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"});
ps.setString(1, reservation.getName());
ps.setObject(2, reservation.getLocalDateTime());
return ps;
}, keyHolder);

long pk = keyHolder.getKey().longValue();
return new Reservation(pk, reservation.getName(), reservation.getLocalDateTime());
}

@Override
public void deleteReservation(final Long id) {
String sql = "DELETE FROM reservation WHERE id = ?";
int updateCount = jdbcTemplate.update(sql, id);
if (updateCount == 0) {
throw new NotFoundReservationException("예약을 찾을 수 없습니다.");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package roomescape.domain.Repository;

import org.springframework.stereotype.Repository;
import roomescape.domain.Model.Reservation;
import roomescape.domain.exception.NoDataException;
import roomescape.domain.exception.NotFoundReservationException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@Repository
public class ReservationRepository {
private static final HashMap<Long, Reservation> store = new HashMap<Long, Reservation>();
private static Long sequence = 0L;


public Reservation save(Reservation reservation) {
reservation.setId(++sequence);
store.put(reservation.getId(),reservation);
return reservation;
}

public List<Reservation> findAll() {
return new ArrayList<>(store.values());
}

public Reservation deleteReservation(Long id){
if (store.containsKey(id)) {
Reservation removeReservation = store.get(id);
store.remove(id);
return removeReservation;
}
throw new NotFoundReservationException("해당 id를 찾지 못하였습니다.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package roomescape.domain.exception;

public class NoDataException extends RuntimeException{
public NoDataException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package roomescape.domain.exception;

public class NotFoundReservationException extends RuntimeException{
public NotFoundReservationException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package roomescape.domain.exceptionHandler;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import roomescape.domain.exception.NoDataException;
import roomescape.domain.exception.NotFoundReservationException;

@ControllerAdvice
public class ExceptionHandlerData {
@ExceptionHandler(NotFoundReservationException.class)
public ResponseEntity handleExceptionNotFound(NotFoundReservationException e) {
return ResponseEntity.badRequest().build();
}

@ExceptionHandler(NoDataException.class)
public ResponseEntity handleExceptionNoData(NoDataException e) {
return ResponseEntity.badRequest().build();
}
}
16 changes: 16 additions & 0 deletions src/main/java/roomescape/web/Controller/HomeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package roomescape.web.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/")
public class HomeController {

@GetMapping
public String home() {
return "home";
}

}
64 changes: 64 additions & 0 deletions src/main/java/roomescape/web/Controller/ReservationController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package roomescape.web.Controller;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.apache.catalina.connector.Response;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import roomescape.domain.Dto.RequestDto;
import roomescape.domain.Dto.ResponseDto;
import roomescape.domain.Model.Reservation;
import roomescape.domain.Repository.BasicRepository;


import java.lang.reflect.Member;
import java.net.URI;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.toList;

@Controller
public class ReservationController {
private final BasicRepository basicRepository;

public ReservationController(@Qualifier("jdbcReservationRepository") BasicRepository basicRepository) {
this.basicRepository = basicRepository;
}

@GetMapping("/reservation")
public String reservation(){
return "reservation";
}

@GetMapping ("/reservations")
@ResponseBody
public ResponseEntity<List<ResponseDto>> checkReservation(){
List<Reservation> reservations = basicRepository.findAll();
List<ResponseDto> responseDtos = reservations.stream()
.map(ResponseDto::makeResponse)
.toList();
return ResponseEntity.ok(responseDtos);
}
@PostMapping("/reservations")
@ResponseBody
public ResponseEntity<ResponseDto> addReservation(@RequestBody RequestDto requestDto){

Reservation reservation = basicRepository.save(requestDto.toReservation());
ResponseDto responseDto = ResponseDto.makeResponse(reservation);
URI location = URI.create("/reservations/"+responseDto.getId());
return ResponseEntity.created(location).body(responseDto);
}

@DeleteMapping("/reservations/{id}")
public ResponseEntity<Void> deleteReservation(@PathVariable Long id) {
basicRepository.deleteReservation(id);
return ResponseEntity.noContent().build();
}

}
3 changes: 3 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:mem:database
8 changes: 8 additions & 0 deletions src/main/resources/schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
DROP TABLE IF EXISTS reservation;

CREATE TABLE reservation
(
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
reservation_date_time TIMESTAMP NOT NULL
);
Loading