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;
}
}
}
}