첫번째 BEAN으로 만들어서 관리하는 방식이 있다. 자격 증명이 있는 사용자를 하나 이상 생성하고, 사용자를 userDetailsService에서 관리하도록 추가한다. 추어진 암호를 UserDetailsService가 저장하고 관리하는 암호를 이용해 검증하는 PasswordEncoder 형식의 Bean을 정의
두번째로는 WebSecurityConfigureerAdapter를 상속하여 configure 메소드를 재정의하는 방식이 있다.
GrantedAuthority 계약과 UserDetails의 구현... 사용자가 어플리케이션에서 수행할 수 있는 작업인 authority들을 가지는 인터페이스이며, getAuthority()메서드를 가진다. UserDetails의 getAuthorities() 메서드는 GrantedAuthority 클래스를 상속받는 Collection을 반환함
UserDetailsService 계약... UserDetailsService 인터페이스에는 UserDetails객체를 반환하는 loaduserByUsername(String username) 메서드 하나만 존재한다. 인증 구현 식 해당 메서드를 호출해 주어진 사용자 이름을 가진 사용자(UserDetails객체)의 세부 정보를 얻음
DB 테이블을 만든 후, DTO 생성, @Data 어노테이션은 @Getter / @Setter, @ToString, @EqualsAndHashCode와 @RequiredArgsConstructor 를 합쳐놓은 것. no는 댓글의 넘버, boardNo는 게시물의 넘버, userID는 댓글을 쓴 유저, title은 댓글의 제목, text는 댓글 내용, writeDate는 댓글을 쓴 날짜이다. 이때 날짜는 현재 시각을 나타내야 하기 때문에, 기본 값을 현재 시간으로 설정해야 하고, insert문에서 작성하면 안된다.
게시물 작성하는 함수. 타이틀을 적는 곳과, 유저, 댓글 내용을 적는 input과 textarea태그를 가져온 뒤, JS 데이터를 만든다. 주의할 점은. 데이터의 키 값을 DB의 속성명과 동일하게 해야 된다. 그리고 만든 JS 데이터를 JSON 데이터로 변환하여 POST에 요청을 보낸다. 댓글 작성에 성공하면 곧 만들 get_comments(); (댓글 조회) 함수를 실행시키게 한다.
댓글 객체들을 화면에 보여주는 함수이다. 맨 처음 댓글 전부를 화변에서 제거하고 시작한다. 불러온 객체 리스트들을 하나씩 조회하여, 다음 HTML 형식으로 조회하게끔 한다. 그리고 수정 버튼과 삭제 버튼까지 만든다. 수정 버튼과 삭제버튼에 onclick 요소로 곧 만들 수정, 삭제 함수들을 넣고, 누르면 수정과 삭제가 가능하도록 한다.
게시물에 해당하는 댓글 전체를 가져오는 함수. 카테고리 방법으로 해당 게시물의 모든 댓글 객체를 받아와야 한다. 받아온 JSON 객체를 JS객체로 변환하여, 받아온 모든 댓글 LIST를 위의 댓글 객체들을 화면에 보여주게 하는 함수에 파라미터로 넣는다.
컨트롤러로 간다. @RestController 어노테이션을 이용하여, 주소가 아닌 값을 불러오게끔 한다. 댓글 작성 POST를 만드는데, 이미 만든 Mapper의 댓글 작성 메소드를 불러온다. @RequestBody는 자바스크립트에서 요청한 요청 값들을 불러오게 하는 용도이다. 그 값들을 불러와서 댓글 작성 메소드의 파라미터안에 넣으면, 댓글 작성 완료된다.
댓글 조회는 GET으로 하는데, 카테고리 방식으로 @PathVariable을 이용하여, 해당 게시물의 boardNo를 불러와서, 헤당 게시물 안에 있는 모든 댓글 목록들을 조회하게끔 한다.
다시 자바스크립트로 돌아와서 댓글 수정과, 댓글 삭제하는 기능을 만든다. 위에서 create_comments_view 함수 부분을 보면, 댓글 수정, 삭제 버튼의 onclick 요소 안에 함수들과 똑같은 이름을 만든다. 그리고 수정 함수 안에 this가 있는데, 이건 이 수정 버튼의 부모 태그의 바로 밑 태그를 불러오게 하기 위함이다. parentElement.nextElementSibling.value로 유저가 수정한 textarea의 내용을 가져온다.
내가 누른 댓를 no를 가져오고, 컨트롤러에서 @PutMapping으로 수정할 계획이으로 메서드는 "put" 그리고 JSON 객체로 변환한다. 요청이 성공하면 당연히 새롭게 댓글이 수정 됐음을 의미하니까, 모든 댓글을 재로딩되어 보여지게 한다.
삭제는 더 간단하다. 그냥 똑같이 내가 누른 버튼의 no를 가져오고, 해당 댓글 no 삭제를 요청하면 그만이다. 역시 요청이 성공하면 모든 댓글을 재로딩
마지막으로 페이지 접속하면 댓글 전부 보여지게끔 get_comments(); 함수를 맨 시작점에 적는다.
그리고 작성 버튼 눌렀을 시 작성기능이 동작하도록 한다.
수정, 삭제 둘다 카테고리 방식으로 해당 댓글의 no를 가져온다. 수정은 @RequestBody로 자바스크립트에서 불러온 JSON 객체를 불러오게 하고, 댓글 수정 메소드를 작성하여 최종적으로 댓글이 수정되도록 한다. 댓글 삭제는 카테고리 방식으로 불러온 no를 댓글 삭제 메소드의 파라미터로 넣어, 해당 no를 가진 댓글이 삭제되도록 한다.
뷰 템플릿이라고 부른다. 뷰 템플릿은 컨트롤러가 전달하는 데이터를 이용하여 동적으로 화면을 구성할 수 있게 해준다. html 태그를 기반으로 하여 th:속성을 이용하여 동적인 view를 제공한다.
셋팅
먼저 타임리프 홈페이지에 들어가서, Docs를 클릭한 후, Spring과의 연계를 위해 다음 Read online을 클릭
해당 xml들을 복사 후
웹 어플리케이션에서 클라이언트의 요청을 받기 위한 컨텍스트 설정이며, 요청과 관련된 객체를 정의하는 servlet-context에 붙여넣기를 한다.prefix가 이 경로에서 파일을 찾는다는 뜻. 그리고 suffix는 어떤 타입의 파일을 찾을지를 의미한다. order로 우선순위는 1. 그리고 UTF-8로 인코딩을 설정하였다.
뷰 없이도, 해당 요청이 정상적으로 실행되는지 확인할 수 있다. 작성후 실행 하면, 응답 코드가 뜨는데, 이 응답 코드로 요청이 정상 실행되는지 판단 가능하다. 만약 코드가 200번대라면 요청에 성공적으로 수행되었다는 뜻이고, 400번대는 사용자의 잘못된 요청으로 처리할 수 없음을 의미한다. 500번대는 내부 서버에 오류가 있음을 의미한다.
아이디와 닉네임이 중복되는지 검사하는 메서드와, 검사가 끝났을 시, 유저를 추가하는 메서드를 만든다.
xml로 가서 쿼리문을 작성하고 매핑한다. 아이디가 null 이 아닐경우 해당 id의 정보를 조회하고, nickName이 null이 아닐 경우 해당 nickName의 정보를 조회한다. LIMIT 1로 단 한개의 정보만을 선택하도록 하였다.
중복 검사 및 회원가입. 먼저 GET요청으로 회원가입 창으로 가게 하였고, POST 요청으로 중복검사 및 회원가입을 진행한다. 만들어 놓았던 is_user_exist 메서드로 아이디 혹은 닉네임이 중복되는게 없는 경우, insert_user 메서드로 DB에 작성한 유저 정보를 추가하고, 로그인 창으로 리다이렉트. 만약 아이디 혹은 닉네임이 중복일 경우, 메세지를 다음과 같이 설정하고, 회원가입 창으로 리다이렉트.
이미 있는 아이디나 닉네임을 적었을 시, ID 혹은 NICKNAME이 중복이라고 메세지가 뜨고, 회원가입창에 리다이렉트
중복되지 않는 아이디와 닉네임을 작성 시, 해당 아이디와 닉네임으로 DB에 저장되고, 로그인 창으로 이동한다.