본문 바로가기

전체 글376

[Servlet-jsp] DAO(Data Access Object)에서 데이터베이스 접근 로직을 구현할 때 사용하는 JdbcTemplate를 싱글톤 패턴으로 구현하기 매번 JdbcTemplate 인스턴스 생성하 컨트롤러에서 접급하는 DAO 클래스와 같이 데이터베이스 접근 로직을 구현할 때 사용하는 JdbcTemplate는 인스턴스를 여러개 필요가 없다. 인스턴스를 하나만 구현해도 된다. 우선, 개선하기 전 아래 코드를 살펴보자. public class JdbcTemplate { public void update(String sql, PreparedStatementSetter pss) throws DataAccessException { [생략..] } public void update(String sql, Object... parameters) { [생략..] } public void update(PreparedStatementCreator psc, KeyHolder .. 2023. 3. 31.
[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.
[Git] Git에서 특정 브랜치만 클론하는 방법 git을 사용하다 브랜치 전체를 clone하지 않고 특정 브랜치 하나만 clone하는 것이 가능하다. 특히 브랜치가 많은 경우 이 방법을 사용할 수 있다. git clone -b {branch_name} --single-branch {저장소 URL} ex) git clone -b hbkuk --single-branch https://github.com/hbkuk/java 위와 같이 실행하면 java의 hbkuk branch만 clone할 수 있다. 2023. 3. 30.
[BaekJoon] 백준 알고리즘 1806번 / 부분합 / 투포인터 / Python 문제 주의 최소 길이를 저장하는 변수인 minLength를 충분히 큰 값으로 지정한다. end 포인터? end 포인터는 고정시켜 놓는 것이 아니라, 특정 조건까지 이동시키는 것임. 해당 문제는 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 것이 목표임. 이때, start 포인터와 end 포인터를 사용하여 특정 조건까지 end 포인터를 이동시키면서 부분합을 계산하고, 그 합이 S 이상이 되는 순간 start 포인터를 이동시켜 최소 길이를 구하는 것임. 길이가 0이 될수도 있나? for문에서 start를 1씩 증가시키면서 end를 이동시켜 나가다보면 자연스럽게 처리되므로 별도의 처리를 하지 않아도 됨. 코드 """ 1. 아이디어 - for문을 통해서 투 포인터로 .. 2023. 3. 30.
[BaekJoon] 백준 알고리즘 2003번 / 수들의 합 2 / 투포인터 / Python 간단한 투 포인터 알고리즘을 이용하여 풀 수 있습니다. 시작점(start)과 끝점(end)을 이용하여 구간합(interval_sum)을 구하며 end를 이동시키며 구간합이 M과 같아지면 카운트합니다. start를 이동시키면서 구간합(interval_sum)도 갱신합니다. 이 알고리즘의 시간 복잡도는 O(N)입니다. """ 1. 아이디어 - 투 포인터를 통한 계산 2. 시간복잡도 - O(N) : 10,000 < 2억개!, 출력 가능 3. 자료구조 - 수열 저장 int[] - 합계 저장 int - 경우의 수 저장 int """ import sys input = sys.stdin.readline N, M = map(int, input().split()) A = list(map(int, input().split.. 2023. 3. 30.
[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.
[BaekJoon] 백준 알고리즘 2559번 / 수열 / 투포인터 / Python 문제 접근방법 해당 문제는 연속적인 부분합 중에서 가장 큰 값을 찾는 문제이다. 가장 간단하게 시간복잡도 O(N^2)의 알고리즘으로 구할 수 있다. 그 방법은 완전 탐색 방법으로, 각 구간을 시작하는 인덱스 i와 끝나는 인덱스 j에 대해, i부터 j까지의 합을 구해서 가장 큰 값을 찾는 것이다. 이를 위해서는 2중 반복문을 사용하여 모든 구간에 대해 합을 구해야 한다. 하지만 해당 문제의 N은 100_000 이하로 주어지며, 시간복잡도 O(N^2)이므로 시간초과로 이어질 수 있다.( 2억개 미만이면 가능) 소스 코드 """ 1. 아이디어 - 투포인터 활용 - for문으로, 처음 K개 합산 - 다음 인덱스 더해주고, 이전 인덱스 빼주면서 최대값 갱신 2. 시간복잡도 - 완전 탐색일 경우 O(N^2) -> .. 2023. 3. 28.