JX405기_비트/Java

Day04-4 로그인과 게시판 의존성DI 주입하기

_하루살이_ 2023. 1. 16. 16:22

실행되는 Board 메인 메소드

BoardDTO, UserDTO 연결하기 위해서는 서로 의존적으로 만듬
의존성 주입(DI)시키는 방법 2가지
1. 생성자를 통한 주입 Scanner를 생성자에 넣어줌
2. Setter를 통한 주입

package day0112;

import View.BoardViewer;
import View.UserViewer;

import java.util.Scanner;

public class Ex03Board02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        BoardViewer boardViewer = new BoardViewer(scanner);
        UserViewer userViewer = new UserViewer(scanner);

        userViewer.setBoardViewer(boardViewer);
        // Setter 를 통해서 해당 boardViewer 필드를 주입
        boardViewer.setUserViewer(userViewer);

        userViewer.showIndex();
    }


}

 

BoardDTO

package model;

public class BoardDTO {
    private int id;
    private String title;

    private int writerId;

    private String writerNickname;

    private String content;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getWriterId() {
        return writerId;
    }

    public void setWriterId(int writerId) {
        this.writerId = writerId;
    }

    public String getWriterNickname() {
        return writerNickname;
    }

    public void setWriterNickname(String writerNickname) {
        this.writerNickname = writerNickname;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public boolean equals(Object o){
        if (o instanceof BoardDTO){
            BoardDTO b =(BoardDTO) o;
            return id == b.id;
        }
        return false;
    }
    public BoardDTO(BoardDTO original){
        id = original.id;
        title = original.title;
        writerId = original.writerId;
        writerNickname = original.writerNickname;
        content = original.content;
    }

    public BoardDTO(){

    }

    public BoardDTO(int id){
        this.id = id;
    }

}

BoardController

package Controller;

import model.BoardDTO;

import java.util.ArrayList;

public class BoardController {
    private ArrayList<BoardDTO> list;
    private int nextId;

    public BoardController(){
        list = new ArrayList<>();
        nextId = 1;

        for (int i = 1; i <= 4; i++) {
            BoardDTO b = new BoardDTO();
            b.setTitle("제목 " + i);
            b.setWriterId(1);
            b.setWriterNickname("일반회원1");
            b.setContent(i + "번째 게시글의 내용입니다.");

            add(b);
        }
    }

    public void add(BoardDTO boardDTO){
        boardDTO.setId(nextId++);
        list.add(boardDTO);
    }

    public BoardDTO selectOne(int id){
        BoardDTO temp = new BoardDTO(id);
        if (list.contains(temp)){
            return new BoardDTO(list.get(list.indexOf(temp))); // 깊은 복사
        }

        return null;
    }

    public ArrayList<BoardDTO> selectAll(){
        ArrayList<BoardDTO> temp = new ArrayList<>();
        for (BoardDTO b : list){
            temp.add(new BoardDTO(b)); // 깊은 복사
        }

        return temp;
    }

    public void update(BoardDTO boardDTO){
        list.set(list.indexOf(boardDTO), boardDTO);
    }

    public void delete(int id){
        list.remove(new BoardDTO(id));
    }




}

BoardViewer

package View;

import Controller.BoardController;
import model.BoardDTO;
import model.UserDTO;
import util.ScannerUtil;

import java.util.ArrayList;
import java.util.Scanner;

public class BoardViewer {
    private final Scanner SCANNER;

    private BoardController boardController;

    private UserViewer userViewer;
    private BoardDTO boardDTO = null;

    private UserDTO login;

    public BoardViewer(Scanner scanner){
        SCANNER = scanner;
        boardController = new BoardController();
    }

    public void setUserViewer(UserViewer userViewer){
        this.userViewer = userViewer;
    }

    public void setLogin(UserDTO login){
        this.login = login;
    }
    public void showMenu(){
        String message = "1. 새 글 작성하기 2. 글 목록 보기 3. 종료";
        while (true){
            int userChoice = ScannerUtil.nextInt(SCANNER, message);
            if (userChoice == 1){
                writeBoard();
            } else if (userChoice == 2){
                printList();
            } else if (userChoice == 3) {
                System.out.println("사용해주셔서 감사합니다.");
                break;
            }
        }
    }

    private void writeBoard(){
        BoardDTO boardDTO = new BoardDTO();
        String message;

        boardDTO.setWriterId(login.getId());
        boardDTO.setWriterNickname(login.getNickname());

        message = "글의 제목을 입력하시오.";
        boardDTO.setTitle(ScannerUtil.nextLine(SCANNER, message));

        message = "글의 내용을 입력하시오.";
        boardDTO.setContent(ScannerUtil.nextLine(SCANNER, message));

        boardController.add(boardDTO);

    }

    private void printList(){
        ArrayList<BoardDTO> list = boardController.selectAll();
        if (list.isEmpty()){
            System.out.println("아직 등록된 글이 없습니다.");
        } else {
            for (BoardDTO b : list){
                System.out.printf("%d. %s\n", b.getId(), b.getTitle());
            }

            String message = "상세보기할 글의 번호나 뒤로 가실려면 0을 입력해주세요.";
            int userChoice = ScannerUtil.nextInt(SCANNER, message);

            BoardDTO b = new BoardDTO();
            b.setId(userChoice);

            while (userChoice != 0 && !list.contains(new BoardDTO(userChoice))){
                System.out.println("잘못 입력하셨습니다.");
                userChoice = ScannerUtil.nextInt(SCANNER, message);
                b.setId(userChoice);
            }

            if (userChoice != 0){
                printOne(userChoice);
            }
        }
    }
    private void printOne(int id){
        BoardDTO boardDTO = boardController.selectOne(id);
        System.out.println("==========================================");
        System.out.println(boardDTO.getTitle());
        System.out.println("------------------------------------------");
        System.out.println("글번호: " + boardDTO.getId());
        System.out.println("글 작성자: " + boardDTO.getWriterNickname());
        System.out.println("------------------------------------------");
        System.out.println(boardDTO.getContent());
        System.out.println("==========================================");

        String message;
        int userChoice;

        if (boardDTO.getWriterId() == login.getId()){
            // 글을 작성한 사람의 아이디와 로그인한 사람의 아이디 같은지 확인
            message = "1. 수정 2. 삭제 3. 뒤로 가기";
            userChoice = ScannerUtil.nextInt(SCANNER, message, 1, 3);

        } else {
            message = "3. 뒤로 가기";
            userChoice = ScannerUtil.nextInt(SCANNER, message,3,3);
        }

        if (userChoice == 1){
            update(id);
        } else if (userChoice == 2){
            delete(id);
        } else {
            printList();
        }
    }
    private void update(int id){
        BoardDTO b = boardController.selectOne(id);

        String message = "새로운 제목을 입력해주세요.";
        b.setTitle(ScannerUtil.nextLine(SCANNER, message));

        message = "새로운 내용을 입력해주세요.";
        b.setContent(ScannerUtil.nextLine(SCANNER, message));

        boardController.update(b);

    }

    private void delete(int id){
        String message = "정말로 삭제하시겠습니까? Y/N";
        String yesNo = ScannerUtil.nextLine(SCANNER, message);
        if (yesNo.equalsIgnoreCase("Y")){
            // equalsIgnoreCase() 대소문자 상관업이 특정문자가 같은지 확인할 때 사용하는 메소드
            boardController.delete(id);
            printList();
        } else {
            printOne(id);
        }
    }



}

UserController

package Controller;

import model.UserDTO;

import java.util.ArrayList;

public class UserController {
    private ArrayList<UserDTO> list;
    // ArrayLis<제네릭> : ArrayList 가 어떤것을 모아두었는지 적는 것
    private int nextId;
    public UserController(){
        list = new ArrayList<>();
        nextId = 1;
    }

    // CRUD
    public void insert(UserDTO userDTO){
        userDTO.setId(nextId++);
        list.add(userDTO);
    }

    public UserDTO selectById(int id){
        for (UserDTO u : list){
            if (u.getId() == id){
                return new UserDTO(u);
            }
        }

        return null;
    }

    public void update(UserDTO userDTO){
        list.set(list.indexOf(userDTO), userDTO);
    }

    public void delete(int id){
        UserDTO u = new UserDTO();
        u.setId(id);
        list.remove(u);
    }

    public boolean validateUsername(String username){
        if (username.equalsIgnoreCase("X")){
            return false;
        }
        for(UserDTO u : list){
            if(username.equalsIgnoreCase(u.getUsername())){
                return false;
            }
        }

        return true;
    }

    public UserDTO auth(String username, String password){
        for (UserDTO u : list){
            if (username.equalsIgnoreCase(u.getUsername()) && password.equals(u.getPassword())){
                return new UserDTO(u);
            }
        }

        return null;
    }

}

UserViewer

package View;

import Controller.UserController;
import model.UserDTO;
import util.ScannerUtil;

import java.util.Scanner;

public class UserViewer {
    private final Scanner SCANNER;
    private UserController userController;
    private BoardViewer boardViewer;
    private UserDTO logIn = null;

    public UserViewer(Scanner scanner){
        SCANNER = scanner;
        userController = new UserController();
    }
    public void setBoardViewer(BoardViewer boardViewer){
        this.boardViewer = boardViewer;
    }

    public void showIndex(){
        String message = "1. 로그인 2. 회원가입 3. 종료";
        while (true){
            int userChoice = ScannerUtil.nextInt(SCANNER, message);
            if (userChoice == 1){
                auth();
                if (logIn != null){
                    boardViewer.setLogin(logIn);
                    showMenu();
                }
            } else if (userChoice == 2) {
                register();
            } else if (userChoice == 3) {
                System.out.println("사용해주셔서 감사합니다.");
                break;
            }
        }
    }

    private void register(){
        String message;
        message = "사용하실 아이디를 입력해주세요.";
        String username = ScannerUtil.nextLine(SCANNER, message);
        while (!userController.validateUsername(username)){
            System.out.println("해당 아이디는 사용하실 수 없습니다.");
            message = "사용하실 아이디나 뒤로 가실려면 \"X\"를 입력해주세요.";
            username = ScannerUtil.nextLine(SCANNER, message);

            if (username.equalsIgnoreCase("X")){
                break;
            }
        }
        if (!username.equalsIgnoreCase("X")){
            UserDTO u = new UserDTO();
            u.setUsername(username);

            message = "사용하실 비밀번호를 입력해주세요.";
            u.setPassword(ScannerUtil.nextLine(SCANNER,message));
            message = "사용하실 닉네임을 입력해주세요.";
            u.setNickname(ScannerUtil.nextLine(SCANNER, message));

            userController.insert(u);
        }

    }
    private void auth(){
        String message;
        message = "아이디를 입력해주세요.";
        String username = ScannerUtil.nextLine(SCANNER, message);

        message = "비밀번호를 입력해주세요.";
        String password = ScannerUtil.nextLine(SCANNER, message);

        logIn = userController.auth(username, password);

        if (logIn == null){
            System.out.println("로그인 정보가 정확하지 않습니다.");

        }

    }

    private void showMenu(){
        String message = "1. 게시판으로 2. 회원 정보관리 3. 로그아웃";
        while (logIn != null){
            int userChoice = ScannerUtil.nextInt(SCANNER,message);
            if (userChoice == 1){
                boardViewer.showMenu();
            } else if (userChoice == 2){
                printOne();
            } else if (userChoice == 3){
                logIn = null;
                System.out.println("정상적으로 로그아웃되었습니다.");
            }
        }
    }

    private void printOne(){
        System.out.println("회원 번호 : " + logIn.getId());
        System.out.println("회원 닉네임 : " + logIn.getNickname());
        System.out.println("--------------------------------------------");
        String message = "1. 수정 2. 탈퇴 3. 뒤로가기";
        int userChoice = ScannerUtil.nextInt(SCANNER,message);
        if (userChoice == 1){
            update();
        } else if (userChoice == 2){
            delete();
        }
    }

    private void update(){
        String message = "새로운 비밀번호를 입력해주세요.";
        String newPassword = ScannerUtil.nextLine(SCANNER, message);

        message = "새로운 닉네임을 입력해주세요.";
        String newNickname = ScannerUtil.nextLine(SCANNER,message);

        message = "기존 비밀번호를 입력해주세요.";
        String oldPassword = ScannerUtil.nextLine(SCANNER,message);

        if (logIn.getPassword().equals(oldPassword)){
            logIn.setNickname(newNickname);
            logIn.setPassword(newPassword);

            userController.update(logIn);
        } else {
            System.out.println("회원 정보 변경에 실패하였습니다.");
        }
    }

    private void delete(){
        String message = "정말로 삭제하시겠습니까? Y/N";
        String yesNo = ScannerUtil.nextLine(SCANNER, message);

        if (yesNo.equalsIgnoreCase("Y")){
            message = "비밀번호를 입력해주세요.";
            String password = ScannerUtil.nextLine(SCANNER, message);

            if(password.equals(logIn.getPassword())){
                userController.delete(logIn.getId());
                logIn = null;
            }
        }
    }
}