본문 바로가기
JAVA/spring

[Spring] CRUD 구현

by 개폰지밥 2019. 8. 28.
반응형

코드로 배우는 스프링 웹 프로젝트 보면서 해봄.

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의 등록

Datasourcemybatis를 사용하기 위해서 반드시 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 – mybatisDAO 패키지

*.controller – 스프링 MVC의 컨트롤러 패키지

Resource/mappers폴더 – mybatisxml 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 폴더 내에서 cssjquery 등의 링크가 포함돼 있으므로, 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

댓글