SBB는 여러 사람이 사용하는 게시판 서비스다. 그러므로 질문한 사람, 답변한 사람을 구별하는 로그인, 로그아웃은 필수 기능이다. 앞서 회원 가입 기능을 구현했으므로 이제 로그인, 로그아웃 기능을 구현할 수 있다. 로그인 구현하기 회원 가입 단계에서 SITE_USER 테이블에 회원 정보를 저장했다. SITE_USER 테이블에 저장된 사용자명(사용자 ID)과 비밀번호로 로그인을 하려면 복잡한 단계를 거쳐야 한다. 하지만 스프링 시큐리티를 사용하면 이 단계를 보다 쉽게 진행할 수 있다. 스프링 시큐리티는 방대한 프레임워크이다. 스프링 시큐리티는 방대한 프레임워크이다. 따라서 스프링 시큐리티가 내부적으로 어떻게 동작하는지 알기 위해서는 스프링 시큐리티에 대해서 자세히 공부해야 한다. 다음을 순서대로 따라해 보..
이번에는 SBB에 회원가입 기능을 구현해 보자. 회원가입 기능을 만들어 보았다면 웹 프로그래밍은 거의 마스터했다고 할 수 있다. 그만큼 회원가입 기능은 웹 사이트에서 핵심 중의 핵심이라 할 수 있다. 회원 정보를 위한 엔티티 지금까지는 질문, 답변 엔티티만 사용했다면 이제 회원 정보를 위한 엔티티가 필요하다. 회원 정보 엔티티에는 최소한 다음과 같은 속성이 필요하다. 속성설명 username 사용자 이름 (사용자 ID) password 비밀번호 email 이메일 User 도메인 그리고 회원은 질문, 답변 도메인이 아니므로 user라는 도메인을 사용할 것이다. 다음과 같이 com.mysite.sbb.user 패키지를 생성하자. SiteUser 엔티티 그리고 사용자를 관리할 SiteUser 엔티티를 다음처럼..
스프링부트는 회원가입과 로그인을 도와주는 스프링 시큐리티(Spring Security)를 사용할수 있다. SBB도 스프링 시큐리티를 사용하여 회원가입과 로그인 기능을 만들 것이다. 그 전에 스프링 시큐리티에 대해서 간단하게 알아보고 필요한 설정도 진행해 보자. 스프링 시큐리티란? 스프링 시큐리티는 스프링 기반 애플리케이션의 인증과 권한을 담당하는 스프링의 하위 프레임워크이다. 인증(Authenticate)은 로그인을 의미한다. 권한(Authorize)은 인증된 사용자가 어떤 것을 할 수 있는지를 의미한다. 스프링 시큐리티 설치 스프링 시큐리티 사용을 위해 다음과 같이 build.gradle 파일을 수정하자. [파일명:/sbb/build.gradle] (... 생략 ...) dependencies { (...
이번에는 질문 목록에 "해당 질문에 달린 답변 개수"를 표시할 수 있는 기능을 추가해 보자. 코드의 분량은 많지 않지만, 게시판 서비스를 더욱 서비스답게 만들어 주는 기능이다. 답변 개수는 다음처럼 게시물 제목 바로 오른쪽에 표시하자. [파일명:/sbb/src/main/resources/templates/question_list.html] 번호 제목 작성일시 (... 생략 ...) th:if="${#lists.size(question.answerList) > 0}"로 답변이 있는지 조사하고, th:text="${#lists.size(question.answerList)}"로 답변 개수를 표시했다. #list.size(이터러블객체)는 이터러블 객체의 사이즈를 반환하는 타임리프의 유틸리티이다. 이제 답변이 ..
게시물 번호가 1부터 시작되는 문제 현재 질문 목록 화면을 유심히 보면 페이지마다 게시물 번호가 항상 1부터 시작되는 문제가 있다. 페이지를 이리저리 이동해 봐도 게시물 번호는 1부터 시작한다. 이 문제를 해결해 보자. 두번째 페이지로 이동하더라도 여전히 게시물 번호가 1부터 시작된다. 게시물 번호 공식 만들기 만약 질문 게시물이 12개라면 0페이지에는 12번째~3번째 게시물이, 1페이지에는 2번째~1번째 게시물이 역순으로 표시되어야 한다. 질문 게시물의 번호를 역순으로 정렬하려면 다음과 같은 공식을 적용해야 한다. 번호 = 전체 게시물 개수 - (현재 페이지 * 페이지당 게시물 개수) - 나열 인덱스 항목설명 번호 최종 표시될 게시물 번호 전체 게시물 개수 데이터베이스에 저장된 게시물 전체 개수 현재 ..
SBB의 질문 목록은 현재 페이징 처리가 안되기 때문에, 게시물 300개를 작성하면 한 페이지에 300개의 게시물이 모두 조회된다. 이번에는 페이징(Paging)을 적용하여 이 문제를 해결해 보자. 대량 테스트 데이터 만들기 페이징을 구현하기 전에 페이징을 테스트할 수 있을 정도로 충분한 데이터를 생성하자. 대량의 테스트 데이터를 만드는 가장 간단한 방법은 스프링부트의 테스트 프레임워크를 이용하는 것이다. 다음처럼 테스트 케이스를 작성하자. [파일명:/sbb/src/test/java/com/mysite/sbb/SbbApplicationTests.java] package com.mysite.sbb; import org.junit.jupiter.api.Test; import org.springframewor..
지금까지 만든 SBB로 질문 목록을 조회하고 질문을 등록하고, 다시 내용을 보고 답변을 달고 이렇게 조작을 하다 보면 아마도 불편함을 느끼게 될것이다. 그것은 바로 메인페이지(Home)로 돌아갈 수 있는 기능이 없기 때문이다. 이번에는 이러한 불편을 해소할 수 있는 내비게이션바를 만들어 보자. 네비게이션바는 모든 화면 위쪽에 고정되어 있는 부트스트랩 컴포넌트이다. 부트스트랩 내비게이션바: https://getbootstrap.com/docs/5.1/components/navbar/ Navbar Documentation and examples for Bootstrap’s powerful, responsive navigation header, the navbar. Includes support for bra..
이전 챕터에서 질문 등록과 답변 등록시 오류가 발생하면 다음과 같이 오류를 표시했다. 앞으로 추가적으로 만들 템플릿들에도 위와 같이 오류를 표시하는 부분이 필요하다. 이렇게 반복적으로 사용하는 문장은 공통 템플릿으로 만들고 필요한 부분에 삽입하여 쓸 수 있다면 편리하지 않을까? 이번 장에서는 위의 오류 메시지를 출력하는 부분을 공통 템플릿으로 작성하고 필요한 곳에 삽입하여 사용할 수 있도록 해보자. 오류 메시지 공통 템플릿 오류 메시지를 표시하는 공통 템플릿을 다음과 같이 작성하자. [파일명:/sbb/src/main/resources/templates/form_errors.html] 출력할 오류메시지 부분에 th:fragment="formErrorsFragment" 속성을 추가했다. 질문 등록 템플릿에 ..