본문 바로가기

Java/Spring-boot

Spring-boot(mysql-mybatis-aws s3(cloudFront) + Vue.js 를 활용한 파일 업로드 하기 - 기초 셋팅

 

 

https://loy124.tistory.com/204 (s3 서버 구축하기) 

https://loy124.tistory.com/205?category=768865 (s3 CloudFront와 연동하기)

 

기초 셋팅

https://loy124.tistory.com/206

백엔드 구성편

https://loy124.tistory.com/207

프론트 구성편

https://loy124.tistory.com/208

 

 

Spring-boot를 활용해서 mysql및 mybatis와 연동해서 aws s3에 이미지및 파일을 업로드하는 예제를 만들었다.

 

먼저 db테이블을 생성한다.

 

 

 

maven 프로젝트로 진행하였다.

 

 

 

pom.xml

<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.5.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>room</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>room</name>
	<description>구해방 프로젝트</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
<!--		<dependency>-->
<!--			<groupId>org.mybatis.spring.boot</groupId>-->
<!--			<artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--			<version>2.1.2</version>-->
<!--		</dependency>-->


		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>


		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.2</version>
		</dependency>

		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.6</version>
		</dependency>

		<dependency>
			<groupId>com.amazonaws</groupId>
			<artifactId>aws-java-sdk</artifactId>
			<version>1.11.106</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 

 

기초 셋팅하기 

application.properties

server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/스키마이름?allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# db response name
spring.datasource.username=디비 아이디
#db response password
spring.datasource.password=비밀번호

spring.jpa.show-sql=true

spring.jackson.property-naming-strategy=SNAKE_CASE

# max file size
spring.servlet.multipart.max-file-size=100MB
# max request size
spring.servlet.multipart.max-request-size=100MB
# files storage location (stores all files uploaded via REST API)

spring.servlet.multipart.enabled=true
        
cloud.aws.credentials.accessKey= 액세스키
cloud.aws.credentials.secretKey= 시크릿키
# AWS S3 bucket

cloud.aws.s3.bucket=s3 버킷 이름
cloud.aws.region.static=ap-northeast-2
cloud.aws.stack.auto=false


mybatis.configuration.map-underscore-to-camel-case=true

 

 

기초셋팅하기

 

폴더 구조(gallery, roomApplication.java, DatabaseConfig, WebConfig, sqls 폴더만 사용한다)

 

gallery 폴더: 이미지관련 controller, dao, dto, service 종합

s3 폴더: aws업로드 관련  service

sqls: mybatis 관련파일 

 

mybatis기초 세팅

 

DatabaseConfig.java 파일 

package bit.com.a;

import java.util.Properties;

import javax.servlet.annotation.MultipartConfig;
import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@MapperScan(basePackages = "bit.com.a")
public class DatabaseConfig {

	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		System.out.println("DatabaseConfig sqlSessionFactory");

		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		Properties prop = new Properties();
		prop.setProperty("mapUnderscoreToCamelCase", "true");
		sqlSessionFactoryBean.setDataSource(dataSource);
		sqlSessionFactoryBean.setConfigurationProperties(prop);
		/*
		 * sqlSessionFactoryBean.getObject().getConfiguration().
		 * setMapUnderscoreToCamelCase(true);
		 */

		Resource myBatisConfig = new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml");
		sqlSessionFactoryBean.setConfigLocation(myBatisConfig);
		Resource[] arrResource = new PathMatchingResourcePatternResolver().getResources("classpath:sqls/*.xml");
		sqlSessionFactoryBean.setMapperLocations(arrResource);

		return (SqlSessionFactory) sqlSessionFactoryBean.getObject();
	}

	@Bean
	public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

 

 

WebConfig.java 파일

 

package bit.com.a;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

	@Override
	public void addCorsMappings(CorsRegistry registry) {
		// WebMvcConfigurer.super.addCorsMappings(registry);

		registry.addMapping("/**").allowedOrigins("*");

	}

}
/*
 * 크로스도메인 이슈란? Ajax 등을 통해 다른 도메인의 서버에 url(data)를 호출할 경우 XMLHttpRequest는 보안상의 이유로
 * 자신과 동일한 도메인으로만 HTTP요청을 보내도록 제한하고 있어 에러가 발생한다. 내가 만든 웹서비스에서 사용하기 위한 rest api
 * 서버를 무분별하게 다른 도메인에서 접근하여 사용하게 한다면 보안상 문제가 될 수 있기 때문에 제한하였지만 지속적으로 웹 애플리케이션을
 * 개선하고 쉽게 개발하기 위해서는 이러한 request가 꼭 필요하였기에 그래서 XMLHttpRequest가 cross-domain을 요청할
 * 수 있도록하는 방법이 고안되었다. 그것이 CORS 이다.
 * 
 * CORS란? CORS(Cross-origin resource sharing)이란, 웹 페이지의 제한된 자원을 외부 도메인에서 접근을
 * 허용해주는 메커니즘이다.
 * 
 * 스프링에서 CORS 설정하기. 스프링 RESTful Service에서 CORS를 설정은 @CrossOrigin 어노테이션을 사용하여 간단히
 * 해결 할 수 있다. RestController를 사용한 클래스 자체에 적용할 수 도 있고, 특정 REST API method에도 설정
 * 가능하다. 또한, 특정 도메인만 접속을 허용할 수도 있다.
 */

 

RoomApplication.java파일

package bit.com.a;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@SpringBootApplication
@MapperScan(basePackages = "bit.com.a")
public class RoomApplication {

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

}

 

이것으로 기초 셋팅은 끝이났다.