[스프링] 스프링에서 DB 연결하기 / DB에 입력한 내용 가져오기
🌟 시작하기 전에 알고가자! 🌟
-
DAO와 Service : 구현 상 큰 차이는 없지만 DAO에는 추후 연동할 데이터베이스에 세션 및 Mybatis 코드가 적용됨
-
Controller : 사용자의 Request를 전달 받아 요청의 처리를 담당하는 Service를 호출함
-
Service
-
Controller에 의해 호출되어 실제 비즈니스 로직과 트랜잭션을 처리함
-
DAO를 호출하여 DB CRUD 처리 후 Controller로 반환됨
-
-
DAO : Service에 의해 호출돼 DB CRUD를 담당
-
Mapper : DAO에서 요청하는 실제 쿼리문이 위치하는 곳
path 변경하기
서버 더블클릭 - 하단 Modules 에서 path 변경하고 저장하기
MySQL - DB 생성하기
create database springtest;
use springtest;
create table springtest(
num int unique auto_increment,
uName char(10) not null,
subject char(30) not null,
content char(200) not null,
date datetime default NOW()
);
insert into springtest
(uName, subject, content, date)
values
('리우', '스프링', '스프링어려웡', now()),
('덴버', '자바', '자바도어려웡', now()),
('나이로비', '배고프다', '내일뭐먹지', now()),
('산타', '크리스마스', '메리크리스마스', now());
select * from springtest;
VO 생성하기
VO (Value Object)
도메인 객체의 일종
read-Only
관계데이터베이스의 레코드에 대응되는 자바클래스
src/main/java/com
하위에 ‘com.springtest.domain’ 패키지 생성, TestVO.java라는 이름으로 클래스를 생성했다
package com.springtest.domain;
import java.sql.Date;
public class TestVO {
private int num;
private String uName;
private String subject;
private String content;
private Date date;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
pom.xml
- java-version은 1.8로, springframework-version은 4.3.18로 변경하기
<dependencies>
태그 안에 아래 내용 붙여넣기
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!-- org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
- 프로젝트 우클릭 - Project facets - Java Version 1.8 로 변경
root-context.xml
src/main/webapp/WEB-INF/spring/root-context.xml
하단 Namespaces
위 사진과 동일하게 체크하고 저장해주자
- 다시 Source로 돌아와서
<beans>
태그 안에 아래 내용 붙여넣기
<!-- MySQL -->
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/DB명?useSSL=false&serverTimezone=Asia/Seoul"></property>
<property name="username" value="root"></property>
<property name="password" value="비밀번호"></property>
</bean>
<!-- SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- mybatis 설정파일의 경로 -->
<property name="configLocation" value="classpath:/mybatis-config.xml" />
<!-- mybatis mapper 파일의 경로 -->
<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
mybatis-config.xml
src/main/resources
하위에 mybatis-config.xml
파일 생성하고 아래와 같이 작성하기
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
매퍼 xml 생성하기
쿼리를 작성하는 XML 파일
MyBatis는 XML에 설정된 쿼리를 읽어 실행시키게 됨
src/main/resources
하위에 폴더와 xml 파일 생성
src/main/resources/mappers/springTestMapper.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="springTestMapper">
</mapper>
JSP 파일 만들기
src/main/webapp/web-INF/views
하위에 폴더 만들고 JSP 파일 생성하기
src/main/webapp/web-INF/views/board/list.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<meta charset="UTF-8">
<title>list</title>
</head>
<body>
<form name="userForm">
<h1>List Page</h1>
<table>
<thead>
<tr>
<th scope="col">번호</th>
<th scope="col">이름</th>
<th scope="col">제목</th>
<th scope="col">내용</th>
<th scope="col">작성일</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="list">
<tr>
<td class="text_ct">${list.num} </td>
<td class="text_ct">${list.uName} </td>
<td class="text_ct">${list.subject} </td>
<td class="text_ct">${list.content} </td>
<td class="text_ct"><fmt:formatDate value="${list.date}" pattern="yyyy/MM/dd" /></td>
</tr>
</c:forEach>
</tbody>
</table>
</form>
</body>
</html>
Controller 만들기
controller : 사용자의 요청이 진입하는 지점 (entry point)
요청에 따라 어떤 처리를 할 지 결정
controller는 결정만 하는 것이고 실질적인 처리는 Service에서 담당
사용자에게 View를 응답으로 보내줌
src/main/java
하위 controller 패키지에 생성
com.springtest.controller/TestController.java
package com.springtest.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/board/*")
public class TestController {
@RequestMapping(value="/list", method = RequestMethod.GET)
public void getList() throws Exception {
}
}
url 매핑을 해 준 대로 http://localhost/board/list
에 들어가보면
짜쟌~😆
매퍼 작성하기
<?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="com.springtest.mappers.board">
<!-- 리스트 출력 -->
<select id="list" resultType="com.springtest.domain.TestVO">
select
num, uName, subject, content, date
from springtest
</select>
</mapper>
DAO 생성
src/main/java
하위에com.springtest.dao
패키지 생성, 안에testDAO.java
클래스(인터페이스) 생성
package com.springtest.dao;
import java.util.List;
import com.springtest.domain.TestVO;
public interface testDAO {
public List<TestVO> list();
}
- 동일 패키지 하위에 testDAO를 상속받는
testDAOImpl.java
클래스 생성
package com.springtest.dao;
import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.springtest.domain.TestVO;
@Repository
public class testDAOImpl implements testDAO {
@Inject
private SqlSession sqlSession;
private static String namespace = "com.springtest.mappers.board";
@Override
public List<TestVO> list() {
return sqlSession.selectList(namespace + ".list");
}
}
Service 생성
src/main/java
하위에com.springtest.service
패키지 생성, 안에testService.java
클래스(인터페이스) 생성
package com.springtest.service;
import java.util.List;
import com.springtest.domain.TestVO;
public interface testService {
public List<TestVO> list();
}
- 동일 패키지 하위에 testService를 상속받는
testServiceImpl.java
클래스 생성
package com.springtest.service;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.springtest.dao.testDAO;
import com.springtest.domain.TestVO;
@Service
public class testServiceImpl implements testService {
@Inject
private testDAO dao;
@Override
public List<TestVO> list() {
return dao.list();
}
}
Controller 작성
package com.springtest.controller;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.springtest.domain.TestVO;
import com.springtest.service.testService;
@Controller
@RequestMapping("/board/*")
public class TestController {
@Inject
private testService service;
@RequestMapping(value="/list", method = RequestMethod.GET)
public String getList(Model model) {
List<TestVO> list = service.list();
model.addAttribute("list", list);
return "board/list";
}
}
root-context.xml 작성
<beans>
태그 안 하단에 아래 코드 작성
<context:component-scan base-package="com.springtest.domain" />
<context:component-scan base-package="com.springtest.dao" />
<context:component-scan base-package="com.springtest.service" />
실행 해 보면 DB에 입력한 값들을 잘 읽어오는 걸 볼 수 있다 ㅎㅎ
주의사항
!! 주의할 점 !! 매퍼의 namespace와 인터페이스 DAO를 상속받는 DAOImpl 클래스의 namespace는 일치해야 한다