Coding 공부/IntelliJ

[IntelliJ_Servlet] Todo List#1 만들기

CBJH 2024. 4. 18. 18:12
728x90
반응형

1. 잡담

 

  • 웹 브라우저는 기본적으로 쓰레드를 제공하므로 따로 thread 클래스를 상속받거나 run 함수를 구현할 필요가 없다.
  • 페이지를 새로고침하면 여러 쓰레드가 동시에 실행된다. 
  • 새로고침하거나 페이지를 이동해도 서버에 저장한 값은 남아 있다.
  • 공통으로 공유하는 자원(싱글톤) 같은 곳에 컬렉션을 사용하여 모두가 접근 가능한 자료를 축적할 수 있다.
System.out.println("this:" + this);
System.out.println("Thread.currentThread().getName():" + Thread.currentThread().getName());

  • enum 복습
    • enum은 생성자가 private 또는 default이므로 외부에서 생성하거나 필드값을 변경할 수 없다. 
    • 상수값을 선언하는 것이 생성자를 호출하는 것과 같은 역할을 한다.
    • 객체를 새로 생성하여 따로 사용할 수 없으므로 공유된 자원을 사용하도록 강요해 싱글톤 같은 역할을 한다.
 

 

public enum YJ302 {
    KT("기태", "지각생"),
    CS("철수", "채찍남"),
    DJ("동준", "앵그리버드"),
    IH("일휘", "조퇴남");

    private final String name;
    private final String desc;

    YJ302(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
}

 

 

2. 목적

 

  • 자바에서 Cotroller로 톰캣 서버에 서블릿으로 제어한다.
  • 각 기능을 Controller로 만들어본다.
  • View를 jsp파일로 만든다.
  • EL을 활용하여 Controller에서 값을 받아온다.
  • 글 목록은 페이지가 바뀌어도 공유할 수 있도록 TodoService eum에서 싱글톤으로 컬렉션을 생성해 관리한다.
  • 글 입력, 수정, 삭제, 불러오기 같은 기능들은 TodoService에서 구현한다.
  • 각 페이지는 각각 자바에서 Controller로 구현하여 get 방식으로 jsp페이지를 열고, post 방식으로 수정한 값을 업데이트한다.

 

3. 기능 설명

 

4. 깃허브 링크

https://github.com/cbjh-4/TodoList_java

 

 

5. 캡처 화면

6. 느낀점과 추가사항

  • 자바 서블릿 컨트롤러에서 doGet으로 jsp파일을 로드할 때, setAttribute메서드로 객체를 jsp에 보낼 수 있다.
  • req.setAttribute("todoDTO", todoDTO);
  • jsp에선 TL문을 사용하여 객체안에 든 값들을 불러올 수 있다.(초기값 설정하는데 쓰인다)
    • setAttribute하지 않고,  getRequestDispatcher를 forward하면 컨트롤러에서 선언한 변수들에 접근이 가능한 줄 알았는데, 이 부분을 몰라서 오랜 시간이 걸렸다.
  • jsp에서 체크 박스를 체크하면 true, 체크하지 않으면 컨트롤러에서 getParameter를 하면 false를 반환하는줄 알았는데, 아무것도 반환하지 않아서 이 부분을 확인하고 처리하는데 어려움을 겪었다.
<form action="/todo/register" method="post" onsubmit="return validateForm();">
       ~
        <label for="finished">Finished:</label>
        <input type="checkbox" id="finished" name="finished" value="true">
        <input type="hidden" name="finished" value="false">
        <button type="submit">등록</button>
    </form>
  • 글 인덱스를 글을 생성할 때 마다 1씩 증가시키는 방법을 어떤 식으로 구현할까 생각했다. DBMS에서 배운 seq를 착안해 private변수로 만들고, ArrayList에 TodoTDO 객체를 추가할 때마다 1씩 증가시켜 문제를 해결했다.
public enum TodoService {
    INSTANCE(0);
    private long seq;
    TodoService(long seq) {
        this.seq = seq;
    }

    public long getSeq() {
        return seq;
    }
    }
  • 글을 수정할 때, ArrayList에 저장된 값을 수정하므로 set함수를 사용하는데, 인덱스와 변경할 객체 정보가 필요했다. 어떻게 구현할지 고민하다가 인덱스를 post로 받아서 밑의 방식으로 수정하는 방법을 생각해냈다.

 

public void modify(TodoDTO todoDTO) {
    TodoDTO todoDTO_temp = get(todoDTO.getTno());
    int index = -1;
    index = todoList.indexOf(todoDTO_temp);
    if(index != -1){
        todoList.set(index, todoDTO);
    }
}