01. Java
02. git
03. Database
04. Jsp [Server] (v)
05. 미니프로젝트 (3W)
06. HTML,CSS
07. JS
08. SpringFramework , SrpingBoot
09. React JS [Front-end]
10. 중간프로젝트 (1M)
11. Linux 명령어
12. AWS 클라우드
13. DevOps - Docker
14. App - Android
15. 최종프로젝트 (1M)
- 데이터베이스 연결 풀은 데이터에 대한 요청이 발생하면 재사용되는 것으로, 데이터베이스의 수행 능력을 향상시키기 위해 사용
- 연결 풀에서 하나의 연결이 생성되어 풀에 배치되면 새로운 연결이 만들어지지 않도록 재사용하지만, 만약 모든 연결이 사용중에 있으면 새로운 연결이 만들어져 풀에 추가
- 연결풀을 통해 사용자는 데이터베이스 연결을 위해 기다리는 시간을 축소시킬 수 있음
- JSP의 커넥션풀 설정
- Eclipse > Servers폴더 > context.xml 수정
커넥션 풀링
- 미리 정해진 개수만큼 DB커넥션을 풀에준비해두고, 어플레이케이션이 요청할 떄마다 Pool에서 꺼내서 할당하며, 다시 돌려받아서 Pool에 넣는 기법
DataSource
- 데이터베이스 연결을 관리하는 인터페이스로, Connection객체 반환
- DB에 이용되는 URL, id, pw, DriverClass를 미리 정의해 놓고 사용하는 객체
# DAO클래스에 dataSource사용 /* * DAO는 클래스는 여러개 만들필요 없이, 객체가 한개만 생성되도록 * singleton클래스로 생성 */ //1. 나자신의 객체를 1개 생성한다. private static UsersDAO instance = new UsersDAO(); //2. 외부에서 생성자를 호출할수 없도록 private막는다 private UsersDAO() { try { InitialContext context = new InitialContext(); dataSource = (DataSource)context.lookup("java:comp/env/jdbc/oracle"); } catch (Exception e) { e.printStackTrace(); } } //3. 외부에서 객체를 요구할 때, instance를 반환합니다. public static UsersDAO getInstance() { return instance; } //커넥션풀을 사용할 dataSource클래스 private DataSource dataSource;
# dataSource를 이용한 Connection연결 try { conn=dataSource.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, email); rs = pstmt.executeQuery(); if(rs.next()) result=1; // 1 = 중복 } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtil.close(conn, pstmt, rs); }
JSP에서 저장객체를 출력할 때 스크립팅을 전혀 쓰지 않을 수 있는 기술
표현식을 대체 가능
EL 사용법
${Value}
${member.name}
${내장객체.name}
내장 객체 | 의미 |
---|---|
pageScope | page객체를 참조하는 객체 |
requestScope | request객체를 참조하는 객체 |
sessionScope | session객체를 참조하는 객체 |
applicationScope | application객체를 참조하는 객체 |
param | 요청 파라미터를 참조하는 객체 |
paramValues | 요청 파라미터(배열)을 참조하는 객체 |
initParam | 서블릿컨텍스트 초기화 파라미터를 참조하는 객체 |
cookie | 쿠키 객체를 참조하는 객체 |
<!-- scope는 생략이 가능하고 request의 경우 request도 생략가능 --> ${param.name }<br> // form태그 이용 ${param.age }<br> ${requestScope.dto}<br> ${requestScope.dto.departmentId }<br> ${dto.departmentName }<br> ${dto.managerId }<br> ${dto.locationId }<br> ${name } ${sessionScope.userId }<br> ${applicationScope.menu }<br>
자바의 제어문을 HTML 태그화 시킬 수 있음
JSTL의 경우 Tomcat 기본 컨테이너에 포함되어 있지 않으므로, 별도의 라이브러리를 설치하고 사용
JSTL 라이브러리
종류 | URI | prefix |
---|---|---|
Core | http://java.sun.com/jsp/jstl/core | c |
XML processing | http://java.sun.com/jsp/jstl/xml | x |
Formatting | http://java.sun.com/jsp/jstl/fmt | fmt |
Database access | http://java.sun.com/jsp/jstl/sql | sql |
Functions | http://java.sun.com/jsp/jstl/functions | fn |
- 상단부에
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
선언 필요
태그 설명 c:catch 예외처리에 사용 c:out jspWriter에 내용 출력 c:set JSP에 사용될 변수 설정 c:remove 설정한 변수 제거 c:if 조건 처리 c:choose 다중 조건 처리 c:forEach 컬렉션이나 Map의 각 항목 처리 c:forTokens 구분자로 분리된 각각의 토큰을 처리할 때 사용 c:when 조건에 맞을 때 c:otherwise 맞는 조건이 없는 경우 c:import url을 사용해 다른 자원의 결과 삽입 c:redirect URL을 재작성 c:param 파라미터 설정
<c:out value="출력값"/>
<c:out value="${a }"/>
<c:set var="변수명" value="설정값" scope="범위"/>
- var : 값을 저장할 EL 변수 이름
- value : 변수의 값
- scope : 변수를 저장할 영역(page/request/session/application)
<c:set var="a" value="홍길동" />
<c:remove var="변수명" scope="범위"/>
- 삭제할 변수의 scope를 지정하지 않으면 동일한 이름으로 저장된 모든 영역의 변수 삭제
<c:if test="조건식" var="조건 처리 변수명"></c:if>
<c:if test="true"> <b>무조건 실행되는 문장</b> </c:if> <c:if test="${param.name eq '홍길동' }" > 참 입니다. </c:if> <c:if test="${param.age >=20 }"> 성인 입니다. </c:if> <c:if test="${param.age<20 }"> 미성년자 입니다. </c:if>
<c:choose> <c:when test="조건식"> 처리 내용 </c:when> <c:when test="조건식"> 처리 내용 </c:when> <c:otherwise> 처리 내용 </c:otherwise> </c:choose>
<c:forEach items="객체명" begin="시작값" end="끝 값" step="증감삭" var="변수명">
- 배열, 컬렉션 또는 맵에 저장되어 있는 값들을 순차적으로 처리할 떄 사용
- 배열의 경우는 객체의 배열 뿐만 아니라 기본 데이터 타입의 배열도 알맞게 처리하며 기본 데이터 타입은 래퍼 클래스를 통해 처리
<h3>구구단 5단 출력</h3> <c:forEach var="i" begin="1" end="9" step="1"> <c:out value="5 * ${i } = ${5*i }"/> <br> </c:forEach> <h3>2~9단까지 출력</h3> <c:forEach var="i" begin="2" end="9" step="1"> <b>${i }단</b> <br> <c:forEach var="j" begin="1" end="9" step="1"> <c:out value="${i } * ${j } = ${i*j }"/> <br> </c:forEach> <c:out value="---------------------------"/> <br> </c:forEach> <h3>향상된 for문</h3> <c:set var="arr" value="<%=new int[] {1,2,3,4,5} %>"/> <c:forEach var="i" items="${arr }" varStatus="stat"> ${i} <br> i의 인덱스 : ${stat.index} <br> i의 카운트 : ${stat.count }<br> </c:forEach>
- 값의 형 변환시 사용
- 문자를 날짜로 형변환
<fmt:parseDate var="a" value="2025/02/24" pattern="yyyy/MM/dd"/>
- 날짜형의 형식을 변경
<fmt:formatDate var="newA" value="${now }" pattern="yyyy년 MM월 dd일 HH:mm:ss"/>
- 문자를 숫자로 형변환
<fmt:parseNumber var="b" value="$32.14" pattern="$0.0" />
<fmt:parseNumber var="c" value="1.123abc" type="number" />
- 숫자를 문자열로 변환
<fmt:formatNumber value="2000" pattern="0000.00"/>
- Model, Controller, View 부분으로 모듈화 되었으며 JSP는 로직 처리가 없이 단순히 Client에게 보여지는 뷰만을 담당
- 각각이 모듈화 되어있어 유지보수가 매우 쉬움
- 웹 브라우저의 요청을 하나의 서블릿이 받으며 그 요청을 알맞게 처리한 후, 그 결과를 보여줄 JSP페이지로 포워딩
- 웹 브라우저의 모든 요청을 하나의 서블릿에서 처리하기 때문에 서블릿은 웹 브라우저의 요청을 구분하는 방법이 필요
- 모델(Model) 은 비즈니스와 관련된 로직만 처리
- 뷰(View) 는 사용자에게 알맞은 화면을 보여주는 역할만 수행
- 컨트롤러(Controller) 는 사용자의 요청에 대해 알맞은 모델을 사용하고 사용자에게 보여줄 뷰를 선택
1. 디렉토리 페턴
- 디렉토리 형태로 서버의 해당 컴포넌트를 찾아서 실행하는 구조
http://localhost:8181/cr/Hello // Hello서블릿 http://localhost:8181/cr/World // World서블릿
2. 확장자 패턴
- 확장자 형태로 서버의 해당 컴포넌트를 찾아서 실행하는 구조
http://localhost:8181/cr/Hello.do // *.do 서블릿 http://localhost:8181/cr/World.do // *.do 서블릿 # URL 매핑 확장자 패턴 형태 @WebServlet("*.example") public class MyController extends HttpServlet { ... }
서블릿은 웹 브라우저의 요청과 웹 어플리케이션의 전체적인 흐름 제어
컨트롤러의 흐름 제어 처리 로직
- 웹 브라우저가 전송한 HTTP 요청을 받아 요청방식에 맞게 doGet(), doPost()호출
- 웹 브라우저가 어떤 기능을 요청했는지 분석
- 모델을 사용해 요청한 기능 수행
- 모델로부터 전달받은 결과물을 알맞게 가공한 후, request나 session의 setAttribute() 메서드를 이용해 결과값을 속성에 저장
- 웹 브라우저에 결과를 전송할 JSP페이지를 선택한 후, 해당 JSP로 포워딩 혹은 리다이렉트함
@WebServlet("*.example") public class MyController extends HttpServlet { private static final long serialVersionUID = 1L; public MyController() { super(); } // 2. get, post 요청을 action으로 하나로 묶음 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doAction(request,response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doAction(request,response); } protected void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 3. 요청을 분기 request.setCharacterEncoding("utf-8"); String uri = request.getRequestURI(); // contextPath : 절대경로 String contextPath = request.getContextPath(); String command = uri.substring(contextPath.length()); //System.out.println(uri); //System.out.println(contextPath); System.out.println(command); if(command.equals("/controller/join.example")) { System.out.println("회원가입 작업"); }else if(command.equals("/controller/login.example")) { System.out.println("로그인 작업"); }else if(command.equals("/controller/getInfo.example")) { System.out.println("회원정보 작업"); } } }