- 만들어보기_User_Main
> 반복하여 코드와 사용방법을 좀더 빠르게 익혀보는 시간이였습니다
> 코딩에 빠르게 익숙해 질 수 있는 좋은 시간이였습니다
> 먼저 Main class로 사용자가 보기 편하게 메뉴를 출력하였고
> 입력받은 메뉴에따라 Service의 각메소드가 실행되게 하였습니다
public class UserMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
Userservice service = Userservice.getInstance(); > 싱글톤으로 만든 객체를 사용하는 방법
Util util = new Util();
boolean loginOk = false; < 사용자가 로그인할경우 메뉴를 하나 더 사용하기 위한 loginOk
while (true) {
System.out.println("====" + UserDTO.getDomain() + "====");
if (loginOk) {
System.out.println("1.정보읽기 2.로그아웃 3.회원수정 4.회원탈퇴 0.종료");
} else {
System.out.println("1.회원가입 2.로그인 3.리스트 4.도메인변경 0.종료");
}
System.out.print("선택 >");
int menu = util.numberCheck();
if (menu == 1) {
if (loginOk) {
service.findById();
} else {
service.save();
}
} else if (menu == 2) {
if (loginOk) {
loginOk = service.logout();
} else {
loginOk = service.login();
> 사용자가 로그인에 성공하면 service의 메소드에서 ture를 리턴하고
> 그리턴을 loginOk에 대입하여 로그인 될 경우
> 로그아웃 , 종료 전까지는 사용자가 선택한 메뉴에 따라 if문에 있는 service 메소드가 실행된다
}
} else if (menu == 3) {
if (loginOk) {
loginOk =service.resave();
} else {
service.list();
}
} else if (menu == 4) {
if (loginOk) {
loginOk =service.userout();
} else {
service.domainChange();
}
} else if (menu == 0) {
break;
} else {
System.out.println("다시입력");
}
System.out.println();
}
System.out.println("시스템 종료");
}
}
- 만들어보기_User_Service
> 사용자가 입력한 정보를 가공하는 역활을하는 service class
> class를 이렇게 여러개 만들어서 만들어보기를 진행하는 이유는
> 데이터베이스와 세션의 진행 방식을 알아보며 만들어보기 위함입니다
> 반복적인 만들기이기에 자세한 설명은 생력하고 새로 추가된 내용만 설명하며 넘어가겠습니다
public class Userservice {
Util util = new Util();
String loginEmail = null; > 대충 세션 역활을하는 필드
String loginPassword = null; > 대충 세션 역활을하는 필드
private static Userservice service = new Userservice(); > static 변수로 객체 생성
private Userservice() {} > 외부에서 new로 객체를 생성할 수 없게 생성자를 private으로 선언
public static Userservice getInstance() {
> 필드로 선언된 객체를 리턴하는 메소드
return service;
> 가공역활을 하는 service는 굳이 객체를 만들 필요가 없이 하나로만 사용해도 상관 없기 때문에
> 메모리를 아끼기 위해 객체가 늘어나지 못하게 싱글톤이라는 방법을 사용합니다
> class를 private로 잠구는 경우 해당 class에서만 새로운 객채를 만들 수 있는데
> 위에서 변수를 만들어주고 static을 이용해 공유 객체를 만들고 이 공유 객체를
> 메소드로 리턴해 다른 class에서 받아 객체를 사용하는 방식을 사용한다
> 맞는지 모르겠다
}
UserRepository repository = UserRepository.getInstance();
> 싱글톤으로 만든 객체를 다른 class에서 사용하는 방법
> 잘보면 new로 새로 만드는것이 아닌 메소드를 호출하여 repositroy에 객체를 대입받음
Scanner sc = new Scanner(System.in);
public void save() {
UserDTO userDTO = new UserDTO();
System.out.print("이름 >");
userDTO.setName(sc.next());
System.out.print("이메일 >");
userDTO.setEmail(sc.next());
System.out.print("비밀번호 >");
userDTO.setPassword(sc.next());
System.out.print("나이 >");
userDTO.setAge(sc.nextInt());
if (repository.save(userDTO)) {
System.out.println("회원가입 완료");
} else {
System.out.println("회원가입 실패");
}
}
public boolean login() {
System.out.print("이메일 입력 >");
String email = sc.next();
System.out.print("비밀번호 입력 >");
String pw = sc.next();
if (repository.login(email, pw)) {
System.out.println("로그인 성공");
loginEmail = email;
loginPassword = pw;
return true;
} else {
System.out.println("로그인 실패");
return false;
}
}
public void list() {
List<UserDTO> array = repository.list();
System.out.println("이메일\t\t비밀번호\t이름\t나이\t가입일");
System.out.println("----------------------------------------------");
for (UserDTO s : array) {
System.out.println(s.toString());
}
}
public void domainChange() { < 이번 만들기는 유사 사이트로그인창으로 도메인이 추가되었습니다
String before = UserDTO.getDomain(); < 실행문에서 사용하기위해 기존 도메인을 before에 대입
System.out.print("변경할 도메인 >");
UserDTO.setDomain(sc.next());
> 변경할 도메인을 입력받고 DTO객체에 저장
> 정보를 받지 않고 이렇게 저장할 수 있는 이유는
> domain필드와 메소드가 Static으로 모든 객체에서 공유하기 때문입니다
System.out.println(before + "=>" + UserDTO.getDomain() + "변경완료!");
}
public void findById() { < 로그인 후 로그인아이디의 정보를 출력하는 메소드
if (loginEmail == null || loginPassword == null) {
System.out.println("로그인 오류");
return;
}> 세션이 없기 때문에 필드에서 로그인이 완료되면 String에 id 와 pw가 저장된다
> 하지만 저장된 값이 없다면 로그인 되지 않고 어떠한 문제로 메소드가 호출된것이기 때문에
> 로그인 오류를 출력하게 하였습니다
UserDTO userDTO = repository.findById(loginEmail, loginPassword);
> Repository에 있는 findById 메소드에 필드에 저장된 id , pw를 매개변수로 사용하고
> Arraylist에 있는 정보가 id , pw 와 같은 list를 DTO객체에 대입하였습니다
if (userDTO == null) { > 만약 대입 받은 정보가 null이면 세오류를
System.out.println("세션 오류");
} else { > 대입 받은 정보가 list라면 list를 출력합니다
System.out.println("이메일\t\t비밀번호\t이름\t나이\t가입일");
System.out.println("----------------------------------------------");
System.out.println(userDTO.toString());
}
}
public boolean logout() {
loginEmail = null;
loginPassword = null;
return false;
} > 딱히 필요 없는 메소드
public boolean resave() { > 사용자의 정보를 변경하는 메소드
UserDTO userDTO = repository.findById(loginEmail, loginPassword);
> 위와 마찬가지로 세션 역활을 하는 필드 id pw를 매개변수로 list를 찾습니다
> DTO의 객체에 대입하고 대입 받은 값이 NULL이라면 오류를 출력
> 대입 받은 값이 NULL이 아니라면 수정을 진행합니다
if (userDTO == null) {
System.out.println("세션 오류");
return true;
} else {
System.out.println("이름 >");
String name = sc.next();
System.out.println("이메일 >");
String email = sc.next(); > 사용자가 수정할 정보를 입력받고
System.out.println("비밀번호 >");
String pw = sc.next();
repository.resave(name , email ,pw ,userDTO);
> Repository에 있는 메소드를 이용하여 사용자의 정보에 덮어씌워줍니다
}
return false; > 수정이 완료되면 false로 자동 로그아웃되게 만들었습니다
}
public boolean userout() { < 회원 탈퇴 메소드
UserDTO userDTO = repository.findById(loginEmail, loginPassword);
> 위와 마찬가지로 세션 역활을 하는 필드 id pw를 매개변수로 list를 찾습니다
> DTO의 객체에 대입하고 대입 받은 값이 NULL이라면 오류를 출력
> 대입 받은 값이 NULL이 아니라면 삭제를 진행합니다
if(userDTO == null) {
System.out.println("오류덩어리!");
return true;
}else { >
repository.userout(userDTO);
> Repository에 있는 userout 메소드에 매개변수로 유저의 정보가 들어있는 객체
> DTO를 사용합니다 이후의 실행방식은 아래의 Repository를 살펴보겠습니다
System.out.println("탈퇴 완료");
return false; < 삭제가 완료되면 자동으로 로그아웃되게 만들기위해 리턴FALSE를 넘겨줍니다
}
}
}
- 만들어보기_User_Repository
package day12;
import java.util.ArrayList;
import java.util.List;
public class UserRepository {
> static 변수로 객체 생성
private static UserRepository repository = new UserRepository();
> 외부에서 new로 생성할 수 없게 생성자를 private으로 선언
private UserRepository() {
> 필드로 선언된 객체를 리턴하는 메소드
}
public static UserRepository getInstance() {
return repository;
}
List<UserDTO> list = new ArrayList<>();
public boolean save(UserDTO userDTO) {
return list.add(userDTO);
}
public boolean login(String Email, String pw) {
for (UserDTO s : list) {
if (s.getEmail().equals(Email) && s.getPassword().equals(pw)) {
return true;
}
}return false;
}
public List<UserDTO> list() {
return list;
}
public UserDTO findById(String loginEmail , String loginPassword) {
for(UserDTO s : list) {
if(s.getEmail().equals(loginEmail)&&s.getPassword().equals(loginPassword)) {
return s;
< 세션 역활을 하는 필드 id , pw 에 저장된 값과 동일한 정보가 있는
< 리스트를 DTO 객체 s에 대입하고 S를 리턴해준다
}
}
return null;
}
public void userout(UserDTO userDTO) { < 매개변수로 객체를 받고
list.remove(userDTO); < remove에 유저정보가 들어있는 DTO객체를 넣어 실행해줍니다
}
public void resave(String name , String email , String pw , UserDTO userDTO) {
for(UserDTO s : list) { < 로그인 유저의 정보를 수정하는 메소드
if(s.equals(userDTO)) < 충분히 이해가 가능하기 때문에 읽어보자
s.setEmail(email);
s.setName(name);
s.setPassword(pw);
}
}
}
- 만들어보기_User_DTO
> DTO역활을하는 CLASS 읽어보자
public class UserDTO {
private final static DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yy/MM/dd hh:mm:ss");
private static String domain = "naver.com";
private String email;
private String password;
private String name;
private int age;
private String joinDate;
public UserDTO () {
this.joinDate = DTF.format(LocalDateTime.now());
}
public static String getDomain() {
return domain;
}
public static void setDomain(String domain) {
UserDTO.domain = domain;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email +"@"+domain;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
String str = email+"\t"+password+"\t"+name+"\t"+age+"\t"+joinDate;
return str;
}
}
'나의 수업일지' 카테고리의 다른 글
인천 일보 아카데미 13일차 do_while / try_catch_finally / 다형성 (0) | 2023.03.12 |
---|---|
숙제)아이디 중복 체크 저장용 (0) | 2023.03.12 |
인천 일보 아카데미 12일차_1 만들며 익히기 (반복학습) (0) | 2023.03.09 |
인천 일보 아카데미 11일차 4개의 클래스를 사용하여 만들어보기 (0) | 2023.03.08 |
인천 일보 아카데미 10일차 확장_상속자_오버라이딩 / 추상화 (0) | 2023.03.07 |