자바에서 로그인/로그아웃 구현하기

업데이트:

이 포스트에서 구현하는 로그인/로그아웃 방식은 Observer디자인 패턴을 사용한다는 것을 전제로 한다.

Command인터페이스 규칙 변경

import java.util.Map;

// 사용자의 명령을 처리하는 객체에 대해 호출할 메서드 규칙을 정의 한다.
public interface Command {

  // => 커맨드 객체들 간에 데이터 교환을 위해 맵 객체를 파라미터로 넘긴다.
  void execute(Map<String,Object> context);
}

인터페이스 규칙이 바뀌었으니 나머지 XXXCommand클래스들도 바뀐 규칙에 맞추어 변경해주었다.

LoginCommand 생성

package com.eomcs.pms.handler;

import java.util.Map;
import com.eomcs.pms.dao.MemberDao;
import com.eomcs.pms.domain.Member;
import com.eomcs.util.Prompt;

public class LoginCommand implements Command {

  MemberDao memberDao;

  public LoginCommand(MemberDao memberDao) {
    this.memberDao = memberDao;
  }

  @Override
  public void execute(Map<String, Object> context) {
    System.out.println("[로그인]");

    if(context.get("loginUser") != null) {
      System.out.println("이미 로그인되어 있습니다.");
      return;
    }
    String email = Prompt.inputString("이메일? ");
    String password = Prompt.inputString("암호? ");

    try {

      Member member = memberDao.findByEmailPassword(email, password);
      if (member == null) {
        System.out.println("사용자 정보가 맞지 않습니다.");
      } else {
        // 로그인이 성공했으면 회원 정보를 context보관소에 저장한다.
        context.put("loginUser", member);
        System.out.printf("%s님 반갑습니다!\n", member.getName());
      }
    } catch (Exception e) {
      System.out.println("로그인 중 오류 발생!");
      e.printStackTrace();
    }

  }
}

MemberDao를 구현한 MemberDaoImpl클래스

sql문을 Mapper로 분리하기 전이라 자바 클래스에서 직접 날리고있다.

  @Override
  public Member findByEmailPassword(String email, String password) throws Exception {
    try (PreparedStatement stmt = con.prepareStatement(
        "select no, name, email, photo, tel, cdt"
            + " from pms_member"
            + " where email = ? and password=password(?)")) {

      stmt.setString(1, email);
      stmt.setString(2, password);

      try (ResultSet rs = stmt.executeQuery()) {
        if (rs.next()) {
          Member member = new Member();
          member.setNo(rs.getInt("no"));
          member.setName(rs.getString("name"));
          member.setEmail(rs.getString("email"));
          member.setPhoto(rs.getString("photo"));
          member.setTel(rs.getString("tel"));
          member.setRegisteredDate(rs.getDate("cdt"));
          return member;
        } else {
          return null;
        }
      }
    }
  }

LogoutCommand클래스

map객체에서 loginUser정보를 remove해주면 끝이다

import java.util.Map;
import com.eomcs.pms.domain.Member;

// Command 규칙에 따라 클래스를 정의한다.
public class LogoutCommand implements Command {

  @Override
  public void execute(Map<String, Object> context) {
    Member loginUser = (Member) context.get("loginUser");
    if(loginUser == null) {
      System.out.println("로그인 상태가 아닙니다.");
      return;
    }
    System.out.printf("%s님 안녕히가세요!", loginUser.getName());
    context.remove("loginUser");
  }
}

태그:

카테고리:

업데이트:

댓글남기기