본문 바로가기

Java152

[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.
[Java] 람다식 / 함수형 인터페이스 / @FunctionalInterface 함수형 인터페이스 @FunctionalInterface: 일반적으로 구현해야 할 추상 메서드가 하나만 정의된 인터페이스를 가르킨다. 자바 컴파일러는 이렇게 명시된 함수형 인터페이스에 두 개 이상의 메서드가 선언되면 에러를 발생시킨다. @FunctionalInterface//구현해야 할 메소드가 한개이므로 Functional Interface이다. public interface Math { public int Calc(int first, int second); } @FunctionalInterface//구현해야 할 메소드가 두개이므로 Functional Interface가 아니다. (오류 사항) public interface Math { public int Calc(int first, int second).. 2023. 3. 24.
[Java] DAO 클래스의 리팩토링(inser, update 쿼리) 너무나도 많은 중복이 발생하는 UserDao 클래스 개발자라면 누구나 한번쯤은 JDBC 라이브러리를 사용한 적이 있을 것이다. 주로 Dao 클래스에서 이를 사용한다. 데이터베이스 쿼리 하나를 실행하기 위해서 개발자가 구현해야 할 코드가 굉장히 많다. 구현할 코드가 각 쿼리마다 다른 부분이라 개발자가 구현할 수 밖에 없다면 모르겠지만 대부분의 구현은 매번 반복되는 부분이다. 반복적인 부분이 있는 코드는 공통 라이브러리를 만들어 제거할 수 있다. 우선 리팩토링 전 아래 코드를 잠깐 훑어보자. public class UserDao { public void insert(User user) throws SQLException { Connection con = null; PreparedStatement pstmt .. 2023. 3. 22.
[Java] MVC 프레임워크 구현 모든 클라이언트의 요청은 DispatcherServlet이 받음 모든 요청을 서블릿 하나가 받을 수 있도록 URL을 매핑함. @WebServlet( name="dispatcher", urlPatterns = "/", loadOnStartup = 1) public class DispatcherServlet extends HttpServlet { [...] } Controller 인터페이스를 구현하자. public interface Controller { String execute( HttpServletRequest request, HttpServletResponse response ) throws Exception; } excute() 메서드의 반환 값은 리다이렉트 방식으로 이동할 경우 redirect: .. 2023. 3. 21.
[Java] static 블록 / 초기화 블럭 초기화 블럭(initialization block) public class RequestMapping { private static Map controllers = new HashMap(); static { controllers.put("/user/create", new UserCreateController()); controllers.put("/user/login", new UserLoginController()); controllers.put("/user/list", new UserListController()); } public static Controller getController( String requestUrl ) { return controllers.get(requestUrl); } } 클.. 2023. 3. 21.