본문으로 건너뛰기

Spring Study 02

· 약 2분
Seokjae Lee
Software engineer

원문: https://doljae.tistory.com/95

온라인 강의를 듣고 배운 점들을 기록한다.

Bcrpyt & BcryptPasswordEncoder​

- Spring Security에서 제공하는 암호화 기법.

- 내부적으로 임의의 salt값을 이용해 평문을 다이제스트(암호문)로 변환한다.

- 즉 동일한 문자열에 대한 해시 결과가 매번 다르게 나온다.

- 그러므로 위 라이브러리에서 제공하는 해시 비교 메서드를 통해서 비교할 수 있다.

- Bcrpyt 라이브러리의 checkpw() 메서드를 통해 평문과 다이제스트를 비교할 수 있다.

- BcryptPasswordEncoder는 AuthenticationProvider의 인자 값(UserDetailServices, PasswordEncoder)의 PasswordEncoder의 구현체로 가장 사용 빈도가 높은 구현체다.

@ExceptionHandler​

- @Controller, @RestController에서 발생한 특정 에러에 대해서 에러 발생 이벤트가 트리거 되었을 때 아래 메서드를 수행한다.

- Controller단에서 Errors 객체로 에러를 받거나, 커스텀 에러 클래스를 throw 할 때 로직을 구현할 수 있다.

- 보통 특정 에러가 발생했을 때 해당 에러에 대한 메시지를 담은 ResponseEntity를 정책에 따라 200, 400 형태로 반환할 때 사용한다.

@UtilityClass​

- Lombok에서 제공하는 Spring Class 중 Utiliy(상수나 반복되는 메서드 등) Class에 명시하는 어노테이션

- 기본 생성자가 private으로 선언된다.

- 사실 사용하지 않는 경우도 있지만 컨벤션 룰에 따라서 사용해주면 클래스 정보에 대한 정보를 명시한다는 점에서 사용할 법하다.

@AppilcationRunner​

- Spring 프로젝트를 시동할 때 run 메서드를 오버라이드 해 해당 메서드를 수행한다.

- CommandLineRunner와 다르게 문자열 기반이 아닌 객체 대상의 작업을 할 때 사용한다.

- 예를 들면 In-Memory-DB인 H2를 사용할 때 초기 데이터 삽입을 위한 Entity 생성 및 Repository.save()를 할 때 사용한다.

JWT 라이브러리 관련​

- maven repository에는 JWT관련 의존성이 많이 있다.

- 그중 가장 다운로드 횟수가 많은 JWT 의존성의 경우 토큰의 만료 기한을 입력하는 expiresAt에 Date 객체가 입력된다.

- 일반적으로 시간 관련된 내용은 LocalDateTime을 사용한다.(조작이 편함)

- 그래서 LocalDateTime 객체를 Date로 변환해서 사용해야 하는데 그 방법이 다양하다.

- 가장 편리한 방법(으로 보이는 방법)은 아래와 같다.

// LocalDateTime 으로 연산하고 Date로 바꿔서 넣어주기
LocalDateTime expiredDateTime = LocalDateTime.now().plusMonths(1);
Date expiredDate = java.sql.Timestamp.valueOf(expiredDateTime);

- 하지만 다른 JWT 의존성 중 LocalDateTime을 인자로 받는 의존성도 있는 것을 확인했다.(jjwt)

- Rule에 맞게 사용하면 될 것 같다.

@RequestHeader​

- Controller단에서 Header 정보를 문자열로 받아볼 수 있는 어노테이션.

- JWT 검증에 대한 부분을 Controller에서 하려 할 때 주로 사용한다.(원래는 Controller 진입 전에 Filter로 해결하는 것이 일반적으로 알고 있다)