반응형

설정

root-context.xml

    <!-- 파일업로드 설정 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"> 
	</bean>

 

"POST" 메서드와 "multipart/form-data" 인코딩을 사용하여 HTML 형식에서 Spring 백엔드로 파일을 업로드한 다음 MyBatis를 사용하여 파일을 BLOB으로 MySQL에 저장

1. HTML 양식에서 입력 유형 "file"을 사용하여 사용자가 업로드할 파일을 선택할 수 있도록 합니다.

<form method="post" action="/upload" enctype="multipart/form-data">
  <input type="file" name="file">
  <button type="submit">Upload</button>
</form>

2. Spring 컨트롤러에서 @PostMapping 어노테이션을 사용하여 폼 제출하고 업로드된 파일을 MultipartFile 객체로 수신합니다.

@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
    // code to handle the file upload
    byte[] fileBytes = file.getBytes();
    
    // mapper -> SQL (.xml)
     +++   code +++
}

3. MyBatis를 사용하여 insert 문으로 Mapper XML 파일을 정의하여 바이트 배열을 BLOB로 MySQL 데이터베이스에 삽입합니다.

<insert id="insertFile" parameterType="byte[]">
  INSERT INTO my_table (file_blob) VALUES (#{value})
</insert>

 

 

설정

Spring 구성 파일(예: application.properties 또는 application.yml)에서 multipart resolver bean을 구성합니다.

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

서버의 멀티파트 구성이 올바르게 설정되었는지 확인하십시오. 이는 서버의 web.xml 파일에 다음 구성을 추가하여 수행할 수 있습니다.

<multipart-config>
    <max-file-size>20971520</max-file-size>
    <max-request-size>41943040</max-request-size>
    <file-size-threshold>1048576</file-size-threshold>
</multipart-config>

root-context.xml

    <!-- 파일업로드 설정 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"> 
	</bean>
728x90
반응형
반응형

구조 : DB 서버 #1, WAS 서버 #2

현상

netstat | grep mysql

mysql 포트를 확인했을 때 아래와 같이 close_wait, time_wait 와 같은 아래와 같이 사용되지 않는 포트가 많이 보임. 나중에 사용자가 늘었을 때, 사용되지 않는 포트나 인스턴스가 늘어 서버에 부하를 줄 것으로 예상.

TCP 통신 중 제대로 소켓이 끊어지질 않아 발생하는 문제 : TIME_WAIT, CLOSE_WAIT

1) TIME_WAIT 해결 방법

MySQL에서 wait_timeout을 설정한다. 사용되지 않는 커넥션들이 반환되어 다시 사용될 준비되는 시간이 2,000,000초이다. 그 시간 동안 계속 대기 상태이므로 timeout을 여유롭게 60초로 변경한다.

show variables like '%timeout%'

set GLOBAL wait_timeout=60;

대기 중인 포트는 사라짐.

2) CLOSE_WAIT 해결 방법

close_wait를 없애는 방법은 서버를 재기동하는 방법밖에 없음.

https://tech.kakao.com/2016/04/21/closewait-timewait/
 

CLOSE_WAIT & TIME_WAIT 최종 분석

트래픽이 많은 웹 서비스를 운영하다보면 CPU는 여유가 있지만 웹서버가 응답을 제대로 처리하지 못하고 먹통이 되는 경우를 종종 보게 됩니다. 여러가지 이유가 있겠지만, 이 글에서는 가장 대

tech.kakao.com

정리를 하자면, 

 

 

행(hang)이란 시스템, 네트워크, 어플리케이션이 동작하지 않고 서비스가 응답하지 않는 상태 즉, 시스템 입출력에 대한 반응이 없는 상태로 시스템 운영이 불가능한 상태를 뜻합니다. 
행 증상의 원인으로는 하드웨어의 결함이나 Thread 혹은 Memory 부족, 리소스 경합이나 DeadLock이 발생

 

728x90
반응형
반응형

Ubunut 환경에 .WAR 파일 배포.

(전자정부프레임워크 : eGovFrame-4.0.0)

- Apache Tomcat 8.5

- JDK 11

- WAR 배포 파일은 Eclipse에서 export를 했다는 전제 조건.

1. Tomcat 및  Java 설치

1. tomcat 설치

$ cd /home/계정/Downloads
$ wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.59/bin/apache-tomcat-8.5.59.tar.gz
$ tar -xzvf apache-tomcat-8.5.68.tar.gz

2. tomcat 디렉토리 변경 및 링크 설정

$ cp -r apache-tomcat-8.5.68 /usr/local/
$ ln -s apache-tomcat-8.5.68/ tomcat

3. JAVA 설치 및 설치 경로

$ sudo apt-get install openjdk-11-jdk

# /usr/lib/jvm/
# java-11-openjdk-amd64

4. 환경 변수 설정

$ vi /etc/profile

# 맨 아래에 추가.

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
JRE_HOME=$JAVA_HOME
CATALINA_HOME=/usr/local/tomcat
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$CATALINA_HOME/bin

export JAVA_HOME
export JRE_HOME
export CLASSPATH CATALINA_HOME
export PATH

2. Tomcat WAR 배포 및 실행

1. WAR 배포 (ftp로 옮겼다는 전제.)

- WAR 파일명 : test.war

- test.war 파일 아래 경로에 배치

/usr/local/tomcat/webapps/test.war

2. war 경로 수정

$ vi /usr/local/tomcat/conf/server.xml

- 아래 코드 추가.

(tomcat이 올바르게 동작하면, war파일은 자동으로 압축 해제)

- <Context path="/" docBase="test.war" reloadable="true" />

      <Host name="localhost"  appBase="webapps"
              unpackWARs="true" autoDeploy="true">
        <Context path="/" docBase="test.war" reloadable="true" />
        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>

3. tomcat 실행

$ sudo /usr/local/tomcat/bin/startup.sh

- localhost:8080으로 접속. (8080포트는 well known 포트이므로 server.xml에서 포트 수정 추천.)

3. 로그인 시 서버 자동 실행.

1. /etc/profile 수정

아래 코드  추가

$ vi /etc/profile

cd /usr/local/tomcat/bin
./startup.sh

2. 권한 추가 및 소유주 변경 (계정 ID : test_user)

서버를 접속할 때, 보통 일반 계정(test_user)으로 접속하여 root 로 전환한다.

위 코드를 실행해도 test_user 계정은 권한이 없으므로, 권한 및 소유주를 변경한다.

1. tomcat 권한 및 소유주 변경
pwd : /usr/local

sudo chown -R jsyoon:root tomcat 
sudo chmod -R 755 tomcat (bin, logs 폴더만 해도 무방)

2. jdk 권한 및 소유주 변경
pwd : /usr/lib/jvm
sudo chown -R jsyoon:root java-1.11.0-openjdk-amd64 
sudo chmod -R 755 java-1.11.0-openjdk-amd64

pwd : /etc/
sudo chown -R jsyoon:root java-11-openjdk
sudo chmod -R 755 java-11-openjdk
/etc/profile : 모든 계정으로 로그인 시 시스템에 적용되는 설정 파일
~/.profile : 사용자 별 설정 파일
~/.bashrc : profile에서 bashrc를 실행하는 코드 포함

본 서버는 나만 사용하므로 /etc/profile을 그대로 사용.

4. 백그라운드 실행.

쉘이 종료되면, 서버 또한 꺼지므로 백그라운드 작업 추가.

/etc/profile 에서 전에 추가한 코드인 ./startup.sh 쉘스크립트 앞에 nohup을 추가.

nohup ./startup.sh
728x90
반응형

'Spring Framework' 카테고리의 다른 글

Spring + Mybatis + MySQL 이미지 BLOB으로 저장  (0) 2023.05.10
1-2 Contoller Return 종류  (0) 2023.04.07
JSP에서 컨트롤러로 값 넘기기.  (0) 2023.03.14
Lombok API  (0) 2023.03.12
반응형

1. URL

	@GetMapping("/boardForm.do")
	public String boardForm() {
		return "boardForm";  //WEB-INF/views/boardBoard.jsp -> forward
	}

2. REDIRECT

	@PostMapping("/boardInsert.do")  // 내성 : 인터폴레이션
	public String boardInsert(Board vo) { // title, content, writer => 파라미터 수집(Board)
		mapper.boardInsert(vo);
		return "redirect:/boardList.do";  // redirect
	}

3. VO, DTO // JSON 데이터 형식으로 변환해서 리턴.

// @ResponseBody -> jackson-data bind(객체를 -> JSON 데이터 포맷으로 변환)
	@RequestMapping("/boardList.do")
	public @ResponseBody List<Board> boardList()
	{
		List<Board> list = boardMapper.getLists();
		return list;  // JSON 데이터 형식으로 변환해서 리턴.
	}

pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

=> JSON VIEW 구글확장프로그램

순수한 데이터만을 전달하는 서버 =>  OPEN API 서버, REST 서버

서버는 브라우저나 모바일에서 필요한 순수한 데이터만을 전달하는 API 서버의 형태로 변환

서버는 클라이언트의 요청 결과를 XML이나 JSON의 형태로 전달하고, 브라우저나 모바일에서는 이를 가공해서 사용자에게 보여주는 방식 (URI : Uniform Resource Identifer)

<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<script type="text/javascript">
	$(document).ready(function(){
		loadList();    	 
	 });  
	 function loadList(){
		// 서버와 통신 : 게시판 리스트 가져오기
		$.ajax({
			url : "boardList.do",
			type : "get",
			dataType : "json",
			success : makeView,
			error : function(){ alert("error");  }    		
		});
	 }        
 	function makeView(data)
 	{
 		alert(data);
 	}
  	
  </script>

var fData=$("#frm").serialize();
$.ajax({
url : "boardInsert.do",
type : "post",
dataType : "fData",
success : loadList,
error : function() {
alert("error");
}
});

728x90
반응형
반응형

JSP 

1. GET 방식 <a href="boardContent.do?idx=${vo.idx}"> </a>

Java pojo

	@GetMapping("/boardContent.do")
	public String boardContent(@RequestParam("idx") int idx, Model model)  { //?idx=6
		Board vo = mapper.boardContent(idx);
		model.addAttribute("vo", vo);
		return "boardContent";

 

2. Get 방식 <a href="boardDelete.do/${vo.idx}" class="btn btn-warning btn-sm">삭제</a>

	@GetMapping("/boardDelete.do/{idx}") //get 방식2
	public String boardDelete(@PathVariable("idx") int idx)  //?idx=6
	{
		mapper.boardDelete(idx);
		return "redirect:/boardList.do";
	}

 

버튼 방식은 폼이 <form></form>  있을때는 onclick으로 하고

없을 때는 그냥 a태그에소 href로 걸면된다. 20강

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

728x90
반응형

+ Recent posts