JSP - 17. 액션태그, 3-TIER, Lombok, JDBC

갓김치·2020년 12월 10일
0

JSP+Spring

목록 보기
18/43

세션 타이머

코드 수정

문제점1

  • 문자열 생성후 동적으로 element를 만들기 위해 parsing했을때 생긴 문제

방법1 - $.parseHTML

  • let msgArea = $.parseHTML(MSGMODALSRC);
    • 공백이 많아 마지막 공백을 text 로 인식
  • let msgArea = $.parseHTML(MSGMODALSRC.trim());
    • 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. 실행코드를 지연시키는 목적 파악




  • actionTagDesc.jsp

커스텀 태그

  • <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>
    <!--07 내의 있는 녀석들에게만 prelude하겠다 -->
    <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>

사용방식

  1. 스코프를 탐색 후, 해당 class 타입에 해당하는 attribute가 없을 경우에만 새로 생성하고 스코프에 넣어줌
  2. 스크립트 기호를 열지 않고도 객체를 받아와서 사용가능 = 변수선언하고 객체생성
    <%=today %>
  3. 변수선언하고 객체생성한 그 변수를 scope에 넣어주는 역할
    <%=request.getAttribute("today") %>
  4. 정리) 한 줄의 코드로 다음의 자바코드 실현 가능!
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") %>"/>

<!-- param 이용해 깔끔하게!! -->
<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약속 X

클라이언트 --- 미들티어(자바) --- 데이터베이스

  • 클라이언트 <-> 미들티어: 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 작동 방식

  1. driver 를 빌드패스에 추가 (리모콘 찾아옴)
  2. driver loading (vm에 너한테 이런 리모콘이 있어~ 라고 알려주기 위해)
  3. Connection 생성
  4. Query 객체 생성
    1) Statement (sql injection에 취약)
    2) PreparedStatement
    3) CallableStatement
  5. Query 실행
    1) ResultSet executeQuery() (결과집합) (ibatis: queryForXXX)
    2) int executeUpdate() (몇개의 레코드가 영향을 받았는지 row count 확인) (ibatis: insert,update,delete)
  6. ResultSet 활용 (set: 순서, index없다 | db에서 cursor데이터를 가져오기위해 set이 사용되었던 것)
  7. 자원 해제 (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에서 코딩중이라 톰캣이 가져가고있음
    • 그래도 tryresource로 묶어주긴해야함

profile
갈 길이 멀다

0개의 댓글