본문 바로가기
빅데이터 부트캠프/Java

빅데이터 부트캠프 76일차

by Mecodata 2022. 10. 26.

JSP(Java Server Page)

- HTML 코드에 JAVA 코드를 넣어 동적 웹 페이지를 생성하는 웹 어플리케이션 도구
(HTML에 Java를 추가적으로 사용할 수 있도록 한 것)
- JSP에 Java 코드를 사용할 수 있지만 Java로 코드를 많이 작성하면 그만큼 효율성이 감소하여 Java 코드를 최소화하는 것이 좋음

※ 원래 HTML에서는 Java로는 코드 작성이 불가능 하고 JavaScript를 이용하여 <script> 태그 안에 코드를 작성함
- jsp파일에서는 특정 변수명이 기본적으로 특정한 타입의 객체로 인식되도록 설정되어 있음

기본 객체 변수

- out -> PrintWriter 객체
- request -> HttpServletRequest 객체
- session -> HttpSession 객체

- pageContext -> this 객체

JSP 태그 종류

scripting 태그

1. <%@ page %> = page 지시자
- 외부 library import
- client에게 응답하는 인코딩, mime type 설정
- 세션을 사용 안하고자 할 경우 설정
- jsp 선언구에 설정 권장


2. <%
! %> = 전역 변수 및 메소드 선언 태그
- servlet이라 가정한 상태에서 멤버변수와 메소드 구현시 사용하는 tag
- servlet 객체는 하나로 모든 user에게 공유


3. <% %> = 자바 코드 입력 태그
- 순수 자바 코드 제한없이 개발 가능
- doGet/doPost/doService() body 부분에 자동 적용
- 이 tag가 많을 수록 jsp 품질 저하
- jsp 자체의 내장 객체들을 이 tag 내부에서도 사용 가능

4. <%
-- --%> = jsp만의 주석 태그
- client 브라우저에 전송 불가
- 보안을 고려한 주석 내용 작성 권장

5. <%
= %> = 출력 태그
- 브라우저에 출력
- doGet/doPost/doService() body 부분에 자동 적용
- 주의사항 : 세미콜론 작성 불가

EL(Expression Language) 태그

- 형식 = ${출력로직}
- 연산 적용 가능
- Java 데이터 출력이 가능한 tag

- 요청 또는 세션
객체에 저장된 데이터에 한해서만 출력

1. 요청 객체 데이터 - ${requestScope.requset객체명}
2. 세션 객체 데이터 - ${sessionScope.session객체명}
3. 쿠키 객체 데이터 = ${cookie.cookie객체명.
value}
- getParameter()와 출력 로직이 혼용된 간결한 문법 = ${param.웹쿼리stringkey}

JSTL(JavaServer Pages Standard Tag Library)

- 자바서버 페이지 표준 태그 라이브러리
- JSP 페이지 내에서 자바 코드를 바로 사용하지 않고 로직을 내장하는 효율적인 방법을 제공
- JSTL은 라이브러리이기 때문에 사용하기전에 core를 header에 추가해야 함

기본 세팅

<%@ taglib % prefix='c' uri="http://java.sun.com/jsp/jstl/core"> 형식으로 header에 입력
- prefix = 불러온 외부 라이브러리를 지칭할 명칭
- uri = uri주소(http://java.sun.com/jsp/jstl/core) 입력

데이터 출력

<c:out value="${출력할 변수}">

조건문(단일)

<c:if test="${조건}">
조건이 참일경우 실행할 코드
</c:if>

※ 조건 맨 앞에 empty, not empty 입력으로 객체가 null인지 판별가능

조건문(다중)

<c:choose>
<c:when test="${조건1}">
조건1 만족시 실행
</c:when>
<c:when test="${조건2}">

조건 2 만족시 실행
</c:when>
<c:otherwise>
조건을 모두 만족하지 않는 경우 실행할 코드
</c:otherwise>
</c:choose>

※ choose는 다중조건을 위한 하나의 틀이고 when=elif, otherwise=else와 같은 역할

반복문

<c:forEach begin="1" end="5" var="i" step="2">
${i}
</c:forEach>
---------------------------------------------------------------------------
for i in range(1, 5, 2):
print(i) 와 같음
※ begin = 시작점, end = 끝점, step = 간격, var = 변수 지칭

Connection Pooling

- Connection 객체를 프로그램이 실행될 때마다 생성하는 것이 아니라, 웹 애플리케이션이 서비스되기 전에 웹 서버에서 미리 생성하여 pool에 저장한 다음, 필요할 때 준비된 Connection 객체를 가져다 사용한 뒤 작업이 끝나면 다시 pool에 반납하는 방식 (Connection은 재사용 가능)
- DB 시스템의 동시 접속자 수를 강제적으로 제한 하는 기술
ex) 콘서트 티켓팅, 수강신청
- 정해진 Connection 수에 한해서만 생성 및 유지 (서버 시작시에 이미 몇개를 생성해서 대기해 놓을 수도 있음)
- 사용 직후에는 데이터 반환 코드 필수

JNDI(Java Naming and Directory Interface)

- [패키지.클래스명]으로 객체를 발견하고 참고(lookup) 하기 위한 자바 API
- lookup() = InitialContext 클래스의 메소드로 JNDI 인터페이스를 통해 서버에 등록된 객체를 찾음
- Java-DB 연동 방법은 DriverManager(JDBC)를 이용하는 방법과 DataSource를 이용하는 방법이 존재
DataSource = JNDI resource
- DataSource는 자체적으로 Connection Pool 기능을 구현하기 때문에 별도로 Connection Pool 기능을 구현해야하는 DriverManager에 비해 편리

- DB 연결을 위한 context.xml 파일 생성 -> Resource 태그에 DataSource 설정
(서버 실행시 서버가 xml파일들을 가장 먼저 읽음)
<Context>
<Resource
name="jdbc/mysql" - JNDI 이름 설정 (Context.lookup()에 사용)
auth="Container" - 자원 관리 권한 설정 (Container = 서버가 관리)
type="javax.sql.DataSource" - 자바 소스와 서버 설정 정보의 중간 매개체 객체 타입
driverClassName="co
m.mysql.cj.jdbc.Driver" - MySQL DB driver
url="jdbc:mysql://localhost:3306/scott" - 접속을 위한 url
username="" - ID
password="" - PW
maxTotal="20" - 동시 접속 max Connection 개수
maxIdle="10" - 10개의 객체는 늘 대기 개수
maxWaitMillis="-1" /> - 20개 초과한 대기 시간, -1 따라서 무한 대기의미

</Context>

DataSource 세팅 (기본 형식)

import javax.sql.DataSource;
Context initContext = null;
initContext = new InitialContext(); - initContext 오버라이딩
Context envContext = (Context)initContext.lookup("java:/comp/env");
ds = (DataSource) envContext.lookup("jdbc/mysql");

- InitialContext 클래스는 Context 인터페이스를 상속받았기 때문에 Context 객체(initContext)를 오버라이딩
- InitialContext 객체는 생성시 context.xml 파일의 데이터를 읽어옴
- java:/comp/env = 응용 프로그램 환경 관련 JNDI, jdbc/mysql = context.xml에 지정한 JNDI 이름
-> (DataSource) envContext.lookup("java:/comp/env/jdbc/mysql"); = 지정한 JNDI에서 resource 반환

댓글