본문 바로가기

Spring

240306 스프링 부트

오늘은 스프링부트 만들어보기

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

 

이 블로그를 보고 해결하였음, 밑의 댓글 참고

 

[에러] java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.ㅇㅇㅇ_jsp 에러 해결

[에러] java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.ㅇㅇㅇ_jsp 에러 해결 방금까지 잘되던 페이지가 사소한 수정을 했을 뿐인데, 에러가 났다. java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.ㅇ

aroundlena.tistory.com

 

\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

 

[Thymeleaf] 타임리프 문법 정리

타임리프는 스프링 부트에서 공식적으로 지원하는 View 템플릿이다 타임리프 장점 - 코드를 변경하지 않기 때문에 서버팀과 퍼블팀 간의 협업이 편해진다 - JSP와 달리 Servlet Code로 변환되지 않기

makeaplayground.tistory.com

 

반복문 해보기

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