본문 바로가기

Java153

[Servlet-jsp] 스택과 힙 메모리 / 멀티쓰레드 상황에서 문제가 발생할 가능성이 있는 Controller의 코드 인스턴스 생성에 따른 비용 발생 매번 클래스의 인스턴스를 생성할 때는 비용이 발생한다. 인스턴스를 생성하고 더 이상 사용하지 않을 경우 가비지 콜렉션 과정을 통해 메모리에서 해제하는 과정 또한 비용이 발생한다. 따라서 인스턴스를 매번 생성할 필요가 없는 경우 매번 인스턴스를 생성하지 않는 것이 성능 측면에서 더 유리하다. 예를 들어, 모델 데이터를 담고있는 DTO(Data Transfer Object)는 클라이언트마다 서로 다른 상태 값을 가진다. 이 경우에는 매 요청마다 인스턴스를 생성해야 한다. 하지만 JdbcTemplate, DAO(Data Access Object), Controller 인스턴스를 매 요청마다 생성해야 할까? 아니다. 인스턴스 하나를 생성한 후 재사용할 수 있다. 서블릿은 서블릿 .. 2023. 3. 31.
[Servlet-jsp] 첫 화면에 접근했을 때 사용자 요청부터 응답까지의 흐름 doFilter() 메서드 실행 클라이언트가 localhost:8080으로 접근하면 요청을 처리할 서블릿에 접근하기 전에 먼저 ResourceFilter와 CharacterEncodingFilter의 doFiltre() 메서드가 실행된다. ResourceFilter의 경우 해당 요청이 정적 자원( CSS, 자바스크립트, 이미지 ) 요청이 아니기 때문에 서블릿으로 요청을 위임한다. service() 메서드 실행 요청 처리는 "/" 으로 매핑되어 있는 DispatcherServlet이므로 이 서블릿의 service() 메서드가 실행된다. URL 분석 후 Controller 객체 찾음 service() 메서드는 요청받은 URL을 분석해 해당 Controller 객체를 Request Mapping에서 가져온다... 2023. 3. 31.
[Servlet-jsp] 서블릿 컨테이너와 MVC 프레임워크 초기화 과정 ServletContext 생성 서블릿 컨테이너는 웹 애플리케이션의 상태를 관리하는 ServletContext를 생성한다. ServletContext가 초기화되면 컨텍스트의 초기화 이벤트가 발생한다. 등록된 ServletContextListener의 콜백 메서드인, contextInitialized() 메서드가 호출된다. @WebListener public class ContextLoaderListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { ResourceDatabasePopulator populator = new ResourceDatabasePopulat.. 2023. 3. 31.
[Java] 뷰(View)를 포함한 모델 데이터에 대한 추상화를 담당하는 ModelAndView 구현하기 Controller의 반환값은 String이다 public class HomeController implements Controller { @Override public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception { QnaDao qnaDao = new QnaDao(); req.setAttribute("questions", qnaDao.selectAll()); return "home.jsp"; } } 위 Controller의 excute() 메서드 반환 값 String을 받아 서블릿에서 JSP로 이동한다. 만약 JQuery의 ajax() 함수를 활용해 서버에 요청을 보낸다면? 응답 데이터 타입은 JSON.. 2023. 3. 29.
[Java] 톰캣(WAS)에서의 URL 패턴과 관련된 이슈 / 자동으로 마지막 슬래시(/)가 추가되어서 리다이렉트 되는 경우 이슈 설명 제대로된 url 맵핑을 했는데도, 에러가 발생하는 경우 예) http://localhost:8080/qna 로 요청시 http://localhost:8080/qna/ 로 리다이렉트 되는 경우 URL 매핑 클래스 public class RequestMapping { private static final Logger logger = LoggerFactory.getLogger(DispatcherServlet.class); private Map mappings = new HashMap(); void initMapping() { mappings.put("/", new HomeController()); mappings.put("/users/form", new ForwardController("/user/.. 2023. 3. 26.
[Java] SQLException에 대해서 / 무분별한 try-catch절 무분별한 SQLException에 대한 처리 우선, 아래 코드를 보자. // 1. 클라이언트가 전달한 userId로 user 객체 가져옴 try { user = userDao.findByUserId( req.getParameter("userId") ); } catch (SQLException e) { e.printStackTrace(); } // 2. user 객체를 수정함 user.updateUser( req.getParameter("userId"), req.getParameter("password"), req.getParameter("name"), req.getParameter("email")); // 3. Db에 다시 업데이트함 try { userDao.update(user); } catch (SQ.. 2023. 3. 24.