좌충우돌 개발공부

TIL(20240527) [Spring:JWT,예외처리,Validation]


📌 Spring

💡 Optional

isPresent()

  • boolean 타입
  • Optional 객체가 값을 가지고 있다면 true , 없다면 false 리턴

💡 JWT 예외처리

  • 대표적인 토큰 예외
UnsupportedJwtException : jwt가 예상하는 형식과 다른 형식이거나 구성 -> httpstatus : 401
MalformedJwtException : 잘못된 jwt 구조 -> httpstatus : 402
ExpiredJwtException : JWT의 유효기간이 초과 -> httpstatus : 403
SignatureException : JWT의 서명실패(변조 데이터) -> httpstatus : 404

💡 Validation

    @NotBlank 
    private String name;
    @Email
    private String email;
    @Positive(message = "양수만 가능합니다.")
    private int price;
    @Negative(message = "음수만 가능합니다.")
    private int discount;
    @Size(min=2, max=10)
    private String link;
    @Max(10)
    private int max;
    @Min(2)
    private int min;
  • 정규표현식
// 휴대폰 번호
^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$

^01 - 시작을 숫자 01로 시작
[0|1|6|7|8|9]? - 0,1,6,7,8,9 중의 숫자가 있을 수도 없을 수도 있다
-? - 하이픈 하나가 있을 수도 없을 수도 있다
[0-9]{3,4} - 숫자 3~4개가 존재
[0-9]{4} - 숫자 4개가 존재
$ - 종료

// 비밀번호 
^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$

?=.*[A-Za-z] - 최소 하나의 문자
?=.*\d - 최소 하나의 숫자
?=.*[$@$!%*#?&] - 최소 하나의 특수문자
{8,} - 최소 8 자

// 닉네임
^([A-Za-z0-9가-힣]{2,})+

[A-Za-z0-9가-힣]{2,} - 영어 대소문자, 숫자, 한글 2자 이상

// 이메일
^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$

^[0-9a-zA-Z] - 0~9 사이 숫자 또는 a-z A-Z 사이 알파벳으로 시작 
[-_\.]? - 중간에 -, _, . 같은 문자가 있을 수도 있고 없을 수도 있다.
*@ - @ 가 반드시 존재한다.
*\. - 반드시 . 이 존재한다.
[a-zA-Z]{2,3} - a-z A-Z 사이 알파벳이 2~3개가 존재
$ - 종료

정규표현식 (Regex) 정리


📌 코딩테스트1️⃣ : 제일 작은 수 제거하기

🔒 문제 : 정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

🚫 조건 :

  • arr은 길이 1 이상인 배열입니다.
  • 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

💡 필요했던 메서드

없음

🔓 문제풀이


class Solution {
    public int[] solution(int[] arr) {
        // 배열의 길이가 1이라면 
           if (arr.length == 1) {
            int[] answer = {-1}; // -1 반환
            return answer;
        }
        
        // 최소값 지정
        int min = arr[0];
        // 최소값을 제거하고 반환하기 위해 배열의 길이 -1
        int[] answer = new int[arr.length-1];
        
        // 최소값 찾기
        for(int i=0; i<arr.length; i++) {
           min = Math.min(min, arr[i]);
        }
        
        int index=0;
        for (int i=0; i<arr.length; i++) {
            if(min == arr[i]) { 
                continue;
            } else {
                // 최소값 빼고 원소값 answer배열 넣기
                answer[index++] = arr[i]; 
            }
            
        }
        return answer;
    }
}

🤷‍♀️ 코딩테스트1️⃣ 문제풀이를 하면서 느낀점

: 이 문제는 풀지 못했다. 내가 생각하지 못한 과정들을 다른사람의 풀이를 조금 참고해서 풀었다. 코드를 하나하나씩 읽어보니 어떻게 풀었는지 이해가 되었다. 하지만 이게 과연 내것이 되었는지가 의문이다. 처음에는 컬렉션을 사용하지 않아서 풀다가 너무 복잡해지는 것 같아 ArrayList를 이용해서 풀어볼려고 시도는 했지만 아직 익숙치 않아서 그런지 배열에서 최소값을 찾았지만 최소값을 제외하고 새로운 배열에 넣는 과정이 어려웠다. 하지만 컬렉션을 사용하지 않았더라도 이 과정은 나에게 어려웠을 것 같다. 복잡해지는 과정에서 차근차근 풀어내는 연습을 해야겠다..

🎈 코딩테스트1️⃣ 다른사람의 풀이!


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Solution {
  public int[] solution(int[] arr) {
    int[] answer = {};

    if (arr.length == 1) {
      answer = new int[]{-1};
    } else {
      List<Integer> list = new ArrayList<>();
      for (int a : arr)
        list.add(a);
      list.remove(Collections.min(list));
      answer = new int[arr.length - 1];
      for (int i = 0; i < list.size(); i++)
        answer[i] = list.get(i);
    }
    return answer;
  }
}