[11.23] 내일배움캠프[Spring] TIL-17

박상훈·2022년 11월 23일
0

내일배움캠프[TIL]

목록 보기
17/72

[11.23] 내일배움캠프[Spring] TIL-17

1. 순수 java를 이용한 미니프로젝트 -1

  • 아직은 DB를 사용하지 않기 때문에 Collection타입으로 클레스 객체를 받아 저장하는 방명록을 만들자!
  • 1) 회의 전 개인 구상
    👉 방명록의 속성 content, name, date .. 등을 정의한 Memo.class를 만들자
    👉 List< >타입으로 데이터를 저장하고 그 데이터를 활용하여 불러오기, 삭제 , 수정 작업이 이뤄지는 MemoList.class를 만들자.
    👉 Main 에서는 Scanner를 활용하여 입력받은 숫자에 따른 기능 구별과 함수 호출을 담당하자.
    👉 MemList.class의 객체를 하나로 사용해야 데이터가 축적되므로 SingleTon 패턴으로 구현하자.
    👉 번호로 동작을 구분할 때 if~ else if~ else 구문보다는 switch ~ case를 활용해보자.
  • 2) 프로젝트 진행 방향 회의
    👉 각자 파트를 나눠서 진행하는 것도 좋지만, 미니프로젝트 취지 자체가 java에 대한 이해를 고취시키기 위함.
    👉 시간을 정해 각자 구현해보고, 코드 리뷰를 하면서 효율적이고 좋은 코드가 있다면 추가하고 불필요한 코드가 있다면 삭제하여 조각조각 구현하자.
  • 3) 코드의 수정과 구상의 실현
    👉 처음에 데이터의 저장과 각종 기능을 담당하는 MemoList.class의 공유를 위해 static변수로 선언해서 사용했다.
    👉 static으로 선언한 자료는 프로그램 시작과 종료까지 유지되는 형태이므로 프로젝트가 커진다면 감당할 수 없을 것 같다는 생각과 피드백을 받았다.
    👉 final로 MemoList.class를 선언 해놓고, 같은 객체를 반환해줄 수 있는 getInstace()를 통해 같은 객체를 사용할 수 있게 구현했다.
  • Memo.class
package com.pricehoon.solutution.project.memo;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

public class Memo  {

//id값을 따로 변수 선언하지 않고 배열의 index를 활용한 부분이 걸린다.
    private String name;
    private String pwd;

    private String content;
    private LocalDateTime date;


    public Memo(String name,LocalDateTime date ,String pwd,String content) {

        this.name = name;
        this.pwd = pwd;
        this.date = date;
        this.content = content;
    }


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

    public void setDate(LocalDateTime date) {
        this.date = date;
    }

    public String getContent(){
        return content;
    }


    public String getName() {
        return name;
    }

    public String getPwd() {
        return pwd;
    }

    public LocalDateTime getDate() {
        return date;
    }

}
  • MemoList.class
package com.pricehoon.solutution.project.memo;

import java.time.LocalDateTime;
import java.util.*;

public class MemoList {
    private static final MemoList memoList_1 = new MemoList();

    private List<Memo> memoList = new ArrayList<>();

    //하나의 객체를 지속적으로 사용하기 위한 메서드
    public static MemoList getInstance() {

        if (memoList_1 == null) {
            return new MemoList();
        }
        return memoList_1;
    }
//데이터를 추가하기 위한 함수
    public void addPost(Memo memo) {

        memoList.add(memo);
        System.out.println("메모가 정상적으로 저장되었습니다.");
    }
//저장된 데이터를 모두 보여주는데, 데이터의 수정과 삽입에 따라 현재 시간이 달라지므로 그 때 오름차순 정렬을 해준다.
    public void showAll() {
//원래는 Date도 String으로 작업했었는데 크기 비교에 다른 정렬이 어려워서 LocalDateTime 타입으로 수정.
        Collections.sort(memoList, new Comparator<Memo>() {
            @Override
            public int compare(Memo o1, Memo o2) {
                if(o1.getDate().isBefore(o2.getDate())){
                    return 0;
                }else{
                    return -1;
                }
            }
        });

        for (int i = 0; i < memoList.size(); i++) {
            System.out.print(i + 1 + " ");
            System.out.print(memoList.get(i).getName() + " ");
            System.out.print(memoList.get(i).getContent() + " ");
            System.out.println(memoList.get(i).getDate());

        }
    }

//삭제와 수정시 해당 게시글의 번호를 확인하는 작업이 중복되어 일어나므로 따로 함수로 분리
    public Boolean confirmNum(int num) {

        if (num > memoList.size() - 1) {

            System.out.println("잘못된 게시글 번호입니다!");
            return false;
        }
        return true;
    }
//삭제와 수정시 해당 게시글의 비밀번호를 확인하는 작업이 중복되어 일어나므로 따로 함수로 분리
    public Boolean confirmPwd(int num, String pwd) {

        for (int i = 0; i < memoList.size(); i++) {

            if (memoList.get(num) != null) {
                String confirmPwd = memoList.get(num).getPwd();
                if (confirmPwd.equals(pwd)) {
                    return true;
                } else {
                    System.out.println("비밀번호가 틀립니다!");
                    return false;
                }
            } else {
                System.out.println("오류");
            }
        }
        return false;
    }

//게시글 번호와, 비밀번호 확인을 거치기 된다면 delete()호출로 방명록 삭제
    public void deletePost(int num) {

        System.out.println("삭제가 완료되었습니다!");
        memoList.remove(num);

    }
//게시글 번호와, 비밀번호 확인을 거치기 된다면 update()호출로 방명록 수정
    public void update(int num, String content) {

        System.out.println("수정이 완료되었습니다!");
        LocalDateTime dateTime = LocalDateTime.now();

        memoList.get(num).setContent(content);
        memoList.get(num).setDate(dateTime);


    }



}
  • Application.class(main act)
package com.pricehoon.solutution.Java;

import com.pricehoon.solutution.project.memo.Memo;
import com.pricehoon.solutution.project.memo.MemoList;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Scanner;

public class Application {

    public static void main(String[] args) {
        //Switch는 그대로 가는걸로
        //수정 삭제 추가하기
        //예외처리

        Scanner sc = new Scanner(System.in);
        while (true) {

            System.out.println("1:추가, 2:전체보기, 3:삭제, 4.수정, 5.종료");
            int select = sc.nextInt();


            if (select == 5) {
                System.out.println("종료");
                break;
            }
//번호에 따른 기능 구분
            switch (select) {
                case 1:
                    insertPost();
                    break;
                case 2:
                    showAll();
                    break;
                case 3:
                    delete();
                    break;
                case 4:
                    update();
                    break;

                default:
                    System.out.println("알맞은 번호를 선택하세요!");
                    break;

            }
        }
    }
//데이터 추가 
    public static void insertPost() {

        MemoList memoList = MemoList.getInstance();

        LocalDateTime dateTime = LocalDateTime.now();

        Scanner sc = new Scanner(System.in);
        System.out.println("메모추가하기");
        System.out.print("이름 :");
        String name = sc.next();
        System.out.print("비밀번호 : ");
        String pwd = sc.next();
        sc.nextLine();
        System.out.print("메모내용 : ");
        String content = sc.nextLine();



        Memo memo = new Memo(name,dateTime ,pwd, content);

        memoList.addPost(memo);
    }

//데이터 다 보여주기
    public static void showAll() {

        MemoList memoList = MemoList.getInstance();
        memoList.showAll();
    }
//데이터 지우기
    public static void delete(){

        MemoList memoList = MemoList.getInstance();
        Scanner sc = new Scanner(System.in);
        System.out.println("--게시글 삭제하기--");
        System.out.println("삭제하고자 하는 게시글의 번호를 입력하세요!");
        int num = sc.nextInt();

        if(!memoList.confirmNum(num-1)){
            return;
        }

        System.out.println("비밀번호를 입력하세요!");
        String pwd = sc.next();

        if(!memoList.confirmPwd(num-1,pwd)){
            return;
        }
        memoList.deletePost(num-1);

    }
//데이터 갱신
    public static void update(){
        MemoList memoList = MemoList.getInstance();
        Scanner sc = new Scanner(System.in);
        System.out.println("--게시글 수정하기--");
        System.out.println("수정하고자 하는 게시글의 번호를 입력하세요!");
        int num = sc.nextInt();
// 현재 입력한 번호 -1 를 해줘서 Array index에 접근하자
        if(!memoList.confirmNum(num-1)){
            return;
        }
        System.out.println("비밀번호를 입력하세요!");
        String pwd = sc.next();
        if(!memoList.confirmPwd(num-1,pwd)){
            return;
        }
        sc.nextLine();
        System.out.println("수정하고자 하는 내용을 입력하세요! : ");
        String content = sc.next();

        memoList.update(num-1,content);

    }
}

2. 아쉬운 점, 느낀점⭐

1) 굳이 idx를 설정해야하나? 라는 의문으로 index로만 작업한 것.
2) 정말 필요한 부분을 제외한다면 코드는 더욱 간결해질 듯.
3) 너무 구현에만 신경썼나라는 생각이 드는 코드.
4) 게시글 번호를 확인하는 로직을 생각해서 작성했는데 더 좋은 방법이 있을 듯..

profile
기록하는 습관

0개의 댓글