diff --git a/build.gradle b/build.gradle index 8d52aebc6..9bc129a0e 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ 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-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'dev.akkinoc.spring.boot:logback-access-spring-boot-starter:4.0.0' diff --git a/src/main/java/roomescape/global/login/LoginMemberArgumentResolver.java b/src/main/java/roomescape/global/login/LoginMemberArgumentResolver.java index 56f3a4043..b28789a45 100644 --- a/src/main/java/roomescape/global/login/LoginMemberArgumentResolver.java +++ b/src/main/java/roomescape/global/login/LoginMemberArgumentResolver.java @@ -5,6 +5,7 @@ import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Value; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; @@ -14,7 +15,8 @@ @Component public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver { - private static final String SECRET_KEY = "Yn2kjibddFAWtnPJ2AFlL8WXmohJMCvigQggaEypa5E="; + @Value("${roomescape.auth.jwt.secret}") + private String secretKey; @Override public boolean supportsParameter(MethodParameter parameter) { @@ -35,7 +37,7 @@ public Object resolveArgument(@NotNull MethodParameter parameter, } return Jwts.parserBuilder() - .setSigningKey(Keys.hmacShaKeyFor(SECRET_KEY.getBytes())) + .setSigningKey(Keys.hmacShaKeyFor(secretKey.getBytes())) .build() .parseClaimsJws(token) .getBody() diff --git a/src/main/java/roomescape/member/domain/Member.java b/src/main/java/roomescape/member/domain/Member.java index ae754e154..1ed6ac2f6 100644 --- a/src/main/java/roomescape/member/domain/Member.java +++ b/src/main/java/roomescape/member/domain/Member.java @@ -1,6 +1,14 @@ package roomescape.member.domain; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@Entity public class Member { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String email; @@ -21,6 +29,9 @@ public Member(String name, String email, String password, String role) { this.role = role; } + public Member() { + } + public Long getId() { return id; } diff --git a/src/main/java/roomescape/member/domain/MemberDao.java b/src/main/java/roomescape/member/domain/MemberDao.java deleted file mode 100644 index 5652a7ee4..000000000 --- a/src/main/java/roomescape/member/domain/MemberDao.java +++ /dev/null @@ -1,57 +0,0 @@ -package roomescape.member.domain; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public class MemberDao { - private final JdbcTemplate jdbcTemplate; - - public MemberDao(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - public Member save(Member member) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(connection -> { - var ps = connection.prepareStatement("INSERT INTO member(name, email, password, role) VALUES (?, ?, ?, ?)", new String[]{"id"}); - ps.setString(1, member.getName()); - ps.setString(2, member.getEmail()); - ps.setString(3, member.getPassword()); - ps.setString(4, member.getRole()); - return ps; - }, keyHolder); - - return new Member(keyHolder.getKey().longValue(), member.getName(), member.getEmail(), "USER"); - } - - public Member findByEmailAndPassword(String email, String password) { - return jdbcTemplate.queryForObject( - "SELECT id, name, email, role FROM member WHERE email = ? AND password = ?", - (rs, rowNum) -> new Member( - rs.getLong("id"), - rs.getString("name"), - rs.getString("email"), - rs.getString("role") - ), - email, password - ); - } - - public Optional findByName(String name) { - return Optional.ofNullable(jdbcTemplate.queryForObject( - "SELECT id, name, email, role FROM member WHERE name = ?", - (rs, rowNum) -> new Member( - rs.getLong("id"), - rs.getString("name"), - rs.getString("email"), - rs.getString("role") - ), - name - )); - } -} diff --git a/src/main/java/roomescape/member/domain/MemberRepository.java b/src/main/java/roomescape/member/domain/MemberRepository.java new file mode 100644 index 000000000..d3cf3cdcb --- /dev/null +++ b/src/main/java/roomescape/member/domain/MemberRepository.java @@ -0,0 +1,10 @@ +package roomescape.member.domain; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface MemberRepository extends JpaRepository { + Optional findByEmailAndPassword(String email, String password); + Optional findByName(String name); +} diff --git a/src/main/java/roomescape/member/service/MemberService.java b/src/main/java/roomescape/member/service/MemberService.java index 9f1715903..ae4f4f16e 100644 --- a/src/main/java/roomescape/member/service/MemberService.java +++ b/src/main/java/roomescape/member/service/MemberService.java @@ -2,25 +2,26 @@ import io.jsonwebtoken.Jwts; import io.jsonwebtoken.security.Keys; -import jakarta.servlet.http.Cookie; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import roomescape.member.controller.dto.MemberRequest; import roomescape.member.controller.dto.MemberResponse; import roomescape.member.domain.Member; -import roomescape.member.domain.MemberDao; +import roomescape.member.domain.MemberRepository; @Service public class MemberService { - private static final String SECRET_KEY = "Yn2kjibddFAWtnPJ2AFlL8WXmohJMCvigQggaEypa5E="; + @Value("${roomescape.auth.jwt.secret}") + private String secretKey; - private final MemberDao memberDao; + private final MemberRepository memberRepository; - public MemberService(MemberDao memberDao) { - this.memberDao = memberDao; + public MemberService(MemberRepository memberRepository) { + this.memberRepository = memberRepository; } public MemberResponse createMember(MemberRequest memberRequest) { - Member member = memberDao.save(requestToMember(memberRequest)); + Member member = memberRepository.save(requestToMember(memberRequest)); return memberToResponse(member); } @@ -33,16 +34,14 @@ private MemberResponse memberToResponse(Member member) { } public String login(MemberRequest memberRequest) { - Member member = memberDao.findByEmailAndPassword(memberRequest.email(), memberRequest.password()); - if (member == null) { - throw new RuntimeException("로그인 실패"); - } + Member member = memberRepository.findByEmailAndPassword(memberRequest.email(), memberRequest.password()) + .orElseThrow(() -> new RuntimeException("로그인 실패")); return Jwts.builder() .setSubject(member.getId().toString()) .claim("name", member.getName()) .claim("role", member.getRole()) - .signWith(Keys.hmacShaKeyFor(SECRET_KEY.getBytes())) + .signWith(Keys.hmacShaKeyFor(secretKey.getBytes())) .compact(); } @@ -51,7 +50,7 @@ public MemberResponse getMemberByName(String memberName) { throw new RuntimeException("로그인이 필요합니다."); } - return memberDao.findByName(memberName) + return memberRepository.findByName(memberName) .map(this::memberToResponse) .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다.")); } diff --git a/src/main/java/roomescape/reservation/controller/ReservationController.java b/src/main/java/roomescape/reservation/controller/ReservationController.java index 5397f3add..d2cb7b4dc 100644 --- a/src/main/java/roomescape/reservation/controller/ReservationController.java +++ b/src/main/java/roomescape/reservation/controller/ReservationController.java @@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import roomescape.global.login.LoginMemberName; +import roomescape.reservation.controller.dto.MyReservationResponse; import roomescape.reservation.service.ReservationService; import roomescape.reservation.controller.dto.ReservationRequest; import roomescape.reservation.controller.dto.ReservationResponse; @@ -30,6 +31,11 @@ public List list() { return reservationService.findAll(); } + @GetMapping("/reservations-mine") + public List mine(@LoginMemberName String memberName) { + return reservationService.findMyReservations(memberName); + } + @PostMapping("/reservations") public ResponseEntity create(@LoginMemberName String memberName, @RequestBody ReservationRequest reservationRequest) { @@ -47,6 +53,13 @@ public ResponseEntity create(@LoginMemberName String member .body(reservation); } + @DeleteMapping("/reservations/{id}") + public ResponseEntity delete(@PathVariable Long id) { + reservationService.deleteById(id); + return ResponseEntity.status(HttpStatus.NO_CONTENT) + .build(); + } + private boolean isNamePresentInRequest(ReservationRequest reservationRequest) { return reservationRequest.name() != null; } @@ -57,11 +70,4 @@ private boolean isNotNullRequestParameters(String memberName, ReservationRequest || reservationRequest.theme() == null || reservationRequest.time() == null; } - - @DeleteMapping("/reservations/{id}") - public ResponseEntity delete(@PathVariable Long id) { - reservationService.deleteById(id); - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); - } } diff --git a/src/main/java/roomescape/reservation/controller/dto/MyReservationResponse.java b/src/main/java/roomescape/reservation/controller/dto/MyReservationResponse.java new file mode 100644 index 000000000..234fce2f3 --- /dev/null +++ b/src/main/java/roomescape/reservation/controller/dto/MyReservationResponse.java @@ -0,0 +1,4 @@ +package roomescape.reservation.controller.dto; + +public record MyReservationResponse(Long id, String theme, String date, String time, String status) { +} diff --git a/src/main/java/roomescape/reservation/domain/Reservation.java b/src/main/java/roomescape/reservation/domain/Reservation.java index a7f282dc3..0cbaf0c95 100644 --- a/src/main/java/roomescape/reservation/domain/Reservation.java +++ b/src/main/java/roomescape/reservation/domain/Reservation.java @@ -1,13 +1,34 @@ package roomescape.reservation.domain; -import roomescape.theme.Theme; -import roomescape.time.Time; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import roomescape.member.domain.Member; +import roomescape.theme.domain.Theme; +import roomescape.time.domain.Time; +@Entity public class Reservation { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String date; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "time_id") private Time time; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "theme_id") private Theme theme; public Reservation(Long id, String name, String date, Time time, Theme theme) { @@ -18,6 +39,14 @@ public Reservation(Long id, String name, String date, Time time, Theme theme) { this.theme = theme; } + public Reservation(String name, String date, Member member, Time time, Theme theme) { + this.name = name; + this.date = date; + this.member = member; + this.time = time; + this.theme = theme; + } + public Reservation(String name, String date, Time time, Theme theme) { this.name = name; this.date = date; diff --git a/src/main/java/roomescape/reservation/domain/ReservationDao.java b/src/main/java/roomescape/reservation/domain/ReservationDao.java deleted file mode 100644 index 8e54b34c8..000000000 --- a/src/main/java/roomescape/reservation/domain/ReservationDao.java +++ /dev/null @@ -1,128 +0,0 @@ -package roomescape.reservation.domain; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; -import roomescape.reservation.controller.dto.ReservationRequest; -import roomescape.theme.Theme; -import roomescape.time.Time; - -import java.sql.PreparedStatement; -import java.util.List; - -@Repository -public class ReservationDao { - - private final JdbcTemplate jdbcTemplate; - - public ReservationDao(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - public List findAll() { - return jdbcTemplate.query( - "SELECT r.id AS reservation_id, r.name as reservation_name, r.date as reservation_date, " + - "t.id AS theme_id, t.name AS theme_name, t.description AS theme_description, " + - "ti.id AS time_id, ti.time_value AS time_value " + - "FROM reservation r " + - "JOIN theme t ON r.theme_id = t.id " + - "JOIN time ti ON r.time_id = ti.id", - - (rs, rowNum) -> new Reservation( - rs.getLong("reservation_id"), - rs.getString("reservation_name"), - rs.getString("reservation_date"), - new Time( - rs.getLong("time_id"), - rs.getString("time_value") - ), - new Theme( - rs.getLong("theme_id"), - rs.getString("theme_name"), - rs.getString("theme_description") - ))); - } - - public Reservation save(ReservationRequest reservationRequest) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(connection -> { - PreparedStatement ps = connection.prepareStatement("INSERT INTO reservation(date, name, theme_id, time_id) VALUES (?, ?, ?, ?)", new String[]{"id"}); - ps.setString(1, reservationRequest.date()); - ps.setString(2, reservationRequest.name()); - ps.setLong(3, reservationRequest.theme()); - ps.setLong(4, reservationRequest.time()); - return ps; - }, keyHolder); - - Time time = jdbcTemplate.queryForObject("SELECT * FROM time WHERE id = ?", - (rs, rowNum) -> new Time(rs.getLong("id"), rs.getString("time_value")), - reservationRequest.time()); - - Theme theme = jdbcTemplate.queryForObject("SELECT * FROM theme WHERE id = ?", - (rs, rowNum) -> new Theme(rs.getLong("id"), rs.getString("name"), rs.getString("description")), - reservationRequest.theme()); - - return new Reservation( - keyHolder.getKey().longValue(), - reservationRequest.name(), - reservationRequest.date(), - time, - theme - ); - } - - public void deleteById(Long id) { - jdbcTemplate.update("DELETE FROM reservation WHERE id = ?", id); - } - - public List findReservationsByDateAndTheme(String date, Long themeId) { - return jdbcTemplate.query( - "SELECT r.id AS reservation_id, r.name as reservation_name, r.date as reservation_date, " + - "t.id AS theme_id, t.name AS theme_name, t.description AS theme_description, " + - "ti.id AS time_id, ti.time_value AS time_value " + - "FROM reservation r " + - "JOIN theme t ON r.theme_id = t.id " + - "JOIN time ti ON r.time_id = ti.id" + - "WHERE r.date = ? AND r.theme_id = ?", - new Object[]{date, themeId}, - (rs, rowNum) -> new Reservation( - rs.getLong("reservation_id"), - rs.getString("reservation_name"), - rs.getString("reservation_date"), - new Time( - rs.getLong("time_id"), - rs.getString("time_value") - ), - new Theme( - rs.getLong("theme_id"), - rs.getString("theme_name"), - rs.getString("theme_description") - ))); - } - - public List findByDateAndThemeId(String date, Long themeId) { - return jdbcTemplate.query( - "SELECT r.id AS reservation_id, r.name as reservation_name, r.date as reservation_date, " + - "t.id AS theme_id, t.name AS theme_name, t.description AS theme_description, " + - "ti.id AS time_id, ti.time_value AS time_value " + - "FROM reservation r " + - "JOIN theme t ON r.theme_id = t.id " + - "JOIN time ti ON r.time_id = ti.id " + - "WHERE r.date = ? AND r.theme_id = ?", - new Object[]{date, themeId}, - (rs, rowNum) -> new Reservation( - rs.getLong("reservation_id"), - rs.getString("reservation_name"), - rs.getString("reservation_date"), - new Time( - rs.getLong("time_id"), - rs.getString("time_value") - ), - new Theme( - rs.getLong("theme_id"), - rs.getString("theme_name"), - rs.getString("theme_description") - ))); - } -} diff --git a/src/main/java/roomescape/reservation/domain/ReservationRepository.java b/src/main/java/roomescape/reservation/domain/ReservationRepository.java new file mode 100644 index 000000000..98317996e --- /dev/null +++ b/src/main/java/roomescape/reservation/domain/ReservationRepository.java @@ -0,0 +1,13 @@ +package roomescape.reservation.domain; + +import org.springframework.data.jpa.repository.EntityGraph; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ReservationRepository extends JpaRepository { + List findByDateAndThemeId(String date, Long themeId); + + @EntityGraph(attributePaths = {"member", "theme", "time"}) + List findMyReservationsByName(String name); +} diff --git a/src/main/java/roomescape/reservation/service/ReservationService.java b/src/main/java/roomescape/reservation/service/ReservationService.java index 7dcc0c300..80179d39a 100644 --- a/src/main/java/roomescape/reservation/service/ReservationService.java +++ b/src/main/java/roomescape/reservation/service/ReservationService.java @@ -1,24 +1,59 @@ package roomescape.reservation.service; import org.springframework.stereotype.Service; +import roomescape.member.domain.Member; +import roomescape.member.domain.MemberRepository; +import roomescape.reservation.controller.dto.MyReservationResponse; import roomescape.reservation.controller.dto.ReservationRequest; import roomescape.reservation.controller.dto.ReservationResponse; import roomescape.reservation.domain.Reservation; -import roomescape.reservation.domain.ReservationDao; +import roomescape.reservation.domain.ReservationRepository; +import roomescape.theme.domain.Theme; +import roomescape.theme.domain.ThemeRepository; +import roomescape.time.domain.Time; +import roomescape.time.domain.TimeRepository; +import roomescape.waiting.domain.Waiting; +import roomescape.waiting.domain.WaitingRepository; import java.util.List; +import static java.util.stream.Stream.*; + @Service public class ReservationService { - private final ReservationDao reservationDao; + private final ReservationRepository reservationRepository; + private final WaitingRepository waitingRepository; + private final ThemeRepository themeRepository; + private final TimeRepository timeRepository; + private final MemberRepository memberRepository; + + public ReservationService(ReservationRepository reservationRepository, + WaitingRepository waitingRepository, + ThemeRepository themeRepository, + TimeRepository timeRepository, + MemberRepository memberRepository) { + this.reservationRepository = reservationRepository; + this.waitingRepository = waitingRepository; + this.themeRepository = themeRepository; + this.timeRepository = timeRepository; + this.memberRepository = memberRepository; + } - public ReservationService(ReservationDao reservationDao) { - this.reservationDao = reservationDao; + public List findMyReservations(String memberName) { + List myReservations = reservationRepository.findMyReservationsByName(memberName); + List myWaitings = waitingRepository.findMyWaitingByName(memberName); + List reservationResponses = myReservations.stream() + .map(this::myReservationToResponse) + .toList(); + List waitingResponses = myWaitings.stream() + .map(this::myWaitingToResponse) + .toList(); + return concat(reservationResponses.stream(), waitingResponses.stream()).toList(); } public ReservationResponse save(String memberName, ReservationRequest reservationRequest) { - Reservation reservation = reservationDao.save(requestToReservation(memberName, reservationRequest)); + Reservation reservation = reservationRepository.save(requestToReservation(memberName, reservationRequest)); return reservationToResponse(reservation); } @@ -26,17 +61,58 @@ private ReservationResponse reservationToResponse(Reservation reservation) { return new ReservationResponse(reservation.getId(), reservation.getName(), reservation.getTheme().getName(), reservation.getDate(), reservation.getTime().getValue()); } - private ReservationRequest requestToReservation(String memberName, ReservationRequest reservationRequest) { - return new ReservationRequest(memberName, reservationRequest.date(), reservationRequest.theme(), reservationRequest.time()); + private Reservation requestToReservation(String memberName, ReservationRequest reservationRequest) { + Member member = findMemberByName(memberName); + Theme themeProxy = findThemeProxyById(reservationRequest.theme()); + Time timeProxy = findTimeProxyById(reservationRequest.time()); + return new Reservation(memberName, reservationRequest.date(), member, timeProxy, themeProxy); + } + + private MyReservationResponse myReservationToResponse(Reservation reservation) { + return new MyReservationResponse( + reservation.getId(), + reservation.getTheme().getName(), + reservation.getDate(), + reservation.getTime().getValue(), + "예약" + ); + } + + private MyReservationResponse myWaitingToResponse(Waiting waiting) { + return new MyReservationResponse( + waiting.getId(), + waiting.getTheme().getName(), + waiting.getDate(), + waiting.getTime().getValue(), + (waitingRepository.countWaitingBy( + waiting.getTheme(), + waiting.getTime(), + waiting.getDate(), + waiting.getId()) + 1) + "번째 예약대기" + ); } public void deleteById(Long id) { - reservationDao.deleteById(id); + reservationRepository.deleteById(id); } public List findAll() { - return reservationDao.findAll().stream() + return reservationRepository.findAll() + .stream() .map(this::reservationToResponse) .toList(); } + + private Member findMemberByName(String name) { + return memberRepository.findByName(name) + .orElseThrow(() -> new RuntimeException("존재하지 않는 멤버입니다.")); + } + + private Theme findThemeProxyById(Long id) { + return themeRepository.getReferenceById(id); + } + + private Time findTimeProxyById(Long id) { + return timeRepository.getReferenceById(id); + } } diff --git a/src/main/java/roomescape/theme/ThemeDao.java b/src/main/java/roomescape/theme/ThemeDao.java deleted file mode 100644 index 945341d8d..000000000 --- a/src/main/java/roomescape/theme/ThemeDao.java +++ /dev/null @@ -1,41 +0,0 @@ -package roomescape.theme; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public class ThemeDao { - private JdbcTemplate jdbcTemplate; - - public ThemeDao(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - public List findAll() { - return jdbcTemplate.query("SELECT * FROM theme where deleted = false", (rs, rowNum) -> new Theme( - rs.getLong("id"), - rs.getString("name"), - rs.getString("description") - )); - } - - public Theme save(Theme theme) { - KeyHolder keyHolder = new GeneratedKeyHolder(); - jdbcTemplate.update(connection -> { - var ps = connection.prepareStatement("INSERT INTO theme(name, description) VALUES (?, ?)", new String[]{"id"}); - ps.setString(1, theme.getName()); - ps.setString(2, theme.getDescription()); - return ps; - }, keyHolder); - - return new Theme(keyHolder.getKey().longValue(), theme.getName(), theme.getDescription()); - } - - public void deleteById(Long id) { - jdbcTemplate.update("UPDATE theme SET deleted = true WHERE id = ?", id); - } -} diff --git a/src/main/java/roomescape/theme/ThemeController.java b/src/main/java/roomescape/theme/controller/ThemeController.java similarity index 69% rename from src/main/java/roomescape/theme/ThemeController.java rename to src/main/java/roomescape/theme/controller/ThemeController.java index 03bca41a6..8ade498fe 100644 --- a/src/main/java/roomescape/theme/ThemeController.java +++ b/src/main/java/roomescape/theme/controller/ThemeController.java @@ -1,4 +1,4 @@ -package roomescape.theme; +package roomescape.theme.controller; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -7,32 +7,34 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import roomescape.theme.domain.Theme; +import roomescape.theme.domain.ThemeRepository; import java.net.URI; import java.util.List; @RestController public class ThemeController { - private ThemeDao themeDao; + private ThemeRepository themeRepository; - public ThemeController(ThemeDao themeDao) { - this.themeDao = themeDao; + public ThemeController(ThemeRepository themeRepository) { + this.themeRepository = themeRepository; } @PostMapping("/themes") public ResponseEntity createTheme(@RequestBody Theme theme) { - Theme newTheme = themeDao.save(theme); + Theme newTheme = themeRepository.save(theme); return ResponseEntity.created(URI.create("/themes/" + newTheme.getId())).body(newTheme); } @GetMapping("/themes") public ResponseEntity> list() { - return ResponseEntity.ok(themeDao.findAll()); + return ResponseEntity.ok(themeRepository.findAll()); } @DeleteMapping("/themes/{id}") public ResponseEntity deleteTheme(@PathVariable Long id) { - themeDao.deleteById(id); + themeRepository.deleteById(id); return ResponseEntity.noContent().build(); } } diff --git a/src/main/java/roomescape/theme/Theme.java b/src/main/java/roomescape/theme/domain/Theme.java similarity index 69% rename from src/main/java/roomescape/theme/Theme.java rename to src/main/java/roomescape/theme/domain/Theme.java index 430a6239c..77fcac81d 100644 --- a/src/main/java/roomescape/theme/Theme.java +++ b/src/main/java/roomescape/theme/domain/Theme.java @@ -1,6 +1,14 @@ -package roomescape.theme; +package roomescape.theme.domain; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@Entity public class Theme { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String description; diff --git a/src/main/java/roomescape/theme/domain/ThemeRepository.java b/src/main/java/roomescape/theme/domain/ThemeRepository.java new file mode 100644 index 000000000..47997ce16 --- /dev/null +++ b/src/main/java/roomescape/theme/domain/ThemeRepository.java @@ -0,0 +1,6 @@ +package roomescape.theme.domain; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ThemeRepository extends JpaRepository { +} diff --git a/src/main/java/roomescape/time/TimeDao.java b/src/main/java/roomescape/time/TimeDao.java deleted file mode 100644 index f39a9a328..000000000 --- a/src/main/java/roomescape/time/TimeDao.java +++ /dev/null @@ -1,41 +0,0 @@ -package roomescape.time; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import java.sql.PreparedStatement; -import java.util.List; - -@Repository -public class TimeDao { - private final JdbcTemplate jdbcTemplate; - - public TimeDao(JdbcTemplate jdbcTemplate) { - this.jdbcTemplate = jdbcTemplate; - } - - public List