1. 책 입력화면 만들기!
01. 책 입력 화면 개요!
- 책 정보를 입력하기 위한 화면을 만든다
- 브라우저에서 /create 주소에 접속하면 책 정보를 입력할 수 있는 화면을 보여준다.
02. 책 컨트롤러 클래스 생성
- 브라우저를 비롯한 클라이언트의 요청을 받아서 응답을 만들어내는 컨트롤러 클래스를 생성
- @Controller 어노테이션 추가!
- @Controller 어노테이션이 있는 클래스는 스프링이 브라우저의 요청을 받아들이는 컨트롤러라고 인지해서 자바 빈으로 등록해서 관리
03. 책 생성 화면 컨트롤러 메소드 작성
- 브라우저 주소가 /create일때 실행되는 자바 컨트롤러 메소드를 작성
package sample.spring.yse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class BookController {
@RequestMapping(value = "/create", method = RequestMethod.GET)
public ModelAndView create() {
return new ModelAndView("book/create");
}
}
- @RequestMapping 어노테이션은 브라우저의 요청에 실행되는 자바 메소드를 지정
- value 속성은 브라우저의 주소(URL)를 지정
- method 속성은 http 요청 메소들를 의미
- GET 메소드는 데이터를 변경하지 않는 경우(select)
- Post 메소드는 데이터가 변경될 경우 사용(insert, delete, update)
- 이 경우 화면을 보여주는 경우는 GET을 사용
- ModelAndView는 컨트롤러가 반환할 데이터를 담당하는 모델(Model)과(And)화면을 담당하는 뷰(View)의 경로를 합쳐놓은 객체
- 생성자에 문자열 타입 파라미터가 입력되면 뷰의 경로라고 간주
- 따라서 create 메소드는 브라우저에서 /create 주소가 GET방식으로 입력되었을 때 book/create 경로의 뷰를 보여준다
04. 책 생성 화면 뷰 생성
- 책 생성 컨트롤러에서 book/create 경로를 반환했으므로, 실제 화면을 담당하는 뷰 코드를 작성, 최종 경로는 src/main/webapp/web-inf/views/book/create.jsp
05. 책 생성 화면 뷰 내용작성
<%@ page pageEncoding="UTF-8" contentType="text/html;charset=utf-8"%>
<html>
<head>
<title>책 생성하기</title>
</head>
<body>
<h1>책 생성하기</h1>
<form method="POST">
<p>제목 : <input type="text" name="title" /> </p>
<p>카테고리 : <input type="text" name="category" /> </p>
<p>가격 : <input type="text" name="price" /> </p>
<p><input type="submit" value="저장" /> </p>
</form>
</body>
</html>
- 뷰는 화면을 담당
- 웹 어플리케이션에서 화면은 웹 브라우저가 렌더링하므로 브라우저가 읽어서 해석할 수 있는 HTML로 최종 변환할 수 있도록 작성한다!
- 서버로 전달되는 키 : 값 쌍을 HTTP 파라미터라고 부른다
06. 책 입력화면 확인하기!
- 서버를 클릭하고 ctrl + alt + d를 눌러 디버깅 모드로 시작하거나 ctrl + alt + s를 눌러서 서버 모드로 시작한다
5. 데이터베이스 준비하기
01. 책 관리 데이터베이스 생성
CREATE database yse_spring_mvc;
CREATE user 'yse_spring_mvc_user'@'%'IDENTIFIED BY '1234';
- 유저에게 권한 추가
GRANT EXECUTE, SELECT, SHOW VIEW, ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, event, INDEX, INSERT, REFERENCES, TRIGGER, UPDATE, LOCK TABLES ON `yse_spring_mvc`.* TO 'yse_spring_mvc_user'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
02. 책 관리 테이블 생성
CREATE TABLE `book`(
`book_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(200) NOT NULL,
`category` VARCHAR(200) NOT NULL DEFAULT '',
`price` INT NULL,
`insert_date` DATETIME NOT NULL DEFAULT NOW(),
PRIMARY KEY (`book_id`)
)
COLLATE='utf8mb4_general_ci'
;
- book_id는 책의 고유 번호이며 자동 번호가 설정
- title은 제목이고 최대 200글자까지 저장 가능
- category는 책의 분류로 RDBMS의 정규화 규칙에 의하면 테이블을 따로 분리하는것이 맞지만 예제의 단순성을 위해 단순 문자열로 저장
- price는 책 가격
- inser_date는 책 정보를 입력한 날짜, 데이터가 입력되면 마리아디비의 now()함수가 실행되면서 자동으로 입력
03. 데이터베이스 라이브러리 설정
- 스프링에서 데이터베이스에 접속하기 위해서는 추가 라이브럴리가 필요
- 마이바티스라는 라이브럴리를 써서 데이터베이스에 접근하는 방식을 취할것이다
- 메이븐 프로젝트에서 모든 라이브러리 괸리는 메이븐이 담당, 메이븐 설정 파일인 pom.xml 파일에 아래의 내용을 추가
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sample.spring</groupId>
<artifactId>yse</artifactId>
<name>SampleSpringYse</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.8</java-version>
<org.springframework-version>5.3.6</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
- mybatis는 XML로 쿼리를 작성하게 해주는 라이브러리다, 쿼리를 문자열로 코딩하지 않고 XML을 사용해서 관리하게 해준다
- mybatis-spring은 스프링과 mybatis를 연동하게 해주는 라이브러리다
- jdbc는 자바에서 데이터베이스에 접속하기 위한 API다, spring-jdbc는 스프링에서 jdbc(java database connectivity)를 통해 데이터베이스와 연결할수 있게 해준다
- dbcp2는 데이터베이스 커넥션 풀(database connection pool)이다, 데이터베이스 서버와 웹 서버는 서로 다른 프로그램이고, 실무에서는 전혀 다른 컴퓨터에 설치되어 있을 가능성이 높다, 서로 다른 컴퓨터와 프로그램이 통신을 하기 위해서는 서로 연결을 맺는 과정이 필요한데, 이 시간이나 네트워크 비용이 꽤 비싼 편이다, 따라서 미리 데이터베이스와 연동하기 위한 길을 만들어놓는 라이브러리가 dbcp2이다, 최근에는 커넥션 풀로 dbcp2 대신 hikaricp를 자주 사용하기도 한다
- log4jdbc-log44j2-jdbc4는 로깅을 위한 라이브러리다, 데이터베이스에 연동하는 쿼리를 콘솔이나 파일 로그로 볼 수 있게 해준다
- mysql은 mysql 데이터베이스 연동라이브러이다, mariaDB도 같은 드라이버를 사용하욘다
- pom.xml을 수정후에는 메이븐 빌드를 꼭 해야한다!
- 만역에 fail이 되면 프로젝트 클린을 해준 후 다시 빌드해준다(이클립스->project->clean)
04. 데이터 소스 설정하기
- 데이터베잇에 접속하기 위한 정보를 설정한다
- 외부 연동 관련정보는 context에서 설정
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/yse_spring_mvc?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="yse_spring_mvc_user"/>
<property name="password" value="1234" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:/sqlmap/**/*_SQL.xml" />
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
- 데이터소스를 설정하는 부분부터 시작하자!
- 데이터베이스의 관련 정보를 데이터소스라고 부른다
- url 항목은 데이터베이스 접속 정보를 나타낸다
- JDBC를 사용해서 MYSQL 드라이버로 현재 컴퓨터의 yse_spring_mvc 데이터베이스에 접속한다
- 데이터베이스 기준 시간 협정 세계시다
- 보안 접속은 하지 ㅇ낳으며(userSSL=false) 유니코드를 사용하고 UTF-8 인코딩을 사용한다
- username은 데이터베이스 유저이다
- password는 데이터베이스 유저의 비밀번호
- sqlSessionFactory는 데이터베이스와 연결을 맺고 끊어질 때 까지의 라이프 사이클을 관리하는 sqlSession 객체를 만든다
- sqlSessionFactory 개체의 프로퍼티는 두개다
- 하나는 데이터 소스를 설정하는 곳, 나머지 하나는 매퍼 파일의 위치를 지정
- 매퍼 파일은 실제 쿼리 내용이 담겨져 있는 파일들이다, 경로가 classpath:/sqlmap/**/*_SQL.xml이므로 /src/main/resource/sqlmap/로 시작하고 _SQL.xml로 끝나는 파일들을 매퍼 파일로 쓴다고 스프링에 알려주는 것이다
- sqlSessionTemplate는 데이터베이스에개별적으로 쿼리를 실행시키는 객체
- sqlSessionTemplate를 소스코드에서 사용하여 쿼리를 실행시킨다
- sqlSessionTemplate 빈은 sqlSessionFactory 객체를 생성자로 받는다
- 따라서 sqlSessionTemplate 객체는 sqlSession 객체가 가지고 있는 데이터베이스 접속 정보와 매퍼 파일의 위치를 알 수 있게 된다
좋은 포스트입니다. 잘 정리되었어요.