Spring Boot - Mail 전송 / Upload

준동이·2023년 6월 8일
0

💡JdbcTemplate로 단순게시판 구현

BootJdbcTemplateBoard 프로젝트

패키지 구성

com.example.bootboard
			BootboardApplication.java(X)
            
com.example.controller
			BoardController.java(O)
            
com.example.model1
			BoardTO
            BoardDAO

프로젝트 생성



JSP실행시킬 환경 설정 - pom.xml

<dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-jasper</artifactId>
	<scope>provided</scope>
</dependency>
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>jstl</artifactId>
</dependency>



application.properties 설정

# View Pages
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://localhost:3306/sample
spring.datasource.username=root
spring.datasource.password=123456



model - BoardTO

package com.example.model;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class BoardTO {
	private String seq;
	private String subject;
	private String writer;
	private String mail;
	private String password;
	private String content;
	private String hit;
	private String wip;
	private String wdate;
	private int wgap;
}



model - BoardDAO



➖➖➖➖➖➖➖➖➖➖➖➖



💡Mybatis - xml로 게시판 구성

BootMyBatisBoard 프로젝트

패키지 설계

com.example.bootmybatisboard
			BootMybatisApplication.java(기본)

com.example.controller
			BoardController.java
            
com.example.config
			DatabaseConfiguration.java

com.example.model
			BoardTO
            BoardDAO
            
mappers
			board.xml



➖➖➖➖➖➖➖➖➖➖➖➖



💡Mybatis - 어노테이션으로 게시판 구성

BootMyBatisBoard02 프로젝트



➖➖➖➖➖➖➖➖➖➖➖➖



💡Spring을 이용한 mail 전송

mail.do - 메일 형태
mail_ok.do - 메일 보내짐

=> controller에서 보내기



pom.xml



application.properties



controller - MailController

package com.example.controller;

import java.io.UnsupportedEncodingException;
import java.util.Date;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

@RestController
public class MailController {
	
    /* JavaMailSender는 Spring Framework에서 제공하는 인터페이스로, 
       이를 사용하여 이메일을 보내는 기능을 구현할 수 있다. 
       이 인터페이스는 이메일 전송을 위한 다양한 메서드를 제공하며, 
       JavaMailSender를 구현한 클래스는 SMTP 서버를 통해 이메일을 전송할 수 있는 기능을 제공 
       
       SMTP는 Simple Mail Transfer Protocol의 약자로, 
       전자 메일을 전송하기 위해 사용되는 네트워크 프로토콜. 
       SMTP는 메일 서버 간에 이메일을 전송하고 수신하는 데 사용 */
    
	@Autowired
	private JavaMailSender javaMailSender;
	
	@RequestMapping("/mail.do")
	public ModelAndView mail(HttpServletRequest request) {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("mail");
		return modelAndView;
	}
	
	@RequestMapping("/mail_ok.do")
	public ModelAndView mail_ok(HttpServletRequest request) {
		
		System.out.println("javaMailSender : " + javaMailSender);
		
		// 보낼사람에 대한 데이터들 입력
		String toEmail = "";
		String toName = "테스터";
		String subject = "테스트 제목";
		String content = "테스트 내용";
		
        // mailSender 메서드를 통하여 위의 값들을 넣어주고 넘겨준다
		this.mailSender2(toEmail, toName, subject, content);
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("mail_ok");
		return modelAndView;
	}
	
	// 메일 받는사람에 대한 정보 
	public void mailSender1(String toEmail, String toName, String subject, String content) {
		
        // SimpleMailMessage : 이메일 전송 기능을 사용하기 위해 사용되는 클래스 / 간단한 텍스트 기반의 이메일 메시지를 생성, 구상할 수 있음.
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
		
		// ~ 에게 보내겠다
		simpleMailMessage.setTo(toEmail); // setTO() : 수신자 이메일 주소를 설정
		simpleMailMessage.setSubject(subject); // setSubject() : 이메일 제목 설정
		simpleMailMessage.setText(content); // setText() : 이메일 본문 설정
		simpleMailMessage.setSentDate(new Date()); // setSentDate(Date sentDate) : 이메일 발송일자 설정
		
        // 실제로 이메일을 전송
		javaMailSender.send(simpleMailMessage);
		
		System.out.println("전송 완료");
	}
	
	
	// html 보내기
	public void mailSender2(String toEmail, String toName, String subject, String content) {
		try {
        
        	// Mime은 : 이메일에서 텍스트뿐만 아니라 첨부파일, 이미지, HTML등 다양한 형식의 콘텐츠를 표현하기 위한 표준 형식
		    // javaMailSender.createMimeMessage()메서드를 사용하여 MimeMessage객체를 생성 / JavaMailSender 인터페이스의 구현체인 JavaMailSenderImpl에서 제공하는 메서드
			MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            
            // addRecipient(RecipientType type, Address address): 수신자의 이메일 주소와 유형(To, Cc, Bcc)을 설정
            // RecipientType.TO는 수신자 유형을 나타내는 상수
            // new InternetAddress(toEmail, toName, "utf-8")는 수신자의 이메일 주소와 이름, 문자 인코딩을 설정하는데 사용
			mimeMessage.addRecipient(RecipientType.TO, new InternetAddress(toEmail, toName, "utf-8"));
			
            // setSubject(String subject, String charset): 이메일 제목을 설정하고 문자 인코딩을 지정
			mimeMessage.setSubject(subject, "utf-8");
            
            // setText(String text, String charset, String mimeType): 이메일 본문을 설정하고 문자 인코딩과 MIME 타입을 지정
			mimeMessage.setText(content, "utf-8", "html");
			
            // setSentDate(Date sentDate): 이메일 발송 일자를 설정
			mimeMessage.setSentDate(new Date());
			
            // 실제로 이메일을 전송
			javaMailSender.send(mimeMessage);
			
			System.out.println("전송 완료");
		} catch (MailException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}



bootmail - BootMailApplication

package com.example.bootmail;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.controller"})
public class BootMailApplication {

	public static void main(String[] args) {
		SpringApplication.run(BootMailApplication.class, args);
	}

}



전송 완료


네이버에서 메일 받은 것 확인


mailSender1메서드로 전송하였을때 - html표현 못함


mailSender2메서드로 전송하였을때 - html표현 가능



mail.jsp에 입력폼 만들어서 메일전송

mail.jsp

디자인 없이 그냥 기능만 구현되게 함

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello mail.jsp
<br><hr><br>

<form action="mail_ok.do" method="post">
이메일 <input type="text" name="email1" />
@
<input type="text" name="email2" />
<input type="submit" value="메일쓰기" />

<br><hr><br>

받을이름 <input type="text" name="name" />

<br><hr><br>

제목 <input type="text" name="subject" />

<br><hr><br>

내용 <input type="text" name="content" />
</form>

</body>
</html>



MailController 클래스 수정



실행

전송 누르면 메일이 받아짐.

그대로 네이버 메일로 전송이 되었음



➖➖➖➖➖➖➖➖➖➖➖➖



💡BootUpload




application.properties

# View Pages
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

# Multipart Config
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=c:/java
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=50MB



form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello form.jsp
<br><br>

<form action="form_ok.do" method="post" enctype="multipart/form-data" >
파일 <input type="file" name="upload" />
<input type="submit" value="파일 업로드" />
</form>

</body>
</html>



controller - UploadController

package com.example.controller;

import java.io.File;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

@RestController
public class UploadController {
	
	@RequestMapping("/form.do")
	public ModelAndView form(HttpServletRequest request) {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("form");
		return modelAndView;
	}
	
    /* MultipartFile : 파일 업로드를 처리하기 위한 객체. 
      클라이언트에서 서버로 업로도된 파일의 정보와 내용을 가지고 있다.
      업로드된 파일의 이름, 크기, 내용 등을 엑세스하고 처치할 수 있음.
      매개변수의 upload는 <input type="file" name="upload">의 name과 일치 */
	@RequestMapping("/form_ok.do")
	public ModelAndView form_ok(MultipartFile upload) {
		
		try {
			System.out.println(upload.getOriginalFilename());
			System.out.println(upload.getSize());
			
			// 중복파일 제거 흐름
			// 파일명_타임스탬프(1970년부터... ~). 확장자
			
            
            /* new File(upload.getOriginalFilename())은 
               업로드된 파일의 원본 파일 이름을 이용하여 새로운 File 객체를 생성.
               이 파일 객체는 서버에 저장될 업로드 파일의 경로를 나타낸다. 
               
               upload.transferTo(new File(upload.getOriginalFilename()))는 
               업로드된 파일을 지정된 파일 경로로 복사하는 역할. 
               이를 통해 클라이언트가 업로드한 파일은 서버의 지정된 경로에 저장*/
            
			// 클라이언트에서 업로드된 파일을 서버의 파일 시스템에 저장하기 위한 코드
            // transferTo() : 업로도된 파일을 지정된 경로에 저장하는 작업을 수행 / 클라이언트가 업로드한 파일을 서버의 파일 시스템의 특정 위치로 복사하거나 이동시키는 역학
			upload.transferTo(new File(upload.getOriginalFilename()));
			
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("form_ok");
		return modelAndView;
	}
}



bootupload - BootUploadApplication

package com.example.bootupload;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.controller"})
public class BootUploadApplication {

	public static void main(String[] args) {
		SpringApplication.run(BootUploadApplication.class, args);
	}

}



실행

콘솔창에 크기랑 이름 출력


지정해 놓은 경로에 저장되는 것을 볼 수 있다.



중복파일 제거와

profile
개발자 꿈나무

0개의 댓글