SpringBoot๋ ์ฃผ๋ก JPA์ Thymeleaf๋ฅผ ํํธ๋๋ก ์ผ์ ๊ฐ๋ฐ์๋ค์๊ฒ ๋๋ฆฌ ์๋ ค์ ธ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ธฐ์ ์ ์ธ๊ณ์์๋ ์ธ์ ๋ ์์ธ๊ฐ ์กด์ฌํฉ๋๋ค.....
๋ณธ ๊ธ์์๋ SpringBoot๋ฅผ MyBatis์ Oracle DB์ ์ฐ๊ฒฐํ๊ณ ,
JSP๋ฅผ ํ์ฉํ์ฌ ๋ทฐ๋ฅผ ๊ตฌ์ฑํ๋ ๊ณผ์ ์ ํ์ํ ์ค์ ๋ค์ ๋ํด ๊ธฐ๋กํ์์ต๋๋ค.
ํ๋ก์ ํธ ํ๊ฒฝ์ ์ธํ ๋ฆฌ์ ์ด์ ์๋์ฐ์ด๋ฉฐ,
๊ฒ์ํ์ ๊ธ๋ชฉ๋ก์ ๋ถ๋ฌ์ค๊ธฐ๊น์ง์ ๊ฐ๋จํ ์ฝ๋๋ก ์ด๋ฃจ์ด์ ธ์์ต๋๋ค.
์คํ๋ง๋ถํธ 2.X.X ๋ฒ์ , ์๋ฐ 11 ๋ฑ ๋ฎ์ ๋ฒ์ ์ผ ๋์ ์ค์ ์ ๋๋ค.
์ค๋น๋ฌผ: SpringBoot ํ๋ก์ ํธ
- ์ด ๊ธ์์ ์ฌ์ฉํ๋ build.gradle ์ ๋๋ค.
plugins {
id 'org.springframework.boot' version '2.4.1' //์คํ๋ง๋ถํธ 2.X.X ๋ฒ์
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}
group = 'com.ํ๋ก์ ํธ.ํจํค์ง์ด๋ฆ'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11' //์๋ฐ 11
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'
// implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' //JSP๋ฅผ ์ด์ฉํ๋ฏ๋ก ์ฃผ์์ฒ๋ฆฌ
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4' // MyBatis ์คํ๋ง ๋ถํธ ์คํํฐ
implementation 'com.oracle.database.jdbc:ojdbc8:21.9.0.0' // ์ค๋ผํด JDBC ๋๋ผ์ด๋ฒ
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' //JSP ์ด์ฉ์ ์ํ ์์กด์ฑ
implementation 'javax.servlet:jstl' //JSTL ์ด์ฉํ๊ธฐ
compileOnly 'org.projectlombok:lombok'
// runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//JUnit4 ์ถ๊ฐ
testImplementation("org.junit.vintage:junit-vintage-engine") {
exclude group: "org.hamcrest", module: "hamcrest-core"
}
}
test {
useJUnitPlatform()
}
- ์คํ๋ง๋ถํธ ๋ฒ์ , ์๋ฐ ์ปดํ์ผ๋ฌ ๋ฒ์ , MyBatis ์คํํฐ ๋ฒ์ , ์ค๋ผํด JDBC ๋๋ผ์ด๋ฒ ๋ฒ์ ์ ํ์ธํ์ธ์
- JSP์ด์ฉ์ ์ํ ์์กด์ฑ์ ์ถ๊ฐํ์ธ์
Oracle ๋ฐ์ดํฐ๋ฒ ์ด์ค ํตํฉ
- application.properties ์ ์์ ์ DB์ ๋ณด๋ฅผ ๋ฑ๋กํด์ Oracle ์ฐ๊ฒฐํฉ๋๋ค
# application.properties
spring.datasource.url=jdbc:oracle:thin:@์ฌ๊ธฐ์IP๋ฒํธ๋ฑ๋กํ๊ณ :์ฌ๊ธฐ๋ํฌํธ4์๋ฆฌ:xe
spring.datasource.username=๋๋น๋ก๊ทธ์ธ์ ์ ๋ค์
spring.datasource.password=๋๋น๋ก๊ทธ์ธํจ์ค์๋
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect
# HikariCP
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=MyHikariCP
spring.datasource.hikari.max-lifetime=600000
spring.datasource.hikari.connection-timeout=30000
# MyBatis
mybatis.type-aliases-package=com.ํ๋ก์ ํธ.ํจํค์ง๋ช
.domain
mybatis.mapper-locations=classpath:/mappers/**/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
#
spring.application.name=๊ฐ์ธ๋ง๋ค๋ค๋ฆ
# JSP ์์น
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
- ์ง์ ๋ฑ๋กํ ์๋ ์์ต๋๋ค.
MyBatis ์ค์
- ์๋ ๊ณ์ธต์ ํํ๋ก ํด๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ณ , mapper.xmlํ์ผ์ ์์ฑํ๋ค.
- boardMapper.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="com.ํ๋ก์ ํธ.ํจํค์ง๋ช
.repository.BoardMapper">
<select id="selectList" resultType="BoardDto">
SELECT /*+ INDEX(BOARD_STUDY idx_BOARD_STUDY_SEQ) */
SEQ
, MEM_NAME
, MEM_ID
, BOARD_SUBJECT
, BOARD_CONTENT
, REG_DATE
, UPT_DATE
, VIEW_CNT
, USEYN
FROM BOARD_STUDY
WHERE ROWNUM <![CDATA[ <= ]]> 20
ORDER BY SEQ DESC
</select>
</mapper>
- ํ์ฌ ํจํค์ง์ ํ์ ํจํค์ง์ธ config ํจํค์ง๋ฅผ ๋ง๋ ๋ค. ๊ทธ ์์ MabatisConfig ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
package com.ํ๋ก์ ํธ.ํจํค์ง๋ช
.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.ํ๋ก์ ํธ.ํจํค์ง๋ช
.repository") // MyBatis Mapper ์ธํฐํ์ด์ค๊ฐ ์๋ ํจํค์ง๋ฅผ ์ค์บ
public class MyBatisConfig {
// ์ถ๊ฐ์ ์ธ MyBatis ์ค์ ๋ฐ ๋น ์ ์ ํ ์ ์์
}
- repositoryํจํค์ง ์์ BoardMapper ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ค.
package com.ํ๋ก์ ํธ.ํจํค์ง.repository;
import com.ํ๋ก์ ํธ.ํจํค์ง.domain.BoardDto;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface BoardMapper {
// ๊ฒ์๋ฌผ ๋ชฉ๋ก ์กฐํ
List<BoardDto> selectList();
}
- Repositoryํด๋์ค์์ BoardMapper๋ฅผ ์ฃผ์ ๋ฐ๊ณ , Mapper.xml์ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํด์ DB์์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
package com.ํ๋ก์ ํธ.ํจํค์ง๋ช
.repository;
import com.ํ๋ก์ ํธ.ํจํค์ง๋ช
.domain.BoardDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class BoardRepository {
private final BoardMapper boardMapper;
@Autowired
public BoardRepository(BoardMapper boardMapper) {
this.boardMapper = boardMapper;
}
public List<BoardDto> findAll() {
return boardMapper.selectList();
}
}
โ DTO ๋ฐ ๊ทธ ์ธ์ ์ฝ๋
๋๋ณด๊ธฐ
ํจํค์ง ๊ตฌ์กฐ
์ปจํธ๋กค๋ฌ
@Controller
public class BoardController {
@Autowired
BoardService boardService;
@GetMapping("/boardList")
public String boardList(Model model) throws SQLException {
List<BoardDto> list = new ArrayList<>();
try {
list = boardService.findBoards();
model.addAttribute("boardList",list);
} catch (SQLException e){
model.addAttribute("boardList",list);
}
return "boardList";
}
}
์๋น์ค
@Service
public class BoardService {
@Autowired
private BoardRepository boardRepository;
//๋ณด๋ ๋ฆฌ์คํธ ๊ฐ์ ธ์ค๊ธฐ
public List<BoardDto> findBoards() throws SQLException {
List<BoardDto> list = new ArrayList<>();
list = boardRepository.findAll();
return list;
}
}
๊ฐ๋จํ ์์ฑ์ ์ํด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์์์ ์ํด๋ถํ๋๋ฆฝ๋๋ค.
board ๊ฒ์๊ธ dto (๊ฐ์ ๋ง๋ Table์ ๋ง์ถฐ ์์ ํ์ธ์)
@Getter @Setter
@ToString
@AllArgsConstructor
public class BoardDto {
private int seq;
private String mem_name;
private String mem_id;
private String board_subject;
private String board_content;
private LocalDateTime reg_date;
private LocalDateTime upt_date;
private String view_cnt;
private String useyn;
}
JSP๋ฅผ ์ํ ๋ทฐ ์ค์
- mainํด๋ ์๋์ ๊ธฐ์กด์ ์๋ java, resources์ ๊ฐ์ ๋ ๋ฒจ๋ก webapp ํด๋๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ํด๋๋ฅผ ๋ง๋คํ๊ณ jspํ์ผ์ ์์ฑํ๋ค
- JSPํ์ผ
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>๊ฒ์ํ</title>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="/resources/js/boardList.js"></script>
<style>
.fixed-col-title {
width: 150px;
background-color: cornsilk;
}
.fixed-col-s {
width: 80px;
}
.fixed-col-m {
width: 180px;
}
</style>
</head>
<body>
<p> ๊ฒ์ํ ๊ธ ๋ชฉ๋ก </p>
<table border="1">
<thead>
<tr>
<th><input type="checkbox" name="allChk" id="allChk"></th>
<th class="fixed-col-s">๊ธ๋ฒํธ</th>
<th class="fixed-col-s">์์ฑ์ ID</th>
<th class="fixed-col-title">์ ๋ชฉ</th>
<th class="fixed-col-m">์์ฑ์ผ</th>
<th class="fixed-col-m">์์ ์ผ</th>
<th class="fixed-col-s">์กฐํ์</th>
</tr>
</thead>
<tbody>
<!-- List๋ฅผ ๋ฐ๋ณตํ๋ฉด์ index๋ฅผ ์ฌ์ฉ -->
<c:forEach items="${boardList}" var="board" varStatus="status">
<tr name="trBoard${status.index}" id="trBoard${status.index}">
<td><input type="checkbox" name="tdBoard${status.index}" id="tdBoard${status.index}"></td>
<td>${board.getSeq()}</td>
<td>${board.getMem_id()}</td>
<td><a href="">${board.getBoard_subject()}</a></td>
<td>${board.getReg_date()}</td>
<td>${board.getUpt_date()}</td>
<td>${board.getView_cnt()}</td>
</tr>
</c:forEach>
<!--๋ฐ๋ณต ์์-->
<%-- <tr>--%>
<%-- <td><input type="checkbox" name="" id=""></td>--%>
<%-- <td>ํ 1, ์ด 2</td>--%>
<%-- <td>ํ 1, ์ด 3</td>--%>
<%-- <td>ํ 1, ์ด 4</td>--%>
<%-- <td>ํ 1, ์ด 5</td>--%>
<%-- <td>ํ 1, ์ด 6</td>--%>
<%-- <td>ํ 1, ์ด 7</td>--%>
<%-- </tr>--%>
<!--๋ฐ๋ณต ์์-->
</tbody>
</table>
</body>
</html>
'๐ฅ๏ธ ๋ฐฑ์๋ > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Querydsl] DTO ์กฐํ ๋ฐฉ๋ฒ (1) | 2024.01.07 |
---|---|
[์ค์ ] ๊น์ํ SpringBoot JPA ๊ฐ์ ํ๋ก์ ํธ 3.X.X ์ค์น ์ค๋ฅ ํด๊ฒฐ (1) | 2023.12.17 |
[Querydsl] Querydsl ์ฌ์ฉ์ ์ํ ์ค๋น (0) | 2023.11.30 |
[API] REST API ํ ์คํ ๋๊ตฌ Talend API Tester (1) | 2023.11.29 |
[API] API ๊ณ ๊ธ ์ค๊ณ - ์ง์ฐ ๋ก๋ฉ๊ณผ ์กฐํ ์ฑ๋ฅ ์ต์ ํ (1) | 2023.11.28 |