Spring Framework
전자정부 표준 프레임워크
공공기관에서 웹페이지를 만들때 지켜야하는 규약 / 정해진 틀을 제공
spring
- jstl/el
- mybatis
- js, jquery + ajax
- bootstrap
POJO -> 여태 import해서 썼던 무거운 클래스를 쓰는게 아니라 가벼운 클래스들을 사용하고
annotation을 쓰면 spring에서 자동으로 상속받는 개념
IoC : 제어의 역전
DI : 의존성주입
AOP : 관점지향 programming
eclipse에서 jstl 사용
pom.xml -> jstl 라이브러리 추가 (maven repository)
jsp파일 만들고 지시자 사용하여
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-> prefix="c": 접두사 c를 써서 taglib사용할때 c만 적어도 사용할수 있게
jsp/servlet에서는 다음과 같이 스크립트릿으로 썼지만 jstl은 간단하게 쓸 수 있다.
<% if (true) {%>
<h1>123</h1>
<%} %>
위에서 core라이브러리를 c라는 접두사를 활용한다고 정의 해놨으니
<c: > 를 이용하면 된다.
반복문, 조건문
<c:forEach begin="1" end="5" step="1" var = "i"> -> 시작지점 1 / 끝5 / 1씩 증가 / 이 증가값을 변수 i에 넣는다.
<c:if test="${i%2==0}">
<%-- EL : Expression Language (${} 로 사용) --%>
<!-- 변수, 연산자, 객체에 들어있는 값을 꺼내올때 EL표현식 사용 -->
<font size="${i}">jstl을 왜 배울까?</font>
<br>
</c:if>
</c:forEach>
<font size="${i}">jstl을 왜 배울까?</font>
변수를 그냥 쓸 수 없고 EL표현식을 사용해야한다 -> ${i}
변수선언
<c:set var="apple" value="사과"/> <c:set></c:set> 를 <c:set />으로 쓸 수 있다.
${apple}
jstl/el 문법
Spring
Servers에서 tomcat서버 더블 클릭후 http 포트번호 변경
Spring에서는 WEB-INF안에 views 파일안에 jsp파일을 넣어야 한다.
WEB-INF는 보안폴더인데 controller를 통해서 실행해야 한다.
jsp/servlet에서는 client가 jsp에게 요청해서 실행 했지만
spring에서는 client가 front controller에게 요청하고 front controller가 controller에게 요청 후 jsp파일을 보여준다
front controller가 교통정리를 해주고 controller(POJO)가 나머지를 처리
spring은 controller를 최대한 경량화 하는게 목표
// FrontController + Controller(아직은 컨트롤러 역할까지 한다)
// POJO 클래스
// Spring에서는 반드시 FC를 거쳐서만 view에 접근할 수 있다.
@Controller //FrontController임을 알려주는 annotation
public class HomeController {
// 요청에 대한 경로값을 설정
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
//jsp파일의 논리적인 주소 --> 물리적인 주소로 spring에서 변환
}
}
servlet-context.xml에서 (WEB-INF - spring - appServlet 안에 있다)
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" /> 로 설정 되어있어서
home이라고만 써도 자동으로 경로를 잡아서 찾을 수 있다.
- spring에서 controller는 POJO로 일반 java 클래스 파일
package kr.smhrd.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller //FrontController임을 알려주는 annotation
public class BoardController {
//메소드를 만들때: public String 메소드명()
@RequestMapping("/basic.do")
public String basic() {
//WEB-INF/views/basic.jsp파일을 부를수 있는 메소드
return "basic";
}
}
이렇게 접속 가능하다
//pom.xml에 들어가서 spring, eclipse 버전 변경
<properties> spring버전 변경
<java-version>1.6</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version> -->3.1.1을 4.3.14로 변경
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<configuration> eclipse버전 변경
<source>1.6</source> --> 1.8로 변경
<target>1.6</target> --> 1.8로 변경
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
프로젝트 우클릭 후 Maven -> update project -> Force Update 체크 후 업데이트 진행
(강제로 업데이트 한번 해줘야 버전 변경이 적용된다)
Bootstrap을 사용하기 위한 라이브러리를 검색해
CDN(Content Delivery Network)을 가져와 head태그 안에 넣는다.
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<%@ 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>
<!-- bootstrap을 사용하기 위해 필요한 라이브러리 3개 -->
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<!-- jQuery library -->
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<!-- Latest compiled JavaScript -->
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<h2>게시판만들기</h2>
<div class="panel panel-default">
<div class="panel-heading">SpringMCV 게시판</div>
<div class="panel-body">
<table class = "table table-bordered table-hover">
<tr>
<td>번호</td>
<td>제목</td>
<td>작성자</td>
<td>작성일</td>
</tr>
<!--
for each문
for(int i : array){
}
-->
<c:forEach var = "vo" items="${list}">
<tr>
<!-- EL 표현식 -->
<!-- :객체바인딩 된 데이터를 바로 꺼내올 수 있다. -> request.getAttribute할 필요 없다 -->
<!-- request객체에 getattribute 하는것 -> 객체 바인딩 -->
<td>${vo.idx}</td>
<td>${vo.title}</td>
<td>${vo.writer}</td>
<td>${vo.indate}</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</div>
</body>
</html>
jsp파일에서 run on server로 실행 -> 404오류 (WEB-INF는 보안폴더)
-> 앞서 설정했던 경로 basic.do로 바꾸면 페이지 볼수있다.
lombok -> dependency 추가 후 jar파일도 다운받아서 파일 실행 후 설치 할 eclipse 경로 지정 후 설치
@Data annotation을 이용해 롬복으로 getter setter메소드 생성
package kr.smhrd.web;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import kr.smhrd.model.BoardVO;
@Controller //FrontController임을 알려주는 annotation
public class BoardController {
//메소드를 만들때: public String 메소드명()
@RequestMapping("/basic.do")
public String basic(HttpServletRequest request) {
// 요청이 들어왔을때 HttpServletRequest request라고 써주기만 하면 request 객체 새로 생성 할 필요 없다.
ArrayList<BoardVO> list = new ArrayList<BoardVO>();
//BoardVO(vo1,vo2)들을 한곳 ArrayList에 담는다
// 게시판 글들을 담아서 리턴 어떻게 basic.do에게 갖고 있는 글들을 보낼 수 있는지
BoardVO vo1 = new BoardVO();
vo1.setIdx(1);
vo1.setWriter("나");
vo1.setTitle("게시판글1");
vo1.setIndate("2022.07.11");
BoardVO vo2 = new BoardVO();
vo2.setIdx(2);
vo2.setWriter("나2");
vo2.setTitle("게시판글2");
vo2.setIndate("2022.07.11");
list.add(vo1);
list.add(vo2);
list.add(vo1);
list.add(vo2);
//현재 페이지 이동없이(url변경없이) view에 접근하는 forward방식인데 spring에서는 전부 설정 (dispatcher등등) 할 필요 없다
// 특정 값들을 넘겨주기 위해서는 request에 담아서 넘겨주면 된다.
// request객체가 필요하면 메소드의 매개변수로 request를 받겠다고 쓰면 -> spring framework에서 알아서 관리해준다
// ★객체바인딩 : list라는 이름으로 list 데이터 값을 넣어서 보낸다
request.setAttribute("list", list);
//WEB-INF/views/basic.jsp파일을 부를수 있는 메소드
return "basic";
}
}
jsp에서 request는 내장객체 이므로 가져오기위해 선언 할 필요 없이 바로 가져 올 수 있다.
Mysql파일안으로 cmd에서 cd를 통해 디렉토리를 옮긴다
Mysql 파일안에 startup을 실행시키고
패스워드는 현재 없으므로 그냥 엔터로 넘긴다
show databases;로
mysql
목록을 보고
use mysql; 로 Database changed 해준다
host가 localhost, user가 root인 유저를 비밀번호가 눈에 안보이게 ('12345') 형태로 넣는다
현재 사용중인 MySQL의 캐시를 지우고 새로운 설정을 적용하기 위해 사용한다.
sql파일을 만들어 Type -> Mysql5.1 name, database 설정 후 연결
create table board(
idx int not null auto_increment,
title varchar(100) not null,
writer varchar(10) not null,
indate datetime default now(),
contents varchar(2000) not null,
primary key(idx)
);
mysql은 숫자 -> int , auto_increment -> 숫자 자동으로 증가
datetime default now() -> 현재 시간이 들어간다
insert into board(title,writer,contents) values('제목1','김운비','게시판글1');
insert into board(title,writer,contents) values('제목2','선영표','게시판글2');
insert into board(title,writer,contents) values('제목3','임경남','게시판글3');
select * from board;
idx와 indate는 데이터가 자동으로 들어가니까 나머지 컬럼만 명시한 후 데이터 삽입
Mybatis를 Mavenrepository에서 가져와 pom.xml에 넣는다
mysql-connector를 Mavenrepository에서 가져와 pom.xml에 넣는다
spring-jdbc를 Mavenrepository에서 가져와 pom.xml에 넣는다
hikari cp를 Mavenrepository에서 가져와 pom.xml에 넣는다
mybatis-spring를 Mavenrepository에서 가져와 pom.xml에 넣는다 -> spring프레임워크와 mybatis를 연결하는 역할
pom.xml --> Maven 프로젝트가 사용하는 라이브러리 관리
web.xml (DD, deployment descriptor, 배치 서술자)
-> 웹 프로젝트에 전반적인 내용들을 알려주는 설명파일
ex) 건물 안내 도면 같이 특정 파일의 위치를 안내해주는 역할
root-context.xml -> 스프링 DB 설정 관련 내용을 작성하는 파일
servlet-context.xml -> 스프링 프레임워크와 관련된 설정파일
기존 JDBC는 그림과 같이 하나씩
연결을 생성하고
한번 사용후 끊어 버렸다
DBCP는 사용후 CP를 반납하고
재사용 할 수 있다.
root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 위쪽에 있는 내용: 해당하는 xml에 어떤 태그들을 사용할 수 있는지 정의해놓은 스키마 파일들을 로드하는 코드 -->
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- JDBC(=connection) 정의하는 공간 -->
<!-- DBCP / HikariCP 설정 잡기 -->
<!-- 객체를 생성하면 그게 bean이고 그 bean들을 포함하는 beans -->
<!-- bean: 객체를 생성하는 태그 / id attribute: 변수명 지정 / class attribute: 어떤 클래스를 생성할 건지 경로까지 잡아주는것 -->
<!-- 변수명을 지정해줘야 밑에 HikariDatasource에서 가져다 쓸 수 있다. -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<!-- setter메소드 사용 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mysql"/>
<property name="username" value="root"/>
<property name="password" value="12345"/>
</bean>
bean의 class에 Maven Dependencies의 HikariCP.jar에 com.zaxxer.hikari의 HikariConfig의 경로를 넣는다.
HikariConfig는 유저네임,패스워드 , url을 만드는 생성자가 없으므로 setter메소드로 채워야한다
set으로 채울수 있는 방식이 아니라 <property name="" value=""/>로 채워준다
jdbcUrl은 Data Source Explorer 우클릭 porperties에서 driver porperties 에서 찾아온다
driverClassName은
세모표시 눌러 들어가서 porperties에서 가져온다 이걸 property name="driverClassName"의 value에 넣는다
<!-- DBCP를 만들어주는 클래스 생성 -->
<bean id="hikariDataSource" class="com.zaxxer.hikari.HikariDataSource.class">
<!-- 생성자 사용하는 태그가 constructor-arg태그-->
<constructor-arg ref="hikariConfig"/>
<!-- ref : reference의 약자 / 위에있는(가져올곳) 클래스 변수명(id)을 작성 -->
</bean>
<!-- DI (Dependency Injection) 의존성 주입 -->
<!-- 클래스 간의 결합도가 낮아진다
하나의 클래스를 변경했다고 해서 다른 클래스가 영향을 받지 않는다. -->
<!-- 1) setter메소드를 사용 -->
<!-- 2) constructor를 사용해서 구현 -->
DBCP를 만들기 위한 class생성은 HikariCP.jar에 com.zaxxer.hikari의 HikariDataSource.class의 경로를
bean태그의 class에 넣는다.
HikariConfig안에 필요한 데이터가 있기 때문에 HikariDataSource가 DBCP를 만들때 HikariConfig를 가져와서 써야한다
외부 클래스를 가져와서 써야하니까 HikariDataSource(HikariConfig)로 생성자의 매개변수로 가져온다.
-> DI (Dependency Injection) 의존성 주입 : Spring의 특징
<!-- 클래스 간의 결합도가 낮아진다
하나의 클래스를 변경했다고 해서 다른 클래스가 영향을 받지 않는다. -->
<!-- 1) setter메소드를 사용 -->
<!-- 2) constructor를 사용해서 구현 -->
<!-- SqlSessionFactory / mybatis-spring에서 제공
: connection가져다가 CRUD작업을 수행할 수 있게끔 하는 클래스 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 생성자가 없어서 setter를 써야하고 setter쓸때 property태그를 사용한다 -->
<property ref="hikariDataSource" name="dataSource"/>
</bean>
<!-- mapper 파일 연결에 대한 설정값을 추가해야 한다 -->
<!-- mapper 파일이 있는 패키지를 통채로 스캔 할 수 있게끔 코드로 설정 -->
<mybatis:scan base-package = "kr.smhrd.mapper"/>
root-context.xml위에
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring" 추가
xsi:schemaLocation=" 에
http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring.xsd 두개 추가
Spring Container라는 공간안에
-> web.xml 파일을 제일 먼저 실행
- ContextLoaderListener를 생성하여 root-context.xml을 실행
-> root-context.xml을 실행하면
- HikariConfig, HikariDataSource가 만들고
- HikariDataSource가 -> DBCP를 만든다
- DBCP에서 꺼내 쓸 수있게 sql session factory bean생성
- Mapper.xml / Mapper.java
DispatcherServlet 는 Servlet-context.xml을 보고 업무 진행
pom.xml = DispatcherServlet -> front controller 역할을 한다
DispatcherServlet가 요청을 받고 -> Controlller에게 보내서 메소드 동작
'빅데이터 서비스 교육 > Spring' 카테고리의 다른 글
스프링(수정) (0) | 2022.07.14 |
---|