02. Spring 웹 사이트 만들어보기!(feat. 스프링 MVC 하루만에 배우기)

min seung moon·2021년 5월 3일
0

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>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<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>

		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>

		<!-- Logging -->
		<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>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>

		<!-- Servlet -->
		<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>

		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>


		<!-- database -->
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.4</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>2.0.4</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>2.7.0</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
		<dependency>
			<groupId>org.bgee.log4jdbc-log4j2</groupId>
			<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
			<version>1.16</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<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에서 설정
<!-- for mysql -->
	<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&amp;useSSL=false&amp;useUnicode=true&amp;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 객체가 가지고 있는 데이터베이스 접속 정보와 매퍼 파일의 위치를 알 수 있게 된다
profile
아직까지는 코린이!

1개의 댓글

comment-user-thumbnail
2023년 11월 15일

좋은 포스트입니다. 잘 정리되었어요.

답글 달기