개발 스펙을 검토중이라면 각 구성항목의 버전별 지원여부와 유무료 정책 및 버전별 특성을 확인하시는 습관을 들이기 바랍니다. 연습하거나 공부용이라면 이점을 확인 안하는 경우가 많아서 막상 필드에서 고민하는 그런점에서 당황하기도 합니다.
열심히 개발 스펙을 검토 확정된 다음 파일럿 페이지를 구성할 때 참고용으로 적어 봅니다.
spring boot 3.x, vscode 사용, 메이븐 프로젝트
최종 결과
이번에는 단순 조회페이지를 만들어 보겠습니다.
1. 프로젝트 생성
mybatis가 sprint boot 3.1 이하 2.6 이상을 지원하는 관계로 3.06를 선택하였습니다.
생성된 프로젝트 루트 pom.xml 참고하시면 반영된 것을 확인할 수 있습니다.
※ 처음에는 jsp를 사용 안하려 했는데 중간 과정에서 사용해보자는 마음에서 시작했는데 역시나 최신버전으로 셋팅하면서 버전문제가 발생하였고 하루라는 시간을 허비하고 삽질을 정리하게 되었네요. 역시 개발을 위한 셋팅은 삽질이네요. spring boot 로 넘어가면서 호환버전 동기화가 좋아졌다고 생각했는데 추천하는 방식을 벗어나면 힘든거네요.
※ 샘플 파일럿 세팅 : jsp를 vscode 로 사용해서 테스트에는 war를 추천하네요.
java 17 오라클 사이트에서 설치해도 되고 "amazon openjdk version" 검색해서 설치하셔도 됩니다.
mvn 3.9 설치는 https://maven.apache.org/download.cgi 여기서 하면됩니다.
mvn 의존성 라이브러리 조회는 https://mvnrepository.com/ 여기서 하면됩니다.
DB는 오라클에서 개발프리로 열어준 것을 사용했습니다.
2023.04.21 - [프로그램/Web] - Oracle23c 도커 설치 후 테스트 계정 생성(2023.4)
Oracle23c 도커 설치 후 테스트 계정 생성(2023.4)
테스트 프로그램 만들고 확인할 용으로 적어 봅니다. 2023.04.15 - [프로그램/짜투리상식] - Dorker에 Oracle 설치(2023.04) Dorker에 Oracle 설치(2023.04) 도커 설치 후 오라클 공식 홈페이지에 접속하여 최신
jsi0.tistory.com
설정내용 : jsp 폴더지정, 인코딩, DB접속, DTO 설정
- 리소스 폴더는 css사용용인데 적용은 안했네요.
1. application.properties
1. application.properties
# server
server.port=8082
# view
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
#encoding
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.force=true
server.servlet.encoding.force-response=true
server.servlet.encoding.enabled=true
#resources
spring.mvc.static-path-pattern=/resources/**
#jdbc
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:FREE
spring.datasource.username=tpuser
spring.datasource.password=tpuserpw
# mybatis alias
mybatis.type-aliases-package = com.board.model.dto.MyDto
2. pom.xml
2. pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.6</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>com.board</groupId>
<artifactId>spbt2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>spbt2</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<!-- JSP -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- 구버전 jstl 유효값체크에서 에러남
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
-->
<!-- jstl -->
<!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api -->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.web/jakarta.servlet.jsp.jstl -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3. MyBoardController.java
3. MyBoardController.java
package com.board.spbt2.board.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.board.spbt2.board.model.biz.MyBoadBiz;
//import java.util.List;
//import com.board.spbt2.board.model.dto.MyDto;
@Controller
public class MyBoardController {
@Autowired
private MyBoadBiz biz;
@GetMapping("/list")
public String selectList(Model model){
model.addAttribute("blist", biz.selectList());
/*
* System.out.println("selectList");
* System.out.printf(" 결과 : %d \n", biz.selectList().size());
* List<MyDto> list = biz.selectList();
* System.out.printf(" 결과 : %s \n", list.get(0).getMyno());
*/
return "boardlist";
}
@GetMapping("/")
public String Welcom(){
System.out.println("step 000 Welcom");
return "index";
}
}
4. MyBoadBiz.java
4. MyBoadBiz.java
package com.board.spbt2.board.model.biz;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.board.spbt2.board.model.dto.MyDto;
import com.board.spbt2.board.model.mapper.MyBoardMapper;
@Service
public class MyBoadBiz {
@Autowired
private MyBoardMapper mapper;
public List<MyDto> selectList() {
return mapper.selectList();
}
public MyDto selectOne(int myno) {
return mapper.selectOne(myno);
}
public int insert(MyDto dto) {
return mapper.insert(dto);
}
public int update(MyDto dto) {
return mapper.update(dto);
}
public int delete(int myno) {
return mapper.delete(myno);
}
}
5. MyDto.java
5. MyDto.java
package com.board.spbt2.board.model.dto;
import java.util.Date;
import java.io.Serializable;
public class MyDto implements Serializable {
private int myno;
private String myname;
private String mytitle;
private String mycontent;
private Date mydate;
public int getMyno() {
return myno;
}
public void setMyno(int myno) {
this.myno = myno;
}
public String getMyname() {
return myname;
}
public void setMyname(String myname) {
this.myname = myname;
}
public String getMytitle() {
return mytitle;
}
public void setMytitle(String mytitle) {
this.mytitle = mytitle;
}
public String getMycontent() {
return mycontent;
}
public void setMycontent(String mycontent) {
this.mycontent = mycontent;
}
public Date getMydate() {
return mydate;
}
public void setMydate(Date mydate) {
this.mydate = mydate;
}
}
6. MyBoardMapper.java
6. MyBoardMapper.java
package com.board.spbt2.board.model.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.board.spbt2.board.model.dto.MyDto;
@Mapper
public interface MyBoardMapper {
@Select(" SELECT MYNO, MYNAME, MYTITLE, MYCONTENT, MYDATE FROM MYBOARD ORDER BY MYNO DESC ")
List<MyDto> selectList();
@Select(" SELECT MYNO, MYNAME, MYTITLE, MYCONTENT, MYDATE FORM MYBOARD WHERE MYNO = #{myno} ")
MyDto selectOne(int myno);
@Insert(" INSERT INTO MYBOARD VALUES(MYNOSEQ.NEXTVAL, #{dto.getMyname}, #{mytitle}, #{dto.mycontent}, SYSDATE) ")
int insert(MyDto dto);
@Update(" UPDATE MYBOARD SET MYTITLE = #{mytitle}, MYCONTENT=#{mycontent} WHERE MYNO = #{myno} ")
int update(MyDto dto);
@Delete(" DELETE FROM MYBOARD WHERE MYNO = #{myno} ")
int delete(int myno);
}
7. boardlist.jsp
7. boardlist.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.board.model.dto.*"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>책목록</title>
<link rel="stylesheet" href="https://s3.ap-northeast-2.amazonaws.com/materials.spartacodingclub.kr/easygpt/default.css">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"
integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4"
crossorigin="anonymous"></script>
<style>
.titleRed {
color: red
}
</style>
</head>
<body>
<table class="table" >
<thead>
<tr>
<th>번호</th>
<th>글쓴이</th>
<th>제목</th>
<th>작성일</th>
</tr>
</thead>
<tbody>
<c:forEach var="dto" items="${blist}">
<tr>
<td><a href="/myboard/detail?myno=${dto.getMyno()}">${dto.getMyno()}</a></td>
<td>${dto.getMyname()}</td>
<td>${dto.getMytitle()}</td>
<td>${dto.getMycontent()}</td>
</tr>
</c:forEach>
</tbody>
</table>
<a href="/">홈</a>
</body>
</html>
비주얼하게 바꾸고 싶지만 좀더 다른 언어도 손을 쓰고 싶으니 작업해서 git에 올리고 수준은 그때 올리는 것으로 해볼께요.
자 다음은 react 로 동일하게 만들어봅시다. 버전이 또 얼마나 올라갔을지 걱정스럽네요.
'프로그램 > Web' 카테고리의 다른 글
spring security 6.2.4 (2024.05) (0) | 2024.05.11 |
---|---|
window에서 https 서비스 테스트(2023.08.09) (0) | 2023.08.09 |
vscode 에서 mvn 명령사용을 위한 설정(2023.08.09) (0) | 2023.08.09 |
우분투 날짜 파일명 만들기(2023.07.19 마리아DB 백업) (0) | 2023.07.19 |
Oracle23c 도커 설치 후 테스트 계정 생성(2023.4) (0) | 2023.04.21 |