> 11일차에서는 그동안 배운 내용들을 모두 합하여
> 프로그램을 만들어보는 시간을 가졌습니다
> 먼저 클래스 DTO , Repository , Service ,Main 으로 나누어 만들었습니다
Scanner sc = new Scanner(System.in);
BoardServic service = new BoardServic();
while(true) {
System.out.println("====게시판====");
System.out.println("1.게시글등록 2.리스트 3.읽기 4.수정 5.삭제 0.종료");
System.out.print("선택 >");
int menu = sc.nextInt();
> 각 메소드의 기능을 세분화
> 메인에는 메소드 명령어만 작성하여 코딩의 길이를 줄이고 가독성을 높였습니다
> 전에 만들어본 프로그램과 비교하면 정말 짧아졌고 보기에도 매우 편합니다
if(menu==1) {
service.save(); > class service에 있는 save메소드를 실행하는 명렁문
}else if (menu ==2) {
service.findAll(); > class service에 있는 findAll메소드를 실행하는 명렁문
}else if (menu ==3) {
service.findById(); > class service에 있는 findById메소드를 실행하는 명렁문
}else if (menu ==4) {
service.update(); > class service에 있는 update메소드를 실행하는 명렁문
}else if (menu ==5) {
service.remove(); > class service에 있는 remove메소드를 실행하는 명렁문
}else if (menu ==0) {
System.out.println("종료합니다");
break;
}else {
System.out.println("없는 메뉴입니다");
}
}
}
}
> 담은 정보를 가공하는 곳
> 프로그램에서 명령문으로 Service의 메소드를 실행하면
> Service class로 넘어와 받은 정보를 하나로 합치게하였습니다
> 이해가 잘안될 수 있지만 메소드를 살펴보며 알아보겠습니다
public class BoardServic {
BoardRepositroy br = new BoardRepositroy();
Scanner sc = new Scanner(System.in);
public void save() { < 메뉴 1번 회원가입 save 메소드
BoardDTO boardDTO = new BoardDTO(); < 저장소 역활을 하는 DTO의 객체를 만들고
System.out.print("제목 >");
boardDTO.setTitle(sc.nextLine()); < 정보를 set으로 저장
System.out.print("작성자 >");
boardDTO.setWriter(sc.next()); < 정보를 set으로 저장
sc.nextLine();
boolean success = br.save(boardDTO);
> Repository의 save에 객체를 매개변수로 사용
> Repository class의 save를 살펴보자
> Repository save에서 정보가 list에 잘 저장되었다면 true를 하지 못하면 false를 리턴
if (success == true) { > 그렇기에 if문으로 조건을 걸어 각 출력문이 조건이 맞다면 출력하게하였습니다
System.out.println("게시글 등록완료!");
} else {
System.out.println("게시글 등록실패!");
}
}
> 이런식으로 Service class는 사용자에게 정보를 받아
> 하나로 합쳐 Repository로 넘겨주는 역활을 합니다
> 이렇게 나누면 처음 만들때는 조금 어지럽지만 이후 수정이나 실행 오류를 찾기 매우 쉬워집니다
public void findAll() {
List<BoardDTO> list = br.findAll();
System.out.println("글번호\t제목\t\t작성자\t조회수\t게시일");
System.out.println("==============================================");
for (BoardDTO b : list) {
b.print();
}
}
public void findById() {
System.out.println("읽을 글 번호");
String bno = sc.next();
BoardDTO boardDTO = br.findById(bno);
if (boardDTO == null) {
System.out.println("찾을 수 없는 글입니다");
} else {
boardDTO.increasesetCnt();
System.out.println("글번호\t제목\t\t작성자\t조회수\t게시일");
System.out.println("==============================================");
boardDTO.print();
}
}
> 게시글을 수정할때 사용하는 update 메소드입니다
> 하나의 Service 메소드에 2가지 Repository 메소드를 사용
public void update() {
System.out.print("수정 글 번호>");
String bno = sc.nextLine(); > 사용자가 수정하고 싶은 게시글의 번호를 받습니다
BoardDTO b = br.findById(bno);
> 받은 번호가 list에 있는 번호인지 알아야하기 때문에
> Repository 에 있는 findById 메소드에 매개변수로 넣어 찾아봅니다
> Repository를 살펴보겠습니다
> 이렇게 Repository에서 리턴받은 정보를 Service에서 만든 BoardDTO의 b객체에 담습니다
if (b == null) {
System.out.println("찾을 수 없는 글입니다");
> 조건문을 이용하여 담은 b에 null이 들어있으면 "없는 글"을 출력하고
> null이 아닌 정보가 들어 있다면 else로 넘어가게됩니다
} else {
BoardDTO boardDTO = new BoardDTO(); > 새로운 BoardDTO 객체를 만들수 있게하고
System.out.print("수정할 제목 >");
boardDTO.setTitle(sc.nextLine()); > 수정 정보를 만든 객체에 담습니다
System.out.print("수정할 작성자 >");
boardDTO.setWriter(sc.nextLine()); > 수정 정보를 만든 객체에 담습니다
if (br.update(boardDTO, bno)) {
System.out.println("업데이트 완료!");
> Repository에 객체와 처음 사용자가 입력한 게시글 번호를 매개변수로 사용합니다
> Reopsitory를 살펴보겠습니다
} else {
System.out.println("업데이트 실패!");
> 실행문에 문제가 있다면 업데이트 실패를 출력하게 하였습니다
}
}
}
> 내가 만든 삭제
public void remove() {
System.out.println("삭제할 글 번호 >");
String bno = sc.next();sc.nextLine();
BoardDTO boardDTO = br.findById(bno);
if (boardDTO == null) {
System.out.println("찾을 수 없는 글입니다");
} else {
br.remove(boardDTO);
System.out.println("삭제 완료");
}
}
> 선생님이 만든 삭제
public void delete() {
System.out.println("삭제할 글 번호");
String bno = sc.next();
if(br.delete(bno)) {
System.out.println("삭제 완료");
}else {
System.out.println("삭제 실패");
}
}
> 둘다 실행에 전혀 문제가 없지만
> 필드 , 메소드의 구성 상황에 따라 적소에 맞게 사용해야한다
}
package day11;
import java.util.ArrayList;
import java.util.List;
public class BoardRepositroy {
> 데이터 베이스 역활을하는 DTO에 정보를 넘겨주고 받아오는 class
private List<BoardDTO> list = new ArrayList<>();
public boolean save(BoardDTO boardDTO) {
return list.add(boardDTO); < 데이터 베이스 역활을 하는 DTO에 객체를 list로 저장
> 리턴 타입이 boolean인 이유는
> add는 list의 숨겨진 메소드이다
> 저장되면 true를 리턴하고 저장에 실패하면 false를 리턴한다
> 다시 Service class로 돌아가보자
}
public List<BoardDTO> findAll(){
return list;
}
public BoardDTO findById(String bno){ > 매개변수로 받은 bno
for(BoardDTO b : list) {
if(b.getBno().equals(bno)) {
return b;
}
> 향상된 for문을 이용하여 BoardDTO의 b객체를 만들고
> list를 대입하며 if문의 조건이 맞다면 b를 reuturn합니다
}
return null;
> if문의 조건에 맞지 않다면 사용자가 적은 게시글 번호가 없는 번호이거나
> 입력 오류 이기 때문에 null을 리턴하게 하였습니다
> 다시 Service로 넘어가겠습니다
}
public boolean update(BoardDTO boardDTO , String bno) { >매개 변수로 받은 객체와 bno
for(BoardDTO b : list) {
> 향상된 for문을 이용하여 Board b를 만들고 list를 담으며
> if문과 대조합니다
if(b.getBno().equals(bno)) {
b.setTitle(boardDTO.getTitle());
b.setWriter(boardDTO.getWriter());
return true;
> 처음 입력받은 bno가 있는 게시글 번호라면 수정 정보를 입력하고
> update 메소드가 실행되는 구조이기 때문에
> bno와 같은 정보를 가지고 있는 객체 b의 게시글 번호를 찾아
> 실행문으로 매개변수로 가져온 객체의 정보를 저장해준 모습입니다
> 이후 타입은 boolean이기 때문에 true를 리턴해줍니다
}
}
return false;
> 만약 프로그램에 문제가 있어 저장에 실패한다면 return으로 false를 줍니다
> 이제 다시 Service class를 살펴보겠습니다
}
// 내가만든 삭제
public void remove(BoardDTO boardDTO) {
list.remove(boardDTO);
}
// 선생님이 만든 삭제
public boolean delete(String bno) {
for(BoardDTO b : list) {
if(b.getBno().equals(bno)) {
list.remove(b);
return true;
}
}
return false;
}
}
> 데이터를 담아놓는 곳 class를 DTO , VO 라고 한다
public class BoardDTO {
private static int number = 100;
private final static DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yy/MM/dd hh:mm:ss");
private String bno;
private String rebno;
private String title;
private String writer;
private int cnt;
private String postDate;
public BoardDTO() { > 기본 생성자를 이용하여 BoardDTO의 객체가 만들어지면 자동으로 실행
this.bno = "B"+ number++;
this.postDate = DTF.format(LocalDateTime.now());
}
public void setRebno() {
this.bno = this.rebno;
}
public String getBno() {
return bno;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public int getCnt() {
return cnt;
}
public void increasesetCnt() {
this.cnt++;
}
public String getPostDate() {
return postDate;
}
public void print() {
System.out.printf("%s\t%s\t\t%s\t%d\t%s\n",bno,title,writer,cnt,postDate);
}
}
package day11;
import java.util.Scanner;
public class UserMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
UserService userservice = new UserService();
boolean loginOk = false;
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 = sc.nextInt();
if (menu == 1) {
if (loginOk == true) {
}
userservice.save();
} else if (menu == 2) {
if (loginOk == true) {
loginOk=false;
continue;
}
loginOk = userservice.FindbyLogin();
} else if (menu == 3) {
if (loginOk == true) {
}
userservice.findAll();
} else if (menu == 4) {
if (loginOk == true) {
}
System.out.print("변경할 도메인 >");
UserDTO.setDomain(sc.next());
} else if (menu == 0) {
break;
} else {
System.out.println("없는 메뉴");
}
System.out.println();
}
System.out.println("프로그램 종료");
}
}
> 아직 미완성이기 때문에 한번 쭉 읽어보며 어떻게 작동하는지 알아보자
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class UserService {
UserRepsitroy repository = new UserRepsitroy();
Scanner sc = new Scanner(System.in);
public void save() {
System.out.print("이메일 >");
String email = sc.next();
System.out.print("비밀번호 >");
String password = sc.next();
System.out.print("이름 >");
String name = sc.next();
System.out.print("나이 >");
int age = sc.nextInt();
UserDTO userDTO = new UserDTO(email,password,name,age);
if(repository.save(userDTO)) {
System.out.println("가입 완료");
}else {
System.out.println("가입 실패");
}
}
public boolean FindbyLogin() {
System.out.print("이메일 >");
String loginId = sc.next();
System.out.print("비밀번호 >");
String loginPw = sc.next();
if(repository.FindbyLogin(loginId, loginPw)) {
System.out.println("로그인 성공");
return true;
}else {
System.out.println("로그인 실패");
return false;
}
}
public void findAll() {
List<UserDTO> list = repository.findAll();
System.out.println("이메일\t\t비밀번호\t이름\t나이\t가입일");
System.out.println("-------------------------------------------------");
for(UserDTO u : list) {
System.out.println(u.toString());
}
}
}
package day11;
import java.util.ArrayList;
import java.util.List;
public class UserRepsitroy {
List<UserDTO> list = new ArrayList<>();
public boolean save(UserDTO userDTO) {
return list.add(userDTO);
}
public boolean FindbyLogin(String id , String pw) {
for(UserDTO userDTO : list) {
if(userDTO.getEmail().equals(id)&&userDTO.getPassword().equals(pw)) {
return true;
}
}
return false;
}
public List<UserDTO> findAll(){
return list;
}
}
package day11;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class UserDTO {
private final static DateTimeFormatter DFT = 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 = DFT.format(LocalDateTime.now());
}
public UserDTO(String email, String password, String name, int age) {
this(); 메소드에서 기본 생성자를 호출하는 방법
this.email = email +"@"+domain;
this.password = password;
this.name = name;
this.age = age;
}
public static String getDomain() {
return domain;
}
public static void setDomain(String domain) {
UserDTO.domain = domain;
> static을 메소드에 넣으면 공용 메소드가 되는데 공유 메서드에서는 this를 사용할 수 없다
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
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;
}
public String getJoinDate() {
return joinDate;
}
public String toString() {
return email+"\t"+password+"\t"+name+"\t"+age+"\t"+joinDate;
> UserDTO를 숨겨져있는 toString을 상속받아 오버라이딩 한 모습
> toString은 재정의 하지 않으면 출력이 정상적으도되지 않는다
}
}