-
Notifications
You must be signed in to change notification settings - Fork 56
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 Data JPA] 정다영 미션 제출합니다. #55
base: day024
Are you sure you want to change the base?
Changes from 1 commit
fb61cfa
bfadb01
a6f3522
1fc71de
49974e9
5cee98e
fbc38d7
f29bf87
4597f0c
3512136
3ec18a7
7d80f5a
a5df2bf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1,7 @@ | ||
# Spring MVC (인증) | ||
# Spring Data JPA | ||
|
||
<h3>1단계 로그인 요구사항</h3> | ||
<h3>4단계 JPA 전환</h3> | ||
|
||
- [x] 로그인 페이지 호출 (login.html 페이지 응답) | ||
- [x] 로그인 요청(POST /login) 응답 API | ||
- email과 password를 이용해서 멤버 조회/ 조회한 멤버로 토큰 생성/Cookie를 통한 응답 | ||
- [x] 인증 정보 조회(GET /login/check) API | ||
- Cookie에서 토큰 정보 추출하여 멤버를 찾아 멤버 정보를 응답 | ||
|
||
<h3>2단계 로그인 리팩터링 요구사항</h3> | ||
|
||
- [x] 멤버 객체를 만드는 로직을 분리(Cookie 인증 정보 활용) | ||
- [x] 예약 생성 시 name이 없는 경우 | ||
- 예약 생성 시 ReservationReqeust의 name이 없는 경우 Cookie에 담긴 정보를 활용 | ||
- [x] Find Member 수정 | ||
- ReservationReqeust에 name값이 있으면 name으로 Member를 찾고 없으면 로그인 정보를 활용해서 Member를 찾는다. | ||
- [x] HandlerMethodArgumentResolver 사용 | ||
- [x] 예약 생성 | ||
관리자는 name 인자로 전달한 정보로 예약을 생성하게 합니다. (기존 기능) | ||
로그인 사용자는 자신의 로그인 정보로 예약을 생성하게 합니다. (신규 기능) | ||
|
||
<h3>3단계 관리자 기능</h3> | ||
|
||
- [ ] 어드민 페이지 | ||
- admin권한이 있는 사람만 할 수 있도록 제한 | ||
- [ ] HandlerInterceptor | ||
- HandlerInterceptor를 활용하여 권한이 없는 경우 401코드 응답 | ||
- [ ] gradle 의존성 추가 | ||
- [ ] 엔티티 매핑 | ||
- [ ] 연관관계 매핑 |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package roomescape.member; | ||
|
||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.stereotype.Repository; | ||
import roomescape.reservation.Reservation; | ||
|
||
import java.util.List; | ||
|
||
@Repository | ||
public interface MemberRepository extends JpaRepository<Member, Long> { | ||
Member findByEmailAndPassword(String email, String password); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,38 +10,45 @@ | |
import org.springframework.stereotype.Service; | ||
import roomescape.instructure.JwtTokenProvider; | ||
|
||
import java.util.Optional; | ||
|
||
@Service | ||
public class MemberService { | ||
@Autowired | ||
private MemberDao memberDao; | ||
private MemberRepository memberRepository; | ||
@Autowired | ||
private JwtTokenProvider jwtTokenProvider; | ||
|
||
public MemberService(MemberRepository memberRepository, JwtTokenProvider jwtTokenProvider) { | ||
this.memberRepository = memberRepository; | ||
this.jwtTokenProvider = jwtTokenProvider; | ||
} | ||
|
||
@Value("${roomescape.auth.jwt.secret}") | ||
String secretKey; | ||
|
||
public MemberResponse createMember(MemberRequest memberRequest) { | ||
Member member = memberDao.save(new Member(memberRequest.getName(), memberRequest.getEmail(), memberRequest.getPassword(), "USER")); | ||
Member member = memberRepository.save(new Member(memberRequest.getName(), memberRequest.getEmail(), memberRequest.getPassword(), "USER")); | ||
return new MemberResponse(member.getId(), member.getName(), member.getEmail()); | ||
} | ||
|
||
|
||
public MemberResponse findMember(String email, String password){ | ||
Member member = memberDao.findByEmailAndPassword(email,password); | ||
return new MemberResponse(member.getId(),member.getName(),member.getEmail()); | ||
public MemberResponse findMember(String email, String password) { | ||
Member member = memberRepository.findByEmailAndPassword(email, password); | ||
return new MemberResponse(member.getId(), member.getName(), member.getEmail()); | ||
} | ||
|
||
public MemberResponse findMemberById(Long memberId){ | ||
Member member = memberDao.findById(memberId); | ||
return new MemberResponse(member.getId(),member.getName(),member.getEmail()); | ||
public MemberResponse findMemberById(Long memberId) { | ||
Optional<Member> optionalMember = memberRepository.findById(memberId); | ||
Member member = optionalMember.orElseThrow(() -> new IllegalArgumentException("Invalid member ID")); | ||
return new MemberResponse(member.getId(), member.getName(), member.getEmail()); | ||
} | ||
|
||
public String createToken(MemberResponse memberResponse){ | ||
public String createToken(MemberResponse memberResponse) { | ||
String accessToken = jwtTokenProvider.createToken(memberResponse); | ||
return accessToken; | ||
} | ||
|
||
public void createCookie(HttpServletResponse response, String token){ | ||
public void createCookie(HttpServletResponse response, String token) { | ||
Cookie cookie = new Cookie("token", token); | ||
cookie.setHttpOnly(true); | ||
cookie.setPath("/"); | ||
|
@@ -51,12 +58,13 @@ public void createCookie(HttpServletResponse response, String token){ | |
public Member extractMemberFromToken(String token) { | ||
Long memberId = extractMemberIdFromToken(token); | ||
if (memberId != null) { | ||
return memberDao.findById(memberId); | ||
Optional<Member> optionalMember = memberRepository.findById(memberId); | ||
return optionalMember.orElse(null); | ||
} | ||
return null; | ||
} | ||
|
||
public Long extractMemberIdFromToken(String token){ | ||
public Long extractMemberIdFromToken(String token) { | ||
Claims claims = Jwts.parserBuilder() | ||
.setSigningKey(Keys.hmacShaKeyFor(secretKey.getBytes())) | ||
.build() | ||
|
@@ -71,8 +79,6 @@ public String extractTokenFromCookie(Cookie[] cookies) { | |
return cookie.getValue(); | ||
} | ||
} | ||
|
||
return ""; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 토큰을 찾지 못 했을 때 빈 문자열을 반환하는 것보다 null을 반환하는 것이 좋지 않을까요?? |
||
} | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,32 +1,40 @@ | ||
package roomescape.reservation; | ||
|
||
import jakarta.persistence.*; | ||
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 | ||
@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) { | ||
this.id = id; | ||
this.name = name; | ||
this.date = date; | ||
this.time = time; | ||
this.theme = theme; | ||
@ManyToOne // ManyToOne 관계 설정 | ||
@JoinColumn(name = "member_id") | ||
private Member member; | ||
|
||
public Reservation() { | ||
} | ||
|
||
public Reservation(String name, String date, Time time, Theme theme) { | ||
public Reservation(String name, String date, Time time, Theme theme, Member member) { | ||
this.name = name; | ||
this.date = date; | ||
this.time = time; | ||
this.theme = theme; | ||
} | ||
|
||
public Reservation() { | ||
|
||
this.member = member; | ||
} | ||
|
||
public Long getId() { | ||
|
@@ -48,4 +56,12 @@ public Time getTime() { | |
public Theme getTheme() { | ||
return theme; | ||
} | ||
} | ||
|
||
public Member getMember() { | ||
return member; // Member 객체의 getter 메서드 추가 | ||
} | ||
|
||
public void setMember(Member member) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 엔티티에서는 setter 사용을 지양하는 것이 좋다고 합니다! |
||
this.member = member; // Member 객체의 setter 메서드 추가 | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
필드 주입과 생성자 주입이 혼용돼서 사용되고 있는데 생성자 주입으로 통일 시키는 것이 좋을 것 같습니다!