CODING/스파르타 내일배움캠프 TIL

44_숫자 문자열과 영단어_기초프로젝트 트러블슈팅_25.2.18(화)

codingTrip 2025. 2. 18. 23:01

사실 어제 코드카타, 팀 프로젝트 둘다 제대로 하지 못해서 TIL 작성하지 못했다.
오늘은 어제 못 푼 코드카타 문제를 튜터님께 힌트를 얻어서 해결했다.
앞으로는 30분 정도 고민하고 가이드 라인이 필요한 경우, 튜터님께 힌트를 받아서 시도해야겠다.

코드카타

46) 숫자 문자열과 영단어

나의 풀이

import java.util.*;

class Solution {
    public int solution(String s) {
        Map<String, Integer> numMap = new HashMap<>();

            numMap.put("zero", 0);
            numMap.put("one", 1);
            numMap.put("two", 2);
            numMap.put("three", 3);
            numMap.put("four", 4);
            numMap.put("five", 5);
            numMap.put("six", 6);
            numMap.put("seven", 7);
            numMap.put("eight", 8);
            numMap.put("nine", 9);
            
            List<String> list = new ArrayList<>();
            list.add("zero");
            list.add("one");
            list.add("two");
            list.add("three");
            list.add("four");
            list.add("five");
            list.add("six");
            list.add("seven");
            list.add("eight");
            list.add("nine");

            for (String str : list) {
                for (String key : numMap.keySet()) {
                    String value = String.valueOf(numMap.get(key));
                    if (str.equals(key)) {
                        s = s.replace(key, value);
                    }
                }
            }
            return Integer.parseInt(s);
    }
}

list와 replace라는 힌트를 주셨다.

나의 경우에는 map 개념을 사용할 생각을 했다.

key와 list의 값이 같으면 이를 value로 반환했다.

 

다른 분들의 풀이

class Solution {
    public int solution(String s) {
        String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        for(int i = 0; i < strArr.length; i++) {
            s = s.replaceAll(strArr[i], Integer.toString(i));
        }
        return Integer.parseInt(s);
    }
}

출처:https://school.programmers.co.kr/learn/courses/30/lessons/81301/solution_groups?language=java

배열에 넣어서 replaceAll 기능을 사용하셨다.

 


기초 프로젝트 트러블슈팅

application.properties에 저장한 secretkey를 찾을 수 없음

 error: cannot find symbol
 public JwtUtil(@Value("${spring.jwt.secret}")String secret) {
                          ^
  symbol:   method value()
  location: @interface Value
public JwtUtil(@Value("${jwt.secret}") String secretkey) {
        this.secretKey = Keys.hmacShaKeyFor(secretkey.getBytes(StandardCharsets.UTF_8));
    }

 

원인은 @Value의 import 설정이었다.

import lombok.Value;이 경로가 아닌

import org.springframework.beans.factory.annotation.Value;로 설정해야 잘 작동한다.

 

 

Claims 추출하지 못하는 트러블

Claims claims = jwtUtil.extractClaims(jwt);

여기에서 claims 정보를 받아와서 

아래처럼 각각 request setAttribute를 하고 싶었는데

추출이 잘 되지 않았다.

httpRequest.setAttribute("userId",claims.getSubject());
httpRequest.setAttribute("email",claims.get("email"));

 

 

원인은 .parseClaimsJwt(token)에 있었다.

오류 원인:
parseClaimsJwt()가 서명이 없는 JWT(JWS가 아님)를 처리하기 위한 메서드

해결 방법:

  • JWT 서명이 포함된 경우 → parseClaimsJws(token) 사용해야 함
  • 서명이 없는 경우 → parseClaimsJwt(token) 사용 가능

따라서 아래와 같이 수정했다.

 public Claims extractClaims(String token){
        return Jwts.parserBuilder()
                .setSigningKey(secretKey) // 1. 서명을 검증할 키 설정(JWT 위,변조 여부 확인)
                .build() // 2. JWT 파서 생성
                .parseClaimsJws(token)// 3. 토큰 파싱 및 서명 검증
                .getBody();// 4. 페이로드(Claims) 추출
    }

 

swagger Failed to load remote configuration.

private static final String[] WHITE_LIST = {"/users/signup", "/login", "/swagger-ui/**", "/v3/api-docs/**"}

LoginFilter 안에 WHITE_LIST에서 해당 경로를 추가했다.