코드로 배우는 스프링 웹 프로젝트 보면서 해봄.
sts3.9버전 사용 mysql 사용
Part 2 기본적인 기능의 게시물 관리
Part 2는 실제로 아주 단순한 crud(등록, 수정, 삭제, 조회) 게시물 관리를 제작합니다.
Part 2에서 만들어지는 게시물 관리는 다음과 같은 기능을 가지고 있습니다.
- 게시물의 등록, 수정, 삭제, 조회
- 페이지 처리
- 검색 처리
01 등록, 수정, 삭제, 조회 기능의 구현
모든 게시물 관리의 시작 형태는 등록(create), 조회(read), 수정(update), 삭제(delete)를 기준으로 합니다.(이하 crud라는 약어를 사용합니다.) 여기에 반드시 하나가 더 추가되는 것이 화면상에 데이터의 목록을 보여주는 리스트 기능이라고 할 수 있습니다.
1.1 개발 목표 인식
일반적인 경우, 개발 순서는 ‘뒤에서 앞으로’의 순서가 많습니다. 즉, 1) 가장 먼저 데이터베이스 관련 부분을 개발하고, 2) 컨트롤러와 비즈니스 영역을 개발한 후 3)마지막으로 화면 쪽을 개발하게 됩니다.
1.2 각 영역에 따른 개발의 준비
영역 | 준비 | 설명 |
데이터베이스 관련 | 관련 스키마, 계정의 생성 | 개발에 사용할 스키마를 정의하고, 개발에 필요한 사용자 계정 등을 생성합니다. |
테이블의 설계와 생성 | 실제 작업할 테이블을 설계하고 각 테이블의 관계를 ERD 등을 사용해서 그려둡니다. | |
더미(dummy) 데이터의 추가 | 테스트를 위한 가상의 의미 없는 데이터(dummy)를 추가해서 개발 시 결과를 확인할 때 사용합니다. | |
스프링 MVC 관련 | 패키지 구조 결정 | 개발에 사용할 패키지 이름이나 코드 규칙 등을 미리 지정합니다. |
개발 역할 분담 | 팀원들 간의 개발 역할을 어떻게 할 것인지를 결정합니다. 이때 PART1에서와 같이 수평적 혹은 수직적인 분할을 하게 됩니다. | |
테스트 방법의 수립 | 개발의 중간에 팀원들의 현재 상황을 올바르게 인식할 수 있도록 테스트 방법을 서로 고융하고, 이를 지키도록 합니다. | |
화면 관련 | 화면 방식의 결정 | Jsp 위주의 개발인지, html 위주와 javascript를 주로 사용하는 개발인지를 명확히 정리합니다. |
절대 경로, 상대 경로의 결정 | 페이지에서 사용하는 링크를 처리를 하나로 통일해서 진행합니다. |
1.3 프로젝트의 생성
프로젝트는 ‘ex01’이라는 이름으로 sts 상의 ‘spring project’를 이용합니다. 본격적인 개발에 앞서 필요한 라이브러리 등은 아래와 같습니다.
- Mysql 드라이버
- Spring-test 모듈
- Mybatis 모듈
- Mybatis-spring 모듈
프로젝트의 패키지는 ‘org.zerock.controller’라는 패키지로 설정해서 작성합니다.
File -> new -> spring legacy project
작성된 프로젝트의 모습은 아래와 같다.
Ex01 프로젝트의 pom.xml을 사용해서 jdk의 버전과 스프링의 버전을 수정하기
<properties>
<java-version>1.8</java-version>
<org.springframework-version>4.3.8.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
프로젝트의 속성 역시 jdk 1.8에 맞도록 변경합니다.
프로젝트에 필요한 라이브러리를 pom.xml을 이용해서 추가
추가된 라이브러리는 mysql, 드라이버, mybatis, mybatis-spring, log4jdbc-log4j2 관련 설정입니다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
테스트 올바르게 진행하기 위해서 junit의 버전과 servlet의 버전 변경
ð 빨간부분 작성
마지막으로 설정과 관련된 파일들을 추가합니다. 파일들의 +위치는 ‘src/main/resources’ 폴더를 이용합니다. Log4jdbc.log4j2.properties 파일과 logback.xml, mybatis-config.xml 파일을 복사해서 추가합니다.
Ctrl + shift + r 을 이용해 검색하면 파일을 쉽게 찾을 수 있음.
1.4 개발 전 준비 – 데이터베이스 관련
1.4.1 DataSource의 등록
Datasource는 mybatis를 사용하기 위해서 반드시 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">
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="url"
value="jdbc:log4jdbc:mysql://127.0.0.1:3306/book_ex?useSSL=false"></property>
<property name="username" value="zerock"></property>
<property name="password" value="zerock"></property>
</bean>
</beans>
1.4.2 datasource의 테스트
datasource의 테스트는 반드시 필요하다!!!
Test 폴더 내의 DataSourceTest
package org.zerock.test;
import java.sql.Connection;
import javax.inject.Inject;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/**/root-context.xml" })
public class DataSourceTest {
@Inject
private DataSource ds;
@Test
public void testConection() throws Exception {
try (Connection con = ds.getConnection()) {
System.out.println(con);
} catch (Exception e) {
e.printStackTrace();
}
}
}
실행 결과는 정상적으로 Connection 객체가 만들어지는 것을 확인할 수 있어야 합니다.
1.4.3 개발 패키지 구성
Part 2에서 개발하는 프로젝트의 패키지 구성은 각 영역을 구분해서 아래와 같이 구성하라
*.domain – value object가 사용하는 패키지
*.service – 서비스 인터페이스와 구현 클래스 패키지
*.persistence – mybatis의 DAO 패키지
*.controller – 스프링 MVC의 컨트롤러 패키지
Resource/mappers폴더 – mybatis의 xml mapper의 위치
1.4.4 테이블의 생성 작업
create table tbl_board(
bno INT NOT NULL AUTO_INCREMENT,
title VARCHAR(200) NOT NULL,
content TEXT NULL,
writer VARCHAR(50) NOT NULL,
regdate TIMESTAMP NOT NULL DEFAULT now(),
viewcnt INT DEFAULT 0,
PRIMARY KEY (bno));
Bno 칼럼은 primary key로 고유한 번호 가지도록 설계 auto_increment라는 제약조건을 이용해 자동으로 데이터 추가시 새로운 번호 가지도록 설계
Regdate 칼럼은 데이터가 추가될 때 현재 데이터베이스의 시간을 이용해 게시물이 생성된 시간을 기록 mysql의 경우 now() 함수를 사용하면 현재 시간을 얻을 수 있음
1.4.5 테스트를 위한 sql 준비
데이터를 추가하고 기능에 문제 없는지 테스트해 보는 작업
create table tbl_board(
bno INT NOT NULL AUTO_INCREMENT,
title VARCHAR(200) NOT NULL,
content TEXT NULL,
writer VARCHAR(50) NOT NULL,
regdate TIMESTAMP NOT NULL DEFAULT now(),
viewcnt INT DEFAULT 0,
PRIMARY KEY (bno));
insert into tbl_board (title, content, writer) values('제목입니다','내용입니다','user00');
1.5 스프링의 UTF-8 처리 필터 등록
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter-class
</filter-class>
</filter>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.6 css, javascript 준비
bootstrap을 이용해서 화면을 구성하는 방식을 사용합니다. 부트스트랩은 반응형 웹 페이지를 만들 때 사용하는 twitter가 제공하는 오픈 소스입니다. 화면 전체의 레이아웃이나 자세한 css를 설정하는 데 많은 시간을 소모하게 되기 때문에 부트스트랩으로 만들어진 템플릿 페이지를 이용합니다.
‘Admin LTE’ 템플릿은 https://almsaeedstudio.com/AdminLTE에서 제공하는 오픈 소스로 부트스트랩을 사용해서 작성된 무료 템플릿입니다.
Admin LTE는 기본적으로 반응형 웹 페이지의 레이아웃을 제공하고, 화면 구성에 필요한 모든 CSS를 사용할 수 있습니다.
1.6.1 프로젝트의 템플릿 적용
이 책의 자료실에 있는 static.zip 파일과 include.zip 파일을 다운로드 받아서 압축을 해제 합니다. Static.zip 파일의 압축을 해제하면 bootstrap, dist, plugin 폴더가 생성되고, include.zip 파일을 해제하면 include 폴더가 생성됩니다.
이 중에서 bootstrap, dist, plugins 폴더는 현재 프로젝트의 ‘src/main/webapp/resources’ 폴더 내로 복사합니다.
Include 폴더는 ‘/WEB-INF/views’ 폴더로 복사합니다.
Include 폴더 내에서 css와 jquery 등의 링크가 포함돼 있으므로, jsp 제작 시 include 시켜서 페이지를 제작합니다.
Home.jsp의 내용은 아래와 같이 수정합니다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@include file="include/header.jsp" %>
<!-- Main content -->
<section class="content">
<div class="row">
<!-- left column -->
<div class="col-md-12">
<!-- general form elements -->
<div class="box">
<div class="box-header with-norder">
<h3 class="box-title">HOME PAGE</h3>
</div>
</div>
</div><!-- /.col (left) -->
</div><!-- /.row -->
</section><!-- /.content -->
<%@include file="include/footer.jsp" %>
작업 내역 정리
- 프로젝트 생성과 JDK 버전 변경
- 프로젝트에 필요한 라이브러리 추가
- 프로젝트에 필요한 설정 파일들 추가
- 개발에 필요한 패키지 생성
- 데이터베이스에 테이블 생성
- DataSource의 연결과 테스트 작업
'JAVA > spring' 카테고리의 다른 글
intellij error - 2 (0) | 2019.09.03 |
---|---|
intellij error - 1 (2) | 2019.09.02 |
paging processing (페이징 처리)- 3 (0) | 2019.08.09 |
paging processing(페이징 처리) - 2 (0) | 2019.08.09 |
paging processing(페이징 처리) - 1 (0) | 2019.08.08 |
댓글