프로젝트 아이디어를 구상하는 단계에서 프로그램에 필요한 기능 사항들을 러프하게 생각해봤다.
*이미용 관리기록 프로그램
- 게시판 형태로 미용관리 기록 (요구사항, 스타일링 사진, 담당 디자이너 등)을 저장 후 재방문시 참고하는 용도
- 해당 기록을 공개/비공개 설정 가능 >> 전체공개시 다른 유저들도 볼 수 있는 별도의 게시판에 노출 (댓글 가능)
- 비공개시 본인 게시글 정보에서만 확인 가능
- 게시물에 대한 좋아요, 조회수 및 북마크(찜) 기능 추가
- 카카오맵 API를 활용하여 방문장소 표시
그리고 위 내용을 바탕으로 필요한 DB 테이블을 정리해보았다.
DB 테이블 중 아무래도 게시물 역할인 record 테이블이 제일 중요하다고 생각했는데, 특히 추후 방문장소의 정보를 카카오맵 API에 마커로 찍기 위해 위치정보를 위한 컬럼을 별도로 추가하려고 했다.
근데 아직 카카오맵 API를 많이 사용해보진 않은 관계로 정확히 어떤 파라미터를 받아야하는지에 대한 정보가 없었다.
챗GPT가 확실히 검색과정을 많이 단축시켜주는 느낌이라 이 친구를 통해 관련 파라미터에 대해 물어봤다.
모든 파라미터를 다 알려주는 것 같아 꼭 필요한 파라미터만 다시 물어봤다.
아무래도 위도와 경도는 필수적으로 들어가는 것 같고, 주소정보는 방문장소를 저장하는 목적상 당연히 받아둬야 할 것 같아 일단 이렇게 세 파라미터를 추가하기로 했다.
이렇게 기본적인 DB 모델링이 끝나고 JPA entity를 통해 정상적으로 테이블들이 잘 생성되는지 확인해 본다.
각각의 연관관계는 모두 일대다 관계로 매핑하였다.
이렇게 DB 테이블도 모두 정상적으로 잘 만들어 졌으니 이제 본격적으로 페이지와 비즈니스 로직을 구현하면 된다.
먼저 로그인과 회원가입 페이지부터 구현하기로 했다.
Spring security를 사용하면 페이지별 인증(authentication)과 인가(authorize)를 대신 처리할 수 있으므로 다음 과정들을 처리해준다.
- security의 사용과 기본적인 설정을 위한 config
- security로 로그인시 해당 사용자의 정보를 받기 위한 User
- 리턴된 User객체의 정보를 읽어 실제 로그인 처리를 담당하는 Service
config 클래스에선 SecurityFilterChain을 Bean으로 등록시켜 준 뒤, 페이지별 접근권한을 설정해주고 로그인과 로그아웃에 대한 url 등을 설정해준다. security에서 기본적으로 설정되어 있는 로그인 form이 있으나 당연히 그것을 사용하지는 않으므로, 별도 로그인 페이지를 구현해줘야 한다.
설정된 로그인 페이지(/login)에서 로그인에 필요한 변수(username, userpassword)를 입력하면 loginProccessingUrl(/loginOk)을 통해 실제 로그인 처리를 위한 로직이 자동으로 실행된다. 해당 페이지(/loginOk)는 별도로 구현할 필요는 없지만, 관련 Service를 설정해줘야 한다.
로그인 실패시 기능구현이나 OAuth2를 통한 소셜로그인 등 도 설정이 가능하나, 일단은 기본 기능만 우선적으로 구현할 계획이라 해당부분은 주석처리 하였다.
또 하나 중요한 부분은 로그인시 비밀번호의 암호화 처리를 위한 PasswordEncoder의 Bean 등록이다. 일단 이게 있어야 설정이 되기도 하고, 뭐.. 당연히 비밀번호는 암호화되어야 하니까..? 이렇게 암호화 처리된 사용자의 비밀번호는 RDBMS에서 조회를 해도 암호화된 상태로만 확인이 가능하다. (당연히 사용자의 비밀번호를 본인 외엔 아무도 알 수 없어야 하니까)
그리고 User 설정.
기본적으로 User 객체를 통해서는 username(로그인시 ID), userpassword(로그인시 PW), authority(권한)만 담을 수 있다. 때문에 OAuth2와 같은 소셜로그인시에는 해당 로그인 회원의 정보를 따로 DB에 저장할 수 없어서 User 객체를 커스터마이징 하기도 한다고 한다. (권장하지는 않는 듯?)
마지막으로 앞서 config의 loginProccessingUrl(/loginOk)의 로그인 처리를 위한 service를 설정해 줬다.
UserDetailService의 구현객체로, DB로부터 해당 로그인 회원의 정보를 받아 User객체로 넘겨주는 역할이라 보면 된다.
디자인은 카카오 로그인 페이지를 참고했다. 회원가입 페이지는 정규표현식을 통한 valid를 설정하여 유효성 검사도 구현하였다.
'프로젝트' 카테고리의 다른 글
개인 프로젝트 시작! (0) | 2023.04.11 |
---|---|
1차 프로젝트(1) - DB 설계 관련 (0) | 2023.02.12 |
첫 팀 프로젝트를 시작하며 (0) | 2023.02.04 |