본문 바로가기
국비학원

[국비지원] KH 정보교육원 88일차

by 도전하는 개발자 2022. 8. 2.

kh day 088

이번주 공지사항
목요일 능력단위평가 빠지지마세요

이번주 훈련방향
가. 지난주 복기
 - Servlet/JSP : JSP EL 완료, JSTL 진행중, UUID 생성기 완료

나. 이번주 예정
 1) Servlet/JSP 완료
 2) 선행요소 : MyBatis SQL Mapper Framework, Quartz Job Scheduler Framework
 3) Eclipse에 Spring Plugin 설치하여 Spring 개발환경 구축
 4) Maven 기반 스프링 MVC Project 생성 연습 (10회 이상)
 5) 스프링 MVC Project 설정에 대한 이해
   : pom.xml, web.xml, log4j2.xml, root-content.xml, servlet-context.xml
 6) 스프링 프레임워크의 양대 기둥인 DI(의존성 주입)와 AOP(관점 지향 프로그래밍)중
     DI(의존성 주입, Dependency Injection) 완료

---

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<jsp:useBean id="myBean" class="org.zerock.myapp.domain.LoginBean" scope="page" />

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>exam01.jsp</title>
</head>

<body>
    <h1>/JSTL/exam01.jsp</h1>
    <hr>

    <h2>JSTL Core 라이브러리 실습#1</h2>
    <hr>

    <!-- set 태그의 목적 -->
    <!-- var 속성 : 바인딩되는 속성의 이름지정 -->
    <!-- value 속성: 바인딩되는 속성의 값 -->
    <!-- 이 태그의 var 속성의 값이 EL 변수명이 됨! -->

    <c:set var="__PAGE__"           value="VALUE_1" scope="page" />
    <c:set var="__REQUEST__"        value="VALUE_2" scope="request" />
    <c:set var="__SESSION__"        value="VALUE_3" scope="session" />
    <c:set var="__APPLICATION__"    value="VALUE_4" scope="application" />

    <!-- out 태그의 value 속성의 값: (1) 문자열 or (2) EL 표기법 -->
    1. <c:out value="Helllo World"/> <br>
    2. <c:out value="${ __PAGE__ }"/> <br>
    3. ${ __PAGE__ } <br>

    <h2>JSTL Core 라이브러리 실습#2</h2>
    <hr>

    <!-- 4개의 공유영역에 한군데에 정한 이름으로 정한 값을 바인딩 수행  -->

    <!-- 아래의 set 태그는 공유영역에 속성 바인딩을 수행하는 것이 아니라
    이미 공유영역에 바인딩 되어있는 자바빈즈 객체의 특정 프로퍼티의 값을
    설정 (set) 하는 태그 역할을 수행 -->

    <c:set target="${ myBean }" property="userid" value="trinity" />

    4. ${ myBean.userid } <br>
    5. <c:out value="${ myBean.userid }" />

    <h2>JSTL Core 라이브러리 실습 #3</h2>
    <hr>

    1. 삭제전 : <c:out value="${__REQUEST__}" /> <br>

    <c:remove var="__REQUEST__"/>

    2. 삭제후 : <c:out value="${ __REQUEST__ }" />
</body>
</html>

exam01.jsp (JSTL 폴더)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>exam02.jsp</title>
</head>
<body>
    <h1>/JSTL/exam02.jsp</h1>
    <hr>
    
    <c:out value="${__PAGE__}" /> <br>
    <c:out value="${__REQUEST__}" /> <br>
    <c:out value="${__SESSION__}" /> <br>
    <c:out value="${__APPLICATION__}" /> <br>
</body>
</html>

exam02.jsp (JSTL 폴더)



-

<c:if> 태그
조건 처리를 할 때 사용하는 태그이다. 자바의 if문과 동일한 기능을 한다. 기본적인 구조는 다음과 같다.

<c:if test="조건식" var="변수명" scope="scope값">
    문장
</c:if>

test 속성에는 조건식을 지정하는데 일반적으로 EL표기법을 사용한다. var 속성에는 조건처리한 결과가 저장된다. scope 속성에는 변수의 scope 영역을 설정한다.

 


<c:choose> , <c:when> , <c:otherwise> 태그
자바의 switch문과 동일한 기능을 제공하는 태그이다. 하나 이상의 <c:when>태그와 하나의  <c:otherwise>태그로 구성된다. 일반적인 기본구조는 다음과 같다. 

<c:choose> 
   <c:when test="조건“>문장<c:when>
   <c:when test="조건“>문장<c:when>
   <c:otherwise>문장</c:otherwise>
</c:choose>

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>exam03</title>
</head>
<body>
    <h1>/JSTL/exam03.jsp</h1>
    <hr>

    <h2>JSTL Core 라이브러리 실습 #1</h2>
    <hr>

    <c:set var="myColor" value="빨강" scope="page" />

    <c:if test="${ myColor == '빨강' }" >
        <p>색상은 빨강색이다.</p>
    </c:if>

    <h2>JSTL Core 라이브러리 실습 #2</h2>
    <hr>

    <c:set var="grade" value="70" scope="request" />

    <c:choose>
        <c:when test ="${ grade >= 90 }">
            학점은 A 이다.
        </c:when>
        
        <c:when test ="${ grade >= 80 }">
            학점은 B 이다.
        </c:when>

        <c:when test ="${ grade >= 70 }">
            학점은 C 이다.
        </c:when>

        <c:otherwise>
            학점은 F 이다.
        </c:otherwise>

    </c:choose>
</body>
</html>

exam03.jsp (JSTL 폴더)

-

<c:forEach> 태그
반복 처리시 사용하는 태그로서 자바의 for문과 비슷하다. 기본적인 구조는 다음과 같다. 

<c:forEach items="객체명" begin="시작 인덱스" end="끝 인덱스" step="증가값" 

                                                                                                                         var="변수명" varStatus="other변수" >
 문장
</forEach>

items 속성에는 배열이나 List형태의 반복할 객체를 지정하여 객체가 저장된 데이터 갯수만큼 반복 처리하거나 begin과 end 속성을 이용하여 원하는 범위만큼 반복 처리도 가능하다. step 속성은 증가값을 지정하여 짝수 또는 홀수 인덱스에 해당되는 반복 처리도 지원된다. var 속성에는 현재 실행된 값이 저장된다.


<c:forTokens> 태그
자바의 StringTokenizer 클래스를 이용한 반복처리에 사용된다. 기본적인 구조는 다음과 같다. 

<c:forTokens items="객체명" delims="구분자" begin="시작 인덱스" end="끝 인덱스" step="증가값"

                                                                                                                      var="변수명" varStatus="other변수" >
 문장
</forTokens>

delims 속성에는 토큰(문자열)을 구분할 구분자를 지정한다. delims 속성값을 기준으로 반복적으로 데이터를 얻는다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Arrays" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>exam04</title>
</head>
<body>
    <h1>/JSTL/exam04.jsp</h1>
    <hr>
    
    <h2>JSTL Core 라이브러리 실습</h2>
    <hr>

    <%  // scriptlet tag
        
        int [] num = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        
        // request scope에 배열객체 바인딩
        request.setAttribute("myArray", num);
    %>

    <c:forEach var="element" items="${ myArray }">
        ${element} <br>
    </c:forEach>

    <h2>JSTL Core 라이브러리 실습 #2</h2>
    <hr>

    <%  // scriptlet tag : 인덱스 기반의 자료구조인 List 컬렉션 생성 및 공유속성 바인딩

        // Arrays.asList() 메소드를 사용해보자
        java.util.List<String> list = Arrays.asList("홍길동", "이순신", "유관순");

        request.setAttribute("__NAME__", list);
    %>

    <c:forEach var="name" items="${__NAME__}">
        ${name} <br>
    </c:forEach>

    <h2>JSTL Core 라이브러리 실습 #3</h2>
    <hr>

    <%  // scriptlet tag
        String str = "A,B,C,D";
        request.setAttribute("data", str);
    %>

    <c:forTokens var="token" items="${ data }" delims=",">
        <c:out value="${ token }" /> <br>
    </c:forTokens>
</body>
</html>

exam04.jsp (JSTL 폴더)



---

2) JSTL formatting 라이브러리
JSTL formatting 라이브러리는 국제화/지역화 및 데이터 포맷과 관련된 기능을 포함하는 태그이다. 국제화/지역화는 다국어 처리와 관련되고 데이터 포맷은 날짜 및 숫자 처리와 관련된 기능이다. JSP에서 사용하기 위해서는 반드시 다음과 같이 taglib 지시어를 사용해야 된다. 

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

다음은 JSTL formatting 라이브러리에 포함된 태그의 목록이다.



<fmt:requestEncoding> 태그
입력 파라미터값에 대한 인코딩 처리시 사용된다. 서블릿의 request.setCharacterEncoding(encoding) 메소드와 동일하다. 기본적인 구조는 다음과 같다. 

<fmt:requestEncoding value="인코딩“ />

value 속성에 인코딩값을 지정한다.

<fmt:setBundle> 태그
properties 확장자를 갖는 파일을 지정하기 위한 태그이다. 일반적으로 ‘리소스 번들’이라고 부르며 /WEB-INF/classes 폴더에 저장한다. 리소스 번들의 내용은 key=value 형식의 문자열로 지정하고 한글은 입력 불가이다. 한글을 입력하기 위해서는 아스키 코드로 변환하여 입력시켜야 된다. 리소스 번들의 목적은 국제화/지역화 기능을 구현하기 위해서 사용된다. 여
러 언어로 작성된 리소스 번들을 작성하고 JSP에서는 지역에 맞게 언어별로 특정 리소스 번들의 문자열을 얻어서 웹 브라우저에 출력하는 메커니즘이다. 언어별로 서로 다른 웹 페이지를 중복 작성하지 않기 때문에 재사용성이 높아서 관리가 쉬워진다. 기본적인 구조는 다음과 같다. 

<fmt:setBundle basename="리소스 번들" var="변수명" scope="scope영역" />

basename 속성에는 리소스 번들값을 지정하고 저장 경로는 /WEB-INF/classes 폴더에 저장시켜야 된다. var 속성은 메시지를 저장할 변수명을 지정한다.

 


<fmt:message> 태그
리소스 번들에서 지정한 값들을 참조할 때 사용한다. 기본적인 구조는 다음과 같다.

<fmt:message key="key값" bundle="번들명" var="변수명" scope="scope영역" />

key속성에는 리소스 번들에서 읽어올 메시지의 key값을 설정한다. bundle속성에는 setBundle에서 var 속성에 지정했던 값을 설정한다. var 속성에는 읽어온 메시지를 저장하는 변수이다

먼저 main/resources 폴더에 bundle.properties를 먼저 만들어주자 

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>


<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>exam01</title>
</head>
<body>
    <h1>/FMT/exam01.jsp</h1>
    <hr>

    <h2>JSTL fmt 라이브러리 실습#1</h2>
    <hr>

    <fmt:setBundle basename="bundle" var="myBundle" scope="page" />
    
    <p>
        <fmt:message key="sendMessage" bundle="${ myBundle }" />
    </p>
</body>
</html>

exam01.jsp (FMT 폴더)

-

<fmt:formatNumber> 태그
수치 데이터를 특정 포맷으로 설정시 사용되는 태그이다. 기본적인 구조는 다음과 같다. 

<fmt:formatNumber value="값" type="타입" pattern="턴" currencySymbol="값" maxIntegerDigits="값" minIntegerDigits="값" maxFractionDigits="값" minFractionDigits="값" var="변수명" scope="값" /> 

value 속성에는 실제 수치값을 지정하고 type속성에는 number,currency,percent 값중에서 설정 가능하다. pattern 속성에는 사용자가 지정한 형식패턴을 설정한다. currencySymbol 속성에는 통화 기호를 지정하고 maxIntegerDigits 속성에는 정수의 최대자리수를 지정하고 minIntegerDigits 속성에는 정수의 최소 자릿수를 지정한다. maxFractionDigits 속성에는 소수점 이하 최대 자리수를 지정하고 minFractionDigits 속성에는 소수점 이하 최소 자릿수를 지정한다.

 


<fmt:formatDate> 태그
날짜 데이터를 특정 포맷으로 설정시 사용되는 태그이다. 기본적인 구조는 다음과 같다. 

<fmt:formatDate value="값" type="타입" dateStyle="날짜스타일"  timeStyle="시간스타일" pattern="패턴" 

var="변수명" scope="scope영역"/> 

value 속성에는 실제 날짜와 시간을 설정하고 type 속성에는 time,date,both 값중에서 하나를 지정 가능하다. dateStyle 속성에는 미리 정의된 날짜 스타일형식을 지정 가능하고 timeStyle 속성에는 미리 정의된 시간 스타일형식을 설정한다. pattern 속성에는 사용자가 지정한 형식 스타일을 설정한다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>exam02</title>
</head>
<body>
    <h1>/FMT/exam02.jsp</h1>
    <hr>

    <h2>JSTL fmt 라이브러리 실습 #1</h2>
    <hr>

    <!-- 1. core library -->
    <c:set var="myDate" value="<%= new Date() %>" scope="page" />
    1. <c:out value="${ myDate }" /> <br>

    <!-- 2. formatting library -->
    2. <fmt:formatDate value="${ myDate }" type="date" /> <br>
    3. <fmt:formatDate value="${ myDate }" type="time" /> <br>
    4. <fmt:formatDate value="${ myDate }" type="both" /> <br>
    5. <fmt:formatDate value="${ myDate }" type="both" dateStyle="short" timeStyle="long" /> <br>
    6. <fmt:formatDate value="${ myDate }" type="both" dateStyle="long" timeStyle="short" /> <br>
    7. <fmt:formatDate value="${ myDate }" type="both" pattern="yyyy/MM/dd HH:mm:ss.SSS" /> <br>

    <h2>JSTL fmt 라이브러리 실습 #2</h2>
    <hr>

    1. <fmt:formatNumber value="100000" type="currency" /> <br>
    2. <fmt:formatNumber value="0.123" type="percent" /> <br>
    3. <fmt:formatNumber value="987654321.1234" pattern="###,###,###.00" /> <br>
</body>
</html>

exam02.jsp -> FMT 폴더

---

Servlet / JSP 끝!!! 수고했습니다
이제 스프링 들어가기 전에 MyBatis와 Quartz를 배웁시다

MyBatis와 Quartz 예제 패키지를 임포트 시키자



mybatis라는 메이븐 프로젝트를 만들자 (quickstart로)


studymybatis의 pom.xml을 복사해 mybatis에덮어쓰자.

빌드패스 맞춰주고 log4j2도 main/resoueces에 덮어쓰자

 



test/java에 AppTest.java 작성하자 (JUnit template으로 jdbc에서 해봤던거다 확인해보세요)

 

@Log4j2
//JUnit 기반의 테스트 클래스는 반드시 기본 생성자를 가져야 함. 그 외의 다른 생성자를 가져서는 안 됨
@NoArgsConstructor

// JUnit Jupyter Test Framework가 개발자가 만든 테스트 클래스의 테스트 메소드를 수행할 때,
// 테스트 인스턴스(객체)를 어떤 단위로 생성할 것인지 지정하는 어노테이션
// (1) Per_CLASS : 테스트 메소드가 몇개던 하나의 인스턴스를 가지고 모든 테스트 메소드를 수행하겠다
// (2) Per_METHOD : 테스트 메소드마다 인스턴스를 생성해서 해당 테스트 메소드를 수행하겠다
@TestInstance(Lifecycle.PER_CLASS) 

// 이 테스트 클래스에 만들 테스트 메소드의 실행순서를 정하는 기준을 설정하는 어노테이션
// (1) MethodOrderer.MethodName			: 테스트 메소드 이름을 정렬해서 실행순서를 결정 (사전순서) 
// (2) MethodOrderer.DisplayName		: 테스트 메소드 표시이름을 정렬해서 실행순서를 결정 (사전순서)
// (3) MethodOrderer.OrderAnnotation	: @Order(순서를 의미하는 정수 >=1) 어노테이션으로 테스트 메소드 실행순서 결정 ***
// (4) MethodOrderer.Random				: 무작위로 테스트 메소드의 순서를 매번 결정
@TestMethodOrder(OrderAnnotation.class)
public class AppTest {

	// 테스트 수행전, 전처리 로직을 수행하는 메소드 (선택)
	@BeforeAll		// 1회성 전처리 로직을 넣을 때 사용
	void beforeAll() { 
		log.trace("beforeAll() invoked.");
	} // beforeAll
	
	@BeforeEach		// 테스트 메소드 수행전 매번 수행되며 전처리 로직을 넣을 때 사용
	void beforEach() { 
		log.trace("beforEach() invoked.");
	} // beforEach
	
	// Test Units + Orders => Test Scenario
	
	// 테스트 메소드 (필수)
	@Test
	@Order(2)  // 이 테스트 메소드의 실행순서를 2번째로 해보자
	@DisplayName("2. 데이터소스 테스트")  // JUnit 탭에 표시될 문구 입력
	@Timeout(value=2000, unit=TimeUnit.MILLISECONDS) // 설정한 시간(2초)이 지나면 Timed Exception 발생!
	void T1() {  // Test Unit
		log.trace("T1() invoked.");
	} // T1
	
	@Test
	@Order(1)  // 이 테스트 메소드의 실행순서를 1번째로 해보자
	@DisplayName("1. 자바빈즈 객체 테스트")  // JUnit 탭에 표시될 문구 입력
	@Timeout(value=2, unit=TimeUnit.SECONDS) // 설정한 시간(2초)이 지나면 Timed Exception 발생!
	void T2() { 
		log.trace("T2() invoked.");
	} // T2
	
	// 테스트 수행후, 후처리 로직을 수행하는 메소드 (선택)
	@AfterEach		// 테스트 메소드 수행후 매번 수행되며 후처리 로직을 넣을 때 사용
	void afterEach() { 
		log.trace("afterEach() invoked.");
	} // afterEach
	
	@AfterAll		// 1회성 후처리 로직을 넣을 때 사용
	void afterAll() { 
		log.trace("afterAll() invoked.");
	} // afterAll

} // end class


AppTest.java

분명 JUnit Template 할 때 배운건데 새로 보는거 같죠? 공부를 안 했다는 겁니다.
반성하고 복습하세요~~!!