본문 바로가기
Java/구현하기(Implementation)

23.07.04) 나만의 Blog 구현하기

by NH_club 2023. 7. 4.
Post 엔터티에서 User에 있는 id, password를 받아와서 데이터베이스에 저장 해야 하는데, User의 id와 password를 가져오지 못함.
더보기

로그인 할 때 발급 받았던 토큰에는 사용자 정보가 담겨져 있음. jwtUtil에 사용자 조회하는 메서드가 있으니 이것을 활용하여 가져올 수 있음

public Claims getUserInfoFromToken(String token) {
    return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
}

토큰에 있는 claims 을 가져와서 get 메서드를 사용하여 값을 추출할 수 있음

Claims claims = jwtUtil.getUserInfoFromToken(token);
String username = claims.get("username", String.class);

가져온 claims 에 username이라는 key를 찾아 value를 보내줌. String.class는 Class 객체를 반환해줌

<T> T get(String claimName, Class<T> requiredType);

claims.get의 내부 코드임

NoSuchElementExeption 발생
더보기
public PostResponseDto createPost(PostRequestDto requestDto, HttpServletRequest req) {
    String token = jwtUtil.getJwtFromHeader(req);

    if (jwtUtil.validateToken(token)) {
        Claims claims = jwtUtil.getUserInfoFromToken(token);
        String username = claims.get("username", String.class);
        User user = userRepository.findByUsername(username).get();

        Post post = new Post(requestDto,user);
        Post savePost = postRepository.save(post);
        PostResponseDto postResponseDto = new PostResponseDto(savePost);
        return postResponseDto;
    } else {
        throw new IllegalArgumentException("유효하지 않은 토큰입니다.");
    }

}

findbyusername을 했을 때 Optinam.empty()면 NoSuchElementExeption 이 발생할 수도 있다고 검색 결과가 나옴

User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new NoSuchElementException("예외"));

예외 처리 후 실행해보니 값을 가져오지 못하는 것이 맞았음.

토큰 값을 가져올 때 payload의 값과 토큰에서 가져오는 이름이 달랐기에 토큰에서 값을 추출하지 못한 거였음.

jwtutil 에서 claim 설정 변경 후 실행.

SQLException 발생
더보기

디버깅 결과 username에 자꾸 null값이 들어가서 이리저리 찾아보고 바꿔보고 gpt한테 물어봤는데 안나오다가 결국 테이블 구조가 이상하다는 것을 알게됨....

현재 post에는 username이란 필드가 없는데 이미 생성되어있는 데이터베이스 post테이블에 테이블 구조엔 username필드가 있는 테이블이 있었던 것임. 그래서 post엔 username 필드가 없으니 생성할 때 들어가지 않았고 결국 username에 nullable로 생성되어 있었던 테이블에서 오류가 발생했던 거임.

테이블 drop후 다시 실행하니 정상 작동... 해결....

의문점: 서블릿은 동적인 페이지를 만들기 위해 웹 서버에 붙이는 프로그램중 하나라는데 그럼 톰캣과 뭐가 다른거지?
더보기

서블릿은 자바를 사용하여 동적으로 웹페이지를 생성하는데 사용되는 프로그램. 사용자의 요청에 따라 컨텐츠를 동적으로 생성하고 변경할 수 있음.

톰캣은 서버 컨테이너 혹은 웹 컨테이너라고도 불림. 서블릿과 JSP(JavaServerPages)를 실행할 수 있는 환경을 제공함.

즉 서블릿은 톰캣의 기능 중 일부인 것.

구현 완료: 유효한 토큰인지 확인 후 게시글 작성하기

복습 키워드: JPA 연관관계 매핑

 

To Be Continue...