[스프링] 스프링에서 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&amp;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}&nbsp;</td>
				        <td class="text_ct">${list.uName}&nbsp;</td>
				        <td class="text_ct">${list.subject}&nbsp;</td>
				        <td class="text_ct">${list.content}&nbsp;</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 생성


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는 일치해야 한다

Categories:

Spring