Leehyoungwoo / vacation-study

vacation study
0 stars 0 forks source link

2023-12-13 TIL #16

Open Leehyoungwoo opened 11 months ago

Leehyoungwoo commented 11 months ago
Leehyoungwoo commented 11 months ago

스프링 데이터 프레임워크에서 제공하는 Page와 Pageable 인터페이스는 페이징 처리를 돕는 매우 중요한 개념입니다.

Pageable: 이 인터페이스는 페이징 처리에 필요한 정보를 가지고 있습니다. 이 정보에는 '현재 페이지 번호', '한 페이지에 포함될 데이터의 수', '정렬 정보' 등이 포함됩니다. PageRequest 클래스는 이 Pageable 인터페이스를 구현하며, 페이징 처리를 요청할 때 사용됩니다. PageRequest의 객체는 PageRequest.of(pageNo, pageSize, sort)와 같은 형식으로 생성할 수 있습니다. pageNo는 0부터 시작하므로, 사용자에게 제공되는 페이지 번호에서 1을 빼줘야 합니다. Page: 이 인터페이스는 페이징 처리된 결과를 담고 있습니다. 이 결과에는 '데이터의 리스트', '현재 페이지 번호', '전체 페이지 수', '현재 페이지의 데이터 수' 등의 정보가 포함됩니다. 또한, 이전 페이지나 다음 페이지가 있는지 여부를 확인하는 메소드도 제공합니다. Page 인터페이스는 Pageable 인터페이스를 상속받아, 요청한 페이징 정보를 가지고 있습니다. 따라서, Page 객체를 통해 요청한 페이징 정보를 다시 확인할 수 있습니다. 위에서 설명한 getBoardPage 메서드에서는 PageRequest를 통해 Pageable 객체를 생성하고, 이를 boardRepository.findByIsDeletedFalse(pageable)에 전달하여 Page 객체를 얻습니다. 이 Page 객체는 Board 객체의 리스트와 페이징 정보를 담고 있습니다. 그리고 Page 객체의 stream 메소드와 map 연산을 통해 Board 객체의 리스트를 BoardReadDto 객체의 리스트로 변환하고, 이를 반환합니다. 이렇게 하면, 페이징 처리된 BoardReadDto 리스트를 얻을 수 있습니다.

Leehyoungwoo commented 11 months ago
Leehyoungwoo commented 11 months ago
Leehyoungwoo commented 11 months ago

자바에서는 클래스에 생성자를 명시적으로 작성하지 않을 경우, 컴파일러가 자동으로 기본 생성자를 생성합니다. 하지만 클래스에 매개변수가 있는 생성자(예: @AllArgsConstructor)를 작성하면, 컴파일러는 기본 생성자를 자동으로 생성하지 않습니다.

Spring Framework의 JSON 파싱 라이브러리인 Jackson은 기본적으로 클래스에 기본 생성자나 세터 메소드를 사용하여 JSON을 객체로 변환합니다. 그러므로 UpdateNicknameDto 클래스에는 기본 생성자가 필요합니다.

따라서 @NoArgsConstructor 어노테이션을 사용하여 기본 생성자를 추가했습니다. 이렇게 하면 Jackson이 UpdateNicknameDto 객체를 생성할 때 필드를 초기화할 수 있습니다.

@AllArgsConstructor 어노테이션은 모든 필드를 인자로 받는 생성자를 생성합니다. 이 어노테이션을 사용하면 필드마다 세터 메소드를 작성하지 않아도 되므로 편리합니다. 하지만 JSON 파싱을 위해서는 기본 생성자 또는 매개변수가 없는 생성자가 필요하므로, @NoArgsConstructor 어노테이션과 함께 사용하는 것이 좋습니다.

따라서, UpdateNicknameDto 클래스에서 @AllArgsConstructor와 @NoArgsConstructor를 함께 사용하는 것이 필요한 상황이라고 할 수 있습니다. 이렇게 하면 필드 초기화를 위한 기본 생성자와 필드를 모두 인자로 받는 생성자를 모두 사용할 수 있습니다.

Leehyoungwoo commented 11 months ago

현재 비밀번호 확인: 사용자가 자신의 아이디라는 것을 증명하기 위해 현재 비밀번호를 입력해야 합니다. 입력한 비밀번호는 암호화된 형태로 데이터베이스에 저장된 값과 비교됩니다. 새 비밀번호 입력: 사용자가 새 비밀번호를 입력합니다. 보통 비밀번호 정책이 있어서, 예를 들어 최소 길이, 특수 문자 포함 여부 등을 체크할 수 있습니다. 새 비밀번호 확인: 사용자가 새 비밀번호를 잘못 입력하는 것을 방지하기 위해, 새 비밀번호를 한 번 더 입력하도록 합니다. 이 두 값이 일치해야만 비밀번호 변경을 진행합니다. 비밀번호 암호화 및 저장: 새 비밀번호는 암호화된 형태로 데이터베이스에 저장됩니다. 보통 해시 함수를 사용하여 비밀번호를 암호화하며, 솔트(salt)라는 랜덤 값도 함께 사용하여 더욱 안전하게 암호화합니다. 이렇게 비밀번호 변경 과정을 거치면, 사용자의 비밀번호가 안전하게 변경되고 저장됩니다.

Spring Security를 사용하면 이러한 비밀번호 처리를 간편하게 할 수 있습니다. PasswordEncoder 인터페이스를 사용하여 비밀번호를 암호화하고 비교할 수 있습니다. BCryptPasswordEncoder는 솔트를 사용한 bcrypt 알고리즘을 이용하여 비밀번호를 암호화하므로, 보통 이 클래스를 많이 사용합니다.

Leehyoungwoo commented 11 months ago
Leehyoungwoo commented 11 months ago
Leehyoungwoo commented 11 months ago

따라서, PasswordConverter를 사용하여 비밀번호 필드에 @Convert 어노테이션을 붙였다면, 비밀번호가 데이터베이스에 저장될 때 PasswordConverter의 convertToDatabaseColumn 메서드가 호출되어 비밀번호가 암호화됩니다.

위의 updatePassword 메서드에서는 새로운 비밀번호를 그대로 전달하고 있습니다. 이때, @Convert 어노테이션에 의해 PasswordConverter의 convertToDatabaseColumn 메서드가 호출되어 새로운 비밀번호가 암호화되어 데이터베이스에 저장될 것입니다.

따라서, updatePassword 메서드에서 새로운 비밀번호를 암호화하지 않아도 됩니다. @Convert 어노테이션과 PasswordConverter가 암호화를 자동으로 처리해주기 때문입니다.

Leehyoungwoo commented 11 months ago