세션 타이머
코드 수정
문제점1
- 문자열 생성후 동적으로 element를 만들기 위해 parsing했을때 생긴 문제
방법1 - $.parseHTML
let msgArea = $.parseHTML(MSGMODALSRC);
- 공백이 많아 마지막 공백을 text 로 인식
let msgArea = $.parseHTML(MSGMODALSRC.trim());
방법2 - 셀렉팅된 엘리먼트를 모달 객체로 생성
let msgArea = $("<div>").html(MSGMODALSRC.trim()).find("#messageModal").modal();
- body에 붙여주면 끝 !
$("body").append(msgArea);
문제점 2) 모달 내 id 중복
- 하드코딩된 const MSGMODALSRC을 사용함으로써 생기는 문제
- 세션 연장되며 모달이 여러개 생성됐을 때, id가 전부 중복됨
방법1 - id에 모달의 갯수를 추가
방법2 - id에 millisecond 추가
Closure
- 함수가 하나의 객체처럼 동작하면서, 함수 자신과 가까운 범위를 클로져라고 칭함
- 1) 변수 탐색시, 지역변수 내에서 먼저 탐색한다
- 2) 지역변수에 없을 때 나와 가장 가까운 블럭에서 찾는다
js에서 scope의 개념
- 함수 안에 함수 안에 또 다른 객체가 존재할 수 있기 때문에 클로져라는 개념이 중요
- depth 구조가 생기는 만큼 새로운 클로져가 생기는 것
세션타이머 과제의 목적
1. js 코드의 라이브러리화 (=모듈화)
- 이번 코드는 코드내에 function이 많음
- 각 function에서 역할에 맞는 기능만 수행하도록 짰기때문
- 예시
- 타이머 초기화 하는 함수
- 메세지 모달 생성하는 함수
2. js 내의 scope 개념
3. 실행코드를 지연시키는 목적 파악
커스텀 태그
<prefix:tagName attributes>
- 커스텀태그 사용시
- 1) custom tag library(jar파일)를 빌드패스에 추가
- 2) taglib 지시자로 라이브러리를 로딩(prefix 결정)
- 3) 사용양식은
<prefix:tagName attributes>
- 액션 태그는 1), 2)번 과정이 없어도 기본적으로 제공된다
- jsp 스펙에 따라 기본 제공되는 커스텀 태그, prefix:jsp
- 커스텀 태그는 서버사이드 태그!
- 서버사이드에서 서버사이드 코드가 실행될때 태그가 번역되기때문에 응답데이터에는 포함되지 않는다
include
1. 정적 내포 방식
- jsp 소스를 파싱하는 단계에서 소스 자체를 내포하는 구조
<%@ include file="/02/userAgent.jsp"%>
- 컴파일된 jsp 파일을 보면, 이미 자바 코드가 포함되어있는 것을 확인할 수 있음
종류
- include 지시자: page 하나를 대상으로 한 내포
- web.xml의 jsp-config: 어플리케이션 자체를 대상으로 한 내포
<jsp-config>
<jsp-property-group>
<url-pattern>/07/*</url-pattern>
<include-prelude>/02/userAgent.jsp</include-prelude>
</jsp-property-group>
</jsp-config>
문제점
- 정적내포 방식으로 여러 소스를 include한 후, 변수를 갖다쓰다가 NullPointException과 같은 오류가 뜬다면?
- 1) 정적 내포된 파일 전부 확인해 오류 확인
- 2) web.xml 내의 jsp-config 내 파일 확인
- include-prelude: 아래 부분에 소스 삽입
- include-coda: 아래 부분에 소스 삽입
2. 동적 내포 방식
- 요청에 대한 처리가 이루어질때 runtime에 실행결과를 내포하는 구조
- 컴파일된 jsp 소스를 보면, userAgent.jsp에 대한 소스는 있지 않음
종류
- RequestDispatcher.include
- PageContext.include
pageContext.include("/02/userAgent.jsp");
- include 액션 태그
<jsp:include page="/02/userAgent.jsp"></jsp:include>
useBean
<jsp:useBean id="today" class="java.util.Date" scope="request"></jsp:useBean>
사용방식
- 스코프를 탐색 후, 해당 class 타입에 해당하는 attribute가 없을 경우에만 새로 생성하고 스코프에 넣어줌
- 스크립트 기호를 열지 않고도 객체를 받아와서 사용가능 = 변수선언하고 객체생성
<%=today %>
- 변수선언하고 객체생성한 그 변수를 scope에 넣어주는 역할
<%=request.getAttribute("today") %>
- 정리) 한 줄의 코드로 다음의 자바코드 실현 가능!
Date today = (Date) request.getAttribute("today");
if (today == null) {
today = new Date();
request.setAttribute("today", today);
}
Bean의 property에 접근하기
<jsp:getProperty property="time" name="today"/>
<jsp:setProperty property="time" name="today" value="0"/>
<jsp:getProperty property="time" name="today"/>
parameter로 setting도 가능
<jsp:setProperty property="year" name="today" value="<%=request.getParameter("year") %>"/>
<jsp:setProperty property="month" name="today" value="<%=request.getParameter("month") %>"/>
<jsp:setProperty property="date" name="today" value="<%=request.getParameter("date") %>"/>
<jsp:setProperty property="year" name="today" param="year"/>
<jsp:setProperty property="year" name="today" param="month"/>
<jsp:setProperty property="year" name="today" param="date"/>
<jsp:setProperty property="*" name="today"/>
- BeanUtils.populate 원리 = reflection 원리~
- nullpoint방지에 자주 쓰임
JDBC: Java DataBase Connectivity
- app vs. appClient?
- app: 운영서버
- appClient: 운영서버에 접근하기 위한 어플리케이션
- cmd:
where sqlplus
- => app과 appClient 양쪽에 존재
- appClient: 내 PC가 아니라 다른 PC에 접근하기 위해 사용
- cmd:
sqlplus system/java
= appClient로 접속하겠다 => TNS:protocol adapter error 유발
- 알맞은 접속방법: cmd:
system@localhost, pw:java
- cmd에서 쿼리도 쓸 수있다구~~
SELECT USERNAME FROM DBA_USERS;
SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER = 'LKR94';
ojdbc maven
- DB가 제공하는 (숨겨진) jar파일을 사용하는 게 원칙이나, Maven을 사용하고 있기때문에 jahia라는 회사의 사내 라이브러리를 몰래 쓸 예정
DB에서 제공하는 jar파일 사용 방법
- app - oracle - product - 11.2.0(버전) - server - jdbc 에 있는 jar
- jar를 직접 추가하려면 /WEB-INF/lib 에 넣어야함
Maven의 custom library 사용 방법
- mvnrepository.com - ojdbc jahia 검색 (jahia라는 회사에서 자기들 회사꺼 repository 셋팅할때 ojdbc를 올려놓음) - 첫번째꺼 클릭 - repositories 클릭 - ( http://maven.jahia.org/maven2/ 카피) - com/ - oracle/ - ojdbc6 - 여기에 있는 jar파일
Index of /groups/maven-jahia-org/com/oracle/ojdbc6/12.1.0.2
- groupId: com.oracle
- artifact: ojdbc6
- version: 12.1.0.2
- pom.xml에 커스텀저장소 추가
<repositories>
<repository>
<id>jahia</id>
<url>http://maven.jahia.org/maven2/</url>
</repository>
</repositories>
3-tier 구조
클라이언트 --- 미들티어(자바) --- 데이터베이스
- 클라이언트 <-> 미들티어: http protocol
- http protocol을 사용하는 한 클라이언트의 브라우저도 상관없고 미들티어의 서버종류도 상관없다 공통적으로 http protocol을 사용하고있기때문에
- 미들티어(자바) <-> 데이터베이스: 약속 없음
- 공통적인 프로토콜(약속)이 따로 없는 이유
- 1) 너무 다양한 종류의 db
- 2) 각자가 사용하는 db에 유리한 방식으로 사용하려고함 -> 협의점 찾기어려움
요청 비교
- 클라이언트 <-> 서버
- 서로간의 연결통로가 구축되고, 응답나가면 연락끊어진다는 규칙
- 서버 <-> db
- 네트워크 통신으로 데이터주고받아야함 == 소켓통신
- 소켓통신하기위해 port번호필요함
- 근데 db마다 port번호다름 (오라클 1521, mssql 1433)
- 그럼 db바뀔때마다 코드의 포트번호 계속바껴야하나요
- 아니다 db가 바껴도 코드는 바꾸면안됨
- 그럼 연결통로에 따라 바뀌는 코드를 짠다면 종속이 되는 것이고 결합력이 발생하는 것임
- db가 바뀌더라도 서버는 가만히있게하려면 연결통로의 접점을 없애야함
- 그래서 서버와 db 중간에 driver를 끼우는거임
- 그래서 연결통로를 생성하고싶다면 서버는 driver에만 명령을내리고 driver가 실제연결통로를 생성해주는것
- 그럼 db가 바뀔때 서버는 바뀔필요없고 driver만 바뀌면됨
- sql 패키지의 공통점 대부분이 인터페이스 -> 구현체가지고있지 x, 사용하는 방법만 정의하고있음 -> 실제인터페이스 구현체는 드라이버가 가지고있음 ==> facade pattern (여기서 드라이버를 facade라고 함)
- ex) 빔프로젝트 켜기위해 본체의 버튼누르지않고 리모콘누름. 사용하는사람은 리모콘만 누르면됨, 빔프로젝트가 바뀌더라도 리모콘의 사용방법은 같음 ( 리모톤의 사용방법이같다 = 리모콘 인터페이스가 같다)
jdbc 작동 방식
- driver 를 빌드패스에 추가 (리모콘 찾아옴)
- driver loading (vm에 너한테 이런 리모콘이 있어~ 라고 알려주기 위해)
- Connection 생성
- Query 객체 생성
1) Statement (sql injection에 취약)
2) PreparedStatement
3) CallableStatement
- Query 실행
1) ResultSet executeQuery() (결과집합) (ibatis: queryForXXX)
2) int executeUpdate() (몇개의 레코드가 영향을 받았는지 row count 확인) (ibatis: insert,update,delete)
- ResultSet 활용 (set: 순서, index없다 | db에서 cursor데이터를 가져오기위해 set이 사용되었던 것)
- 자원 해제 (close)
lombok: Domain Layer Framework
- projectlombok에서 jar파일(플러그인) 다운로드
- 디펜던시받고 어노테이션을 쓰기위해 컴파일이 필요하기때문 (?)
C:\Users\PC-02>d:
D:\>java -jar lombok.jar
- D:\B_Util\3.Eclipse\eGovFrameDev-3.9.0-64bit\eclipse\eclipse.exe 를 파일이름에복사
- 맥) /Applications/eGovFrameDev-3.9.0-MacOS-64bit.app/Contents/Eclipse/eclipse.ini
아직도업네이클립스꺼!
ini에서 확인!
다시켜
짜잔
편하쥬?
근데 롬복이 변수만 추가한다고 어떻게 gettersetter를 만들고있을까/?
자바빈규약에 따라서 만들고있던거시다
이게가능하려면 이클래스안에 어떤 property가 있다는걸 동적으로 찾아낼수있어야아함 -> 이때 롬복이 사용하는게 reflection 이라는 기술
조심
★★ private byte[] bytes; 이런거까지 toString 안들어가게.. -> 로딩하다문제생길수있음 -> bytes 가 1기가면 어쩔거야.,,
기본생성자없으면 ibatis resultClass 못써머금 -> @NoArgsContstructor
빌더에는 프로퍼티전부갖는 생성자필요 -> @AllArgsConstructor
어노테이션
- 마커 - 그냥 @Getter 이렇게
- 싱글밸류 - 웹서블릿
- 멀티밸류 -
과제
reflection 사전조사
DB 설정정보구해오기 미션
SELECT * FROM DATABASE_PROPERTIES;
- db, driver는 한셋트 (db바뀌면 driver도 바뀜)
- 그러나 driver바뀐다고 자바코드바뀌는거아님, 항상 sql패키지 아래 인터페이스를 쓰고있음 -> facade 패턴
- stmt, conn 인터페이스의 구현체는 drvier가 가지고잇음
- 예외처리 안하는이유 jsp에서 코딩중이라 톰캣이 가져가고있음