본문 바로가기

공부

(113)
23.11.22 오늘 정말 많은 기능들을 구현했다. 1. Spring Security를 이용한 인증 Spring Security를 이용해서 Jwt토큰 방식으로 사용자 인증을 하는 기능을 구현했다. 첫번째로 JwtUtil 클래스를 통해 Jwt를 다루는 클래스를 만들었다. JwtUtil클래스에는 JwtToken을 만들어 주는 기능, Jwt토큰을 확인하는 기능, 해당 토큰에서 정보를 담은 토큰을 잘라주는 기능, 잘라준 토큰에서 사용자 정보를 가져오는 기능, 토큰의 유효성을 판단하는 기능이 포함된다. Jwt토큰은 로그인 성공시 HttpServletResponse 클래스에 Header에 값을 넣어주는 방식으로 기능을 구현했다. 두번째는 Filter를 설계했다. 필터는 인증이 필요한 요청일 때, 헤더에 들어있는 토큰이 유효한지를 ..
스프링 내부 객체 사용 실수 인증/인가 필터단을 설계하면서 UserDetails를 구현한 UserDetailsImpl을 커스텀해서 사용했다. 이 UserDetailsImpl에 내가 사용하는 Entity인 User와 매칭 시키기 위해 UserRepository의 값을 꺼내와서 UserDetailsImpl에 넣어줘야 한다. 따라서 UserDetailsService 클래스를 사용해야 한다. 근데 여기서 문제가 생겼다. 스프링에서는 UserDetailsService는 이미 존재하는 클래스인 것. 따라서 주의 없이 UserDetailsService 클래스를 필드값으로 갖는 클래스를 사용할 때 잘못된 클래스를 가져올 수 있다. (내가 그랬고, 우리 팀원이 그랬다.) [해결방법] UserDetailsImpl의 로직을 사용하는 클래스의 이름을 U..
빈 생성 오류 트러블 슈팅 Error creating bean with name 'jwtUtil': Injection of autowired dependencies failed 오류가 났다. jwtUtil을 빈으로 만드는데 실패했다는 것 같다. autowired를 해줄 의존성이 없다? 그래서 구글링 한 결과 대부분 @Service와 같이 @Component 어노테이션이 생략이 돼있어서라고 하는데, 나는 JwtUtil이고, @Component 어노테이션도 달려 있었다. 구글링으로는 답이 없어 튜터님께 찾아갔다. [해결방법] 답은 간단했다. @Value("${jwt.secret.key}") // Base64 Encode 한 SecretKey private String secretKey; 이부분에서 문제였다. 왜냐하면 @Value 어노..
23.11.21 팀프로젝트 시작! 내가 맡은 임무는 CRUD이다. 오늘 기본적인 틀은 다 만들어놓고 이제 인증/인가를 맡은 팀원을 도와줘야겠다. 어제 배웠던 몇가지 기술로 CRUD를 더 보기 좋게 만들었다. 1. ResponseEntity 사용 ResponseEntity를 사용하면 내가 원하는 상태코드를 줄 수도 있고, 바디에도 내가 넘기고 싶은 정보들을 넣어줄 수 있어서 좋다. 상태코드를 내가 주고 싶은대로 줄 수 있다는 것이 매력적이다. return ResponseEntity.status(HttpStatus.OK.value()).body(menuResponseDto); 요런식! 2. 입력값을 validation 정규 표현식으로 제한하기 사용자 입력 제한을 request단에서 제어한다. validation은 보통 회원..
[팀프로젝트] 뉴스피드 API명세서 기능 Method url request reponse purpose 로그인 POST /users/login { "username" : "유저아이디" "pwd" : "비밀번호" } { "로그인 성공", "상태코드 : 201" }, { "오류메세지", "상태코드" } DB에 저장된 유저만 로그인하여 JWT토큰을 응답 회원가입 POST /users/signup { "username" : "유저아이디", "pwd" : "비밀번호", "email" : "email@email.com" "nickname" : "닉네임", "profile" : "한줄 소개" } { "회원가입 성공", "상태코드 : 201" }, { "오류메세지", "상태코드" } 정규식에 맞춘 회원가입/DB에 회원 저장/DB에 중복된 회원 저장 실패..
23.11.20 할일 카드 저장 프로젝트를 마쳤다. 회원가입/로그인 파트를 구현에 실패했다. Entity들의 연관관계를 맺고, CRUD하는데에는 성공했다. 오늘은 개인과제 해설 영상을 보면서 부족했던 부분들에 대해 다시 공부하는 시간을 가져야한다. 우선 이번에 실패한 개념들을 공부해보자. 1. 정규 표현식 회원가입시 개발자가 원하는 형태의 아이디와 비밀번호를 받을 수 있다. Validation의존성을 추가하여 사용하자. // Validation implementation 'org.springframework.boot:spring-boot-starter-validation' Build.Gradle에 추가해서 사용한다. 사용방식은 다음과 같이 사용한다. @Pattern(regexp = "^[a-z0-9]{4,10}$") p..
23.11.17 본격적인 회원가입/로그인 코드를 작성시작! JWT를 이용하여 쿠키에 토큰을 저장하고.(토큰에는 seceret key가 들어있다.) 클라이언트는 제공받은 쿠키를 응답할 때 같이 보내 서버가 인증하기 위해 받는다. 이런 개념으로 코드를 작성하기 시작했다. 사용자의 인증/인가 허락 흐름은 이렇게 작동한다. 1. 사용자의 로그인 요청 2. 서버에서 사용자의 정보가 DB에 있는지 확인 2-1. 사용자의 정보가 DB에 존재 하지 않으면 오류 발생 및 오류 응답 2-2. 사용자의 정보가 DB에 존재하면 JWT 토큰을 쿠키에 담아 클라이언트에 전송. 3. 인증이 완료된 사용자는 앞으로 모든 응답에 JWT 토큰을 담은 쿠키를 같이 전송 4. 서버에서는 쿠키의 유효성을 검사해 쿠키의 인증/인가가 유효하다면 그에 맞는 권한..
23.11.16 오늘은 유저-카드-댓글 세 Entity를 모두 연관관계를 만들어주었다. https://taeho-fighting.tistory.com/54 [Spring] Could not write JSON: Infinite recursion (StackOverflowError) 으악 이거 뜨면 좀 멘붕이다. 왜냐면 오류난 로그를 올리면 진짜 끝도 없이 계~~속 올라가야 한다. 이 에러의 이유는!! 바로 재귀 호출이다. 내 프로젝트에서 발생한 이유는 다음과 같다. 나는 카 taeho-fighting.tistory.com 그 과정에서 생긴 오류와 트러블 슈팅에 대한 포스팅. 영속성 전이를 통해 유저가 지워지면 관련된 모든 Entity를 지워준다. 마찬가지로 카드를 지워주면 관련된 댓글이 다 지워진다. 영속성 전이를 알려..
[Spring] Could not write JSON: Infinite recursion (StackOverflowError) 으악 이거 뜨면 좀 멘붕이다. 왜냐면 오류난 로그를 올리면 진짜 끝도 없이 계~~속 올라가야 한다. 이 에러의 이유는!! 바로 재귀 호출이다. 내 프로젝트에서 발생한 이유는 다음과 같다. 나는 카드 Entity와 댓글Entity 를 연관관계를 맺어 사용하고 있엇다. 카드 1 : N 댓글의 관계를 맺었다. 따라서 댓글 클래스에는 Card 필드를 ManyToOne으로 가지고 있다. 외래 키의 주인은 댓글! public class Comment extends Time{ ... // 카드 하나에 여러 댓글을 달아야 하니까 N의 관계 @ManyToOne @JoinColumn(name = "card_id") private Card card; ... 카드 클래스에는 댓글이 List형식으로 필드로 갖는다. public..
23.11.15 ENTITY의 연관관계에 대해서 배웠다. 이번 프로젝트에 필요한 기술이다. 할일 카드 만들기에 유저, 카드, 댓글 이 세개의 엔티티의 관계를 정립해야 했다. 1. 유저와 카드는 1:N의 관계다. 2. 카드와 댓글은 1:N의 관계다. 3. 유저와 댓글은 1:N의 관계이다. 나의 초기 엔티티 관계에서는 유저와 댓글이 직접적인 연관을 맺지 않았다. 왜냐하면 댓글은 카드에 종속되어 있다고 생각해서이다. 여기서 고려해야 했던 부분이 카드에 달리는 댓글은 카드 작성자만 있는 것이 아니라, 다른 회원이 단 댓글도 보여야 한다. 따라서 댓글을 그저 카드의 종속된 객체로만 볼 수 없어졌다. 따라서 유저와 댓글의 관계도 맺어줘야 한다. 이 개념을 가지고 오늘 카드와 댓글을 매칭 시키는 코드를 구현했다. 아직 제대로 작동이..