💡 회원 가입 기능은 어떻게 구현했나요?
회원 가입 폼에서 데이터를 입력하면 제약 조건에 맞는지 유효성 및 중복 검사를 한 후에 조건에 맞다면 Post 요청을 통해 컨트롤러의 함수를 호출합니다.
그리고 Service에서 새로운 계정을 만드는 함수를 호출합니다.
새로운 계정을 만들 때는 Builder 어노테이션을 통해 더 안정적으로 엔티티를 생성할 수 있게 했고, JpaRepository(Spring Data JPA)를 상속받는 AccountRepository를 통해 저장하도록 했습니다.
비밀번호는 Spring Security에 있는 PasswordEnconder 인터페이스의 기본 알고리즘인 Bcrypt로 암호화하여 저장했습니다.
💡 로그인 기능은 어떻게 구현했고 왜 그렇게 구현했나요?
SpringSecurity의 Config 설정을 통해 로그인 페이지를 제가 만든 로그인 페이지가 호출되기 바꿔서 구현했습니다.
전체적으로 게시판 프로젝트의 여러 기능을 추가하려고 계획했을 때 로그인 기능의 우선도는 다소 낮아서 이렇게 구현했습니다.
💡 이메일 전송 및 확인 기능은 어떻게 구현했나요?
랜덤 UID 생성을 통해 이메일 체크 토큰을 만들어서 유니크한 메일 인증 주소를 만들도록 했습니다.
그리고 TemplateEngine과 Context를 활용해서 토큰, 발신 주소, 수취인과 HTML로 구성된 내용을 넣은 메시지를 만들었습니다.
메시지는 JavaMailSender와 MimeMessage를 사용해서 메일을 전송했습니다.
STMP 서버로는 Gmail을 사용했습니다.
이메일에서 확인 링크를 클릭하면 컨트롤러에서 서비스의 이메일 인증 확인 함수를 호출해서 회원의 이메일 인증 값을 true로 변경하도록 했습니다.
💡 JavaMailSender를 사용한 이유는 무엇인가요? - 꼬리 질문
MailSender는 SimpleMailMessege를 정의해 텍스트로 된 메시지를 전송할 수 있는 반면, JavaMailSender는 MimeMessage를 정의해 HTML 메시지를 만들어 보낼 수 있으므로 HTML 메시지를 보내기 위해서 사용했습니다.
그리고 저는 타임리프를 사용했으므로 TemplateEngine의 process() 함수를 통해 제가 만든 HTML 메시지 작성을 했습니다
Context 객체에는 메일 전송에 필요한 정보를 정의하도록 했습니다.
💡 프로필 조회 기능은 어떻게 구현했나요?
프로필을 조회할 닉네임의 사용자가 있는지 확인 후, 있다면 JpaRepository를 상속받는 AccountRepository에서 닉네임으로 회원을 조회하고 뷰로 회원 데이터를 전달해서 프로필 조회를 할 수 있도록 구현했습니다.
💡 작성 글, 작성 댓글 목록 조회 기능은 어떻게 구현했나요?
JpaQueryFactory를 Bean으로 주입받고 Querydsl을 사용해서 조회하려는 사용자의 닉네임과 동일한 작성자를 가진 게시글들의 데이터와 개수를 찾도록 했습니다.
그리고 Pageable(Spring Data Jpa) 인터페이스를 활용해서 페이징 관련 설정을 하고 Page 인터페이스를 활용해서 페이지 사이즈, 번호, 전체 엔티티 개수등을 받아 모델에 추가하고 뷰에 전달해서 페이징된 화면을 보여줄 수 있도록했습니다.
💡 프로필 세팅 기능은 어떻게 구현했나요?
자기소개, 닉네임, 비밀번호 수정은 폼을 통해 받은 데이터를 dto와 ModelMapper를 통해 회원 정보를 수정했습니다.
그런데 이 때 회원 객체는 영속 상태가 아닌 분리 상태이므로 영속성 컨텍스트에 dirty checking이 되지않아 수정이 된 데이터가 DB에 반영되지 않습니다.
따라서 JpaRepository를 상속받는 AccountRepository에서 save() 함수를 호출해서 merge하도록 했습니다.
프로필 이미지 수정은 Cropper JS를 사용해서 수정할 수 있도록 했습니다.
댓글