기본 셋팅의 마지막!
오늘 할 일은 DB와 연동하기!
- 테스트 페이지 만들기
- Spring과 DB 연동
- 등록한 데이터 확인하기
- Web에서 DB에 데이터 등록하기
이것만 끝나면 이제 슬슬 기능을 만들어 볼 수 있을 것 같습니다.
DB 연동 요약 정리 하기
-----------------------------------------------------------------
* DB 연동 페이지 생성하기 (페이지 생성될때마다 하는 것)
-----------------------------------------------------------------
1) VIEW : page.jsp 생성
2) Controller : pageController.java 생성 -> 메서드 작성
3) Mapper : pageMapper 생성 -> 쿼리문 작성
-> 새로운 Mapper일 경우 root-context.xml에 mapper 추가
4) VO : DB getter/setter / return toString 작성
5) tiles.xml 새로운 페이지 추가
----------------------------------------------------------------
----------------------------------------------------------------
* DB 최초 연동하기 (최초 설정 후 안건드려도 되는 것)
----------------------------------------------------------------
1) pom.xml DBMS 관련 라이브러리 작성하여 메이븐 추가
2) root-context.xml에 properties, DBMS, Mapper 추가
3) mybatis-config.xml 추가
4) resource에 jdbc.properties 추가
----------------------------------------------------------------
시작!
먼저 테스트 페이지를 하나 만들겠습니다.
1. 테스트 페이지 만들기
1.1 Sidebar.jsp 수정
- 테스트 페이지 메뉴 내용을 추가/수정 해줍니다. (href=이동할 위치 / 표기할 이름)
1.2 테스트 페이지를 추가합니다.
이제 테스트 페이지 메뉴를 클릭하면 보여줄 view를 작성해줍니다.
폴더와 jsp 파일을 생성해주세요.
1.3 이제 컨트롤러를 생성해줍니다.
- MVC 패턴으로 생성 했기 때문에 view에 관한 동작을 통제하는 컨트롤러를 생성해주어야 합니다.
컨트롤러는 .java로 실행되기 때문에 자바 클래스를 하나 생성해주시면 됩니다.
- 그러면 이제 testPage의 컨트롤러가 생겼고 클래스가 생성되었으니 메서드를 작석해서 동작해주도록 합시다.
코드 작성에는 @RequestMapping과 @Controller를 사용합니다.
자바의 장점 중 하나인 AOP(관심 지향 프로그래밍)를 이용하는 것이지요!
클라이언트가 /testPage로 접속하여 요청을 보내면 testPageController에서 동작을 처리해서 결과 값을 testPage/testpage로 보내주게 됩니다.
더보기 접기
그런데, @Controller , @RequestMapping 과 같은 어노테이션이 무엇이냐!
자바를 열공하신 분들은 손쉽게 이해하겠지만 저는 아니기때문에(?) 정리해보도록 하죠
어노테이션은 java5부터 추가되었으며 사용하는 이유는 여러가지가 있겠지만
주된 이유는 데이터의 설명과 데이타의 유효성 검증 때문입니다.
- 자바 코드 작성시 선언한 메서드에 @Override가 붙게되면
이것은 해당 메서드가 Override 되었다는 표시이며, 이것의 상위 클래스가 있는지를 확인을 하며 없을경우 컴파일 에러를 내며
유효성을 검사하게 되는 것 입니다.
- 더불어 메타데이터(데이터 설명하는것)의 기능을 하기 때문에 코드를 볼때도 훨씬 깔끔하며
이해하기 쉬워지게 되는 장점을 갖게 되는 것입니다.
앞으로 사용할 @Controller 혹은 @RequestMapping과 같은 어노테이션은 Spring FrameWork에서 지원해 주는 기능입니다.
어노테이션은 개발자들이 직접 정의를 할 수 있습니다.
그래서 핵심로직에 영향이 미치지 않는 공통 모듈(로그인,인증 등..)을 정의하여 필요에 따라 코드에 삽입할 수 있기때문에
코드는 깔끔해지고 또 효율적으로 활용이 가능해 집니다.
이것을 Spring의 장점 요소 중 하나인 AOP(관심 지향 프로그래밍)이라고 합니다.
(좀 더 자세한 설명은 구글에 검색하면 좋은 자료들이 많이 있습니다!)
접기
1.4 타일즈 설정하기
- 페이지까지 생성이 되었으면 이제 tiles.xml에 타일즈 디자인을 표기할 페이지를 추가해 주면 됩니다.
- name 이랑 value 수정하면 됩니다. 당연한 이야기지만 경로 정확하게 설정하지 않으면 에러나요!
1.5 페이지 생성 확인
정상 동작 확인했으면 이제 본격적으로 DB를 연동해보도록 하죠
2. DB 연동하기
저는 Mysql을 사용할 계획 입니다. 오라클과 같은 다른 DBMS를 사용하시는 구조는 동일합니다만 패키지 추가하는 내용이 조금 다를듯 해서
그 부분은 따로 찾아봐야 할 것 같네요
또한 전 HeidSQL 이라는 프로그램을 사용합니다. 하지만 면접을 준비할때는 Mysql CMD를 통해 연습하는것이 좋을 듯 합니다
DBMS와 테이블이 생성되어있다는 가정 하에 진행하겠습니다.
* 정보
DB 이름 : spring_web_project
table 이름 : testpage
속성 : id - int-auto increament(prime key) / user_name -varchar(50) / content - varchar(50)
2.1 데이터베이스 연동하기
연동에 필요한 순서는 Pom.xml에 라이브러리 파일 추가하기 -> root-context.xml에 DBMS 정보 등록하기 -> mybatis 설정 입니다.
2.1.1 Pom.xml
Spring에는 Maven이라는 것이 존재합니다. Maven은 라이브러리를 pom.xml에 작성을 하면 자동으로 라이브러리를 포함해주는
아주아주 편리한 기능이죠!
그래서 아래의 내용을 pom.xml에 Mysql관련 라이브러리를 포함하도록 합니다.
추가할 내용은 다음과 같습니다.
- mysql - mysql-connetcor-java => java와 mysql 연동을 위한 라이브러리
- MyBatis => mybatis
- mybatis-spring => spring에서 사용할 mybatis 정보
- Spring JDBC => jdbc 라이브러리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!-- MyBatis 3.4 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- MyBatis-Spring 1.3-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- Spring-JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
cs
이렇게 저장하면 자동으로 라이브러리가 다운로드 받아집니다.
라이브러리 포함 후 서버는 재시작해야 동작합니다.
보통 xml과 같은 설정 파일들을 수정하게 되면 적용하기 위해 재시작 해준다 생각하면 편할 듯 합니다.
2.2 root-context.xml 에 DBMS 관련 객체를 설정해줍니다. (여기서 스프링의 장점인 Spring DI를 알 수 있겠네요)
설정 내용은 다음과 같습니다.
- properties => jdbc에 연결할때 DB의 접속 주소, 계정, 비밀번호를 설정 관리하는 파일을 설정합니다.
- jdbc-mysql => jdbc 드라이버를 사용할때 참조할 위치 설정
- MyBatis-Spring => Spring에서 MyBatis를 설정을 참조할 부분 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- properties -->
<bean class ="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
<property name ="locations" value ="classpath:/jdbc.properties" / >
<property name ="ignoreUnresolvablePlaceholders" value ="true" / >
<property name ="fileEncoding" value ="UTF-8" / >
</bean >
<!-- JDBC-MYSQL -->
<bean id ="dataSource" class ="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name ="driverClassName" value ="${jdbc.driverClassName}" / >
<property name ="url" value ="${jdbc.url}" / >
<property name ="username" value ="${jdbc.username}" / >
<property name ="password" value ="${jdbc.password}" / >
</bean >
<!-- MyBatis-Spring -->
<bean id ="sqlSessionFactory" class ="org.mybatis.spring.SqlSessionFactoryBean" >
<property name ="configLocation" value ="classpath:mybatis-config.xml" / >
<property name ="dataSource" ref ="dataSource" / >
</bean >
cs
2.3 properties 작성하기
- 이제 DB로 접속할 정보가 작성되어있는 properties 파일을 설정합니다. root-context.xml에 작성한 위치에 생성하면 됩니다.
- jdbc.properties 생성
- jdbc.properties 내용
2.4 mybatis 설정 파일인 mybatis-config.xml를 작성해줍니다. (root-context.xml에 작성된 파일이 없으면 실행 에러나는것 참고해주세요)
작성 방법은 다음과 같습니다.
접속 경로 같은건 properties에서 작성할것이기 때문에 따로 작성 할 내용은 없습니다.
- 작성 위치 및 내용
<?xml version ="1.0" encoding ="UTF-8" ? >
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration >
</configuration >
cs
2.5 mapper 생성
MVC 패턴의 model 부분 입니다.
Client 요청 -> View -> 동작요청 -> Controller 메서드 실행 -> 데이터 관련 -> Model로 요청 -> 컨트롤러로 전송 -> 메서드 처리 후 다시 -> view
위에 굵은 글씨 부분을 작성하게 되는 것 입니다.
mapper의 특징은 interface 로 작성된다는것! 중요하니 참고 해주세요.
2.5.1 mapper 생성
- mapper Package를 생성 후 mapper를 생성해줍니다. mapper의 확장자는 .java 입니다.
- mapper의 내용은 DB 쿼리문 이라고 생각하시면 됩니다.
여기서 또 구분할 내용이 있는데 Mapper의 경우 mapper의 역할만 합니다. 그래서 DB의 내용을 담아줄 파일을 나누어 줘야 관리하기가 편리해 주는데
이것은 VO 라고 합니다.
MVC 패턴에선 이것을 DAO - DTO(VO) 구조로 나누어서 사용을 합니다.
지금 하는 예제 프로젝트에서는 DAO를 따로 설정하지 않았는데, 추후에 DAO 설정을 통해 접근을 관리할 수 있도록 추가하겠습니다.
(일단 연동 테스트 부터)
아직 서버 트래픽 관리 부분까지는 개념과 실력이 부족하기 때문에 관련 내용을 좀 더 깊게 공부 한 후 서버 관리 영역에 관해 글을 작성할때 내용을 추가해보도록 하겠습니다.
DAO-DTO 간단 설명 보기 접기
먼저, DAO DTO가 무엇인지 살펴 봅니다.
- DAO(Data Access Object)
DAO란 데이터에 접근하기 위한 객체 입니다. 그래서 DAO 파일에는 JDBC에 접근할 정보를 작성하고 접근을 합니다.
사용자들 마다 DB를 사용한다면 수많은 사용자가 사용할 경우 엄청난 양의 connection이 필요합니다. 그렇게 되면 서버에 부하가 걸리고
느려지게 되겠지요.
그래서 이러한 연결 객체를 필요할때마다 하나씩 생성하여 연결하고 일정 연결이 초과되면 연결을 거부하고 또 여유가 있는경우는
다시 객체를 생성하여 연결할 수 있도록 Connection Pool을 만들어 서버를 효율적으로 운용하기 위해 사용합니다.
- DTO(Data Transfer Object) = VO(value Object)
DAO가 접근 설정만 한다면 그 내용을 가져오는 것은 DTO(=VO) 가 합니다. DB에서 데이터를 가져오거나 페이지에서 데이터를 DB에 저장하게 될 경우 해당 데이터를 중간 계층에서 왔다 갔다 전달해 주는 역할자 입니다. 데이터를 담을 수례같은 개념이죠.
그래서 DTO에는 심플하게 getter() setter() 메서드만 작성하면 됩니다.
접기
2.5.2 mapper 객체 root-context.xml에 아래 내용을 추가 합니다.
<!-- Mapper -->
<bean id ="testPageMapper" class ="org.mybatis.spring.mapper.MapperFactoryBean" >
<property name ="mapperInterface" value ="com.mycompany.mapper.testPageMapper" / >
<property name ="sqlSessionFactory" ref ="sqlSessionFactory" / >
</bean >
cs
2.5.3 vo 생성 하기
- vo의 내용은 getter / setter로 구성됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.mycompany.vo;
public class testPage {
String id;
String user_name;
String content;
public String getId() {
return id;
}
public void setId(String id) {
this .id = id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this .user_name = user_name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this .content = content;
}
@Override
public String toString () {
return "testPage [id=" + id + ", user_name=" + user_name + ", content=" + content + "]" ;
}
}
cs
2.5.4 mapper 작성하기
- interface로 작성하기 때문에 메서드 이름만 생성해주고 내용은 생성 안합니다.
- select 어노테이션을 통해 쿼리문을 작성해줍니다.
package com.mycompany.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Select;
import com.mycompany.vo.testPage;
public interface testPageMapper {
@Select("select * from testpage ORDER BY date DESC" )
public List< testPage> getList();
}
cs
2.6 DB 출력을 위해 controller 수정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.mycompany.myapp;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.mycompany.mapper.testPageMapper;
import com.mycompany.vo.testPage;
@Controller
public class testPageController {
@Autowired
private testPageMapper testpagemapper;
@RequestMapping(value = "/testPage" , method = RequestMethod.GET)
//DB 출력 동작 메서드
public String testPage_print(Model model){
//<> 안에 DTO or VO 이름
List< testPage> testpage = testpagemapper.getList_testpage();
//model을 통해 View로 전달
model.addAttribute("testpage" ,testpage);
return "testPage/testpage" ;
}
}
cs
2.7 View에 표기하기
- testpage.jsp 작성한 내용입니다.
- controller로 부터 DB 내용을 가져올때 경로 설정을 c:foreach 문을 사용했는데 이 문법을 사용하기 위해서
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>를 추가해주었습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<% @ taglib uri= "http://java.sun.com/jsp/jstl/core" prefix= "c" %>
<% @ page language= "java" contentType= "text/html; charset=EUC-KR"
pageEncoding= "EUC-KR" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
<!--
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
-->
<div class ="container-fluid" >
<!-- Breadcrumbs-->
<ol class ="breadcrumb" >
<li class ="breadcrumb-item" ><a href ="#" >testPage</a ></li >
<li class ="breadcrumb-item active" >Overview</li >
</ol >
<!-- DataTables Example -->
<div class ="card mb-3" >
<div class ="card-header" >
<i class ="fas fa-table" ></i > testPage-data
</div >
<div class ="card-body" >
<div class ="table-responsive" >
<table class ="table table-bordered" id ="dataTable" width ="100%" cellspacing ="0" >
<thead >
<tr >
<th >id</th >
<th >user_name</th >
<th >content</th >
</tr >
</thead >
<tbody >
<c:forEach items ="${testpage}" var ="testpage" >
<tr >
<td >${testpage.id}</td >
<td >${testpage.user_name}</td >
<td >${testpage.content}</td >
</tr >
</c:forEach >
</tbody >
</table >
</div >
</div >
</div >
</div >
cs
2.8 정상적으로 데이터 읽어오는지 확인하기
- 이제 서버를 재시작하고 페이지가 정상 동작하는지를 확인합니다.
정상적으로 출력 되었다면 잘 작성했다는 것이겠죠?
정리하며 쓰다보니 내용이 많아져서
DB작성하기는 다음편에 작성하겠습니다.