빅데이터 서비스 교육/Spring

spring 개념 및 설정

Manly 2022. 7. 11. 12:50
반응형

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