내일배움캠프 33일차 TIL _ 7주 4일차

2024. 5. 30. 21:32TIL Java

 

  • 오늘 있었던 일
    • 개인과제
    • 알고리즘

SPRIONG

  • 스프링 정리
더보기

숙련 스프링 공부

  •  Jwt 로 Refresh 토큰 구현하기
    	//Refresh 전용 토큰 검사기
        public boolean validateRefreshToken(String token, HttpServletResponse response) {
            try {
                Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
                return true;
            } catch (ExpiredJwtException e) {
                ErrorMessage( response, "Expired JWT Exception, 만료된 JWT Refresh token 입니다.\n로그인을 해 주세요 : @Post : /api/user/login");
            } catch (UnsupportedJwtException e) {
                ErrorMessage( response, "Unsupported Jwt Exception, 지원되지 않는 JWT Refresh 토큰 입니다.");
            } catch (SignatureException | MalformedJwtException e) {
                ErrorMessage( response, "Invalid JWT signature, 유효하지 않는 JWT Refresh 서명 입니다.");
            } catch (IllegalArgumentException e) {
                ErrorMessage( response, "JWT claims is empty, 잘못된 JWT Refresh 토큰 입니다.");
            }
            return false;
        }
    
    //  토큰 말료시  토큰 생성
        private void handleExpiredToken(ExpiredJwtException e,String token, HttpServletResponse response) {
            String username = e.getClaims().getSubject();
            User user = userRepository.findByUsername(username).orElseThrow(()
            -> new IllegalArgumentException("해당 유저가 존제하지 않습니다."));
            if(!validateRefreshToken(substringToken( user.getRefreshToken() ) ,response)){
    /*            String Refresh_token = createRefreshToken( user.getUsername(), user.getRole() );
                user.setRefreshToken(Refresh_token);*/
                return;
            }
            if (user != null) {
                newAccessToken( response, user );
            } else {
                logger.error("Refresh token 을 찾을 수 없습니다.");
            }
        }
    
        //  Access토큰 말료시  Access토큰 생성
        private void newAccessToken(HttpServletResponse response, User user) {
            String newAccessToken = createAccessToken( user.getUsername() , user.getRole());
            addToken( newAccessToken, response );
            response.setStatus( 400);
            response.setContentType( "text/plain;charset=UTF-8");
    
            try (PrintWriter writer = response.getWriter()) {
                writer.write("Access 토큰이 재생성되었습니다 다시 시도해 주세요");
            } catch (IOException ex) {
                logger.error("응답 오류");
            }
        }
    Refresh토큰이 필요할때 로그인 하게 만들 수 있다.

 

  •  리플 생성시 토큰의 사용자 와 이름 통일하기
  •     public ReplyResponseDto(Reply reply , User user) {
            this.id = reply.getId();
            this.reply_username = user.getUsername();
            this.reply_content = reply.getReply_content();
            this.created = reply.getCreated();
        }
    이런 방법으로 사용자 이름 을 넣을  수 있다.

 

 

알고리즘 문제 풀기

     ● 체육복

더보기

● 체육복 //링크

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        boolean[] stu = new boolean[n+1];
        List<Integer> list = new ArrayList<>();
        Arrays.sort(lost);
        Arrays.sort(reserve);
        
        for (int i : lost){
            stu[i - 1] = true;
        }

        for (int i : reserve){
            if (stu[i - 1]){
                stu[i - 1] = false;
            }else {
                list.add(i);
            }
        }

        for (int i : list){
                  if ( i >= 2 && stu[i - 2]) {
                stu[i - 2] = false;
            }else if(stu[i]){
                stu[i] = false;
            }

        }
        int answer = n;
        for (boolean i : stu){
            if (i){
                answer--;
            }
        }
        return answer;
    }
}
  • 첫 시도때 태스트문도 통과했지만 후반 특정문제 3개와 방법을 바꾸면 2개가 틀린다.
    • 문제 지문에
      • 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다
    • 이거 때문인가
      • 앞뒤의 순번이 있는지 확인후 넣었다 = 특정 문제 3개가 틀림
      • 3번째 for문의 순서를 바꿔봤다 = 특정 문제 2개가 틀린다.
      • 임의로 순서를 만들어 채육복을 빌려주는 순서를 만든다. = 통과
      •         Arrays.sort(lost);
                Arrays.sort(reserve);
  • 밑은 다른 사람의 풀이
  • class Solution {
        public int solution(int n, int[] lost, int[] reserve) {
            int[] people = new int[n];
            int answer = n;
    
            for (int l : lost) 
                people[l-1]--;
            for (int r : reserve) 
                people[r-1]++;
    
            for (int i = 0; i < people.length; i++) {
                if(people[i] == -1) {
                    if(i-1>=0 && people[i-1] == 1) {
                        people[i]++;
                        people[i-1]--;
                    }else if(i+1< people.length && people[i+1] == 1) {
                        people[i]++;
                        people[i+1]--;
                    }else 
                        answer--;
                }
            }
            return answer;
        }
    }
  • 엄청 깔끔하게 만들었네

 


당일 회고

  • ㅇ? 과제에 스프링 서큐리티를 써도 된다고요? 에? 에????에에에에