프로젝트를 만들 때 Dependencies 를 선택하는 창이 나온다.

Web Programming을 할 것이니까 Web 탭에서 Rest Repositories(RESTful 사용), Spring Web Services 를 선택하자.

SQL탭에서는 MyBatis를 사용할 것이기에 이것을 선택했고 그 외는 사용할 DB의 Driver를 선택한다.

Server 를 따로 설치하지 않기 때문에 (이 전 Spring Tool 3에서는 톰캣을 직접 넣어주었으나 여기서는 No) Boot 에서 JSP 실행을 위해 embedded tomcat을 maven repository 에서 검색한 후 version은 boot가 관리하기 때문에 version을 지운 후 넣는다.

html, css, JSP를 위해서는 상단 바 help에서 Marketplace에 들어가고 

이 것을 다운 받아준다.

표현 언어(Expression Language) 란?

- 스크립트 요소의 사용 없이 JSP 페이지에 값을 표현할 수 있는 태그 기반의 스크립트 언어이다.

- 표현 언어는 JSP 2.0버전부터 추가되었다.

- JSP 2.2(Tomcat 7.0) 부터는 EL에서 객체의 메소드를 직접 접근 할 수 있는 기능이 추가 되었다.

- 표현 언어는 JSP의 스크립트 요소 (스크립트 릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있다.

- EL 2.0은 JSP 2.2(Tomcat 7.0), EL 3.0은 JSP 2.3(Tomcat 8.0)에서 지원한다.

 

기능

- JSP의 네 가지 기본 객체가 제공하는 영역의 속성 사용

page, request, session, application에 binding된 attribute나 그 attribute의 property 값 출력

- collection 객체에 대한 접근 방법 제공

- 수치 연산자, 관계 연산자, 논리 연산자 등의 EL연산자 제공

- 자바 클래스의 메소드 호출 기능 제공

- EL 내장 객체 제공

 

형식

${expression}

- 중괄호에 있는 표현식은 런타임에 평가되고 출력 스트림으로 전송된다. 

 

 

ch10

ex01 - 사칙연산 및 연산

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>EL</h3>

<p>사칙연산</p>
<p> ${3+5} <!-- 8 : Long형 --> </p>
<p> ${3+"5"} <!-- 8 : Long형 --> </p>
<p> 3+null의 결과는 0 (null은 0으로 변환되어 연산) : Long형 --> </p>
<p> ${10/5} <!-- 2.0 : Double형 --> </p>
<p> ${13/5} <!-- 2.6 : Double형 --> </p>
<p> ${13 mod 5} <!-- 3 --> </p>
<p> ${13 % 5} <!-- 3 --> </p>
<p> EL에서는 "A"+"B" 처럼 문자열 결합을 하면 에러가 발생한다. </p>
<hr>

<p>비교/논리 연산</p>
<p> 3 == 4 : ${3==4 }, 3 eq 4 : ${3 eq 4 } </p>
<p> 3 != 4 : ${3 !=4 }</p>  <%-- 3 ne 4 : ${3 ne 4 } 이것도 됨 --%> 
<p> 3 lt 4 : ${3 lt 4 }, ${ 3<4 }</p>
<p> 3 gt 4 : ${3 gt 4 }, ${ 3>4 }</p>
<p> 3 le 4 : ${3 le 4 }, ${ 3<=4 }</p>
<p> 3 ge 4 : ${3 ge 4 }, ${ 3>=4 }</p>

<p> empty name : ${empty name}</p> <!-- 속성이름에 name이 없으므로 true -->
<!-- empty는 값이 null, 빈문자열, 길이가 0인 배열은 true -->

<p>  ${10%2==0?"짝수":"홀수" }</p>

<p> 기타 연산 </p>
<p> 문자열 결합 : +=, ${"서울" += "경기"}</p>
<p> 세미콜론연산자 - a;b 에서 a는출력 되지 않고 b만 출력</p>
<p> ${1+2; 2+5 } - 결과 : 7</p>
<p> 할당 연산자 : 할당연산 자체도 출력 </p>
<p> ${a=10 } ${a} - 결과 10 10</p>
<p> ${a=10; a } - 결과 : 10 </p>

</body>
</html>

 

ex02 EL 내장객체

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>EL 내장 객체</h3>

<p> pageContext : 현재 페이지의 설정 정보</p>
<p> ContextPath : <%=request.getContextPath() %> </p>
<p> ContextPath : ${pageContext.request.contextPath } </p>
<hr>

<p> header : 요청 헤더 정보 </p>
<p> User-Agent : ${header["user-agent"]} </p>

</body>
</html>

 

ex03 - 객체 EL 로 표현

더보기
<%@ page import="ch10.user.User" %>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	request.setCharacterEncoding("utf-8");

	User dto = new User("홍길동", 10, "010-1111-1111");
	request.setAttribute("vo", dto);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<jsp:forward page="ex03_ok.jsp">
	<jsp:param value="서울" name="city"/>
</jsp:forward>


</body>
</html>
<%@page import="ch10.user.User"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%
	request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<!-- 
	EL의 주 사용 목적은 request, pageContext, session 등에서 
	설정한 속성(attribute)을 출력하기 위해 사용한다. 
-->

<h3>EL을 사용하지 않는 경우</h3>
<%
	User vv = (User)request.getAttribute("vo");
	String city = request.getParameter("city");
%>
	<!-- 필드의 값이 null인 경우 null로 출력 된다. -->
<p> <%=vv.getName() %>, <%=vv.getAge() %>, <%=vv.getTel() %>, <%=vv.getSubject() %></p>
<p> <%=city %> </p>

<h3>EL을 사용하는 경우</h3>
	<!-- 필드의 값이 null인 경우 아무것도 출력되지 않는다. -->
<p> ${vo.name}, ${vo.age}, ${vo.tel}, ${vo.subject } </p>

<!-- 파라미터는 param이라는 내장 객체 -->
<p> ${param.city} </p> <!-- request.getParameter("city"); 와 유사 -->

</body>
</html>

 


JSTL(JSP Standard Tag Library) 이란?

- JSP에서는 사용자가 태그를 정의해서 사용하는 것이 가능하며, 이런 사용자 정의 태그를 커스텀 태그라고 하는데 이들 중 자주 사용하는 것을 표준으로 만들어 놓은 것이 JSTL 이다.

- JSTL은 JSP의 공통적인 핵심 기능을 캡슐화한 태그 모음이다.

- JSTL은 반복(iteration) 및 조건문, XML문서 조작을 위한 태그, 국제화 태그 및 SQL 태그와 같은 일반적인 구조 작업을 지원한다.

- JSTL과 커스텀 태그 및 JSP액션태그는 XML 기반에서 작성이 되었기 때문에 모든 태그는 시작 태그와 종료 태그의 쌍으로 이루어져야 한다.

- 시간, 날짜, 숫자의 포맷이나 문자열 가공 등의 처리에서 비즈니스 로직과 프리젠테이션 로직을 분리할 수 있다.

- JSTL은 EL(Expression Language)를 사용하여 표현한다.

- JSTL 1.2버전은 Tomcat 6.0부터 사용 가능하다.

 

JSTL 사용을 위한 jar

- JSTL은 커스텀 태그의 일종으로 자바로 작성된 tag이므로 다음의 라이브러리가 필요하다.

- jstl-1.2.jar의 maven dependency

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

<version>1.2</version>

</dependency>

 

taglib 지시어

- 사용자 정의 태그나 JSTL사용을 위한 태그 라이브러리를 지정한다.

- taglib 지시어는 사용자 정의 태그, JSTL의 라이브러리 위치를 식별하고 JSP 에서 사용자 정의 태그 및 JSTL을 식별하기 위한 방법을 선언한다.

- 형식

<%@taglib uri="uri" prefix = "prefixOfTag">

- 속성

uri : 태그 라이브러리 URI 또는 태그 라이브러리 디스크립터 파일의 URI

prefix : 사용자 정의 태그 접두사(태그를 식별하기 위한 이름)

- 사용 예

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

 

ex04 - core 태그 사용 c:if

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
	request.setCharacterEncoding("utf-8");
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<!-- form 태그에서 action을 생략하면 자신의 주소가 action이 된다. -->
<form method="post" action="ex04.jsp">
<p>
	<input type="text" name="num" placeholder="숫자" required="required" pattern="\d+">
	<button type="submit">확인</button>
</p>
</form>

<!-- c:if 태그는 조건이 참인 경우에 실행하며, else 구문은 존재하지 않는다. -->
<c:if test="${ not empty param.num }">
	<p>
		${param.num} : ${param.num % 2 == 0 ? "짝수":"홀수"}
	</p>
</c:if>

<c:if test="${ not empty param.num }">
	<p>
		<c:if test="${param.num%2==0}">
			짝수
		</c:if>
		<c:if test="${param.num%2==1}">
			홀수
		</c:if>
	</p>
</c:if>

</body>
</html>

 

ex05 - c:choose 다중 선택구문

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>c:choose : 다중 선택 구문</h3>

<form action="ex05.jsp" method="post">
<p>
	<input type="text" name="num" placeholder="숫자" required="required" pattern="\d+">
	<button type="submit">확인</button>
</p>
</form>
<hr>

<c:if test="${not empty param.num }">
<p>
	<c:choose>
		<c:when test="${param.num%3==0 && param.num%4==0 and param.num !=0}">
			${param.num} : 3과 4의 배수
		</c:when>
		<c:when test="${param.num%3==0 && param.num !=0}">
			${param.num} : 3의 배수
		</c:when>
		<c:when test="${param.num%4==0 && param.num !=0}">
			${param.num} : 4의 배수
		</c:when>
		<c:otherwise>
			${param.num} : 3 또는 4의 배수가 아님
		</c:otherwise>
	</c:choose>
</p>
</c:if>

</body>
</html>

 

로그를 찍히게 하기 위해 pom.xml 에 추가해야 하는 dependency가 있다.

 

<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.10</version>
    <scope>test</scope>
</dependency>

 

scope를 runtime으로 바꿔주어야 다 찍힌다.

 

pom.xml 에서 자바 버전과 스프링프레임워크의 버전을 바꿔줄 수 있다. 

 

dependency를 확인할 수 있는 사이트 : https://mvnrepository.com/

jdbc와 transaction을 위한 dependency를 추가했는데, 버전부분을 ${org.springfrwamework-version} 으로 바꾸면 위에서 보았던

<properties>

  :

   <org.springframework-version>5.3.13</org.springframework-version>

 

</properties>

<org.springframework-version> 태그 안의 값으로세팅되기 때문에 나중에 버전을 일일히 바꿀 필요가 없어서 좋다.

프로젝트를 생성하고 나서는 Project Facets 에서 자바 버전을 맞춰주어야한다. 내가 깔은 자바 버전은 1.8 이기때문에 바꿔주었다. Dynamic Web Module 의 경우도 Servlet 3.1을 쓰기 때문에 바꿔주었다.

 

여기서 설정한 환경 변수가 classpath:/의 위치이다.

DB연결을 위한 JDBC, DBCP, Pool dependency도 검색해서 추가.

MariaDB 사용을 위한 dependency 추가 maven repository 에서 검색해서 넣어주면 된다.

오라클을 사용하려면 위 dependency를 추가한다.

mybatis 를 쓸 것이기 때문에 pom.xml 에 관련 사항도 추가해주자.

이 두개의 xml 이 객체 생성의 역할을 맡는다. 

mybatis의 객체생성을 위해서 root-context.xml 에 import 태그로 mybatis 를 연결해 객체생성을 할 수 있도록 한다.

 

 

 

POST 방식으로 통신하게 될 때 한글 깨짐 현상을 방지하기 위해서 POST방식을 UTF-8로 인코딩설정하기

하나라도 오타가 있으면

이렇게 ???로 한글이 깨져서 들어가게된다. 

주의할 것

 

이외 JSP, HTML, CSS 등 인코딩을 UTF-8로 바꿔주고

workspace의 인코딩도 UTF-8로 바꿔준다.

 

웹 브라우저를 Chrome 으로 선택하기

 

 

환경설정은 아무래도 처음 깔았을 때 빼고는 안하다 보니까 + 처음에는 선생님께서 하라는 대로 했기 때문에 자세히 기억이 안났는데 다시 처음부터 하다 보니까 오히려 이게 이렇게 필요한 거구나 하면서 알게되었던 것들이 있다. 

 

 

server.xml 파일에서 Connector 부분에서 포트번호를 바꿀 수 있고 URIEncoding을 통해 한글 인코딩을 설정해야한다.

설치 시 UTF-8로 문자셋을 설정해주어야 한글이 깨지지 않는다. 

Use UTF8 as default server's character set 을 눌러주자.

 

Enable networking 을 체크해주어야 다른 컴퓨터에서도 접근이 가능하다.

이후 윈도우 시작탭에서 MySQL Client (MariaDB) 라고 생기므로 누르고 들어가면된다.

 

Show database;
SELECT database();

 

CREATE database mydb;
USE mydb;

CREATE TABLE bbs (

);

DESC bbs;

show databases;
-- use (디비이름); 후
show tables;

AOP (Aspect Oriented Programming) 란?

관점 지향 프로그래밍

핵심 비지니스 로직과 공통 모듈을 분리함으로써 개발자가 좀 더 비지니스 로직에만 집중해서 처리할 수 있는 방법을 제공 한다.

공통 모듈을 적용해서 발생하는 의존 관계의 복잡성과 코드 중복을 해소해 주는 프로그래밍 기법이다.

즉, 공통 모듈(로깅, 보안인증, 트랜잭션 등)을 별도로 작성한 후 코드밖에서 비지니스 로직 사이에 삽입하는 것이 AOP 기능을 사용해 개발한 것이라고 볼 수 있다.

AOP는 OOP(Object Oriented Programming)를 대신하는 새로운 개념이 아니라, OOP를 더욱 OOP답게 사용할 수 있도록 도와주는 개념이다.

 

AOP 특징

Spring은 프록시(Proxy) 기반 AOP를 지원한다.

- Spring은 타겟(target) 객체에 대한 프록시를 만들어 제공한다.

- 타겟을 감사는 프록시는 실행시간(Runtime)에 생성된다.

- 프록시는 Advice를 타겟 객체에 적용하면서 생성되는 객체이다.

 

프록시(Proxy)가 호출을 가로챈다(intercept)

- 프록시는 타겟 객체에 대한 호출을 가로챈 다음 Advice의 부가기능 로직을 수행하고 난 후에 타겟의 핵심기능 로직을 호출한다.(전 처리 Advice)

- 타겟의 핵심기능 로직 메소드를 호출한 후에 공통 기능(Advice)을 수행한다. (후 처리 Advice)

 

Spring AOP는 메소드 Join Point만 기원한다.

- Spring은 동적 프록시를 기반으로 AOP를 구현하므로 메서드 Join Point 만 지원한다.

- 핵심 기능(타겟)의 메소드가 호출되는 런타임 시점에만 공통 기능(Advice)을 적용할 수 있다.

- AspectJ 같은 고급 AOP 프레임워크를 사용하면 객체의 생성, 필드 값의 조회와 조작, static 메소드 호출 및 초기화 등의 다양한 작업에 공통기능을 적용 할 수 있다. 

import java.util.Random;

public void generatePwd() throws Exception {
		// 10자리 임시 패스워드 생성
		StringBuilder sb = new StringBuilder();
		Random rd = new Random();
		String s = "~!@#$%^&*+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
		for (int i = 0; i < 10; i++) {
			int n = rd.nextInt(s.length());
			sb.append(s.substring(n, n+1));
		}

		System.out.println(sb.toString()); // 생성된 10자리 임시 패스워드 확인용
		
	}

Random 클래스를 임포트해서 문자열 s에서 무작위로 뽑은 한 자리를 스트링 빌더객체 sb에 10번 붙여주고 마지막에 스트링빌더에 있던 것을 toString() 메소드를 이용해서 변환시켜준다.

+ Recent posts