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 Core] 신지훈 미션 제출합니다. #389

Open
wants to merge 34 commits into
base: 0094-gengar
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
e85c1f7
refactor(MissionStepTest): [8단계] 테스트 코드 추가
0094-Gengar Nov 25, 2024
d9debfd
feat(schema.sql): [8단계] time 데이터 베이스 추가
0094-Gengar Nov 25, 2024
9a1ea5b
feat(Time): [8단계] time 객체 클래스 생성
0094-Gengar Nov 25, 2024
8f20448
refactor(Reservation package): [8단계] 예약 관련 도메인들을 예약 패키지로 이동
0094-Gengar Nov 25, 2024
2eb8035
feat(TimeRequest): [8단계] 예약 시간 요청에 사용할 DTO 생성
0094-Gengar Nov 25, 2024
ab272cd
refactor(Time): [8단계] 패키지 이동
0094-Gengar Nov 25, 2024
2d600ab
feat(TimeController): [8단계] 시간 추가 API 기능 생성
0094-Gengar Nov 25, 2024
156607a
feat(TimeController): [8단계] 시간 조회 API 생성
0094-Gengar Nov 25, 2024
9ab28f4
feat(TimeController): [8단계] 시간 삭제 API 생성
0094-Gengar Nov 25, 2024
c1d7d5e
refactor(MissionStepTest): [8단계] 테스트 코드 '팔단계' 추가(통과)
0094-Gengar Nov 25, 2024
7e4316d
refactor(schema.sql): [9단계] 테이블 스키마 재정의
0094-Gengar Nov 25, 2024
24fb51c
refactor(ReservationRepository): [9단계] 예약 쿼리 수정
0094-Gengar Nov 26, 2024
a3c0efa
refactor(Reservation): [9단계] 시간 타입 String 에서 객체로 변경
0094-Gengar Nov 26, 2024
c8ff013
refactor(ReservationRequest): [9단계] 시간 타입 String 에서 객체로 변경
0094-Gengar Nov 26, 2024
66d0038
refactor(ReservationService): [9단계] 시간 타입 String 에서 객체로 변경
0094-Gengar Nov 26, 2024
2d067f7
refactor(TimeController): [9단계] 시간 타입 String 에서 객체로 변경
0094-Gengar Nov 26, 2024
905f8f1
refactor(Time): [9단계] Property 방식으로 매개변수를 처라하기 위해 JsonCreator 어노테이션 추가
0094-Gengar Nov 26, 2024
b5f5bf4
refactor(MissionStepTest): [9단계] 테스트 코드 '구단계' 추가(통과)
0094-Gengar Nov 26, 2024
6886611
refactor(MissionStepTest): [10단계] 테스트 코드 '십단계' 추가(통과) - 앞선 리뷰에서 진행한 내용
0094-Gengar Nov 26, 2024
62e8003
refactor(Time): 생성자에 JsonCreator, JsonProperty 추가
0094-Gengar Nov 26, 2024
8c936b1
refactor(TimeController, TimeRequest): 코드 리팩토링(new Time() -> toTime())
0094-Gengar Nov 26, 2024
b92587b
refactor(Reservation, ReservationController): 코드 리팩토링
0094-Gengar Nov 26, 2024
c4e8b2f
feat(data.sql): 시간 데이터 임의 추가
0094-Gengar Nov 26, 2024
be9d153
refactor(MissionStepTest, data.sql): 테스트 코드 변경(시간 데이터 수동 생성으로 인한 id 값…
0094-Gengar Nov 26, 2024
4915b5b
refactor: 미사용, 불필요, 중복 코드 삭제
0094-Gengar Nov 27, 2024
bdc553f
refactor(HomeController): 시간 관리 페이지를 띄우는 GetMapping 추가
0094-Gengar Nov 27, 2024
fbed97d
refactor(ReservationRequest): RequestBody를 통해 정보를 받을 때 time은 Long 형으로 받기
0094-Gengar Nov 27, 2024
c9737cd
refactor(ReservationService): timeId를 통해 time과 맵핑하는 코드 추가
0094-Gengar Nov 27, 2024
304fe1e
[주석 정리]
0094-Gengar Jan 4, 2025
1da44ff
[주석 제거]
0094-Gengar Jan 4, 2025
7a9185b
refactor: ReservationRequest -> ReservationDTO, ReservationRepository…
0094-Gengar Jan 4, 2025
446a234
feat(NotFoundTimeException): 시간 관련 예외 클래스 생성
0094-Gengar Jan 4, 2025
52565c9
refactor(Reservation): 예약 관련 로직 리팩토링(레이어드 아키텍처 반영)
0094-Gengar Jan 4, 2025
2ec9f44
refactor(Time): 시간 관련 로직 리팩토링(레이어드 아키텍처 반영)
0094-Gengar Jan 4, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public ResponseEntity<Void> save(@RequestBody Customer customer) {
return ResponseEntity.ok().build();
}

@GetMapping("/customers") // -> customers 라는 파일(경로)을 만든 적이 없는데 코드가 돌아가긴 함..
@GetMapping("/customers")
public ResponseEntity<List<Customer>> list() {
String sql = "select id, first_name, last_name from customers";
List<Customer> customers = jdbcTemplate.query(
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/roomescape/controller/HomeController.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,9 @@ public class HomeController {
public String home() {
return "home";
}

@GetMapping("/time")
public String time() {
return "time";
}
}
16 changes: 8 additions & 8 deletions src/main/java/roomescape/controller/ReservationController.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,24 @@
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import roomescape.model.Reservation;
import roomescape.model.ReservationRequest;
import roomescape.model.ReservationService;
import roomescape.model.reservation.Reservation;
import roomescape.model.reservation.ReservationDTO;
import roomescape.model.reservation.ReservationService;

import java.util.List;

@Controller
public class ReservationController {

private ReservationService reservationService;
private final ReservationService reservationService;

public ReservationController(ReservationService reservationService) {
this.reservationService = reservationService;
}

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

@GetMapping("/reservations")
Expand All @@ -31,9 +31,9 @@ public List<Reservation> getReservations() {
}

@PostMapping("/reservations")
public ResponseEntity<Reservation> addReservation(@RequestBody ReservationRequest reservationRequest) {
Reservation reservation = reservationService.addReservation(reservationRequest);
return ResponseEntity.status(HttpStatus.CREATED) // status: 201
public ResponseEntity<Reservation> addReservation(@RequestBody ReservationDTO reservationDTO) {
Reservation reservation = reservationService.addReservation(reservationDTO);
return ResponseEntity.status(HttpStatus.CREATED)
.header("Location", "/reservations/" + reservation.getId())
.body(reservation);
}
Expand Down
41 changes: 41 additions & 0 deletions src/main/java/roomescape/controller/TimeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package roomescape.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import roomescape.model.time.Time;
import roomescape.model.time.TimeDTO;
import roomescape.model.time.TimeService;

import java.util.List;

@RestController
@RequestMapping("/times")
public class TimeController {

private final TimeService timeService;

public TimeController(TimeService timeService) {
this.timeService = timeService;
}

@GetMapping
@ResponseBody
public List<Time> getTimes() {
return timeService.getAllTimes();
}

@PostMapping
public ResponseEntity<Time> addTime(@RequestBody TimeDTO timeDTO) {
Time time = timeService.addTime(timeDTO);
return ResponseEntity.status(HttpStatus.CREATED)
.header("Location", "/times/" + time.getId())
.body(time);
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteTime(@PathVariable Long id) {
timeService.deleteTime(id);
return ResponseEntity.noContent().build();
}
}
7 changes: 7 additions & 0 deletions src/main/java/roomescape/exception/NotFoundTimeException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package roomescape.exception;

public class NotFoundTimeException extends RuntimeException {
public NotFoundTimeException(String message) {
super(message);
}
}
37 changes: 0 additions & 37 deletions src/main/java/roomescape/model/ReservationRepository.java

This file was deleted.

25 changes: 0 additions & 25 deletions src/main/java/roomescape/model/ReservationRequest.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package roomescape.model;
package roomescape.model.reservation;

import roomescape.model.time.Time;

public class Reservation {

private Long id;
private String name;
private String date;
private String time;
private Time time;

public Reservation(String name, String date, String time) {
public Reservation(String name, String date, Time time) {
this.name = name;
this.date = date;
this.time = time;
Expand All @@ -25,11 +27,19 @@ public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getDate() {
return date;
}

public String getTime() {
public Time getTime() {
return time;
}

public void setTime(Time time) {
this.time = time;
}
}
33 changes: 33 additions & 0 deletions src/main/java/roomescape/model/reservation/ReservationDAO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package roomescape.model.reservation;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class ReservationDAO {
private final JdbcTemplate jdbcTemplate;

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

public List<Reservation> findAll() {
String sql = """
SELECT
r.id as reservation_id,
r.name,
r.date,
t.id as time_id,
t.time as time_value
FROM reservation as r INNER JOIN time as t ON r.time_id = t.id
""";
return jdbcTemplate.query(sql, new ReservationRowMapper());
}

public int deleteById(Long id) {
String sql = "DELETE FROM reservation WHERE id = ?";
return jdbcTemplate.update(sql, id);
}
}
29 changes: 29 additions & 0 deletions src/main/java/roomescape/model/reservation/ReservationDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package roomescape.model.reservation;

import com.fasterxml.jackson.annotation.JsonProperty;

public class ReservationDTO {
private String name;
private String date;

@JsonProperty("time")
private Long timeId;

public ReservationDTO(String name, String date, Long timeId) {
this.name = name;
this.date = date;
this.timeId = timeId;
}

public String getName() {
return name;
}

public String getDate() {
return date;
}

public Long getTimeId() {
return timeId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package roomescape.model.reservation;

import org.springframework.jdbc.core.RowMapper;
import roomescape.model.time.Time;

import java.sql.ResultSet;
import java.sql.SQLException;

public class ReservationRowMapper implements RowMapper<Reservation> {
@Override
public Reservation mapRow(ResultSet rs, int rowNum) throws SQLException {

String timeValue = rs.getString("time_value");

Time time = new Time(timeValue);

Reservation reservation = new Reservation(
rs.getString("name"),
rs.getString("date"),
time
);
reservation.setId(rs.getLong("reservation_id"));
return reservation;
}
}
Original file line number Diff line number Diff line change
@@ -1,48 +1,57 @@
package roomescape.model;
package roomescape.model.reservation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;
import roomescape.exception.InvalidReservationParameterException;
import roomescape.exception.NotFoundReservationException;
import roomescape.model.time.Time;
import roomescape.model.time.TimeService;

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

@Service
public class ReservationService {
private final JdbcTemplate jdbcTemplate;
private final ReservationRepository reservationRepository;
private final ReservationDAO reservationDAO;
private final TimeService timeService;

@Autowired
public ReservationService(JdbcTemplate jdbcTemplate, ReservationRepository reservationRepository) {
public ReservationService(JdbcTemplate jdbcTemplate, ReservationDAO reservationDAO, TimeService timeService) {
this.jdbcTemplate = jdbcTemplate;
this.reservationRepository = reservationRepository;
this.reservationDAO = reservationDAO;
this.timeService = timeService;
}

public List<Reservation> getAllReservations() {
return reservationRepository.findAll();
return reservationDAO.findAll();
}

public Reservation addReservation(ReservationRequest reservationRequest) {
if (reservationRequest.getName() == null || reservationRequest.getName().isEmpty() ||
reservationRequest.getDate() == null || reservationRequest.getDate().isEmpty() ||
reservationRequest.getTime() == null || reservationRequest.getTime().isEmpty()) {
public Reservation addReservation(ReservationDTO reservationDTO) {
if (reservationDTO.getName() == null || reservationDTO.getName().isEmpty() ||
reservationDTO.getDate() == null || reservationDTO.getDate().isEmpty() ||
reservationDTO.getTimeId() == null) {
throw new InvalidReservationParameterException("예약 내용에 누락된 부분이 있습니다.");
}

Reservation reservation = new Reservation(reservationRequest.getName(), reservationRequest.getDate(),reservationRequest.getTime());
Long timeId = reservationDTO.getTimeId();
Time time = timeService.findTimeById(timeId);

String sql = "INSERT INTO reservation (name,date,time) VALUES (?,?,?)";
Reservation reservation = new Reservation(
reservationDTO.getName(),
reservationDTO.getDate(),
time
);

String sql = "INSERT INTO reservation (name, date, time_id) VALUES (?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder();

jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql, new String[]{"id"});
ps.setString(1, reservation.getName());
ps.setString(2, reservation.getDate());
ps.setString(3, reservation.getTime());
ps.setLong(3, time.getId());
return ps;
}, keyHolder);

Expand All @@ -54,9 +63,9 @@ public Reservation addReservation(ReservationRequest reservationRequest) {
}

public void deleteReservation(Long id) {
int rowAffected = reservationRepository.deleteById(id);
int rowAffected = reservationDAO.deleteById(id);
if (rowAffected == 0) {
throw new NotFoundReservationException("삭제하려는 예약이 없습니다.");
throw new NotFoundReservationException("삭제하려는 예약이 존재하지 않습니다.");
}
}
}
Loading