1. ์ฐ์ ์ค๋ฅ๊ฐ ๋์ ํ ์คํธ ์ ์ฃผ์์ฒ๋ฆฌํ๋ pom์ mybatis์ mysql ์ ์ฃผ์์ ํ์ด์ค๋ค.
2. ์ค์ ํ์ผ์ ์์
jsp์ context์ ์ ์ด์ฃผ์๋ db์ฐ๊ฒฐ์ ํ์ํ๋ ์ ๋ณด๋ค์ ๋์ผํ๊ฒ ์ ์ด์ค๋ค.
p84ํ์ด์ง์ ๋ ๊ฑฐ์ ๋ชจ๋ธ์ root.xml, ์์ชฝ์ ์๋ฐํ์ผ์ ymlํ์ผ๋ก์ค์ ํ ์์๋ค
๋ด๊ฐ ymlํ์ผ๋ก ์ฝ๊ฒ ์์ฑํ ์ฝ๋๋ฅผ ์คํ๋ง์ด xml,์๋ฐํ์ผ๋ก ๋ง๋ค์ด ์ค์ ํด์ค๋ค.
3. ๋ง์ด๋ฐํฐ์ค ์ฐ๊ฒฐ ์ค์ ํ๊ธฐ
p89
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@Configuration
@MapperScan(basePackages = "com.cos.crud.repository")
public class DataAccessConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return sessionFactory.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
import javax.sql.DataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DataSourceConfig {
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource(){
return DataSourceBuilder.create().build();
}
}
์ปจํธ๋กค+ํด๋ฆญํ๋ฉด ์์ ์๋ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ ์๋ค.
๋ํ์ฌ์ง ์ญ์
๊ทธ๋๋ก ๋ณต๋ถ!
*์คํ๋ง ์ปจํ ์คํธ ์์ ioc๊ฐ๋ ์ ์ด์ฉํด์ ์คํ๋ง์ด ์ปดํฌ๋ํธ์ค์บ(๊ตฌ์ฑ์์๋ฅผ ์ค์บ) @__ ์ด๋ ธํ ์ด์ ๋ค์ ์ฐพ๋๋ค.
๋ณต๋ถํ๊ฒ๋ค์ด @configuration ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ฌ๋ค.
์ด์ ๋ง๋ ํด๋์์ ์ค์ ํ ์คํธ๋ง ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
4. my sql database๋ง๋ค๊ธฐ
root ์ ์ํด์ ๋ง๋ค๊ธฐ
create user 'spring'@'%' identified by 'bitc5600';
create database spring;
grant all privileges on spring.* to 'spring'@'%';
ํ ์ด๋ธ ๋ง๋ค๊ธฐ
CREATE TABLE mem(
id int AUTO_INCREMENT PRIMARY KEY,
username varchar(100) not null,
password varchar(100) not null,
email varchar(100),
createDate timestamp
)ENGINE=InnoDB DEFAULT CHARSET = utf8;
5. ๋ชจ๋ธ ๋ง๋ค๊ธฐ
๋ชจ๋ธ์ ๋ง๋ค๊ฑด๋ฐ
domain: ๊ธฐ๋ฅ์ด๋ผ๋ ์๋ฏธ
damainํจํค์ง๋ฅผ ๋ง๋ค์ด์ ๊ทธ ์์ model, dto๋ฑ์ ๊ธฐ๋ฅ๋ค์ ๋ชจ์๋์์๋ ์๋ค.
model=Value Object, VO๋ผ๋ ํจํค์ง๋ผ๊ณ ๋ ๋ง๋ ๋ค.
VO๋ ๋ถ๋ณ, ๋ณํ์ง์๋๋ค๋ ํน์ง์ด ์๋ค. finaly , ์์ ๋์ง์๋ ๋ฐ์ดํฐ๋ง์ VO๋ผ ๋ถ๋ฅธ๋ค.
setter์ ๋ง๋ค์ง ์๋๋ค. getter์ ์์ฑ์๋ง ๋ง๋ ๋ค.
๋ณ๊ฒฝํ ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๊ณ ์ถ์ผ๋ฉด dto๋ชจ๋ธ์ ๋ง๋ค์ด model์ ์ฝ์ด dto์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ฌ์ฉํ๋ค.
ํ์ ์ ์ํ ์ฝ์!
6. ๋ง์ด๋ฐํฐ์ค ์ฌ์ฉ์ ์ํ ํ์ผ ๋ง๋ค๊ธฐ
https://mybatis.org/mybatis-3/sqlmap-xml.html
<?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.cos.springboot.repository.MemRepository">
<select id="findAll" resultType="com.cos.sprringboot.model.Mem">
select * from mem order by id desc
</select>
<select id="findById" resultType="com.cos.sprringboot.model.Mem">
select * from mem where id=#{id} ์ ํํ๊ฒ ์ ์ด์ผ ํ๋ค.
</select>
<insert id="save"> // ๊ฒํฐ๊ฐ ํธ์ถ ๋๋ค.
insert into mem(username, password, email, createDate) values(#{username},#{password},#{email},now())
</insert>
<insert id="update">
update mem set password = #{password}, email = #{email} where id = #{id}
</insert>
<insert id="delete">
delete from mem where id= #{id}
</insert>
</mapper>
* ๊ฐ๋จํ SQL๋ฌธ ์๋๋ก๋ ๊ฑธ ์ ์๋ค.
*์กฐ์ธํด์ ๋ฐ์๋ ๋งต ์ฐ์ง๋ง๊ณ ์กฐ์ธํ DTO์ฌ์ฉ ํ์ฌ ๋ฐ๋ ๊ฒ์ด ์ข๋ค! ๊ทธ๋ ๊ฒ ๋ฐ์
package com.cos.springboot.repository;
import java.util.List;
import com.cos.springboot.model.Mem;
public interface MemRepository {
@Select("SELECT * FROM mem")
List<Mem> findAll();
}
7. mem์๋์ํค๊ธฐ
package com.cos.springboot.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import com.cos.springboot.dto.RequestMemJoinDto;
import com.cos.springboot.repository.MemRepository;
@Controller
public class MemController {
@Autowired // ์ฃผ์
ํด์ค๋ค DI์ ๊ฐ๋
, ํ์ฌ @repository์์ญ์ MemRepository ์ด ๋์ด์ ธ์๊ธฐ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค.
private MemRepository memRepository;
@PostMapping("/mem/api/join")
// ํ์ํ ๋ฐ์ดํฐ๋ username, password, email , ํ๊ฑด์ getparam์ผ๋ก ๋ฐ์ผ๋ฉด ๋์ง๋ง ์ฌ๋ฌ๊ฑด์ผ๋์๋ DTO๋ก ๋ฐ๋๋ค.
// json์ผ๋ก ๋์ง๊ณ json์ผ๋ก ๋ฐ๋๋ค. requestbody, ๊ทธ๋ฌ๊ณ ํํ๋ฅผ ๋ณํ์ํค๋ฉด ๋๋ค.
// DML์ ์ธ์ํธ๋ง ํ๊ธฐ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ๋ง ๋ฐ๊ธฐ ๋๋ฌธ์ ์ธ์ํธ๊ฐ ์ฑ๊ณตํ๋ฉด ํ์ด์ง์ด๋๋ง ํด์ฃผ๋ฉด ๋๋ค.
// api๊ฐ ๋ถ์๋์๋ data๋ง ๋ฆฌํดํด์ฃผ๋ฉด ๋๋ค. ํ์ด์ง๋ฆฌํด์ด ์๋ ์ธ์ํธ๊ฐ ์๋์๋ค๋ ๊ฒฐ๊ณผ๊ฐ๋ง ๋ฆฌํด
public @ResponseBody int memApiJoin(@RequestBody RequestMemJoinDto requestMemJoinDto) {
// memํํ๋ก ๋ฐ์์๋์๊ฒ ์ง๋ง, DTO๋ฅผ ๋ง๋ค์ด ๋ฐ๋๋ค. mem์ ๋๋น์ฉ
// ๋ฆฌํ์คํธ๋ฐ๋,๋ฒํผ๋ก ๋ฐ๋๋ค. ์๋ ์คํ๋ง์ ๋ชป๋ฐ์ง๋ง ์ญ์จ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค๋ธ์ ํธ๋ก ๋ณํํ์ฌ ๋ฐ์์ค๋ค.
int result = memRepository.save(requestMemJoinDto);
if(result ==1) {
return 200; //์๋๋ ๋ทฐ๋ฆฌ์กธ๋ธ๊ฐ ๊ด์ฌํ๊ธฐ๋๋ฌธ์ @@ResponseBody ๋ก ๋ฐ์ดํฐ๋ก ์ธ์ํ๊ฒ ํด์ผํจ.
}else {
return 500;
}
}
}
ํ์ฌ์ ์ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ ์ํฉ
@controller
HomeController
MemControler
@configulation
DataAccessConfig
DataSourceConfig
@repository (๋ ํ์งํ ๋ฆฌ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ์ ๋์ฐ๊ธฐ ์ํด ์ฌ์ฉ, ์์ ์ ์ฌ์ฉํ์์ผ๋ ํ์ฌ๋ dataacess๊ฐ ๋์ด์ฃผ๊ณ ์์)
MemRepository
*intํ์ด ์๋ String ํ์ผ๋ก ๋ฆฌํด ๋ฐ๊ณ ์ถ์๋ ์ฌ์ฉ ํ๋ ๋ฉ์๋
์ถํ @valid ๋ฅผ ๋ฃ์ผ๋ฉด ์ค๋ฅ๋ฉ์์ง๋ฅผ ๊น๋ํ๊ฒ ํ์ธํ ์ ์๋ค.
(1). ํ์๊ฐ์
- MemController
public @ResponseBody ResponseEntity<String> memApiJoin(@RequestBody RequestMemJoinDto requestMemJoinDto) {
// memํํ๋ก ๋ฐ์์๋์๊ฒ ์ง๋ง, DTO๋ฅผ ๋ง๋ค์ด ๋ฐ๋๋ค. mem์ ๋๋น์ฉ
// ๋ฆฌํ์คํธ๋ฐ๋,๋ฒํผ๋ก ๋ฐ๋๋ค. ์๋ ์คํ๋ง์ ๋ชป๋ฐ์ง๋ง ์ญ์จ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค๋ธ์ ํธ๋ก ๋ณํํ์ฌ ๋ฐ์์ค๋ค.
int result = memRepository.save(requestMemJoinDto);
if (result == 1) {
return new ResponseEntity<String>("ํ์๊ฐ์
์ฑ๊ณต", HttpStatus.CREATED); // ์๋๋ ๋ทฐ๋ฆฌ์กธ๋ธ๊ฐ ๊ด์ฌํ๊ธฐ๋๋ฌธ์ @ResponseBody ๋ก ๋ฐ์ดํฐ๋ก
// ์ธ์ํ๊ฒ ํด์ผํจ.
} else {
return new ResponseEntity<String>("ํ์๊ฐ์
์คํจ.", HttpStatus.BAD_REQUEST);
}
}
(2). ํ์ ๋ฆฌ์คํธ ํ์ด์ง
- list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ํ์ ๋ฆฌ์คํธ</title>
</head>
<body>
<table border="1">
<tr>
<th>username</th>
<th>email</th>
<th>createdate</th>
<th>update</th>
</tr>
<c:forEach var="mem" items="${mems}">
<tr>
<th>${mem.username}</th>
<th>${mem.email}</th>
<th>${mem.createDate}</th>
<td><button onclick="mem_update(${mem.id})">edit</button></td>
</tr>
</c:forEach>
</table>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
function mem_update(mem_id){
location.href='/mem/'+mem_id;
}
</script>
</body>
</html>
- MemController
@GetMapping("/mem")
public String mems(Model model) {
List<Mem> mems = memRepository.findAll();
model.addAttribute("mems", mems);
return "mem/list";
}
(3). ํ์ ์์ ํ์ด์ง
- update.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ํ์ ์์ ํ์ด์ง</title>
</head>
<body>
<table border="1">
<tr>
<th>id</th>
<th>username</th>
<th>password</th>
<th>email</th>
<th>createdate</th>
</tr>
<tr>
<th><input id="id" type="text" value="${mem.id}"
readonly="readonly"></th>
<th><input type="text" value="${mem.username}"
readonly="readonly"></th>
<th><input id="password" type="password" value="${mem.password}"></th>
<th><input id="email" type="text" value="${mem.email}"></th>
<th><input type="text" value="${mem.createDate}"
readonly="readonly"></th>
</tr>
</table>
<button id="mem_update_proc">์์ ํ๊ธฐ</button>
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
$('#mem_update_proc').on('click', function() {
let data={
id: $('#id').val(),
password: $('#password').val(),
email: $('#email').val()
};
$.ajax({
type: 'PUT',
url : '/mem/api/update',
data : JSON.stringify(data),
contentType : 'application/json; charset=utf-8',
dataType :'json'
}).done(function(result){
if(result==='ok'){
alert('ํ์์ ๋ณด๊ฐ ์์ ์๋ฃ');
location.href='/mem';
}else {
alset('ํ์์ ๋ณด ์์ ์คํจ')}
}).fail(function(result){
alert('์๋ฒ์ค๋ฅ');
});
});
</script>
</body>
</html>
- MemController
@PutMapping("/mem/api/update")
public @ResponseBody ResponseEntity<?> updateProc(@RequestBody RequestMemUpdateDto requestMemUpdateDto) {
int result = memRepository.update(requestMemUpdateDto);
if(result==1) {
return new ResponseEntity<RequestMemUpdateDto>(requestMemUpdateDto, HttpStatus.OK);
}else {
return new ResponseEntity<RequestMemUpdateDto>(requestMemUpdateDto, HttpStatus.BAD_REQUEST);
}
}
(4). ํ์ ์ญ์
- MemController
* ์ ๋ฆฌ
1. mysql์ ํ๊ธฐ ์ํด์๋ pom.xml์ mysql๊ณผ mybatis์ ๋ฃ์ด์ค์ผํ๋ค.
2. configํ์ผ์ ๋๋ค ๋ณต์ฌ๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ํด์ผํ๋ค. IOCํ๊ธฐ์ํจ,DataSourceConfig ์ ์์ ํ ํ์ ์๋ค. DataAccessConfig์ ์ค์บํ ํ์ด์ง๋ง ํ์ธํ์ฌ ์์ ํ๋ค.
3. ymlํ์ผ์์ DB์ฐ๊ฒฐ์ ์ํ datasource๋ฅผ ์ถ๊ฐํ๋ค.
4. model์ ๋ง๋ ๋ค. setter์ ๋ง๋ค ํ์๊ฐ ์๋ค. setterํ ์ผ์ด ์๋ค.
5. MemRepository๋ฅผ ๋ง๋ ๋ค. ๋งคํผ๊ฐ ์ค์บ๋๋ ์์น์ ์์ด์ผ ํ๊ธฐ๋๋ฌธ์ DataAccessConfig์ ์ค์บ ์์น์ ์ ํํ๊ฒ ๋ง๋ ๋ค.
6. mem.xmlํ์ผ์ ๋ง๋ ๋ค. namespace๋ฅผ ์ ํํ๊ฒ ๋ ํ์งํ ๋ฆฌ๋ฅผ ๋ฐ๋ผ๋ณผ์์๊ฒ ํ์ธํ๋ค.
๋ฆฌ์คํธ๋ ๊ฒ์ด๋ผ์ ajax ์์ป๋ค.
์ธ์ํธ, ์ ๋ฐ์ดํธ๋ ํฌ์คํธ๋ฐฉ์์ด๋ผ์ ajax๋ฅผ ์ฌ์ฉํ๋ค.
'java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง - ์ํ ์กฐํ ๊ฒ์ํ ๋ง๋ค๊ธฐ(1) (0) | 2021.02.27 |
---|---|
์คํ๋ง - ์ ํจ์ฑ๊ฒ์ฌ, ํ์ผ์ ๋ก๋ (0) | 2021.02.27 |
JSP๋ฅผ ์ด์ฉํ ์ ํ ์๊ฐ ํํ์ด์ง ๋ง๋ค๊ธฐ (0) | 2021.02.27 |
์คํ๋ง ์์ํ๊ธฐ -2 (0) | 2021.02.27 |
์คํ๋ง ์์ํ๊ธฐ (0) | 2021.02.27 |