오늘은 스프링부트 만들어보기
spring.io 에서 스프링 4 버전을 받아도 되지만
기존에 설치했던 전자정부 프레임워크에서 스프링 4 버전을 지원하기 때문에
여기서 스프링부트를 시작
프로젝트 만들기
new > Project > Spring starter Project 선택
Type 은 gradle, Packaging : War, Group, Package 설정
다음 페이지에서 원하는 Dependencies 를 검색하여 추가
원하는 Dependency 들을 선택하여 추가하였으면 finish 클릭하여 프로젝트 생성
기존 maven 은 pom.xml 에서 설정하였지만
gradle 은 build.gradle 에서 나중에 추가하고 싶은 dependency 들을 추가할 수 있음
설정하기
build.gradle 에서 설정하기
// 필요한 jar 파일들을 여기에 넣음
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
// 의존성 추가하기
implementation "org.apache.tomcat.embed:tomcat-embed-jasper" // tomcat사용하기
implementation 'org.mariadb.jdbc:mariadb-java-client:3.0.8' // DB
// JSTL 의존성 추가
// implementation 'javax.servlet:jstl:1.2' // jsp, 3 버전 미만
implementation 'jakarta.servlet:jakarta.servlet-api'
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api'
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'
compileOnly 'org.projectlombok:lombok' // compileOnly : 컴파일 시점에만 참여
developmentOnly 'org.springframework.boot:spring-boot-devtools' // developmentOnly : 개발할 때에만 사용
annotationProcessor 'org.projectlombok:lombok' // annotationProcessor : 어노테이션(@) 으로 사용하기 위해 사용
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
// Runtime 할 때만 필요, 실행환경에서 제공되는 dependency 를 설정
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'
// testImplementation : test 코드 수행때만 사용
}
application.properties 설정하기
# jsp path // jsp 파일의 경로 설정
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
# MariaDB
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://서버주소:포트번호/DB 이름
spring.datasource.username=계정아이디
spring.datasource.password=계정비밀번호
# Mybatis // DTO package 의 위치 설정
mybatis.type-aliases-package=com.solbum.web.dto
mybatis.mapper-locations=static/mapper/*.xml
# port 변경 시
server.port=80
.jsp 파일을 만들 폴더 생성
src > main > webapp > WEB-INF > views 밑에 .jsp 파일들 생성
스프링부트 3 버전 이상에서 JSTL 사용 시 발생하는 오류
원래는 해당 jstl 의존성을 사용하고 있지만
implementation 'javax.servlet:jstl:1.2'
자바 버전이 오르면서 java 가 아닌 jakarta 를 사용하고 있음
해당하는 의존성을 넣어줘야 오류 없이 사용할 수 있음
implementation 'jakarta.servlet:jakarta.servlet-api'
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api'
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl'
밑의 에러를 해결하는 방법
java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.ㅇㅇㅇ_jsp
이 블로그를 보고 해결하였음, 밑의 댓글 참고
\workspace\.metadata\.plugins\org.eclipse.wst.server.core\
밑에 있는 폴더를 삭제하고 서버 재기동하니 정상 작동
.jsp 파일에 jstl taglib 작성 시 기존의 http 가 아닌 jakarta 문법을 사용하니 해결 완료
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
== >>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
게시글 띄워보기
Controller, Service 생성
@Controller
public class IndexController {
@Resource(name = "testService")
private TestService testService;
@GetMapping("/index")
public String index(Model model) {
List<BoardDTO> list = testService.boardList();
model.addAttribute("list", list);
return "index";
}
}
@Service("testService")
public class TestService {
@Autowired
private TestDAO testDAO;
public List<BoardDTO> boardList() {
return testDAO.boardList();
}
}
TestDAO 는 @Mapper 로 interface 하기
@Repository
@Mapper
public interface TestDAO {
List<BoardDTO> boardList();
}
testMapper.xml 설정, namespace 에 interface 로 만든 DAO 추가
<mapper namespace="com.solbum.web.dao.TestDAO">
<select id="boardList" resultType="BoardDTO">
select * from boardview limit 0, 15
</select>
</mapper>
thymeleaf 사용해보기
기존과 동일하게 Controller 생성
@GetMapping("/index")
public String index(Model model) {
model.addAttribute("test", "컨트롤러메세지");
return "index";
}
resources > templates > html 파일 생성, thymeleaf 문법으로 텍스트 출력하기
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h2 th:text="${test}">인덱스랍니다</h2>
[[${test}]] <!-- 단순 출력의 경우 이렇게 출력할 수 있음 -->
</body>
</html>
기존 태그 사이에 있던 글은 사라지고 ${test} 에 담긴 값으로 대체되어 출력됨
타임리프 문법 설명
https://makeaplayground.tistory.com/187
반복문 해보기
list 에 문자열 담아서 model 에 add 하기
List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add("숫자 : " + i);
}
model.addAttribute("list", list);
출력해보기 -> java 의 foreach 와 비슷하게 변수명 : model 에 들어간 객체 로 사용함
<div th:each="list : ${list}">
<div th:text="${list}">숫자i 출력</div>
</div>
해당 List 의 크기와 index 값도 받을 수 있음
<div th:each="list, i : ${list}">
<span>[[${i.index}]] // [[${i.size}]] // [[${list}]]</span>
</div>
객체의 index 값과 size 크기를 받아 출력
Map 을 이용해서 게시판 글 띄워보기
Controller, Service, DAO 생성
// Controller
model.addAttribute("boardList", indexService.boardList());
// Service
@Service("indexService")
public class IndexService {
@Autowired
private IndexDAO indexDAO;
public List<Map<String, Object>> boardList() {
return indexDAO.boardList();
}
}
// DAO
@Repository
@Mapper
public interface IndexDAO {
List<Map<String, Object>> boardList();
}
Mapper
<mapper namespace="com.solbum.web.dao.IndexDAO">
<select id="boardList" resultType="HashMap">
select * from boardview
order by board_no desc
limit 0, 15
</select>
</mapper>
index.html 에 띄우기, 행이 반복되어야 해서 tr 에 반복문 달기
<table>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
</tr>
</thead>
<tbody>
<tr th:each="row : ${boardList}">
<td th:text="${row.board_no}">번호</td>
<td th:text="${row.board_title}">제목</td>
<td th:text="${row.mname}">작성자</td>
<td th:text="${row.board_date}">작성일</td>
</tr>
</tbody>
</table>
변수 선언 방법
with 로 선언된 이름은 해당 태그가 닫히기 전까지만 사용할 수 있음
<th:block th:with="name=한솔범">
<div th:text="${name}"></div>
</th:block>
<h6 th:text="${name}"></h6> --> 안찍힘
시간 출력해보기
model 에 시간 추가
model.addAttribute("time", LocalDateTime.now());
thymeleaf 를 이용하여 출력해보기
<div th:text="${time}">시간</div> // 2024-03-06T16:19:50.101482300
<div th:text="${#temporals.day(time)}">day</div> // 6
<div th:text="${#temporals.month(time)}">month</div> // 3
<div th:text="${#temporals.year(time)}">year</div> // 2024
<div th:text="${#temporals.hour(time)}">hour</div> // 16
<div th:text="${#temporals.minute(time)}">minute</div> // 19
<div th:text="${#temporals.second(time)}">second</div> // 50
문자열 연결하기
||(pipe) 를 이용하여 해당 안의 값들을 전체 문자열로 찍을 수 있음
<div th:with="id=solbum" th:text="|${id} 님 하이|"></div> // solbum 님 하이
값 비교하기
<!-- 값은 boolean 형으로 출력됨 -->
<div th:text="1 gt 2"> > </div>
<div th:text="1 lt 2"> < </div>
<div th:text="1 ge 2"> >= </div>
<div th:text="1 le 2"> <= </div>
<div th:text="1 ne 2"> != </div>
<div th:text="1 eq 2"> == </div>
<!-- 삼항 연산자 -->
<div th:text="(1 eq 1) ? '같음' : '다름'"></div> ==> 같음 출력
<div th:text="(1 eq 1) ?'': '다름'"></div> ==> 어떤 한 경우에만 출력하고 싶을 경우 이런 식으로 사용
세션 확인해보기
<div th:text="${session}">session</div> ==> org.thymeleaf.context.WebEngineContext$SessionAttributeMap@3f309d3d
// url : http://localhost/index?no=123123
<div th:text="${param.no}">locale</div> ==> 123123
a 태그 href 활용해보기
<a th:href="@{/main}">main</a> <br>
<a th:href="@{/detail(no=205)}">상세보기</a> ==> detail?no=205
<a th:href="@{/detail(no=205, page=5)}">상세보기</a> ==> detail?no=205&page=5
'Spring' 카테고리의 다른 글
240308 스프링 부트 (1) | 2024.03.08 |
---|---|
240307 스프링 부트 (0) | 2024.03.07 |
240305 스프링 프로젝트 (4) | 2024.03.05 |
240304 스프링 프로젝트 (3) | 2024.03.04 |
240229 스프링 프로젝트 (0) | 2024.02.29 |