1. DAO 클래스에 싱글턴 패턴을 적용함 (Dao, Service 같은 객체는 싱글턴 패턴 적용)
- 싱글턴 패턴이 적용된 클래스는 프로그램이 실행되는 동안 오직 한 개의 객체만 생성해서 사용한다.
TodoDao 객체를 매 JSP 마다 생성해야 하는데, 한번만 생성하기
- 싱글턴 패턴
public class TodoDao {
// TodoDao 클래스가 메모리에 로딩되는 즉시 TodoDao객체를 생성해서 정적변수에 저장한다.
(정적변수 -> 메모리에 로딩되는 순간 딱 한번만 객체 생성됨)
private static TodoDao instance = new TodoDao();
// 생성자의 접근제한자를 private 설정해서 외부에서 이 객체를 new로 생성할 수 없게 한다.
private TodoDao() {}
// 정적변수에 미리 저장해둔 TodoDao객체를 제공하는 정적 메소드를 정의한다.
public static TodoDao getInstance() {
return instance;
}
public void deleteTodoByNo(int todoNo) {
SqlMapper.delete("todos.deleteTodoByNo", todoNo);
}
}
delete.jsp
int todoNo = StringUtil.stringToInt(request.getParameter("no"));
//TodoDao todoDao = new TodoDao();
TodoDao todoDao = TodoDao.getInstance();
todoDao.deleteByNo(todoNo);
2. HttpSession 객체에 로그인한 사용자 아이디와 사용자 이름만 저장했다.
login.jsp
String id = request.getParameter("id");
String password = request.getParameter("password");
UserDao userDao = UserDao.getInstance();
User user = userDao.getUserById(id);
// 사용자 정보 존재 여부 체크, 비밀번호 일치여부 체크
session.setAttribute("LOGIN_USER_ID", user.getId());
session.setAttribute("LOGIN_USER_NAME", user.getName());
header.jsp
String loginUserName = (String) session.getAttribute("LOGIN_USER_NAME");
if (loginUserName != null) {
로그아웃</a href="logout.jsp">
} else {
로그인</a href="loginform.jsp">
회원가입</a href="form.jsp">
}
3. LoginCheckFilter를 사용해서 로그인체크를 필터에서 한번에 처리했다.
- 로그인 안한 사용자는 홈, 로그인, 회원가입 부분만 보이도록 각 JSP로 들어가기 전에 로그인체크 필터
- 홈(/home.jsp), 회원가입(/user/form.jsp, /user/register.jsp, /user/completed.jsp),
로그인(/user/loginform.jsp, /user/login.jsp)을 요청하는 URL 로그인체크를 수행하지 않는다.
- 위에서 나열한 URL외 모든 URL 요청에 대해서는 로그인체크를 수행한다.
- LoginCheckFilter 등록시 필터의 초기화 파라미터로 로그인체크를 수행하지 않은 요청 URL을 설정했다.
로그인체크필터
1. 요청 URL 분석
2. 요청 URL이 ignorePath에 포함되어 있는지 확인
3. 포함되어 있으면 JSP 실행
4. 포함되어 있지 않으면
로그인 여부 확인
- 로그인 O -> JSP 실행
- 로그인 X -> 로그인 폼
-> 어차피 로그인 안되어있으면 못들어오니까
각 JSP마다 로그인체크를 할 필요가 없음
- web.xml
<filter>
<filter-name>loginCheckFilter</filter-name>
<filter-class>com.sample.filters.LoginCheckFilter</filter-class>
<init-param>
<param-name>ignore-path</param-name>
<param-value>
/home.jsp -----> 얘네들은 로그인체크를 무시한다.
/user/form.jsp
/user/register.jsp
/user/completed.jsp
/user/loginform.jsp
/user/login.jsp
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>loginCheckFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4. 할일 관리 애플리케이션
- todo 관련 모든 요청은 반드시 로그인 후에만 사용할 수 있다.
- 로그인한 사람(자신의)의 todo만 등록/조회/수정/삭제/취소/완료처리 할 수 있다.
- todo/list.jsp
int currentPage = StringUtil.stringToInt(request.getParameter("page"), 1);
// loginUserId는 결코 null일 수 없다. 로그인안 된 사용자는 todo/list.jsp를 요청할 수 없다.
String loginUserId = (String) session.getAttribute("LOGIN_USER_ID");
TodoDao todoDao = TodoDao.getInstance();
// 로그인한 사용자의 전체 todo갯수 조회
int totalRows = todoDao.getTotalRows(loginUserId);
Pagination pagination = new Pagination(currentPage, totalRows);
// 로그인한 사용자의 전체 todo중에서 현재 페이지번호에 해당하는 todo 조회하기
Map<String, Object> param = new HashMap<>();
param.put("userId", loginUserId);
param.put("begin", pagination.getBegin());
param.put("end", pagination.getEnd());
List<Todo> todoList = todoDao.getTodos(param);
'수업내용 > Web' 카테고리의 다른 글
[2023.1.27.금] 리액트 뷰 (0) | 2023.01.27 |
---|---|
[2022.11.28.월] 부트스트랩 (0) | 2022.11.28 |
[2022.11.21.월] IO 입출력 (0) | 2022.11.21 |
[2022.11.18.금] 서블릿, 첨부파일 업로드 (0) | 2022.11.18 |
[2022.11.17.목] 장바구니 추가기능, 비밀번호 암호화 (0) | 2022.11.17 |