[자바 JDBC 게시판] 7일차

김정현·2022년 8월 17일

JDBC게시판

목록 보기
5/9

1 . 로그인 기능 구현

1) 로그인 아이디 체크

public void login() {
		System.out.println("== 로그인 ==");	
	int loginIdTryCount = 0;
	int loginIdTryMaxCount = 3;
	String loginId = null;
	String loginPw = null;
	while (true) {
		if (loginIdTryCount >= loginIdTryMaxCount) {
			System.out.println("아이디를 확인하고 다시 시도해주세요.");
			return;
		}
		System.out.printf("아이디 입력 :  ");
		loginId = sc.nextLine().trim();
		if (loginId.length() == 0) {
			loginIdTryCount++;
			System.out.println("아이디를 입력해 주세요.");
			continue;
		}
		boolean isLoginDup = memberService.isLoginIdDup(loginId);
		if (isLoginDup == false) {
			loginIdTryCount++;
			System.out.printf("%s는(은) 존재하지 않는 아이디입니다.\n", loginId);
			continue;
		}
		break;
	}
  • DB의 member테이블에 입력받은 아이디가 있어야 로그인이 가능
  • memberService.isLoginIdDup(loginId) 메소드를 통해 아이디가 존재하는지 여부를 확인
  • 공백을 입력하거나 일치하는 아이디가 없을시 loginIdTryCount++;하여 3이상이 나오게 되면
  • 즉, 3번시도 후 로그인 기능( login( ) )을 return

2) 로그인 비밀번호 체크

Member member = memberService.getMemberByLoginId(loginId);
	int loginPwTryCount = 0;
	int loginPwTryMaxCount = 3;

	while (true) {
		if (loginPwTryCount >= loginPwTryMaxCount) {
			System.out.println("비밀번호를 확인하고 다시 시도해주세요.");
			return;
		}
		System.out.printf("비밀번호 입력 :  ");
		loginPw = sc.nextLine();

		if (loginPw.length() == 0) {
			loginPwTryCount++;
			System.out.println("비밀번호를 입력해 주세요.");
			continue;
		}
		if (member.loginPw.equals(loginPw) == false) {
			loginPwTryCount++;
			System.out.println("비밀번호가 일치하지 않습니다.");
			continue;
		}
		break;
	}

	System.out.printf("%s님 로그인 성공\n", member.name);
}
  • memberService.getMemberByLoginId(loginId) 메소드를 통해 입력받은 loginId와 일치하는 회원(Member)을 찾음

  • 찾은 회원의 비밀번호와 입력받은 비밀번호가 일치하는지 체크하고

  • loginId입력과 동일하게 3번 공백이거나 일치하지 않으면 return

3) DB를 조회하여 얻은 데이터는 Map타입이므로 member(memberMap) 생성자를 추가

//Map<String, Object> memberMap =DBUtil.selectRow(conn, sql);

public Member(Map<String, Object> memberMap) {
		this.id = (int)memberMap.get("id");
		this.regDate = (LocalDateTime) memberMap.get("regDate");
		this.updateDate = (LocalDateTime) memberMap.get("updateDate");
		this.loginId = (String)memberMap.get("loginId");
		this.loginPw = (String)memberMap.get("loginPw");
		this.name = (String)memberMap.get("name");
	}

2 . Container 도입

1) 문제점

private int action(Connection conn, Scanner sc, String cmd) {
		MemberController memberController = new MemberController(conn,sc);		
		ArticleController articleController = new ArticleController(conn,sc);
  • 연결시마다 ( action() 을 실행할때마다 ) 새로 Controller들을 생성함

  • 현재 controller 안에 필드로 service가 있고 service 안에 필드로 dao가있다. 각각 실행할때마다 생성되고있다.

  • 이를 해결하기 위해 container 도입

2) Container

	public class Container {
	public static ArticleController articleController;
	public static MemberController memberController;
	public static ArticleService articleService;
	public static MemberService memberService;

	public static ArticleDao articleDao;
    public static MemberDao memberDao;

	public static Session session;

	public static Scanner sc;

	public static Connection conn;

	public static void init() {
		session = new Session();

		articleDao = new ArticleDao();
		memberDao = new MemberDao();

		articleService = new ArticleService();
		memberService = new MemberService();

		articleController = new ArticleController();
		memberController = new MemberController();
		}
}
  • 각각의 controller , service , dao 를 init( ) 메소드를 통해 생성

3) conn을 Container.conn으로 전달

		try {
			conn = DriverManager.getConnection(url, "root", "");
			Container.conn = conn;

			int actionResult = action(cmd);

			if (actionResult == -1) {
				break;
			}
  • 이전에는 conn 을 controller → service → dao로 생성자를 통해 전달하였지만
  • DB연결 후 Container.conn 로 전달하여 (conn이 필요한) dao 에서는 Container.conn을 사용하게 하여 각각의 controller와 service들의 생성자로 conn이 필요 없어짐

4) Main에서 에러메세지를 보여줄 수 있도록 처리

	public static int update(Connection dbConn, SecSql sql) {
			int affectedRows = 0;
			PreparedStatement stmt = null;
		try {
			stmt = sql.getPreparedStatement(dbConn);
			affectedRows = stmt.executeUpdate();
		} catch (SQLException e) {
			throw new SQLErrorException("SQL 예외, SQL : " + sql, e);
  • 위에 코드를 보면 update메소드 실행시 SQLException이 발생하면
  • throw new SQLErrorException을 발생 시키고있다.
  • 이때 F6을 누르면 예외메시지를 알수 있지만
	try {
		new App().run();
	} catch (SQLErrorException e) {
			System.err.println(e.getMessage());
			e.getOrigin().printStackTrace();
	}
  • Main에서 에러메시지를 console에 출력하도록 함

3 . member profile 구현

1) Session에 로그인 시 member,memberId 저장

    public class Session {
        public int loginedMemberId;
        public Member loginedMember;
    public Session() {
        loginedMemberId = -1;
        }
   }
	public void login(String cmd) {
		if(Container.session.loginedMemberId != -1) {
			System.out.println("로그아웃 후 이용 가능합니다.");
			return;
		}	
		
		~~~~~~~~~~~~~~~~~
		
		Container.session.loginedMember = member;
		Container.session.loginedMemberId = member.id;
		
		System.out.printf("%s님 환영합니다.\n", member.name);
		break;
	}
  • 로그인시 Container안에 session에 loginedMember, loginedMemberId를 저장
  • 저장된 loginedMember, loginedMemberId를 바탕으로 로그인했을때 안했을때 가능한 기능들을 구현할 예정

2) member profile

	public void showProfile(String cmd) {
    	if(Container.session.loginedMemberId==-1) {
      	  System.out.println("로그인 후 이용가능합니다.");
        	return;
  	 }else {	 
     System.out.printf("번호  :  %d\n", Container.session.loginedMember.id);
     System.out.printf("아이디  :  %s\n"Container.session.loginedMember.loginId); 
     System.out.printf("이름  :  %s\n", Container.session.loginedMember.name);
 }
  • profile은 로그인된 멤버의 정보를 보여주는것으로
  • 로그인시 Container.session.loginedMemberId에 memberId를 저장하므로 -1이 아니다.
  • 저장하지 않았을경우 -1, loginedMemberId가 -1일 경우를 체크하여 return

0개의 댓글