나의 수업일지

인천 일보 아카데미 12일차_2 만들며 익히기 (반복학습)

GUPING 2023. 3. 10. 00:22
  • 만들어보기_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;
	}
}