-
Notifications
You must be signed in to change notification settings - Fork 118
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
부산대 BE_문성민 2주차 과제 (3단계) #402
base: dalsungmin
Are you sure you want to change the base?
부산대 BE_문성민 2주차 과제 (3단계) #402
Conversation
validation 의존성을 추가하고 입력을 검증할 추가(addProduct)기능과 수정(updateProduct)기능에 @Valid 어노테이션 추가
저번주 피드백에서 컨트롤러에서 레포지토리를 바로 호출하는거보다 서비스를 통해 레포지토리를 호출하는 것이 좋다고 하셔서 구현했습니다.
상품 이름은 공백을 포함하여 15자가 넘어가거나 비어있으면 에러가 발생하도록 처리
특수 문자 * 가능: ( ), [ ], +, -, &, /, _ * 그 외 특수 문자 사용 불가 이 조건 만족하지 않으면 에러 발생
"카카오"가 포함된 문구를 입력시 " '카카오'가 포함된 문구는 담당 MD와 협의한 경우에만 사용할 수 있습니다." 라는 에러 메시지 나타나게 구현
Member 객체 생성 및 DB에 저장할 테이블, 기본으로 들어갈 데이터 생성
h2 데이터베이스에 연결될 테이블 경로 수정
서비스 단 추가로 만들 때 놓친 것을 나중에 알아서 수정했습니다.
회원가입할때 입력한 이메일이 중복되는지 검증
로그인 할 때 입력한 이메일과 비밀번호가 일치하는지 검증
회원가입 때 받은 정보를 암호화 하여 DB에 저장하도록 기능을 구현
|
||
@PostMapping("/{id}") | ||
public String updateProduct(@Valid @PathVariable Long id, @ModelAttribute Product product, RedirectAttributes redirectAttributes) { | ||
try { |
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.
여기서 try catch로 작업을 다 해주셨는데 이렇게되면
@ControllerAdvice - GlobalExceptionHandler 클래스를 생성한 이유가 없어요. ^^
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({Exception.class, RuntimeException.class})
public String handleException(Exception e, RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("errorMessage", "Error: " + e.getMessage());
return "redirect:/products";
}
@ExceptionHandler(ProductNotFoundException.class)
public String handleProductNotFoundException(ProductNotFoundException e, RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("errorMessage", "Product not found: " + e.getMessage());
return "redirect:/products";
}
@ExceptionHandler(InvalidProductException.class)
public String handleInvalidProductException(InvalidProductException e, RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("errorMessage", "Invalid product: " + e.getMessage());
return "redirect:/products";
}
}
이렇게 구성하고 컨트롤러 단에서 try catch 걷어 냅시다!
@PostMapping("/{id}")
public String updateProduct(@PathVariable Long id, @ModelAttribute @Valid Product product, RedirectAttributes redirectAttributes) {
productService.updateProduct(id, product);
return "redirect:/products";
}
모든지 새로운 기술을 습득하거나 적용할때 왜 왜 왜 ! 항상 머리속에 왜라는 생각을 꼭 하셔서 @ControllerAdvice 를 왜 사용할까?
사용하면 좋은 이유는 무엇인가? 동작 원리는 무엇인가? 항상 자기 자신에게 역질문하면서 개발해보셔요 !!
|
||
@PostMapping("/delete/{id}") | ||
public String deleteProduct(@PathVariable Long id, RedirectAttributes redirectAttributes) { | ||
try { |
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.
위와 같이 수정해주세요.
} | ||
|
||
public void validateProduct(Product product) { | ||
if (product.getName().length() > 15 || product.getName().trim().isEmpty()) { |
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.
여기서도 중요한 꿀팁 하나 알려드릴게요.
if(product.getName().contains("카카오")) {
... 생략
이거 보다는
"카카오".contains(product.getName()) 구현하는게 유리 합니다. 이유는 null 관리측면에서 유리해요.
product.getName() 값이 null 이 들어오게되면 위에 상황은 nullpointexception이 발생할 가능성이 있지만.
"카카오".contains(product.getName()) 구현하게 된다면 product.getName() 에 Null 값이 들어와도 괜찮지요.
return ResponseEntity.status(HttpStatus.CONFLICT).body("Email already exists"); | ||
} | ||
Member registeredMember = memberService.registerMember(member); | ||
String token = jwtUtil.generateToken(registeredMember.getId(), registeredMember.getName(), |
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.
jwt의 원리와. 단점 파악하기.
- jwt 는 대칭키 일까요 비대칭키 일까요?
- jwt의 토큰값은 복호화가 가능할까요?
- jwt의 단점은?
- jwt의 단점을 위해서 보안해야할 방법은?
위 처럼 jwt를 사용하는 정확한 이유과 장단점을 확인하면서 학습하기를 권장 드립니다 :)
|
||
@Component | ||
public class JwtUtil { | ||
private final String secretKey = "Yn2kjibddFAWtnPJ2AFlL8WXmohJMCvigQggaEypa5E="; |
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.
해당 시크릿키는 외부에 노출되면 또 위험하기 때문에 관리를 잘 해주셔야 합니다.
보통 현업에서는 이 시크릿키를 한번더 암호화해서 사용하여 관련 라이브러리 소개드립니다.
- Jasypt
- 참고 주소 : https://bepoz-study-diary.tistory.com/200
예를 들어 아래와 같이 적용할수 있습니다.
jwt.secret.key=ENC(SHZ3Wn9WLIBcQXX3hG5/7WHoIvkR+UF0fYYerwztivYoE8ec6vM4wAKLxhjRjSMS)
관련 자료도 한번 찾아봐서 공부하시면 좋을거 같아요.
아직 구현이 덜 되었지만 일단 PR 올립니다... 최대한 빨리 다시 수정하겠습니다!