사실 어제 코드카타, 팀 프로젝트 둘다 제대로 하지 못해서 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에서 해당 경로를 추가했다.
'CODING > 스파르타 내일배움캠프 TIL' 카테고리의 다른 글
46_기초프로젝트 발표 후 회고_25.2.20(목) (0) | 2025.02.20 |
---|---|
45_문자열 내 마음대로 정렬하기_기초프로젝트 트러블슈팅_25.2.19(수) (0) | 2025.02.19 |
43_시저 암호_기초 프로젝트 트러블슈팅_25.2.14(금) (0) | 2025.02.14 |
42_최소직사각형_일정관리 Develop 과제 해설_25.2.13(목) (0) | 2025.02.14 |
41_크기가 작은 부분 문자열_일정관리 Develop 주석 작성(Javadoc) 및 리팩토링_25.2.12(수) (0) | 2025.02.12 |