일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바
- 메시지시스템
- 스프링
- Python
- 썸머스쿨예약
- ui
- 스마트인재개발원
- 자바페스티벌
- 바이트디그리
- 코딩
- 빅데이터
- 리스트
- 자바스크립트
- ux
- iOS개발강의
- 덴디컨설팅
- 문제풀이
- 파이썬
- 머신러닝
- 코린이
- 서블릿
- K디지털크레딧
- 광주직업학교
- 전주스터디카페
- jsp
- java
- 내일배움카드
- 전주독서실
- 패스트캠퍼스
- 딥러닝
- Today
- Total
멀리 보는 연습
'Spring MVC 하루만에 배우기' 실습 본문
Spring Framework에 대해 더 공부하고 싶어서 찾아보다가 'Spring MVC 하루만에 배우기'라는 글을 보았다. 주제(?)는 책을 입력하고 수정하고 삭제하고 리스트까지 보여주는 사이트를 만드는 것인데, 복습도 하면서 차근차근 해보자는 마음으로 시작해보았다. 생각보다 오래 걸리지 않고 유익하니 시간 여유가 된다면 공부해도 좋을 것 같다.
↓아래 링크로 접속!
1. 프로젝트 세팅
자바 버전은 8버전인 jdk 1.8, Tool은 eclipse를 통해서 진행했고, DB는 Maria DB(MySQL 클론 무료 관계형 DB 서버), 쿼리문은 HeidiSQL을 통해서 입력했다. Tomcat 8.5로 서버 구축!
학원에서 스프링을 배울 때는 표준프레임워크 포털인 eGovFrame 사이트에서 직접 다운받아서 사용했었는데, 이번 프로젝트는 기존의 eclipse에서 스프링 프로젝트를 새로 만들었다.
사실 세팅 단계에서는 이해를 하고 진행한다기 보다는 매뉴얼대로 따라하기만 하면 된다. 팔로미~
2. DB 준비하기
아까 설치한 heidiSQL에 접속해서 프로젝트에 맞게 설정하고 DB 유저도 만들어준다.
CREATE USER 'sgh_spring_mvc_user'@'%' IDENTIFIED BY '1234';
유저를 생성했다면, 이제 본격적으로 책을 관리하기 위한 table도 생성해준다. table에 들어갈 속성은 제목, 분류, 가격 세가지이다.
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'
;
COLLATE='utf8mb4_general_ci' ?
여기서 궁금한 점이 생겼다. 그동안 utf8은 많이 봤는데, utf8mb4는 뭐지?
그래서 검색을 해봤더니 utf8로 생성되는 table은 emoji문자가 등록되지 않고 에러가 나는데 반해서 utf8mb4로 생성된 테이블은 이상없이 처리 된다고 한다. 뭐 크게 중요한 건 아닌 것 같지만 그래도 알아가는 재미..
table까지 생성했다면, 스프링과 데이터베이스를 연결할 수 있는 라이브러리를 준비해보자. 학원에서도 배운 적이 있는 마이바티스를 통해서 DB에 접근해봤다. 수업 시간에는 수업 진도를 따라가기 급급했는데, 이렇게 혼자 이해하면서 빌드하니까 훨씬 좋았다.
<!-- 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>
모든 라이브러리는 메이븐이라는 친구가 관리를 한다. 따라서 메이븐 설정 파일인 pom.xml에 마이바티스를 추가하겠다고 해주는 과정이다.
그리고 마지막으로 아래와 같이 root-context.xml에서 데이터 소스 설정까지 해주면 DB 연동이 완료된다. 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 -->
<!-- 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/sgh_spring_mvc?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8" />
<property name="username" value="sgh_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>
</beans>
마지막으로 SQL 쿼리문을 작성할 xml 파일을 만들어주면 된다. 위에서 마이바티스가 하는 일은 스프링과 DB를 연결시키는 것이라고 했는데, 마이바티스는 xml 파일에 설정된 쿼리를 읽어서 실행하기 때문에 잘 작성해줘야 한다.
xml 파일을 생성하면 아래와 같이 수정해준다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="book">
</mapper>
3. 책 입력 화면과 기능
큰 틀에서 순서를 보자면, 아래와 같다.
1) controller에서 '/create' 메소드를 만들어서 해당하는 경로의 뷰를 보여주게 한다.
@RequestMapping(value="/create", method = RequestMethod.GET)
public ModelAndView create() {
return new ModelAndView("book/create");
}
2) '/create' 뷰를 jsp를 통해 만든다.
<%@ 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>
3) 입력된 내용을 저장하는 쿼리를 book_SQL.xml 파일에 작성
<insert id="insert" parameterType="hashMap" useGeneratedKeys="true" keyProperty="book_id">
<![CDATA[
insert into book
(title, category, price)
values
(#{title}, #{category}, #{price})
]]>
</insert>
4) 작성한 쿼리를 실행하는 DAO 메소드를 BookDao에 만든다.
public int insert(Map<String, Object> map) {
return this.sqlSessionTemplate.insert("book.insert", map);
}
5) 책 서비스 클래스(BookServiceImpl)를 만들어줘야 하는데, 서비스 클래스는 controller와 DAO를 연결한다.
package sample.spring.sgh;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BookServiceImpl implements BookService {
@Autowired
BookDao bookDao;
}
위와 같이 입력하면 BookService 부분에 빨간 줄이 뜰 것이다. 서비스 인터페이스가 없기 때문. 직접 생성하지 않고 빨간 줄에 마우스를 올려서 생성하면 간편하다.
package sample.spring.sgh;
public interface BookService {
}
6) 이제 본격적으로 'BookServiceImpl'에다가 서비스 클래스 메소드를 만들어보자.
@Override
public String create(Map<String, Object> map) {
int affectRowCount = this.bookDao.insert(map);
if (affectRowCount == 1) {
return map.get("book_id").toString();
}
return null;
}
이렇게 만들면, 또 빨간 줄이 뜰 것이다. 상위 인터페이스에 메소드 시그니쳐가 없기 때문. 정의된 것이 있어야 재정의(Override)를 하는데 정의된 것 즉 메소드 시그니쳐가 없다니 으아니..! 당황하지 말고 빨간 줄에 마우스를 올려 create 'create' in super type 'BookService'를 클릭한다.
클릭하면 인터페이스에 메소드 시그니쳐가 바로 생성된다.
String create(Map<String, Object> map);
7) controller에 서비스 빈 추가
책 입력 기능 서비스를 호출하려면 서비스 빈이 필요하다. 아래와 같은 빈을 추가하자.
@Autowired
BookService bookService;
8) 책 입력 기능 메소드 추가
1번에서 create 뷰를 보여주는 메소드를 controller에 입력했다면, 이제 입력한 값을 저장하는 메소드를 controller에 입력해보자.
@RequestMapping(value = "/create", method = RequestMethod.POST)
public ModelAndView createPost(@RequestParam Map<String, Object> map) {
ModelAndView mav = new ModelAndView();
String bookId = this.bookService.create(map);
if (bookId == null) {
mav.setViewName("redirect:/create");
}else {
mav.setViewName("redirect:/detail?bookId=" + bookId);
}
return mav;
}
이 밖에도 수정, 삭제, 검색의 기능들이 있는데, 위 순서를 각자의 기능에 맞게 조금씩 변형해 나가면서 만들면 된다. 학원에서 진행했던 내용과는 또 다른 내용들이었어서 유익했다. 다음 편에서는 형식만 갖춰진 이 페이지들을 진짜 페이지처럼 만들어볼 예정이다. 재미있다.
필자인 연서은님에게 감사를 전하면서 다음 편으로 꼬우꼬우!
'Study > Spring FrameWork' 카테고리의 다른 글
Spring_MVC 패턴 기초_1편 (0) | 2021.08.22 |
---|