File업로드 기능 구현 중 jar파일을 lib에 넣었는데도 불구하고 파일 업로드 불가 문제 발생
정확히는 파일 업로드 기능은 되나 import 오류
Project Structure => Project Settings => Modules에 jar 파일 넣어주니 import 오류 메시지 없어짐
File업로드 기능 구현 중 jar파일을 lib에 넣었는데도 불구하고 파일 업로드 불가 문제 발생
정확히는 파일 업로드 기능은 되나 import 오류
Project Structure => Project Settings => Modules에 jar 파일 넣어주니 import 오류 메시지 없어짐
1. ubuntu로 진행
2. 키 페어 생성 후 로컬에 저장
3. GitBash로 대여중인 서버 원격 접속
ssh -i 키패어 경로(드래그 가능) ubuntu@퍼블릿 IPv4주소
ssh -i /c/Users/cojun/Desktop/AWS_Cloud/cojun2024_mykey.pem ubuntu@퍼블릿 IPv4주소
4. 원격 접속 완료
5. JDK 설치
// 우분투 패키지 목록 최신화
$ sudo apt-get update
// 우분투 시스템에 모든 패키지 최신화
$ sudo apt-get upgrade
// 11버전 설치
$ sudo apt-get install openjdk-11-jdk
6. Java 환경 변수 설정
# Java 설치 경로 찾기
update-alternatives --config java
# 환경 변수 설정 ( 편집 )
nano ~/.profile
# Java 환경 변수 설정
# Java 환경 변수 설정 밑에 내용 추가
export JAVA_HOME=<자바_설치_경로>
export PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
# 변경 사항 적용
source ~/.profile
# 설정 적용됫는지 확인
echo $JAVA_HOME
java -version
7. Tomcat 설치 ( SpringBoot 프로젝트라 해당 설정 필요 없었음 )
AWS EC2 서버에 포트 추가
Tomcat 다운 / 설치
// Tomcat 서버 패키지 확인
sudo apt-cache search tomcat
// Tomcat 패키지, 관리 패키지 다운로드
sudo apt install tomcat9 tomcat9-admin
// ss 명령어를 사용하여 톰캣 8080 기본 포트가 제대로 Listen 하고 있는지 확인
ss -ltn
// OS가 재부팅되면 Apache Tomcat 서버가 자동으로 시작되게 설정
sudo systemctl enable tomcat9.service
//비활성화
sudo systemctl disable tomcat9.service
// 포트 OS 방화벽 허용 설정
sudo ufw allow from any to any port 8080 proto tcp
Tomcat 서버 테스트
8. IntelliJ IDEA에서 JAR 파일을 생성
// gradle 추가
bootJar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
9. FileZilla 사용 배포 파일 업로드
10. java -jar omzteam-0.0.1-SNAPSHOT.jar ( jar 파일 실행 )
11. nohup 설정 ( 원격접속 끊어져도 서버 계속 돌아가게 하기 )
nohup java -jar JAR파일명.jar &
nohup java -jar omzteam-0.0.1-SNAPSHOT.jar &
12. 서버 강제종료
# 프로세스 종료
ps -ef | grep 'omzteam-0.0.1-SNAPSHOT.jar' | awk '{print $2}' | xargs kill
13. 결과 ( AWS 인바운드 규칙 9191 port 추가 )
GitHub_Team (1) | 2023.11.25 |
---|---|
Vue.js 실전_ 연습 순서 (0) | 2023.11.08 |
스프링 시큐리티_구글 소셜로그인_DB연결 (0) | 2023.11.01 |
Vue.js basic (0) | 2023.11.01 |
local=> Git (0) | 2023.11.01 |
https://www.data.go.kr/data/15070405/fileData.do
통계청_나라통계_우편번호_20211110
우편번호, 우편번호순서, 도이름, 시군구이름, 읍면동이름, 리건물이름, 동호, 최초등록일, 최초등록자, 최종수정일, 최종수정자, 등록일, 수정일시, 전체주소
www.data.go.kr
공공데이터 포탈에서 CSV파일 다운로드 가능
다운로드한 csv 파일 시트의 컬럼명을 테이블의 컬럼명과 동일하게 설정
1. 데이터를 삽입할 테이블이 속해있는 스키마(DB)의 오른쪽을 클릭한 후 Table Data Import Wizard를 클릭
2. Import할 CSV파일을 선택
3. 이미 만들어둔 테이블에 데이터를 삽입하기 위해선 'Use existing table'을 선택
만약 새로운 테이블을 만들고 거기에 데이터를 삽입하고자 한다면 'Create new table'을 선택
'Truncate table before Import'에는 체크를 해제
4. 맨 위에서 다운로드한 csv 파일 컬럼명을 테이블 컬럼명과 동일하게 맞춰서 따로 설정 필요 없음
5. Table Data Import
상세보기 + 조회수 (0) | 2024.01.06 |
---|---|
검색 기능 + 페이징 처리 (1) | 2024.01.06 |
행 번호 관련 (0) | 2024.01.06 |
오라클, MySQL 페이징 쿼리문 + iBATIS (0) | 2024.01.05 |
log4j2.xml (2) | 2024.01.04 |
// 상세화면
public BoardVO selectNBoardDetail(int unq) throws Exception;
// 조회수 증가
public int updateNBoardHits(int unq) throws Exception;
<select id="boardDAO.selectNBoardDetail" resultClass="boardVO">
select unq, title, name, content, DATE_FORMAT(rdate, '%Y-%m-%d')as rdate
from nboard
where unq = #unq#
</select>
<update id="boardDAO.updateNBoardHits">
update nboard
set hits = hits + 1
where unq = #unq#
</update>
@RequestMapping("/boardDetail.do")
public String selectNBoardDetail(BoardVO vo, ModelMap model) throws Exception {
// 조회수
boardService.updateNBoardHits(vo.getUnq());
// 상세보기
BoardVO boardVO = boardService.selectNBoardDetail(vo.getUnq());
String content = boardVO.getContent(); // \n
boardVO.setContent(content.replace("\n", "<br>" ));
model.addAttribute("boardVO", boardVO);
return "board/boardDetail";
}
<td align="left" width="40%">
<a href="boardDetail.do?unq=${result.unq }">
<c:out value="${result.title }" />
</a>
</td>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<% pageContext.setAttribute("newline", "\n"); %>
<c:set var="content" value="${fn:replace(boardVO.content, newline, '<br>') }" />
<!-- 개행 문자(\n)를 HTML에서 사용 가능한 줄바꿈(<br>)으로 변경 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="/eGovFrame_Web_project/script/jquery-1.12.4.js"></script>
<script src="/eGovFrame_Web_project/script/jquery-ui.js"></script>
</head>
<style>
body {
font-size: 9pt;
}
button {
font-size: 9pt;
}
table {
width: 600px;
border-collapse: collapse;
}
th,td {
border: 1px solid #cccccc;
padding: 3px;
}
.input1 {
width: 98%;
}
.textarea {
width: 98%;
height: 100px;
}
</style>
<script>
$(function(){
$("#title").val("제목입력");
})
//jquery 방식
function fn_submit() {
// 앞뒤 공백 제거 $.trim ( 자바스크립트는 없고 jquery만 지원 )
if( $.trim($("#title").val()) == ""){
alert("제목을 입력해주세요!");
$("#title").focus();//input 입력칸으로 이동
return false;
}
$("#title").val($.trim($("#title").val()) );
if( $.trim($("#pass").val()) == ""){
alert("암호를 입력해주세요!");
$("#pass").focus();
return false;
}
$("#pass").val($.trim($("#pass").val()) );
// ajax(비동기전송방식의 기능을 가지고 있는 jquery의 함수)
var formData = $("#frm").serialize();
$.ajax({
type:"POST",
data:formData,
url:"boardWriteSave.do",
dataType:"text", // 리턴 타입
success:function(data){ // controller에서 => "ok"값을 던져줬으면 성공
if(data == "ok"){
alert("저장완료");
location="boardList.do"
}else{
alert("저장실패");
}
},
error:function() { // 장애발생
alert("오류발생")
}
});
// 자바스크립트
/* if(document.frm.title.value == ""){
alert("제목을 입력해주세요!");
document.frm.title.focus();
return false;
}
if(document.frm.pass.value == ""){
alert("암호를 입력해주세요!");
document.frm.pass.focus();
return false;
} */
//document.frm.submit(); // 동기전송방식
}
</script>
<body>
<form id="frm"> <!-- method="post" action="boardWriteSave.do" 비동기 방식에는 필요없음 -->
<table>
<caption>게시판 상세</caption>
<tr>
<th width="20%">제목</th>
<td width="80%">${boardVO.title }</td>
</tr>
<tr>
<th>글쓴이</th>
<td>${boardVO.name }</td>
</tr>
<tr>
<th>내용</th>
<td height="50">
<!-- 개행 자바 코드 사용 -->
${boardVO.content }
<!-- 개행 JSTL -->
<%-- ${content } --%>
</td>
</tr>
<tr>
<th>등록일</th>
<td>${boardVO.rdate }</td>
</tr>
<tr>
<th colspan="2">
<button type="submit" onclick="fn_submit() ;return false;">저장</button>
<button type="reset">취소</button>
</th>
</tr>
</table>
</form>
</body>
</html>
개행문자( \n ) 를 HTML에서 사용 가능한 줄바꿈 <br>으로 변경 처리
JAVA 컨트롤러에서 처리 replace 사용
boardVO.setContent(content.replace("\n", "<br>" ));
${boardVO.content }
JSTL 처리 방법
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<% pageContext.setAttribute("newline", "\n"); %>
<c:set var="content" value="${fn:replace(boardVO.content, newline, '<br>') }" />
<!-- 개행 JSTL -->
<%-- ${content } --%>
CSV파일_MySQL_우편번호 (1) | 2024.01.15 |
---|---|
검색 기능 + 페이징 처리 (1) | 2024.01.06 |
행 번호 관련 (0) | 2024.01.06 |
오라클, MySQL 페이징 쿼리문 + iBATIS (0) | 2024.01.05 |
log4j2.xml (2) | 2024.01.04 |
private String searchGubun;
private String searchText;
public String getSearchGubun() {
return searchGubun;
}
public void setSearchGubun(String searchGubun) {
this.searchGubun = searchGubun;
}
public String getSearchText() {
return searchText;
}
public void setSearchText(String searchText) {
this.searchText = searchText;
}
isNotNull로 검색이 안됫을 때도 페이지가 출력되게 해야 됨
<select id="boardDAO.selectNBoardList" resultClass="egovMap">
select b.* from (
select row_number() over (order by unq desc) as rn, a.* from (
select unq ,title, name, hits, DATE_FORMAT(rdate, '%Y-%m-%d')as rdate
from nboard
<isNotNull property="searchGubun">
<isNotNull property="searchText">
where $searchGubun$ like '%$searchText$%'
</isNotNull>
</isNotNull>
order by unq desc ) as a ) as b
<![CDATA[
where rn >= #startIndex# and rn <= #endIndex#
]]>
</select>
총 게시물 갯수도 검색이 됫을 때 검색 된 내용으로 나와야 되기 때문에 위에 내용 그대로 복사 붙혀 넣기
<select id="boardDAO.selectNBoardTotal" resultClass="java.lang.Integer">
select count(*) total from nboard
<isNotNull property="searchGubun">
<isNotNull property="searchText">
where $searchGubun$ like '%$searchText$%'
</isNotNull>
</isNotNull>
</select>
사용자가 입력한 옵션을 기억하고, 페이지가 다시 로드될 때 그옵션이 선택된 상태로 유지되게 하려고
${param.searchGubun == 'title' ? 'selected' : ''}
"${param.searchText}"
사용
<div class="div2">
<form name="searchFrm" method="post" action="boardList.do">
<select name="searchGubun" id="searchGubun">
<option value="title" ${param.searchGubun == 'title' ? 'selected' : ''}>제목</option>
<option value="name" ${param.searchGubun == 'name' ? 'selected' : ''}>글쓴이</option>
<option value="content" ${param.searchGubun == 'content' ? 'selected' : ''}>내용</option>
</select>
<input type="text" name="searchText" id="searchText" value="${param.searchText}"/>
<button type="submit">검색</button>
</form>
</div>
검색 조건이 있는 경우와 없는 경우를 <c:choose>, <c:when>, <c:otherwise>를 사용하여 처리
검색 조건이 있을 때 : 검색 조건을 포함하는 페이지 링크 생성 방법 ( 검색 조건 유지 )
검색 조건이 없을 때 : 기본 페이지 링크 생성 방법
사용자가 선택한 검색 범주(예: 제목, 내용 등)를 URL 매개변수로 추가
${param.searchGubun}은 사용자가 이전에 선택한 검색 범주를 가지고 있음
사용자가 입력한 검색어를 URL 매개변수로 추가
${fn:escapeXml(param.searchText)}는 사용자가 입력한 검색어를 가져옴
fn:escapeXml 함수를 사용해 이 입력값에서 XML/HTML 태그를 이스케이프하여 보안을 강화
즉, 스크립팅 공격으로부터 보호
사용하려면 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 태그를 추가 해야됨
<div style="width:600px; margin-top:5px; text-align:center;">
<c:forEach var="i" begin="1" end="${totalPage}">
<c:choose>
<c:when test="${not empty param.searchGubun and not empty param.searchText}">
<!-- 검색 조건이 있는 경우 -->
<a href="boardList.do?viewPage=${i}&searchGubun=${param.searchGubun}&searchText=${fn:escapeXml(param.searchText)}"> ${i }</a>
</c:when>
<c:otherwise>
<!-- 검색 조건이 없는 경우 -->
<a href="boardList.do?viewPage=${i}"> ${i }</a>
</c:otherwise>
</c:choose>
</c:forEach>
</div>
CSV파일_MySQL_우편번호 (1) | 2024.01.15 |
---|---|
상세보기 + 조회수 (0) | 2024.01.06 |
행 번호 관련 (0) | 2024.01.06 |
오라클, MySQL 페이징 쿼리문 + iBATIS (0) | 2024.01.05 |
log4j2.xml (2) | 2024.01.04 |