나의 수업일지

인천 일보 아카데미 11일차 4개의 클래스를 사용하여 만들어보기

2023. 3. 8. 23:38
  • 만들어보기_메인
> 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("없는 메뉴입니다");
            }
        }
    }
}
  • 만들어보기_Serivce
> 담은 정보를 가공하는 곳
> 프로그램에서 명령문으로 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("삭제 실패");
        }
    }

    > 둘다 실행에 전혀 문제가 없지만
    > 필드 , 메소드의 구성 상황에 따라 적소에 맞게 사용해야한다
}
  • 만들어보기_Repository
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;
        }
}
  • 만들어보기_DTO
> 데이터를 담아놓는 곳 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);
    }
}
  • 만들어보기2_메인
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("프로그램 종료");
    }

}
  • 만들어보기2_Service
> 아직 미완성이기 때문에 한번 쭉 읽어보며 어떻게 작동하는지 알아보자

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());
        }
    }
}
  • 만들어보기2_Repository
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;
    }
}
  • 만들어보기2_DTO
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은 재정의 하지 않으면 출력이 정상적으도되지 않는다
	}

}

'나의 수업일지' 카테고리의 다른 글

인천 일보 아카데미 12일차_2 만들며 익히기 (반복학습)  (0) 2023.03.10
인천 일보 아카데미 12일차_1 만들며 익히기 (반복학습)  (0) 2023.03.09
인천 일보 아카데미 10일차 확장_상속자_오버라이딩 / 추상화  (0) 2023.03.07
인천 일보 아카데미 9일차 static을_알아보자  (0) 2023.03.06
인천 일보 아카데미 8일차 메소드로 만들어보기/ArrayList 알아보기  (0) 2023.03.05
'나의 수업일지' 카테고리의 다른 글
  • 인천 일보 아카데미 12일차_2 만들며 익히기 (반복학습)
  • 인천 일보 아카데미 12일차_1 만들며 익히기 (반복학습)
  • 인천 일보 아카데미 10일차 확장_상속자_오버라이딩 / 추상화
  • 인천 일보 아카데미 9일차 static을_알아보자
GUPING
GUPING
안녕하세요 개발자를 꿈꾸는 GUPING 입니다
GUPING
개발자를 꿈꾸는 GUPING
GUPING
전체
오늘
어제
  • 분류 전체보기 (89)
    • 나의 수업일지 (88)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • pagingAjax
  • 파일이름가져오기
  • Ajax
  • 답변 채택
  • 파일 이름 가져오기
  • PAGE
  • Paging
  • 네이버
  • 파일이름(다중)
  • 여러사진프리뷰
  • 페이징
  • naver
  • 검색
  • 로그인 경고문
  • 지식인
  • 업로드파일이름출력
  • 버튼 이벤트 변경
  • 수정
  • 로그인게시판
  • 틀만들기
  • 클래스 이름 변경
  • 로그인form
  • 버튼 이벤트 함수 변경
  • 다중프리뷰
  • 페이징Controller
  • realative
  • 삭제
  • 검색결과페이징
  • 버튼2가지이벤트
  • 개힘드렁

최근 댓글

최근 글

hELLO · Designed By 정상우.
GUPING
인천 일보 아카데미 11일차 4개의 클래스를 사용하여 만들어보기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.