ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 학원 day67. 싱글턴 정복중....
    기록 2022. 12. 8. 23:26

    싱글턴은 객체를 한개만 사용하는 방법이다.

    TodoDao dao = new TodoDao();  : jsp 안에서 객체를 생성했다. 그리고 jsp가 실행될 때마다 계속 생성된다.

    그런데 사실 TodoDao는 그 안에 값을 담는게 아니라서 객체 한개만 있으면 된다.

    그래서 그 안에 자기 자신을 담는 static변수를 하나 만든다. 그리고 생성자를 private으로 만든다. 

    private이니까 외부에서 안보인다. 객체를 함부로 사용할 수 없게 됨.

      private static TodoDao instance = new TodoDao();

      private TodoDao( ) { }

    그리고 public static 메소드를 만들어 위에서 만든 instance를 제공한다. (정적메소드는 객체 생성 안하고도 쓸 수 있으니까.)

      public static TodoDao getInstance( ) {  

          return instance;

      }

    객체를 그럼 어떻게 얻는가?

    getInstance라는 메소드를 호출하면 아까 만들어놓은 instance가 반환될 것이다.

    그러니까 이제부터 아래 코드로 instance를 불러온다.

    TodoDao dao = TodoDao.getInstance();

    정적 메소드는 클래스 로딩할 때 만들어지고 한번밖에 실행되지 않는다. 

     

    정리.

    1. DAO 클래스에 싱글턴 패턴을 적용함
    - 싱글턴 패턴이 적용된 클래스는 프로그램이 실행되는 동안 오직 한 개의 객체만 생성해서 사용한다.
    - 싱글턴 패턴
    public class TodoDao {
    // TodoDao 클래스가 메모리에 로딩되는 즉시 TodoDao객체를 생성해서 정적변수에 저장한다.
    private static TodoDao instance = new TodoDao();  // static은 메모리에 로딩될 때 한번만 실행되고 이후에는 실행되지 않는다.
    // 생성자의 접근제한자를 private 설정해서 외부에서 이 객체를 new로 생성할 수 없게 한다.
    private TodoDao() {}
    // 정적변수에 미리 저장해둔 TodoDao객체를 제공하는 정적 메소드를 정의한다.
    public static TodoDao getInstance() {
    return instance;
    }

    public void deleteTodoByNo(int todoNo) {
    SqlMapper.delete("todos.deleteTodoByNo", todoNo);
    }
    }

    delete.jsp
    int todoNo = StringUtil.stringToInt(request.getParameter("no"));

    // TodoDao todoDao = new TodoDao();
    TodoDao todoDao = TodoDao.getInstance();       // 정적메소드는 클래스 이름으로 실행할 수 있음!!
    todoDao.deleteByNo(todoNo);


    참고.

    static 변수와 static 메소드

    static은 정적(고정된) 변수와 메소드가 있다. > 정적필드, 정적메소드라고 부른다.

    정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버.

     

    멤버 변수, 멤버 메소드와의 차이점은?

    정적 변수와 정적 메소드는 객체 생성에 참여하지 않는다. (생성된 객체에 포함되어 있지 않음)

    클래스의 로딩이 끝나면 즉시 정적 변수와 정적 메소드는 즉시 사용할 수 있다.

    static 영역에 생성된 정적변수와 정적메소드도 클래스별로 관리되기 때문에, 정적변수와 정적메소드를 사용할 때는 클래스이름으로 사용한다.

    인스턴스 메소드에서는 멤버 변수, 정적 변수, 멤버 메소드, 정적 메소드 모두 사용이 가능하지만, 정적 메소드에서는 멤버 변수, 멤버 메소드는

    사용이 불가능하고 정적 변수, 정적 메소드만 사용이 가능하다.

    정적 변수와 정적 메소드는 왜 필요한 건가?

    정적 변수는 한번만 생성하기 때문에 값이 정해져 변경할 수 없는 상수(final)를 선언할 때 주로 사용한다. (ex. 파이 등등)

    정적 메소드는 주로 유틸리티 클래스에서 사용하는데 멤버 변수와의 상호작용이 없고 여러 객체에서 자주 사용한다.

    공용으로 사용한다? > 정적 선언, 그렇지 않다? > 인스턴스로 선언.


    LoginCheckFilter는 모든 jsp, 서블릿이 실행되기 전에 또는 실행된 후에 실행되는 것이다. 전처리, 후처리 담당!

    빨간색은 로그인체크를 하지 않겠다고 한 것임.   


    원래는 User 객체를 담아놨었지만, Id, Name 외에는 필요없기 때문에 굳이 큰 객체를 담을 필요 없이 

    세션에 id와 사용자이름만 담았다.

    register.jsp에서 userId만 가져오게 함.

    list.jsp에서도 getToalRows를 loginUserId로 검색하였다.

    목록을 보낼 때 pagination 객체가 있는데, pagination 안에는 사용자 아이디가 따로 없어서 Map 을 하나 따로 만들어서

    사용자 아이디, 시작페이지, 끝 페이지를 가져온다.

    '기록' 카테고리의 다른 글

    학원 day69.  (0) 2022.12.12
    학원 day68. Map 정복  (0) 2022.12.09
    학원 day66. github  (0) 2022.12.07
    학원 day65. Git  (0) 2022.12.06
    학원 day64. ajax  (0) 2022.12.05

    댓글

Designed by Tistory.