Skip to content
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
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public LoginMemberArgumentResolver(JwtUtil jwtUtil) {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(LoginMember.class)
&& parameter.getParameterType().equals(Member.class);
&& parameter.getParameterType().equals(MemberInfo.class);
}

@Override
Expand All @@ -47,6 +47,7 @@ public Object resolveArgument(

JwtPayload jwtPayload = jwtUtil.parseToken(token);
return new MemberInfo(
jwtPayload.id(),
jwtPayload.name(),
jwtPayload.role()
);
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/roomescape/auth/controller/LoginController.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package roomescape.auth.controller;

import org.springframework.data.crossstore.ChangeSetPersister.NotFoundException;
import org.springframework.http.ResponseCookie;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CookieValue;
Expand All @@ -26,7 +27,7 @@ public LoginController(LoginService loginService) {
@PostMapping
public ResponseEntity<Void> login(
@RequestBody LoginRequest loginRequest
) {
) throws NotFoundException {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NotFoundException은 언체크 예외인데, 메서드에 명시적으로 적어주신 이유가 있을까요?

String token = loginService.login(loginRequest.email(), loginRequest.password());

ResponseCookie cookie = ResponseCookie.from("token", token)
Expand All @@ -42,7 +43,7 @@ public ResponseEntity<Void> login(
@GetMapping("/check")
public ResponseEntity<LoginResponse> loginCheck(
@CookieValue(value = "token", required = false) String token
) {
) throws NotFoundException {
if (token == null || token.isBlank()) {
return ResponseEntity.status(401).build();
}
Expand Down
21 changes: 13 additions & 8 deletions src/main/java/roomescape/auth/service/LoginService.java
Original file line number Diff line number Diff line change
@@ -1,34 +1,39 @@
package roomescape.auth.service;

import org.springframework.stereotype.Service;
import roomescape.member.Member;
import roomescape.member.MemberDao;
import roomescape.member.MemberInfo;
import roomescape.auth.util.JwtPayload;
import roomescape.auth.util.JwtUtil;
import roomescape.member.Member;
import roomescape.member.MemberInfo;
import roomescape.member.MemberRepository;


@Service
public class LoginService {

private final MemberDao memberDao;
private final MemberRepository memberRepository;
private final JwtUtil jwtUtil;

public LoginService(MemberDao memberDao, JwtUtil jwtUtil) {
this.memberDao = memberDao;
public LoginService(MemberRepository memberRepository, JwtUtil jwtUtil) {
this.memberRepository = memberRepository;
this.jwtUtil = jwtUtil;
}

public String login(String email, String password) {
Member member = memberDao.findByEmailAndPassword(email, password);
Member member = memberRepository.findByEmailAndPassword(email, password)
.orElseThrow(
() -> new IllegalArgumentException("not found Member with email: " + email));
return jwtUtil.createToken(member);
}

public MemberInfo check(String token) {
JwtPayload payload = jwtUtil.parseToken(token);
Member member = memberDao.findByName(payload.name());
Member member = memberRepository.findByName(payload.name())
.orElseThrow(() -> new IllegalArgumentException(
"not found Member with name: " + payload.name()));
Comment on lines -17 to +33

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


return new MemberInfo(
member.getId(),
member.getName(),
member.getRole()
);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/roomescape/auth/util/JwtPayload.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package roomescape.auth.util;

public record JwtPayload(String name, String role) {
public record JwtPayload(Long id, String name, String role) {

}
1 change: 1 addition & 0 deletions src/main/java/roomescape/auth/util/JwtUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public String createToken(Member member) {
public JwtPayload parseToken(String token) {
Claims claims = jwtParser.parseClaimsJws(token).getBody();
return new JwtPayload(
Long.valueOf(claims.getSubject()),
String.valueOf(claims.get("name")),
String.valueOf(claims.get("role"))
);
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/roomescape/member/Member.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
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;
Expand All @@ -21,6 +30,10 @@ public Member(String name, String email, String password, String role) {
this.role = role;
}

public Member() {

}

public Long getId() {
return id;
}
Expand Down
55 changes: 0 additions & 55 deletions src/main/java/roomescape/member/MemberDao.java

This file was deleted.

1 change: 1 addition & 0 deletions src/main/java/roomescape/member/MemberInfo.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package roomescape.member;

public record MemberInfo(
Long id,
String name,
String role
) {
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/roomescape/member/MemberRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package roomescape.member;

import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member, Long> {

Optional<Member> findByEmailAndPassword(String email, String password);

Optional<Member> findByName(String name);
}
16 changes: 12 additions & 4 deletions src/main/java/roomescape/member/MemberService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,22 @@

@Service
public class MemberService {
private MemberDao memberDao;

public MemberService(MemberDao memberDao) {
this.memberDao = memberDao;
private MemberRepository memberRepository;

public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}

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());
}
}
27 changes: 27 additions & 0 deletions src/main/java/roomescape/reservation/MyReservationResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package roomescape.reservation;

public record MyReservationResponse(
Long reservationId,
String theme,
String date,
String time,
String status
) {

public static MyReservationResponse from(Reservation reservation, Integer rank) {
return new MyReservationResponse(
reservation.getId(),
reservation.getTheme().getName(),
reservation.getDate(),
reservation.getTime().getValue(),
getStatus(reservation, rank)
);
}

public static String getStatus(Reservation reservation, Integer rank) {
if (reservation.isWaiting()) {
return rank + "번째 예약대기";
}
return "예약";
}
Comment on lines +21 to +26

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DTO의 메서드에 접근자가 public인 정적 메서드가 있는 이유가 있을까요?

}
62 changes: 54 additions & 8 deletions src/main/java/roomescape/reservation/Reservation.java
Original file line number Diff line number Diff line change
@@ -1,34 +1,72 @@
package roomescape.reservation;

import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
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.Member;
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(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) {
this.id = id;
this.name = name;
this.date = date;
this.time = time;
this.theme = theme;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
Comment on lines +33 to +35

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


@Enumerated(EnumType.STRING)
private ReservationStatus status;

public Reservation(String name, String date, Time time, Theme theme) {
public Reservation(String name, String date, Time time, Theme theme, Member member,
ReservationStatus status) {
this.name = name;
this.date = date;
this.time = time;
this.theme = theme;
this.member = member;
this.status = status;
}

public Reservation() {

}

public boolean isOwnedBy(Long memberId) {
return this.member.getId().equals(memberId);
}

public boolean isReserved() {
return this.status == ReservationStatus.RESERVED;
}

public boolean isWaiting() {
return this.status == ReservationStatus.WAITING;
}

public void promoteToReserved() {
this.status = ReservationStatus.RESERVED;
}
Comment on lines +58 to +68

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

상태를 직접 노출하지 않고, 명확한 이름으로 의미를 잘 전달하는군요!


public Long getId() {
return id;
}
Expand All @@ -48,4 +86,12 @@ public Time getTime() {
public Theme getTheme() {
return theme;
}

public Member getMember() {
return member;
}

public ReservationStatus getStatus() {
return status;
}
}
Loading