171204-TIL

Reading time ~1 minute

오늘 한일

- MVC 프레임워크, JDBC 라이브러리 : MVC 프레임워크 1단계 실습

  • DispatcherServlet 구현 : 모든 클라이언트 요청을 받는 서블릿

  • RequestMapping 구현 : 요청 URL과 컨트롤러 매핑하는 클래스

  • ForwardController 구현 : 특별한 로직 없이 뷰(JSP)에 대한 이동만을 담당하는 클래스

- 저녁 타임 톰캣 최종분석 읽음

  • 머리 자르느라 별로 못봤다.

오늘 느낀점

  • 오랜만에 코딩을 하니 순간 오전에 멍때렸다. 정확히는 어떻게 시작할까 감이 안잡혔다. 그 덕에 어떤식으로 요구사항들을 해결 할까 고민하다가 일단 만들고 보자는 식으로 구현 하다보니 커밋을 활용하지 못하고 한번에 만들어 버렸다.(이런식으로 만드는게 맞나? 확신이 너무 안선 상태로 작업 하다보니 커밋하기가 꺼려졌다) 처음엔 DispatcherServlet의 동작들을 doGet, doPost 메소드에 구현했는데 아무리 생각해도 이건 아닌거 같아서 service를 활용하게 바꿨다. 그 다음 RequestMapping이 미묘한곳에서 가지고 있었는데 이걸 자연스럽게 init를 활용 해서 DispatcherServlet가 가지게 했다. 한 5일정도 코드를 한번도 안쳐서 그런지 순간 감을 잃은 느낌이였다. 여튼 오후에 정신차리고 잘 마무리 했다.

  • 사실 ForwardController은 어떻게 forward로 이동할 JSP 경로 정보는 생성자로 전달할 수 있도록 구현한다.는 요구사항의 생성자로 전달하는 부분을 계속 고민하다가 다른 사람의 코드를 힐끔 봤다. 이게 뒤늦게 하는 사람의 특권(?)이 아니겠는가?? 그래도 5분 10분이 아니라 그 이상 충분히 고민해봤다. ForwardController내부만 보고 사용법 자체는 직접 구현 했는데 같은 경로에 대해 재활용을 안하는게 마음에 걸렸다. 그러다 현재 TIL을 작성하다 잠시 고민해보니 아이디어가 떠올랐다.
    public Controller findController(String path) {
    		Controller controller = controllers.get(path);
    		if (controller == null) {
    			return new ForwardController(path);
    		}
    		return controllers.get(path);
    	}
    

    지금 코드는 controllers라는 Map에 포함되어 있지 않는 경로에 대해서는 같은 상태값을 가지는 새로운 controller를 매번 생성하게 된다.

    public Controller findController(String path) {
    		Controller controller = controllers.get(path);
    		if (controller == null) {
          controller = new ForwardController(path);
          controllers.put(path, controller);
    			return controller;
    		}
    		return controllers.get(path);
    	}
    

    이렇게 구현하면 차후에 같은 경로로 요청할땐 새로운 컨트롤러 객체를 생성하지 않고 최초 요청시에 생성하고 Map에 넣어둔 controller를 재활용 할 수 있을거 같다.

    public Controller findController(String path) {
    		Controller controller = controllers.get(path);
    		try {
          return controllers.get(path);
    		} catch (Exception e) {
          log.info(path);
          controller = new ForwardController(path);
          controllers.put(path, controller);
          return controller;
    	}
    

    급 생각났는데 위처럼 if문이 아니라 try-catch문으로 작성하면 조건문을 확인안하고 작동을 하니 더 효율적일 듯 싶다.(새로운 controller가 추가된 기념으로 로그도 찍어주고..) 아니면 try-catch문 자체도 일정 자원을 소모 할까??

  • 밖에 춥다.

내일 할일

  • MVC 코드 리뷰 및 JDBC 실습

  • 톰캣 완벽분석 읽기