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/README.md b/src/main/README.md index 086ab29ab..2416fdf1b 100644 --- a/src/main/README.md +++ b/src/main/README.md @@ -4,26 +4,18 @@ --- -## Spring MVC 미션 3단계 - 관리자 기능 +## Spring JPA 4-5단계 + +entity매니저를 사용해서 repository 수정 +jpa 전환 및 내 예약 구성코드를 생성함. -어드민 페이지 진입은 admin 권한이 있는 사람만 할 수 있도록 제한한다. -만약 진입 권한이 없다면 401 코드를 응답하도록 한다. --- ### 고민한 내용 🤔 -- HandlerInterceptor에서 기본적으로 preHandle/postHandle/afterCompletion으로 나뉘어져있던데, -이번의 경우에는 admin페이지 접속만을 확인하면 되는거라서 preHandle만을 사용했습니다. -이경우에는 postHandle과 afterCompletion을 어떻게 구성하면 좋을지..? 알고 싶네요. - - -- WebConfig 같은 경우에는, admin 페이지를 접속할때의 role만을 확인해주면 되므로 /admin/***을 사용해주었습니다. - -- token 만료시간도 있어야할 것 같아서 expire_time을 이용해서,만료시간을 구현해보았습니다. 만료시간을 구현할 더 좋은 -방법이 있을지?? 궁금합니다. - -- token을 accessToken과 refreshToken으로 나눠서 구현해주었는데, 구현하다보니 너무 어려워서 제대로 구현된건지 잘 -모르겠습니다. - +- jpa를 구성하는 과정에서 @entity를 사용하는 과정에서 많은 부분을 + entity 객체가 대신해주니까 그 부분이 이해가 살짝 안되고 어려웠습니다. +- 그리고 entity 매니저를 사용하게 된다면, jpa와 달리 어떠한 부분이 더 좋다고 + 느낀지 그 부분이 궁금해요! diff --git a/src/main/java/roomescape/CookieManager.java b/src/main/java/roomescape/CookieManager.java index 22b74fea8..37966006a 100644 --- a/src/main/java/roomescape/CookieManager.java +++ b/src/main/java/roomescape/CookieManager.java @@ -1,13 +1,13 @@ package roomescape; import jakarta.servlet.http.Cookie; +import org.springframework.stereotype.Component; import roomescape.exception.TokenNotFoundException; import java.util.Arrays; +@Component public class CookieManager { - - public String extractToken(Cookie[] cookies, String cookieName) { return Arrays.stream(cookies) .filter(cookie -> cookieName.equals(cookie.getName())) diff --git a/src/main/java/roomescape/login/LoginInterceptor.java b/src/main/java/roomescape/login/LoginInterceptor.java index 0c431b54c..479d447fd 100644 --- a/src/main/java/roomescape/login/LoginInterceptor.java +++ b/src/main/java/roomescape/login/LoginInterceptor.java @@ -8,32 +8,41 @@ import roomescape.CookieManager; import roomescape.JwtProvider; import roomescape.member.Member; -import roomescape.member.MemberDao; +import roomescape.member.MemberRepository; @Component public class LoginInterceptor implements HandlerInterceptor { private final JwtProvider jwtProvider; - private final MemberDao memberDao; + private final MemberRepository memberRepository; private final CookieManager cookieManager; - public LoginInterceptor(JwtProvider jwtProvider, MemberDao memberDao, CookieManager cookieManager) { + public LoginInterceptor(JwtProvider jwtProvider, MemberRepository memberRepository, CookieManager cookieManager) { this.jwtProvider = jwtProvider; - this.memberDao = memberDao; + this.memberRepository = memberRepository; this.cookieManager = cookieManager; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - Cookie[] cookies = request.getCookies(); + Cookie[] cookies = getCookies(request); - String token = cookieManager.extractToken(cookies, "accessToken"); + String token = cookieManager.extractToken(cookies,"accessToken"); Long memberId = jwtProvider.getMemberId(token); - Member member = memberDao.findById(memberId); - if (member == null || !member.getRole().equals("ADMIN")) { + Member member = memberRepository.findById(memberId) + .orElseThrow(); + if (!member.getRole().equals("ADMIN")) { response.setStatus(401); return false; } return true; } + + private Cookie[] getCookies(HttpServletRequest httpServletRequest) { + Cookie[] cookies = httpServletRequest.getCookies(); + if (cookies == null) { + throw new IllegalStateException("cookie is not exist"); + } + return cookies; + } } diff --git a/src/main/java/roomescape/login/LoginMemberArgumentResolver.java b/src/main/java/roomescape/login/LoginMemberArgumentResolver.java index 5d4909850..ef6ac6bf2 100644 --- a/src/main/java/roomescape/login/LoginMemberArgumentResolver.java +++ b/src/main/java/roomescape/login/LoginMemberArgumentResolver.java @@ -11,15 +11,15 @@ import roomescape.CookieManager; import roomescape.JwtProvider; import roomescape.member.Member; -import roomescape.member.MemberDao; +import roomescape.member.MemberRepository; @Component public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver { - private final MemberDao memberDao; + private final MemberRepository memberRepository; private final JwtProvider jwtProvider; private final CookieManager cookieManager; - public LoginMemberArgumentResolver(JwtProvider jwtProvider, MemberDao memberDao,CookieManager cookieManager) { - this.memberDao = memberDao; + public LoginMemberArgumentResolver(JwtProvider jwtProvider, MemberRepository memberRepository,CookieManager cookieManager) { + this.memberRepository = memberRepository; this.jwtProvider = jwtProvider; this.cookieManager=cookieManager; } @@ -38,7 +38,8 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m Long memberId = jwtProvider.getMemberId(token); - Member member = memberDao.findById(memberId); + Member member = memberRepository.findById(memberId) + .orElseThrow(); return new LoginMember(member.getId(), member.getName(), member.getEmail(), member.getRole()); } @@ -58,5 +59,4 @@ private Cookie[] getCookies(HttpServletRequest httpServletRequest) { } return cookies; } - } diff --git a/src/main/java/roomescape/login/LoginService.java b/src/main/java/roomescape/login/LoginService.java index 6085212f4..f609ff078 100644 --- a/src/main/java/roomescape/login/LoginService.java +++ b/src/main/java/roomescape/login/LoginService.java @@ -2,36 +2,34 @@ import org.springframework.stereotype.Service; import roomescape.member.Member; -import roomescape.member.MemberDao; +import roomescape.member.MemberRepository; import roomescape.member.MemberResponse; @Service public class LoginService { - private final MemberDao memberDao; + private final MemberRepository memberRepository; - public LoginService(MemberDao memberDao) { - this.memberDao = memberDao; + public LoginService(MemberRepository memberDao) { + this.memberRepository = memberDao; } public Member login(String email, String password) { - Member member = memberDao.findByEmailAndPassword(email, password); - if (member == null) { - throw new RuntimeException("Invalid email or password"); - } + Member member = memberRepository.findByEmailAndPassword(email, password) + .orElseThrow(); + return member; } public MemberResponse checkLogin(Long memberId) { - Member member = memberDao.findById(memberId); - if (member == null) { - throw new RuntimeException("Invalid email or password"); - } + Member member = memberRepository.findById(memberId) + .orElseThrow(); return new MemberResponse(member.getId(), member.getName(), member.getEmail()); } public Member findById(Long id) { - Member member = memberDao.findById(id); + Member member = memberRepository.findById(id) + .orElseThrow(); return member; } diff --git a/src/main/java/roomescape/member/Member.java b/src/main/java/roomescape/member/Member.java index 903aaa9b0..9cfa0933d 100644 --- a/src/main/java/roomescape/member/Member.java +++ b/src/main/java/roomescape/member/Member.java @@ -1,19 +1,23 @@ package roomescape.member; +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; private String password; private String role; - public Member(Long id, String name, String email, String role) { - this.id = id; - this.name = name; - this.email = email; - this.role = role; - } + protected Member(){ + } public Member(String name, String email, String password, String role) { this.name = name; this.email = email; diff --git a/src/main/java/roomescape/member/MemberDao.java b/src/main/java/roomescape/member/MemberDao.java deleted file mode 100644 index db0b9c68c..000000000 --- a/src/main/java/roomescape/member/MemberDao.java +++ /dev/null @@ -1,68 +0,0 @@ -package roomescape.member; - -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -@Repository -public class MemberDao { - private 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 Member findByName(String name) { - return 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 - ); - } - - public Member findById(Long id) { - return jdbcTemplate.queryForObject( - "SELECT id, name, email, role From member WHERE id = ?", - (rs, rowNum) -> new Member( - rs.getLong("id"), - rs.getString("name"), - rs.getString("email"), - rs.getString("role") - ), - id - ); - } -} diff --git a/src/main/java/roomescape/member/MemberRepository.java b/src/main/java/roomescape/member/MemberRepository.java new file mode 100644 index 000000000..841775064 --- /dev/null +++ b/src/main/java/roomescape/member/MemberRepository.java @@ -0,0 +1,44 @@ +package roomescape.member; + +import jakarta.persistence.EntityManager; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public class MemberRepository { + private final EntityManager entityManager; + + public MemberRepository(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public Optional findById(Long id) { + return Optional.ofNullable(entityManager.find(Member.class, id)); + } + + public void save(Member member) { + entityManager.persist(member); + } + + public List findAll() { + return entityManager.createQuery( + "SELECT m FROM Member m", + Member.class + ).getResultList(); + } + + public Optional findByEmailAndPassword(String email, String password) { + List members = entityManager.createQuery( + "SELECT m FROM Member m WHERE m.email= :email AND m.password =:password", + Member.class + ).setParameter("email", email) + .setParameter("password", password) + .getResultList(); + + return members.stream().findFirst(); + } + + +} diff --git a/src/main/java/roomescape/member/MemberService.java b/src/main/java/roomescape/member/MemberService.java index ccaa8cba5..dc697eac9 100644 --- a/src/main/java/roomescape/member/MemberService.java +++ b/src/main/java/roomescape/member/MemberService.java @@ -4,14 +4,21 @@ @Service public class MemberService { - private MemberDao memberDao; + private final MemberRepository memberRepository; - public MemberService(MemberDao memberDao) { - this.memberDao = memberDao; + public MemberService(MemberRepository memberDao) { + this.memberRepository = memberDao; } public MemberResponse createMember(MemberRequest memberRequest) { - Member member = memberDao.save(new Member(memberRequest.getName(), memberRequest.getEmail(), memberRequest.getPassword(), "USER")); + Member member = + new Member( + memberRequest.getName(), + memberRequest.getEmail(), + memberRequest.getPassword(), + "USER"); + + memberRepository.save(member); return new MemberResponse(member.getId(), member.getName(), member.getEmail()); } } diff --git a/src/main/java/roomescape/reservation/Reservation.java b/src/main/java/roomescape/reservation/Reservation.java index 83a7edf1b..c0face405 100644 --- a/src/main/java/roomescape/reservation/Reservation.java +++ b/src/main/java/roomescape/reservation/Reservation.java @@ -1,13 +1,26 @@ package roomescape.reservation; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import roomescape.theme.Theme; import roomescape.time.Time; +@Entity public class Reservation { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String date; + @ManyToOne + @JoinColumn(name ="time_id") private Time time; + @ManyToOne + @JoinColumn(name ="theme_id") private Theme theme; public Reservation(Long id, String name, String date, Time time, Theme theme) { diff --git a/src/main/java/roomescape/reservation/ReservationDao.java b/src/main/java/roomescape/reservation/ReservationDao.java deleted file mode 100644 index b029b348c..000000000 --- a/src/main/java/roomescape/reservation/ReservationDao.java +++ /dev/null @@ -1,127 +0,0 @@ -package roomescape.reservation; - -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.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, String name) { - 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.getDate()); - ps.setString(2, name); - ps.setLong(3, reservationRequest.getTheme()); - ps.setLong(4, reservationRequest.getTime()); - return ps; - }, keyHolder); - - Time time = jdbcTemplate.queryForObject("SELECT * FROM time WHERE id = ?", - (rs, rowNum) -> new Time(rs.getLong("id"), rs.getString("time_value")), - reservationRequest.getTime()); - - Theme theme = jdbcTemplate.queryForObject("SELECT * FROM theme WHERE id = ?", - (rs, rowNum) -> new Theme(rs.getLong("id"), rs.getString("name"), rs.getString("description")), - reservationRequest.getTheme()); - - return new Reservation( - keyHolder.getKey().longValue(), - name, - reservationRequest.getDate(), - 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/ReservationRepository.java b/src/main/java/roomescape/reservation/ReservationRepository.java new file mode 100644 index 000000000..734132a55 --- /dev/null +++ b/src/main/java/roomescape/reservation/ReservationRepository.java @@ -0,0 +1,55 @@ +package roomescape.reservation; + +import jakarta.persistence.EntityManager; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public class ReservationRepository { + private final EntityManager entityManager; + + public ReservationRepository(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public Reservation save(Reservation reservation) { + entityManager.persist(reservation); + return reservation; + } + + public Optional findById(Long id) { + return Optional.ofNullable(entityManager.find(Reservation.class, id)); + } + + public List findAll() { + return entityManager.createQuery( + "SELECT r FROM Reservation r", + Reservation.class + ).getResultList(); + } + + public void deleteById(Long id) { + Reservation reservation = entityManager.find(Reservation.class, id); + + if (reservation != null) { + entityManager.remove(reservation); + } + } + + public List findByDateAndThemeId(String date, Long themeId){ + return entityManager.createQuery( + """ + SELECT r + FROM Reservation r + WHERE r.date =:date + AND r.theme.id=:themeId + """, + Reservation.class + ).setParameter("date",date) + .setParameter("themeId",themeId) + .getResultList(); + } +} + diff --git a/src/main/java/roomescape/reservation/ReservationService.java b/src/main/java/roomescape/reservation/ReservationService.java index c392496dc..4f940ae36 100644 --- a/src/main/java/roomescape/reservation/ReservationService.java +++ b/src/main/java/roomescape/reservation/ReservationService.java @@ -2,15 +2,23 @@ import org.springframework.stereotype.Service; import roomescape.login.LoginMember; +import roomescape.theme.Theme; +import roomescape.theme.ThemeRepository; +import roomescape.time.Time; +import roomescape.time.TimeRepository; import java.util.List; @Service public class ReservationService { - private ReservationDao reservationDao; + private final ReservationRepository reservationRepository; + private final ThemeRepository themeRepository; + private final TimeRepository timeRepository; - public ReservationService(ReservationDao reservationDao) { - this.reservationDao = reservationDao; + public ReservationService(ReservationRepository reservationRepository,ThemeRepository themeRepository,TimeRepository timeRepository) { + this.reservationRepository = reservationRepository; + this.themeRepository=themeRepository; + this.timeRepository=timeRepository; } public ReservationResponse save(ReservationRequest reservationRequest, LoginMember loginMember) { @@ -18,17 +26,27 @@ public ReservationResponse save(ReservationRequest reservationRequest, LoginMemb if (name == null) { name = loginMember.name(); } - Reservation reservation = reservationDao.save(reservationRequest, name); - return new ReservationResponse(reservation.getId(), reservation.getName(), reservation.getTheme().getName(), reservation.getDate(), reservation.getTime().getValue()); + Theme theme = themeRepository.findById(reservationRequest.getTheme()) + .orElseThrow(); + Time time=timeRepository.findById(reservationRequest.getTime()) + .orElseThrow(); + Reservation reservation =new Reservation( + name, + reservationRequest.getDate(), + time, + theme + ); + reservationRepository.save(reservation); + return new ReservationResponse(reservation.getId(), reservation.getName(), reservation.getTheme().getName(), reservation.getDate(), reservation.getTime().getTimeValue()); } public void deleteById(Long id) { - reservationDao.deleteById(id); + reservationRepository.deleteById(id); } public List findAll() { - return reservationDao.findAll().stream() - .map(it -> new ReservationResponse(it.getId(), it.getName(), it.getTheme().getName(), it.getDate(), it.getTime().getValue())) + return reservationRepository.findAll().stream() + .map(it -> new ReservationResponse(it.getId(), it.getName(), it.getTheme().getName(), it.getDate(), it.getTime().getTimeValue())) .toList(); } } diff --git a/src/main/java/roomescape/theme/Theme.java b/src/main/java/roomescape/theme/Theme.java index 430a6239c..c656dbeee 100644 --- a/src/main/java/roomescape/theme/Theme.java +++ b/src/main/java/roomescape/theme/Theme.java @@ -1,10 +1,19 @@ package roomescape.theme; +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; + public Theme() { } diff --git a/src/main/java/roomescape/theme/ThemeController.java b/src/main/java/roomescape/theme/ThemeController.java index 03bca41a6..d41305215 100644 --- a/src/main/java/roomescape/theme/ThemeController.java +++ b/src/main/java/roomescape/theme/ThemeController.java @@ -13,26 +13,27 @@ @RestController public class ThemeController { - private ThemeDao themeDao; + private final 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/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/ThemeRepository.java b/src/main/java/roomescape/theme/ThemeRepository.java new file mode 100644 index 000000000..0bd727605 --- /dev/null +++ b/src/main/java/roomescape/theme/ThemeRepository.java @@ -0,0 +1,39 @@ +package roomescape.theme; + +import jakarta.persistence.EntityManager; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public class ThemeRepository { + private final EntityManager entityManager; + + public ThemeRepository(EntityManager entityManager) { + this.entityManager = entityManager; + } + + public Theme save(Theme theme){ + entityManager.persist(theme); + return theme; + } + public List findAll(){ + return entityManager.createQuery( + "SELECT t FROM Theme t", + Theme.class + ).getResultList(); + } + public Optional findById(Long id){ + return Optional.ofNullable( + entityManager.find(Theme.class,id) + ); + } + public void deleteById(Long id){ + Theme theme = entityManager.find(Theme.class,id); + + if(theme!=null){ + entityManager.remove(theme); + } + } +} diff --git a/src/main/java/roomescape/time/Time.java b/src/main/java/roomescape/time/Time.java index 008ed93cf..6e7f14246 100644 --- a/src/main/java/roomescape/time/Time.java +++ b/src/main/java/roomescape/time/Time.java @@ -1,16 +1,24 @@ package roomescape.time; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@Entity public class Time { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String value; + private String timeValue; public Time(Long id, String value) { this.id = id; - this.value = value; + this.timeValue = value; } public Time(String value) { - this.value = value; + this.timeValue = value; } public Time() { @@ -21,7 +29,7 @@ public Long getId() { return id; } - public String getValue() { - return value; + public String getTimeValue() { + return timeValue; } } diff --git a/src/main/java/roomescape/time/TimeController.java b/src/main/java/roomescape/time/TimeController.java index 2343114d1..3850c6773 100644 --- a/src/main/java/roomescape/time/TimeController.java +++ b/src/main/java/roomescape/time/TimeController.java @@ -14,7 +14,7 @@ @RestController public class TimeController { - private TimeService timeService; + private final TimeService timeService; public TimeController(TimeService timeService) { this.timeService = timeService; @@ -27,7 +27,7 @@ public List