자바에서 로그인/로그아웃 구현하기
업데이트:
이 포스트에서 구현하는 로그인/로그아웃 방식은 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");
}
}
댓글남기기