지금 우리 프로젝트에 몇가지의 클래스들이 좀 있잖아? 이거를 motivation할 때 처럼 패키지로 나눠서 분류를 해볼거야.
또요? 코드짜는거보다 더 어려워요.. 흑흐극
Controller model과 view를 연결시켜주는 역할
- controller package -> ArticleController, Controller, MemberController
Dao DB에 접근 하려고할 때 쿼리문 적는 곳
- dao package -> ArticleDao, MemberDao
Dto 사용할 변수들 선언하는 곳
- dto pacakge -> Article, Dto, Member
Exception SQL 예외처리를 담당 하는 곳
- exception package -> SQLErroException
Service ctroller가 요청을 받으면 적절한 서비스로 연결해서 서비스가 dao로 전달해주는 역할
- service - > ArticleService, MemberService
Util
- util -> DBUtil(sql문을 메서드 형식으로 저장해서 상황에 맞는 메서드 호출하면서 사용), SecSql()
그 외 App, Main, Util
저번에 회원가입을 했으니까 이번에는 회원가입한 id를 이용해서 로그인 기능을 만들어보자. 로그인 기능은 Membercotroller 클래스에 만들어야겠지??
이제 그정도는 알아요!!
System.out.println("==로그인==");
while (true) {
System.out.print("로그인 아이디 : ");
loginId = sc.nextLine().trim();
if (loginId.length() == 0 || loginId.contains(" ")) {
System.out.println("아이디 똑바로 써");
continue;
}
boolean isLoginIdDup = memberService.isLoginIdDup(loginId);
if (isLoginIdDup == false) {
System.out.println(loginId + "은(는) 없어");
continue;
}
break;
}
Member member = memberService.getMemberByLoginId(loginId);
int tryMaxCount = 3;
int tryCount = 0;
while (true) {
if (tryCount >= tryMaxCount) {
System.out.println("비번 다시 확인하고 시도해");
break;
}
System.out.print("비밀번호 : ");
loginPw = sc.nextLine().trim();
if (loginPw.length() == 0 || loginPw.contains(" ")) {
tryCount++;
System.out.printf("비번 똑바로 써(%d/3)\n", tryCount);
continue;
}
if (member.getLoginPw().equals(loginPw) == false) {
tryCount++;
System.out.printf("일치하지 않아(%d/3)\n", tryCount);
continue;
}
로그인 기능을 구현하기 전에 나는 비밀번호 횟수를 제한 하는 형식으로 했어. 우리도 다른 사이트 로그인 할 떄 막 5회제한 이런거 있잖아.
isLoginIdDup 변수로 아이디가 있는지 없는지 판별을 해야하는데 이제 리팩토링을 했기 때문에 memberService한테 isLoginIdDup메서드를 수행해서 값을 가져와야 해!
그리고 getMemberByLoginId메서드를 수행해서 loginId를 가져와서 member변수에 저장을 해야하는데, 이 친구도 물론 Service한테 달라고 요청을 해야해
이제 비밀번호는 tryMaxCount변수를 이용해 최대 카운트 갯수를 선언하고 tryCount변수를 이용해 비밀번호를 잘못치거나 값이 없을 때 1씩 증가시켜 제한을 걸어둘거야.
그리고 이제 로그인이 되어있어야지 우리의 기능들을 이용 할 수 있어. 그러려면 프로그램이 우리를 기억하고 있어야 되잖아? 그래서 Session을 이용해 로그인이 되어있는 상태를 만들어보고 이걸 이용해 로그아웃도 진행할거야. 그래서 로그인이 안되어있으면 로그인 하고 이용하라고 문구를 띄워보자. ~~너무 깐깐하시네요..
public class Session {
public Member loginedMember;
public int loginedMemberId;
public Session() {
loginedMember = null;
loginedMemberId = -1;
}
public void logout() {
loginedMember = null;
loginedMemberId = -1;
}
public void login(Member member) {
Container.session.loginedMember = member;
Container.session.loginedMemberId = member.getId();
}
public boolean isLogined() {
return loginedMemberId != -1;
}
}
Session클래스는 먼저 Container클래스에 static변수로 선언을 하고 활용을 해야 프로그램 전역에서 Container.session를 통해 로그인 상태를 확인 할 수 있어
그럼 이걸 어떻게 하냐? 바로 MemberController측에서 로그인을 하는 시점에 Session에 저장을 해두면 되겠지
그래서 Session클래스의 login메서드 보이지? 저거를 이용해 로그인 하고 비밀번호 까지 완료 한 후 Container.session.login(member); 이렇게 추가해 주면 기억을 session이 해줄거야.
느낀점
확실히 프로그램이 점점 커지니까 신경써야할 점도 많고 인텔리제이랑 Db를 연결하니까 정말 게시판을 만들 수 있구나 라는 느낌을 받으면서 얼른 프론트까지 합쳐서 나만의 프로젝트를 완성하고 싶어졌다. 생각보다 프론트는 꾸미는거라 재미 있을수도....ㅎㅎㅎ 얼른 코드들을 다루는 능력이 향상되어 자신감도 높아지고 재밌게 프로젝트를 하는 순간이 왔으면 좋겠따. 그러려면 복습이 필수겠지만 화이팅 해야지