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 Data JPA] 한경준 미션 제출합니다. #53

Open
wants to merge 22 commits into
base: hkjbrian
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
22a3c65
step1 : 쿠키 생성, 응답에 쿠키 포함
Jun 25, 2024
10e758b
step1 : 인증 정보 조회 API 구현
Jun 25, 2024
96dcea9
step1 : 인증 정보 조회 API 구현
Jun 25, 2024
ec00aac
step1 : 예외처리 추가, 객체 이름 변경 , authservice 메서드 중 일부 private으로 변경
Jun 30, 2024
676db68
step1 : 예외처리 추가, 객체 이름 변경 , authservice 메서드 중 일부 private으로 변경
Jun 30, 2024
c2396a4
step2 : LoginMemberArgumentResolver 추가( @Authentication, @AuthWebConf…
Jun 30, 2024
b9837ba
step2 : ReseravtionController에 name이 들어오면 해당 name을 활용하도록 변경
Jun 30, 2024
4a649d6
step3 : 미션 추가
Jun 30, 2024
5ee087f
step3 : AdminInterceptor 추가
Jun 30, 2024
c14f2c2
Merge pull request #1 from hkjbrian/step3
hkjbrian Jul 1, 2024
b43760d
step4 : build.gradle 설정 변경, 학습 테스트 추가, getTime 메서드 추가, TimeRepository 생성
Jul 1, 2024
4d35bbf
step4 : JPA 관련 설정 추가
Jul 1, 2024
713484f
step4 : 엔티티 설정,Repository 생성, Dao 삭제
Jul 1, 2024
db11a85
step4 : Dao 활용 부분 Repository 활용으로 수정
Jul 1, 2024
8b4bbe4
step4 : requestToDao 추가, SQL 예약어 value -> timeValue 변경
Jul 1, 2024
d407a43
step5 : MyReservationsResponse 추가, 예약 조회 기능
Jul 2, 2024
20bab7a
step6 : 미션 추가, Waiting 패키지 추가
Jul 2, 2024
8c5ea3f
step6 : DB 설정 변경, sql 수정, TIME 메서드 삭제
Jul 10, 2024
03ee991
step6 : DB 설정 변경, sql 수정, TIME 메서드 삭제
Jul 10, 2024
8688c21
step6 : 예약 대기 생성, JpaRepository 상속하도록 수정
Jul 12, 2024
95977d6
step6 : 중복 예약 방지, 예약 목록 조회 구현
Jul 12, 2024
e2e05a3
step6 : 예약 대기 상태 확인, 삭제 기능 구현
Jul 12, 2024
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
33 changes: 33 additions & 0 deletions src/main/java/roomescape/auth/AdminInterceptor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package roomescape.auth;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import roomescape.member.Member;
import roomescape.member.MemberRepository;
import roomescape.member.MemberService;

@Component
public class AdminInterceptor implements HandlerInterceptor {
private final MemberRepository memberRepository;
private final MemberService memberService;

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

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Long memberId = memberService.checkLogin(request).getId();
Member member = memberRepository.findById(memberId).get();

if (member == null || !member.getRole().equals("ADMIN")) {
response.setStatus(401);
return false;
}

return true;
}
}
42 changes: 42 additions & 0 deletions src/main/java/roomescape/auth/AuthController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package roomescape.auth;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import roomescape.member.LoginMember;
import roomescape.member.MemberService;

@Controller
public class AuthController {
MemberService memberService;

public AuthController(MemberService memberService) {
this.memberService = memberService;
}

@PostMapping("/login")
public ResponseEntity<Void> tokenLogin(@RequestBody LoginRequest request, HttpServletResponse response) {

String accessToken = memberService.loginByEmailAndPassword(request);

Cookie cookie = new Cookie("token", accessToken);
cookie.setHttpOnly(true);
cookie.setPath("/");
response.addCookie(cookie);

return ResponseEntity.ok().build();
}

@GetMapping("/login/check")
public ResponseEntity<LoginMember> loginCheck(HttpServletRequest request) {

LoginMember loginMember = memberService.checkLogin(request);

return ResponseEntity.ok().body(loginMember);
}
}
35 changes: 35 additions & 0 deletions src/main/java/roomescape/auth/AuthWebConfiguration.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package roomescape.auth;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import roomescape.member.MemberService;

import java.util.List;

@Configuration
public class AuthWebConfiguration implements WebMvcConfigurer {

private final LoginMemberArgumentResolver loginMemberArgumentResolver;
private final AdminInterceptor adminInterceptor;

public AuthWebConfiguration(
LoginMemberArgumentResolver loginMemberArgumentResolver,
AdminInterceptor adminInterceptor
) {
this.loginMemberArgumentResolver = loginMemberArgumentResolver;
this.adminInterceptor = adminInterceptor;
}

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(loginMemberArgumentResolver);
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(adminInterceptor)
.addPathPatterns("/admin");
}
}
11 changes: 11 additions & 0 deletions src/main/java/roomescape/auth/Authentication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package roomescape.auth;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface Authentication {
}
30 changes: 30 additions & 0 deletions src/main/java/roomescape/auth/Extractor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package roomescape.auth;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;

@Component
public class Extractor {

public String extractToken(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();

for (Cookie cookie : cookies) {
if (cookie.getName().equals("token")) {
return cookie.getValue();
}
}
return "";
}

public Long extractId(String token) {
return Long.valueOf(Jwts.parserBuilder()
.setSigningKey(Keys.hmacShaKeyFor("Yn2kjibddFAWtnPJ2AFlL8WXmohJMCvigQggaEypa5E=".getBytes()))
.build()
.parseClaimsJws(token)
.getBody().getSubject());
}
}
38 changes: 38 additions & 0 deletions src/main/java/roomescape/auth/LoginMemberArgumentResolver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package roomescape.auth;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import roomescape.member.LoginMember;
import roomescape.member.MemberService;

import java.lang.annotation.Annotation;

@Component
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {
private MemberService memberService;

public LoginMemberArgumentResolver(MemberService memberService) {
this.memberService = memberService;
}

@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(Annotation.class)
&& parameter.getParameterType().equals(LoginMember.class);
}

@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {

HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
return memberService.checkLogin(request);
}
}
7 changes: 7 additions & 0 deletions src/main/java/roomescape/auth/LoginRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package roomescape.auth;

public record LoginRequest(
String email,
String password
) {
}
21 changes: 21 additions & 0 deletions src/main/java/roomescape/auth/TokenProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package roomescape.auth;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import roomescape.member.Member;

@Component
public class TokenProvider {
private String secretKey = "Yn2kjibddFAWtnPJ2AFlL8WXmohJMCvigQggaEypa5E=";

public String createToken(Member member) {
String accessToken = Jwts.builder()
.setSubject(member.getId().toString())
.claim("name", member.getName())
.claim("role", member.getRole())
.signWith(Keys.hmacShaKeyFor(secretKey.getBytes()))
.compact();
return accessToken;
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package roomescape.member;

public class MemberResponse {
public class LoginMember {
private Long id;
private String name;
private String email;

public MemberResponse(Long id, String name, String email) {
public LoginMember(Long id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}

public static LoginMember from(Member member) {
return new LoginMember(member.getId(), member.getName(), member.getEmail());
}

public Long getId() {
return id;
}
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/roomescape/member/Member.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
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 +29,10 @@ public Member(String name, String email, String password, String role) {
this.role = role;
}

public Member(){

}

public Long getId() {
return id;
}
Expand Down
4 changes: 1 addition & 3 deletions src/main/java/roomescape/member/MemberController.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package roomescape.member;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
Expand All @@ -21,7 +19,7 @@ public MemberController(MemberService memberService) {

@PostMapping("/members")
public ResponseEntity createMember(@RequestBody MemberRequest memberRequest) {
MemberResponse member = memberService.createMember(memberRequest);
LoginMember member = memberService.createMember(memberRequest);
return ResponseEntity.created(URI.create("/members/" + member.getId())).body(member);
}

Expand Down
55 changes: 0 additions & 55 deletions src/main/java/roomescape/member/MemberDao.java

This file was deleted.

13 changes: 13 additions & 0 deletions src/main/java/roomescape/member/MemberRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package roomescape.member;


import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface MemberRepository extends JpaRepository<Member, Long> {
public Optional<Member> findByName(String name);

public Member findByEmailAndPassword(String email, String password);

}
Loading