본문 바로가기
프로젝트/파이널프로젝트-대학 행정 그룹웨어

파이널 프로젝트 만들기 (스프링 부트)

by moca7 2024. 11. 6.

 

 

 

[프로젝트를 만들어서 깃에 올리는 사람 입장]

 

 

 

(0) 깃에 워크스페이스가 아닌 프로젝트를 올린다.

- 팀원 중 한명만 프로젝트를 올리고 다른사람을 초대할 수 있다.
- 다른 팀원들은 모두 다 워크스페이스를 각자 만들어야 한다. 워크스페이스 세팅도 각자 해야 한다.

- 워크스페이스 세팅, 서버세팅은 다 각자해야 한다. 
- 프로젝트는 한명이 만든다. 프로젝트 이름은 팀명을 따서 각 팀별로 다르게 만든다. 

- 스프링 부트 프로젝트다. STS4, 스프링 부트 버전 3.2.11, 자바 17버전을 사용한다.

 

 

 

(1) C:\workspaces에 final-workspace 폴더를 만든다.

 

 

 

(2) sts4로 워크스페이스를 C:\workspaces\final-workspace로 선택하고 실행한다.

- 이러면 C:\workspaces\final-workspace에 ".metadata" 폴더가 만들어진다.

 

 

 

(3-1) 워크스페이스 세팅 - UTF-8 인코딩

- window - preferences - general - workspace에서 UTF-8로 설정

- window - preferences - Web - CSS files, HTML files, JSP Files의 인코딩을 제일 위에 있는 "ISO 10646/UNICODE(UTF-8)"로 설정. ("enco"를 검색)

- window - preferences - XML - XML Files 의 인코딩을 제일 위에 있는 "ISO 10646/UNICODE(UTF-8)"로 설정.

- window - preferences - general - editors - text editors - spelling - Encoding에서 Default (UTF-8) 체크. ("spelling" 검색)

 

 

 

(3-2) 워크스페이스 세팅 - 폰트 설정

- general - appeance - colors and fonts - basic 확장 - text font  선택하고 오른쪽에서 Edit.. 누르고 D2CODING 선택하고 확인.

 

 

 

(3-3) 워크스페이스 세팅 - tab size 설정

- window - preferences - general - editors - text editors에서 Displayed tab width를 4에서 2로 바꾼다. (tab 검색)

 

 

 

(3-4) 워크스페이스 세팅 - java code templates 설정

- window - preferences - java - code style - code templates 에서 'Code' 눌러서 method body, catch block body에서 주석 지운다.

 

 

 

(3-5) 워크스페이스 세팅 - JSP Files templates 설정

- window - preferences - Web - JSP Files - Editor - Templates - 'New JSP File (html 5)'를 선택해서 Edit..을 누른다.

- 페이지 지시어 아래에 아래 두 줄을 추가한다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<c:set var="contextPath" value="$${pageContext.request.contextPath}" />

 

 

(3-6) 워크스페이스 세팅 - xml파일 주석에 빨간줄 안뜨게 

- window - preferences - XML(Wild Web Devloper)에서 Download external resources like referenced DTD, XSD를 체크한다. 

 

 

 

(3-7) 워크스페이스 세팅 - 주석에 빨간줄 안뜨게

- window - preferences - general - editors - text editors - spelling에서 제일 위의 Enable spell checking을 체크 해제한다.

 

 

 

(3-8) 워크스페이스 세팅 - xml catalog 등록

- window - preferences - xml - xml catalog - user specified entries 등록

- config 파일용 Location에 http://mybatis.org/dtd/mybatis-3-config.dtd

- config 파일용 Key에 -//mybatis.org//DTD Config 3.0//EN

- mapper 파일용 http://mybatis.org/dtd/mybatis-3-mapper.dtd

- mapper 파일용 -//mybatis.org//DTD Mapper 3.0//EN

 

 

 

(4) 서버세팅

- 스프링 부트는 내장 서버(아파치 톰캣 10)가 있다. 그래서 서버 세팅을 할 필요가 없다.

- 포트번호는 스프링 부트 프로젝트를 만들고 나서 application.properties에서 수정한다.

 

 

 

(5) new 했을 때 뜨는 목록 설정

- window - perspective - customize perspective - shortcuts 탭에서 설정한다.

- General에서 File, Folder 체크.

- Java에서 Class, Interface, Package, Source Folder 체크.

- Maven은 체크 해제.

- Spring Boot에서 Spring Starter Project 체크.

- Web에서 JSP File 체크. CSS File은 해도 되고 안해도 된다.

- XML에서 XML File 체크.

 

 

 

(6) 새로운 Spring Starter Project 생성

- 패키지 익스플로러의 Create new Spring Starter Project를 클릭한다.

 

- name은 xxxx (프로젝트 이름)

- Type은 Maven (빌드도구 선택)

- packaging은 War (개발끝나고 배포할때 압축시킬 파일의 타입)

- Languagae는 Java 

- Java Version은 17 (17이상만 있다)

- GroupId는 com.br 

- ArtifactId는 xxxx

- Package는 com.br.xxxx

- Description은 설명이다. 수정해도 되고 그래도 둬도 된다. 그냥 둔다.

- 하단의 next. 

 

- 스프링 부트 버전은 3.2.11 버전을 선택한다.

- lombok 검색 -> Lombok 체크

- devtools 검색 -> Spring Boot DevTools 체크

- spring web 검색 -> Spring Web 체크

- 하단의 finish.

 

 

 

 

(7) 생성된 프로젝트 구조 확인

 

 

 

 

- 위와 같이 만들어진다.

- src/main/java : java파일 (소스코드 작업)

- src/main/resources : 로그 설정문서, 마이바티스 관련 문서

- src/main/resources/static : 정적 자원 (이미지, js, css파일들)

- src/main/webapp/WEB-INF/views : jsp파일 (화면 작업)

 

 

 

 

 

- 위는 수업때 한 boot 프로젝트의 최종 구조(참고용).

 

 

 

 

 

(8) pom.xml 수정

 

 
<?xml version="1.0" encoding="UTF-8"?>
 
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.11</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
 
  <groupId>com.br</groupId>
  <artifactId>gdcampus</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>gdcampus</name>
  <description>Demo project for Spring Boot</description>
 
  <url/>
  <licenses>
    <license/>
  </licenses>
  <developers>
    <developer/>
  </developers>
  <scm>
    <connection/>
    <developerConnection/>
    <tag/>
    <url/>
  </scm>
 
  <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-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </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>
   
    <!-- jsp 사용을 위한 jasper 라이브러리 -->
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
   
    <!-- jstl 사용을 위한 라이브러리들 -->
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
    </dependency>

    <dependency>
        <groupId>jakarta.servlet.jsp.jstl</groupId>
        <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
    </dependency>
   
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jakarta.servlet.jsp.jstl</artifactId>
    </dependency>
   
   
    <!-- BCryptPasswordEncoder 사용을 위한 라이브러리 -->
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-core</artifactId>
    </dependency>
   
    <!-- MyBatis, Oracle 관련 라이브러리-->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>3.0.3</version>
    </dependency>
    <dependency>
      <groupId>com.oracle.database.jdbc</groupId>
      <artifactId>ojdbc11</artifactId>
      <scope>runtime</scope>
    </dependency>
   
    <!-- log4jdbc 라이브러리 -->
    <dependency>
      <groupId>org.bgee.log4jdbc-log4j2</groupId>
      <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
      <version>1.16</version>
    </dependency>
   
   
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter-test</artifactId>
      <version>3.0.3</version>
      <scope>test</scope>
    </dependency>
   
    <!-- 웹소켓 관련 starter 라이브러리 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
   
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <excludes>
            <exclude>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
            </exclude>
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>
 

 

- 기존 프로젝트의 pom.xml을 작업탐색기에서 복사해서 붙여넣기 했다. 이 프로젝트의 pom.xml은 지웠다.

- pom.xml을 다른데서 가져온다면 groupId, artifactId, name을 수정해야 한다.

 

 

 

 

(9) application.properties 수정

 

 
spring.application.name=gdcampus

# contextPath 등록
# server.servlet.context-path=/gdcampus


# 사용할 포트번호 수정
server.port=9999

# 응답뷰 관련한 prefix, suffix : servlet-context.xml의 ViewResolver 빈 등록 설정 대체
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp


# 연결 db 정보 관련 구문 등록
# spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
# spring.datasource.url=jdbc:log4jdbc:oracle:thin:@localhost:1521:xe
# spring.datasource.username=GDCAMPUS
# spring.datasource.password=GDCAMPUS

spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:oracle:thin:@13.125.128.181:1521:xe
spring.datasource.username=GDCAMPUS
spring.datasource.password=GDCAMPUS
spring.datasource.hikari.maximum-pool-size=1



# 마이바티스 관련 구문 등록 (기존의 mybatis-config.xml 파일 내용)
mybatis.mapper-locations=mybatis/mappers/*.xml
mybatis.type-aliases-package=com.br.boot.dto
mybatis.configuration.jdbc-type-for-null=NULL


# 파일업로드를 위한 구문 등록
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
 

 

 

- 기존 프로젝트의 application.properties 파일 자체를 복사해서 가져오지 않고,

현재 프로젝트의 application.properties 파일에 구문만 추가한다. 

(파일을 가져오면 utf-8로 저장이 안돼서 주석이 깨져보인다)

- 맨 위의 spring.application.name=gdcampus 아래에 기존 프로젝트에서 썼던 구문들을 복붙했다.

 

- [사용할 포트번호 수정]으로 9999를 했다. 8080은 오라클이 쓰고, 8888은 수업 때 만든 부트 프로젝트가 쓰고 있었다.

 

- [연결 db 정보 관련 구문 등록]에서 위 4줄은 내 pc의 로컬 db에 연결할 때 구문이다.

아래 4줄은 학원 db 서버(13.125.128.181)에 접속할 때의 구문이다.

 

- [연결 db 정보 관련 구문 등록]에서 spring.datasource.hikari.maximum-pool-size=1를 추가해야 한다.

커넥션풀에 제한을 주지 않으면 db서버가 뻗어버린다.

 

- [마이바티스 관련 구문 등록]에서 mybatis.type-aliases-package=com.br.boot.dto로 되어있는 걸 

=com.br.gdcampus로 수정한다.

 

- Save Problems 오류 창이 뜬다면 Save as UTF-8을 누르면 된다.

 

 

 

 

(10) 서버 start

- 서버를 start하고 오류가 없는지 확인한다. 오류가 없어야 한다. 

- 오류가 발생한다면 Project - Clean, Maven - Update Project를 하면 정상 구동된다.

 

 

 

 

===========================================================

 

 

 

 

(11) src/main/webapp/WEB-INF/views 폴더 생성

- WEB-INF 폴더와 그 하위 폴더인 views 폴더를 따로 만들어줘야 한다.

 

 

 

(11-2) migration이라면 기존 spring legacy project에서 views와 resources 가져온다.

- spring legacy project에서 src/main/webapp/WEB-INF/views 폴더 안의 폴더들과 main.jsp를 복사한다.

STS4 패키지 익스플로러의 src/main/webapp/WEB-INF/views에 붙여넣기 한다.

- spring legacy project에서 src/main/webapp/resources 폴더 안의 images와 js 폴더를 복사한다.

STS4 패키지 익스플로러의 src/main/resources/static에 붙여넣기 한다.

 

 

 

(12) src/main/webapp/WEB-INF/views에 main.jsp 생성

 

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<c:set var="contextPath" value="${pageContext.request.contextPath}" />

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>


  <!-- Header, Nav start -->
  <jsp:include page="/WEB-INF/views/common/header.jsp" />
  <!-- Header, Nav end -->
 
 

  <!-- Section start -->
  <section class="row m-3" style="min-height: 500px">

    <div class="container border p-5 m-4 rounded">
      <h2 class="m-4">파이널 프로젝트</h2>
     
   
      <p>잘 뜨는지 확인용</p>
    </div>

  </section>
  <!-- Section end -->



  <!-- Footer start -->
  <jsp:include page="/WEB-INF/views/common/footer.jsp" />
  <!-- Footer end -->


</body>
</html>
 

 

 

 

(13) src/main/webapp/WEB-INF/views에 common 폴더 생성

 

 

 

(14) src/main/webapp/WEB-INF/views/common에 header.jsp 생성

 

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
   

<!-- Bootstrap 사용을 위한 CDN -->
<!-- ------------------------- -->

<style>
  header{height: 50px}
  header a{color:black;}
  header .profile-img{width:30px;}
   
      .page-link {
          color: #6c757d;
          background-color: #fff;
          border: 1px solid #ccc;
      }
      .page-item.active .page-link {
          z-index: 1;
          color: #555;
          font-weight:bold;
          background-color: #f1f1f1;
          border-color: #ccc;
      }
      .page-link:focus, .page-link:hover {
          color: #000;
          background-color: #fafafa;
          border-color: #ccc;
      }
</style>

<script>
  if('${alertMsg}' != ''){
    alert('${alertMsg}');
    if('${historyBackYN}' == 'Y'){
      history.back();
    }
  }
</script>



<header class="row m-3">
  <div class="col-3 d-flex justify-content-center align-items-center">
      <!-- <a href="${contextPath}"><img src="${ contextPath }/resources/images/goodee_logo.png" width="100px"></a> -->
      <a href="${contextPath == '' ? '/' : contextPath}"><img src="${ contextPath }/resources/images/goodee_logo.png" width="100px"></a>
      <!-- <a href="${contextPath == '' ? '/' : contextPath}"><img src="${contextPath}/images/goodee_logo.png" width="100px"></a> -->
  </div>
  <div class="col-5"></div>
  <div class="col-4 d-flex justify-content-center align-items-center">
 
   
    <c:choose>
      <c:when test="${ empty loginUser }">
        <!-- case1. 로그인전 -->
        <a href="${contextPath}/member/signup.do">회원가입</a> &nbsp;|&nbsp;
        <a href="#" data-toggle="modal" data-target="#loginModal">로그인</a>
      </c:when>
     
      <c:otherwise>
        <!-- case2. 로그인후 -->
        <div>
        <img class="profile-img" src="${ contextPath }<c:out value='${loginUser.profileURL}' default='/resources/images/defaultProfile.png' />">&nbsp;
        <a href="${contextPath}/member/myinfo.do">${loginUser.userName}님</a> &nbsp;|&nbsp;
        <a href="${contextPath}/member/signout.do">로그아웃</a>
        </div>
      </c:otherwise>
    </c:choose>  
 
  </div>
</header>
<nav class="navbar m-3 navbar-expand-sm bg-dark navbar-dark d-flex justify-content-center">
<ul class="navbar-nav">
    <li class="nav-item">
    <!-- <a class="nav-link" href="${contextPath}">Home</a> -->
    <a class="nav-link" href="${contextPath == '' ? '/' : contextPath}">Home</a>
   
    </li>
    <li class="nav-item">
    <a class="nav-link" href="${contextPath}/notice/list.do">공지사항</a>
    </li>
    <li class="nav-item">
    <a class="nav-link" href="${contextPath}/board/list.do">일반게시판</a>
    </li>
    <li class="nav-item">
    <a class="nav-link" href="#">사진게시판</a>
    </li>
</ul>
</nav>

<!-- 로그인 클릭 시 뜨는 모달 (기존에는 안보이다가 위의 a 클릭시 보임) -->
<div class="modal fade" id="loginModal">
    <div class="modal-dialog modal-sm">
        <div class="modal-content">
        <!-- Modal Header -->
        <div class="modal-header">
            <h4 class="modal-title">Login</h4>
            <button type="button" class="close" data-dismiss="modal">&times;</button>
        </div>

        <form action="${contextPath}/member/signin.do" method="post">
            <!-- Modal Body -->
            <div class="modal-body">
                <label for="userId" class="mr-sm-2">ID :</label>
                <input type="text" class="form-control mb-2 mr-sm-2" placeholder="Enter ID" id="userId" name="userId" required> <br>
                <label for="userPwd" class="mr-sm-2">Password:</label>
                <input type="password" class="form-control mb-2 mr-sm-2" placeholder="Enter password" id="userPwd" name="userPwd" required>
            </div>
           
            <!-- Modal footer -->
            <div class="modal-footer">
                <button type="submit" class="btn btn-primary">로그인</button>
                <button type="button" class="btn btn-danger" data-dismiss="modal">취소</button>
            </div>
        </form>
        </div>
    </div>
</div>
 

 

 

- <a href="${contextPath}"><img src="${ contextPath }/resources/images/goodee_logo.png" width="100px"></a> 

기존의 스프링 레거시 프로젝트에서는 이렇게 작성되어 있었다.

 

- <a href="${contextPath == '' ? '/' : contextPath}"><img src="${ contextPath }/resources/images/goodee_logo.png" width="100px"></a>

이렇게 contextPath를 수정했다. 이러면 로고 이미지 클릭시 메인페이지로 이동된다. 

(스프링 부트에서는 기본적으로 context path가 빈문자열이다)

 

- <a href="${contextPath == '' ? '/' : contextPath}"><img src="${contextPath}/images/goodee_logo.png" width="100px"> </a>

이렇게 img의 src 경로를 수정(정적자원 디렉토리 경로 재설정)하면

스프링 부트 프로젝트의 src/main/resources/static/images 폴더 안의 goodee_logo.png 이미지가 보여진다.

 

 

 

 

 

(15) src/main/webapp/WEB-INF/views/common에 footer.jsp 생성

 

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<c:set var="contextPath" value="${pageContext.request.contextPath}" />

   
<style>
    footer{
        height: 200px;
        border-top: 1px solid lightgray;
    }
    footer a{color:black}
    .footer-info{
        list-style: "-  ";
        padding-left:30px;
    }
    .footer-copyright{text-align:center}
</style>


<footer class="m-3">
  <ul class="nav footer-link">
      <li class="nav-item">
      <a class="nav-link" href="#">이용약관</a>
      </li>
      <li class="nav-item">
      <a class="nav-link" href="#">개인정보취급방침</a>
      </li>
      <li class="nav-item">
      <a class="nav-link" href="#">인재채용</a>
      </li>
      <li class="nav-item">
      <a class="nav-link" href="#">고객센터</a>
      </li>
  </ul>
 
  <ul class="footer-info">
      <li>상호명 : GooDee Academy</li>
      <li>대표자 : 이승엽</li>
      <li>전화 : 02-818-7950</li>
      <li>개인정보책임자 : 주승재 / jsj@goodee.co.kr</li>
      <li>본관 : (08505) 서울특별시 금천구 가산디지털2로 95</li>
  </ul>
 
  <div class="footer-copyright">
      Copyright ⓒ GooDee Academy. All rights reserved.
  </div>
</footer>
 

 

 

 

(16) src/main/webapp/WEB-INF/views/common에 error.jsp 생성

 

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    <div class="container p-3">

        <!-- Header, Nav start -->
        <jsp:include page="/WEB-INF/views/common/header.jsp" />
        <!-- Header, Nav end -->
   
        <!-- Section start -->
        <section class="row m-3" style="min-height: 500px">
   
          <div class="container border p-5 m-4 rounded">
            <div align="center">  
                <br><br>
                <h1 style="font-weight:bold">에러메세지</h1>
            </div>
          </div>
   
        </section>
        <!-- Section end -->
   
        <!-- Footer start -->
        <jsp:include page="/WEB-INF/views/common/footer.jsp" />
        <!-- Footer end -->
   
    </div>


</body>
</html>
 

 

 

 

(17) src/main/java에 com.br.gdcampus.controller 패키지 생성

 

 

 

(18) com.br.gdcampus.controller에 MvcController 생성

 

 
package com.br.gdcampus.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MvcController {

 
  @GetMapping("/")
  public String mainPage() {
    return "main";
  }
 
}

 

 

 

 

(19) 서버 start

 

 

 

 

- localhost:9999를 입력해서 메인페이지가 잘 뜨는지 확인한다.

- application.properties에 뷰 리졸버의 prefix와 suffix를 설정했기 때문에 MvcController에서 main을 리턴하면 /WEB-INF/views/main.jsp가 떠야 한다. 

 

- 왼쪽 위 로고 이미지는 깨져보인다.  

정적 자원들을 src/main/resources/static 폴더에 가져다 놨는데도 못찾고 있다.

 

 

 

 

 

 

 

- static 폴더에 가져다 놨는데도 이미지를 못 찾고 있는 이유는 스프링에서 가져온 header.jsp는 이미지 경로를 resources라는 경로로부터 찾고 있다.

- spring legacy project할 때는 src/main/webapp 폴더 안에 resources 폴더가 있었다. (resources 안에 images 폴더)

스프링 부트 프로젝트는 소스폴더인 src/main/resources안에 static 폴더가 있다. (static 안에 image 폴더)

 

- migration을 할 때 정적자원 경로를 재설정 해야 한다. (정적 자원 디렉토리 등록)

근데 일일이 찾아가서 바꾸기 번거로우니 한번에 어떤 요청이 왔을때 어떠한 곳으로 보내게 한다.

 

 

 

 

(20) com.br.spring.config 패키지 생성

- 설정에 필요한 클래스가 있을 수 있다. 그걸 config 패키지에 둘 예정이다.

 

 

 

(21) com.br.spring.config에 WebMvcConfig (일반) 클래스 생성

 

 
package com.br.gdcampus.config;

import org.springframework.context.annotation.Configuration;
// import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// import com.br.gdcampus.interceptor.LoginCheckInterceptor;

// import lombok.RequiredArgsConstructor;

// @RequiredArgsConstructor
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
 
 
  // private final LoginCheckInterceptor loginCheckInterceptor;
 

 
  // 리소스 핸들링 등록을 할 수 있는 메소드 (servlet-context.xml의 <resources> 태그 설정 대신)
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
   
    // <resources mapping="/resources/**" location="classpath:/static/" />
    registry.addResourceHandler("/resources/**")
        .addResourceLocations("classpath:/static/");
   
    // <resources mapping="/upload/**" location="file:///upload/" />  
    registry.addResourceHandler("/upload/**")
        .addResourceLocations("file:///upload/");
  }
 
 
  /*
  public void addInterceptors(InterceptorRegistry registry) {
   
   
      //  <interceptor>
        //  <mapping path="/member/myinfo.do" />
        //  <mapping path="/board/regist.do" />
        //  <beans:bean class="com.br.spring.interceptor.LoginCheckInterceptor" id="LoginCheckInterceptor"/>
      //  </interceptor>
       *
   
    registry.addInterceptor(loginCheckInterceptor)
        .addPathPatterns("/member/myinfo.do")
        .addPathPatterns("/board/regist.do");
   
    // 다른 인터셉터도 등록하고 싶다면 위의 3줄을 또 쓰면 됨.

  }
  */
 

}
 

 

 

- 일단 리소스 핸들링 하는 메소드만 작성한다.

- 인터셉터는 나중에 할 때 추가한다.

 

- upload 관련은 https://moca7.tistory.com/335 마지막 부분 참조. 

 

 

 

 

(22) 서버 start

- localhost:9999를 요청하면 메인 페이지가 뜬다. 로고 이미지도 잘 뜬다.

 

 

 

 

====================================================================

 

 

(23) 패키지 생성 & 쓰레기 파일 추가

- com.br.gdcampus.config (위에서 만듦)

- com.br.gdcampus.controller (위에서 만듦)

- com.br.gdcampus.dao

- com.br.gdcampus.dto

- com.br.gdcampus.handler

- com.br.gdcampus.interceptor

- com.br.gdcampus.scheduler

- com.br.gdcampus.service

- com.br.gdcampus.util

 

- 깃은 폴더가 아닌 파일 단위로 관리되기 때문에 폴더만 만들어 놓고 파일이 없으면 깃에 올라가지 않는다.

각 패키지에 쓰레기 파일을 추가한다.

 

 

 

(24) src/main/webapp/WEB-INF/views에 board, member 등의 폴더를 추가한다. 

- 화면구현 페이지들을 보관하는 폴더다. 각각 쓰레기 파일도 추가한다.

 

 

 

(25) gitignore 추가

- 스프링 부트 프로젝트를 깃으로 올릴때는 application.properties 파일도 올려야 된다.

- 스프링 때의 gitignore 문서에서 *.properties는 없애거나 주석처리(앞에 # 붙이면 주석처리)한다.

- 깃에 워크스페이스가 아닌 프로젝트 폴더를 올릴 것이기 때문에

수업 때와 달리 워크스페이스 폴더가 아닌 프로젝트 폴더에 gitignore를 둬야 한다. 

- 그런데 이미 프로젝트 폴더에 gitignore가 있다.

STS4에서 기본 설정으로 Spring Boot 프로젝트를 생성하면 프로젝트 폴더 안에 .gitignore 파일이 자동으로 생성된다.

이미 있는 .gitignore 파일을 수정한다.

 

 

 

(26) git에 올리기

 

- 깃에 워크스페이스(C:\workspaces\final-workspace)가 아니라

프로젝트(C:\workspaces\final-workspace\gdcampus) 만 올린다.

 

 

- 깃허브 데스크탑을 연다.
file - new repository - local path를 choose 눌러서 c:\worksapces\final-workspace를 선택하면 
로컬 패스가 c:\worksapces\final-workspace가 보여진다.

(올리고자 하는 폴더의 한 단계 상위폴더를 선택한다.)

 

그리고 Name에 semiProject, vita, gdcampus 등의 올리고자하는 폴더 이름(프로젝트명)을 적는다.


- readMe 파일을 체크한다.

create repository 한다. 이런다고 끝이 아니고 publish repository까지 해야 끝난다.
(이때 private으로 체크해도 초대하면 다른사람들이 내가 올린 repository에 접근할 수 있다)




(27) 팀원 초대보내는 법
- 깃허브 홈페이지에서 your repository - 초대를 보내고자 하는 repository에 들어가서

깃허브 상단 메뉴 중 settings - access의 collaborator - add people - 닉네임을 입력해서 선택하면 메일이 발송된다.
- 초대를 받은 사람은 private이어도 repostiory에 접근이 가능하다. 

 

 

 

 


====================================================================

 

 

 


* migration 작업 - BCryptPasswordEncoder 빈 등록
 
  1. 라이브러리 등록 : pom.xml
 <dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-core</artifactId>
 </dependency>
 
2. BCryptPasswordEncoder 빈 등록 
   1) Spring Security 설정 관련 클래스 만들기 : com.br.boot.config.SecurityConfig
   2) 해당 클래스에 @Configuration 작성
   3) @Bean 으로 BCryptPasswordEncoder 빈 등록


---------------------------------------------------------------

* migration 작업 - MyBatis, logback, log4jdbc

  1. OrcleDriver, MyBatis starter 라이브러리 등록
     1) 프로젝트 우클릭 > Spring > Add Starters 선택후 dependency 선택
        ㄴ Oracle Driver (SQL 안)
        ㄴ MyBatis Framework (SQL 안)
        
  2. mybatis 기존 mapper 파일 가져다 두기 : src/main/resources/mybatis/mappers/
  
  3. db 연결 정보 등록 : application.properties
     spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
 spring.datasource.url=jdbc:log4jdbc:oracle:thin:@localhost:1521:xe
 spring.datasource.username=spring
 spring.datasource.password=spring
 
4. mybatis 관련 구문 등록 : application.properties
   mybatis.mapper-locations=mybatis/mappers/*.xml
 mybatis.type-aliases-package=com.br.boot.dto
 mybatis.configuration.jdbc-type-for-null=NULL
 
5. log4jdbc 라이브러리 추가 : pom.xml
   <dependency>
  <groupId>org.bgee.log4jdbc-log4j2</groupId>
  <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
  <version>1.16</version>
 </dependency>
 
6. logback, log4jdbc 기존 파일 복사해오기 : src/main/resources/
   logback.xml 파일 패키지 수정 
     
---------------------------------------------------------------

* migration 작업 - 파일업로드 (별도의 라이브러리 등록 필요 없음)

  1. MultipartResolver 관련 등록 구문 :  application.properties
     spring.servlet.multipart.max-file-size=10MB
 spring.servlet.multipart.max-request-size=100MB
 
2. FileUtil 클래스에 fileupload 메소드 안에 업로드 폴더 경로 수정 

   File filePathDir = new File("C:" + filePath);

---------------------------------------------------------------

* migration 작업 - Interceptor

  1. 기존 프로젝트의 interceptor 클래스 복사
  
  2. 해당 interceptor 클래스 빈으로 등록 (@Component)
  
  3. 인터셉터 등록 : WebMvcConfig
     1) Interceptor 객체 DI
     2) addInterceptors 메소드 오버라이딩 후 아래 내용 작성 
        registry.addInterceptor(실행시킬Interceptor객체)
.addPathPatterns("url mapping값")
.addPathPatterns("url mapping값");

4. contextPath 이슈
   - Interceptor 클래스에 contextPath로 리다렉트 구문 작성시 
     contextPath가 빈 문자열일 경우 이슈 발생 (제대로 redirect 되지 않음)
     => response.sendRedirect(request.getContextPath().equals("") ? "/"
   : request.getContextPath());  로 수정
        
---------------------------------------------------------------

* migration 작업 - Scheduler

  1. 기존 프로젝트에서 Scheduler 클래스 복사
  
  2. 해당 클래스 빈으로 등록 (@Component)
  
  3. 스케줄링 활성화 : com.br.boot.BootApplication
     @EnableScheduling 추가 
     
---------------------------------------------------------------

* migration 작업 - WebSocket

  1. 라이브러리 등록 
     1) 프로젝트 우클릭 > Spring > Add Starters 
     2) WebSocket (Messaging 안) dependency 추가 
     
  2. 기존 프로젝트 EchoHandler 클래스 복사
  
  3. 해당 클래스 빈 등록 (@Component)
  
  4. websocket 핸들러 등록 
     1) websocket 설정을 위한 클래스 만들기 : com.br.boot.config.WebSocketConfig
     2) WebSocketConfigurer 구현 클래스로 만들기 : implements WebSocketConfigurer
     3) EchoHandler 객체 DI
     4) HttpSessionHandshakeInterceptor 빈으로 등록 
     5) registerWebSocketHandlers 오버라이딩 한 후 하단 구문 작성 
        registry.addHandler(구동시킬EchoHandler객체, "웹소켓연결을위한url")
.addInterceptors(httpSessionHandshakeInterceptor())
.withSockJS();

 

 

 

- market place에서 web 검색해서 설치, 롬복 라이브러리 추가하고 실제 파일 있는데 가서 실행시켜서 sts나 이클립스에 설치하는건 1번만 하면 된다.