Spirng Boot 의 환경설정 파일

- pom.xml, Mapper 파일만 있다

- web.xml, servlet-context.xml, root-context.xml 이 사용되지 않는다

- MyBatis 환경설정 파일인 Configuration.xml 도 사용되지 않는다, 여기서 alias 가 설정되지 않음

- 새로 application.properties 환경 설정 파일이 생성된다

+ 새로 DB 관련 환경 설정 관련 클래스 (DataAccessConfig.java) 하나가 생성된다

 

Spring Boot 환경설정 파일 정리

1. pom.xml

2. Mapper 파일

3. application.properties

4. DataAccess 설정 파일 클래스


Spring Boot - MyBatis 연동 예제 1 : 프로젝트 MyBatis01

프로젝트 MyBatis01 : 프로젝트 생성

- java 폴더 하위에 Package 에 적힌 패키지가 생성된다

 

프로젝트 MyBatis01 : 프로젝트 실행 확인

오른쪽 마우스 - Run As - Run on Server 로 프로젝트를 실행

- 이 화면이 출력되면 실행 성공이다

 

프로젝트 MyBatis01 : 환경설정 pom.xml 파일 수정

		<!-- jsp 파일을 사용하기 위한 의존 라이브러리 -->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>
		<!-- jstl -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
		</dependency>

- pom.xml 에 JSP 파일 사용하기 위한 의존라이브러리와 JSTL 의존 라이브러리 추가

- JSTL 을 사용하기 위해 필요한 라이브러리이다

+ ojdbc8 을 쓸 것이므로 ojdbc8 을 남기고, ojdbc6 와 ojdbc6 다운 위한 repository 인 codelds 는 주석으로 막기

 

프로젝트 MyBatis01 : 테이블 생성하기

- webapp 폴더 하위에 sql 폴더를 생성하고, sql 폴더 하위에 myboard.sql 파일 생성

- Connection profile 을 설정하고, 테이블 boardtest, 시퀀스 boardtest_seq 생성

- myboard.sql

select * from tab;
select * from seq;

create table boardtest(
no number primary key,
name varchar2(20),
subject varchar2(50),
content varchar2(1000),
register date
);

create sequence boardtest_seq;


DB 연동 준비

top-level 패키지 하위에 JAVA 파일이 저장될 폴더 생성하기

- src/main/java/com/example/demo 폴더 하위에 config, controller, service, dao, model 폴더 생성

- config 폴더엔 DB 연동에 필요한 클래스가 들어갈 것

 

DataAccess 설정 파일 생성 (간략히만 설명)

- src/main/java/com/example/demo/config – DataAccessConfig.java 생성

- DataAccessConfig.java

package com.example.demo.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@PropertySource("classpath:/application.properties")          
public class DataAccessConfig {
	
	@ConfigurationProperties(prefix = "spring.datasource")    
	public DataSource dataSource() {
		return DataSourceBuilder.create().build();
	}
	
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
		SqlSessionFactoryBean factoryBean=new SqlSessionFactoryBean();
		
		factoryBean.setDataSource(dataSource);
		factoryBean.setMapperLocations(
				new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*.xml")
				);
		factoryBean.setTypeAliasesPackage("com.example.demo.model"); // DTO Alias 설정
		return factoryBean.getObject();
	}
	
	@Bean
	public SqlSessionTemplate sessionTemplate(SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

- root-context.xml 에서 설정했던 내용을 이 클래스 DataAccessConfig 와 application.properties 파일에서 설정

 

프로젝트 MyBatis01 : 환경설정 application.properties 파일 수정

- 대부분의 환경 설정을 이 파일에서 설정

# port 
server.port=80

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

# oracle
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=spring
spring.datasource.password=spring123

# mybatis
mybatis.config-location=classpath:mybatis-config.xml
mybatis.mapper-locations=classpath:mapper/*.xml

1. application.properties 에서 서버 포트번호를 설정

- 기본포트 8080 에서 80 으로 수정

2. prefix 와 suffix 를 설정

- View 파일들이 저장될 최상위 경로값 설정

- 이때 prefix 에 해당하는 폴더도 webapp 폴더 하위에 생성해야함

2. DB 연동을 위해 Oracle(또는 MySql) 연동시 필요한 정보를 설정

- 기존에 root-context.xml 에서 설정하던 내용을 여기서 설정

- 또한 com/example/demo/config/DataAccessConfig.java 에도 DB 연동 관련 내용이 들어감

3. MyBatis 연동을 위해 MyBatis 연동시 필요한 정보를 설정

- 기존에 root-context.xml 에서 설정하던 내용을 여기서 설정, configuration.xml 파일, Mapper 파일을 불러옴

+ Spring Boot 에서는 configuration.xml 파일에서 alias 값을 설정할 수 없으므로, configuration.xml 파일을 삭제해도 된다, 삭제시 configuration.xml 파일을 불러오는 코드도 삭제해야함

 

DB 연동 환경설정 내용이 들어가는 곳

1. DataAccessConfig.java 파일

2. application.properties

- 이 두가지가 맞물려서 돌아간다

 

Spring Boot 에서의 MyBatis 환경설정 파일 mybatis-config.xml

- Spring Boot 에서는 MyBatis 환경설정 파일인 mybatis-config.xml 에서 DTO 클래스의 alias 값을 설정해도 적용되지 않음

- DTO class 의 alias 는 DTO 클래스 위에서 @Alias 어노테이션으로 적용시켜야한다

- 여기서 설정한 alias 값을 Mapper 파일에서 resultType, parameterType 등에 사용함

+ Controller, Service, DAO 는 Spring 과 같다, DTO 에는 @Getter, @Setter, @Alias 등 어노테이션 사용

 

프로젝트 MyBatis01 : DataAccess 설정 파일 설명

- DataAccessConfig.java

package com.example.demo.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@PropertySource("classpath:/application.properties")          
public class DataAccessConfig {
	
	@ConfigurationProperties(prefix = "spring.datasource")    
	public DataSource dataSource() {
		return DataSourceBuilder.create().build();
	}
	
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
		SqlSessionFactoryBean factoryBean=new SqlSessionFactoryBean();
		
		factoryBean.setDataSource(dataSource);
		factoryBean.setMapperLocations(
				new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*.xml")
				);
		factoryBean.setTypeAliasesPackage("com.example.demo.model"); // DTO Alias 설정
		return factoryBean.getObject();
	}
	
	@Bean
	public SqlSessionTemplate sessionTemplate(SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

- root-context.xml 에서 3가지 bean 을 만들던 내용에 해당하는 내용이 DataAccess 설정 파일에 3개의 메소드로 들어감

- DataSource, SqlSessionFactory, SqlSessionTemplate 객체들이 순차적으로 생성되고 있다

 

@Configuration
@PropertySource("classpath:/application.properties")          
public class DataAccessConfig {

- 여기서 @ProperthSource 에 application.properties 환경 설정 파일을 불러온다

- 이걸 불러와야 application.properties 와 맞물려서 bean 객체 생성 가능

 

DataAccessConfig.java 의 dataSource() 메소드 부분

	@ConfigurationProperties(prefix = "spring.datasource")    
	public DataSource dataSource() {
		return DataSourceBuilder.create().build();
	}

- @configurationProperties(prefix = "spring.datasource") 는 application.properties 에서 DB 연동에 필요한 값을 설정할때는 spring.datasource 로 시작해야한다는 의미

- 그래서 application.properties 에서 DB 연동 관련된 내용은 spring.datasource 로 시작한다

- 이때 이 DB 연동 관련 내용이 있는 곳은 위의 @PropertySource 에서 지정한 곳, 즉 application.properties 파일을 의미

 

- application.properties 부분

 

- 기존 root-context 의 이 내용이다 (아래)

 

DataAccessConfig.java 의 sqlSessionFactory() 부분

	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
		SqlSessionFactoryBean factoryBean=new SqlSessionFactoryBean();
		
		factoryBean.setDataSource(dataSource);
		factoryBean.setMapperLocations(
				new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*.xml")
				);
		factoryBean.setTypeAliasesPackage("com.example.demo.model"); // DTO Alias 설정
		return factoryBean.getObject();
	}

- SqlSessionFactoryBean 객체 factoryBean 을 생성하면서 Setter 메소드로 프로퍼티에 값을 세팅하고 있다

1. 위에서 만든 dataSource 객체를 세팅하고

2. Mapper 파일을 불러오는 코드

3. DTO 클래스가 저장된 패키지를 여기서 경로 설정해서 불러옴, 그것에 의해서 DTO 에서 @Alias 어노테이션 사용 가능

 

- 기존 root-context 의 이 내용이다 (아래)

 

DataAccessConfig.java 의 sessionTemplate() 부분

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

- 기존 root-context 의 이 내용이다 (아래)

 

+  Controller, Service, DAO 이나 나머지 부분은 Spring Project 때와 과 같다, DTO 만 @Getter, @Setter, @Alias 등 어노테이션 사용

 

프로젝트 MyBatis01 : DTO 클래스 보기

- Board.java

package com.example.demo.model;

import java.util.Date;

import org.apache.ibatis.type.Alias;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Alias("board")
public class Board {
	private int no;
	private String name;
	private String subject;
	private String content;
	private Date register;
}

- Getter / Setter 메소드 대신 @Getter, @Setter 어노테이션 사용

- @Alias 어노테이션으로 해당 DTO 의 alias 를 설정함, 현재는 "board" 로 설정했다

- 이때 DataAccessConfig.java 파일에서 아래의 코드로 DTO 가 저장된 패키지를 지정하는 경로를 세팅해야, DTO 클래스에서 DTO Alias 를 설정 가능하고, 그 Alias 를 Mapper 파일에서 사용 가능

- DataAccessConfig.java 에서 Mapper 파일을 불러오고, DTO 클래스 위치도 불러오므로, Mapper 파일에서 DTO Alias 를 사용 가능한 것이다.

 

Alias 설정 방법

1. DTO 클래스 위 @Alias 어노테이션으로 설정

2. DataAccessConfig.java 에서 setTypeAliasesPackage() 로 DTO 클래스가 위치한 경로를 구해서 세팅해야한다

- 위 두가지가 충족되어야 DTO 에서 Alias 를 설정하고, Mapper 파일에서 그 Alias 사용 가능

 

- 나머지 흐름, 코드는 Spring 과 같은므로 설명 생략

 

로젝트 MyBatis01 : 완성된 프로젝트 실행

 

Spring Boot 환경설정 파일 정리

1. pom.xml

2. Mapper 파일

3. application.properties

4. DataAccess 설정 파일 클래스


Spring Boot - MyBatis 연동 예제 2 : 프로젝트 sbboard

- Spring 으로 만들었던 예제 프로젝트 springboard 를 Spring Boot 으로 다시 만들기
- 프로젝트 springmember 설명 : https://laker99.tistory.com/m/150

 

프로젝트 sbboard: 실습 준비

- Spring 실습시에 생성했던 board53 테이블을 사용하므로 테이블 생성할 필요 없이 바로 실행해도 연동 된다

 

프로젝트 sbboard: 프로젝트 실행

 

파일들 살펴보기 : pom.xml

- 현재는 타임리프가 아닌 JSTL 로 출력할것이므로 JSTL 라이브러리가 추가되어있다

- ojdbc8 을 사용함

 

파일들 살펴보기 : application.properties

# port 
server.port=80

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

# oracle
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=spring
spring.datasource.password=spring123

# mybatis
# mybatis.config-location=classpath:mybatis-config.xml
# mybatis.mapper-locations=classpath:mapper/*.xml

# DTO Alias
# mybatis.type-aliases-package=com.example.demo.model

1. 포트 설정

- 실행방법에 따라 다른 아파치 톰캣이 동작한다

- 우리가 설정한 아파치 톰캣이 있고, Spring Boot 엔 내장된 아파치 톰캣이 있다

1) 브라우저 창을 열어서 localhost 나 ip 주소로 요청하면 application.propeties 위에서 설정한 포트가 내부포트로 동작

- 기본 포트는 8080, 우리가 application.properties 에서 80 으로 변경시킨 것이다

2) 반면 Run As - Run on Server 로 실행하면 우리가 설치한 아파치 톰캣으로 실행한다

- 우리가 아파치 톰캣 설치시 설정했던 포트번호로 실행된다

 

2. VIewResolver

+ 타임리프

- 나중에 타임리프를 쓸때는 View 파일을 저장할때 webapp 를 사용하지 않고 resources/templates 폴더 하위에 저장된다

- 나중에 타임리프를 쓸때는 JSP 파일이 아닌 HTML 파일로 View 를 만들어야한다

3. 오라클 연결

- spring.datasource 는 DataAccessConfig.java 에서 설정한 prefix 값이다

4. MyBatis 연결

- Spring Boot 에서 mybatis-config.xml 은 아무 역할을 하지 않으므로, mybatis-config.xml 을 불러오는 코드는 삭제해도 됨

- DataAccessConfig.java 파일에서 Mapper 파일을 불러오고 있으므로 application.properties 에서 Mapper 파일을 불러오는 코드는 삭제해도 됨

5. DTO Alias

- DTO Alias 는 DTO 에서 설정하고, 그 DTO 경로를 DataAccessConfig.java 에서 불러오고 있으므로 여기에서 Alias 를 설정할 필요가 없다

 

프로젝트 sbboard: DataAccess 설정 파일

- DataAccessConfig.java

package com.example.demo.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@PropertySource("classpath:/application.properties")          
public class DataAccessConfig {
	
	@ConfigurationProperties(prefix = "spring.datasource")    
	public DataSource dataSource() {
		return DataSourceBuilder.create().build();
	}
	
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
		SqlSessionFactoryBean factoryBean=new SqlSessionFactoryBean();
		
		factoryBean.setDataSource(dataSource);
		factoryBean.setMapperLocations(
				new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*.xml")
				);
		factoryBean.setTypeAliasesPackage("com.example.demo.model"); // DTO Alias 설정
		return factoryBean.getObject();
	}
	
	@Bean
	public SqlSessionTemplate sessionTemplate(SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

1. @ConfigurationProperties 어노테이션에서 DB연동과 관련된 prefix 를 "spring.datasource" 로 지정

2. 그 prefix 를 application.properties 에서 사용하고 그 DB 연동 관련 정보를 여기서 불러와서 dataSource 객체 생성

3. sqlSEssionFactory() 메소드의 코드 factoryBean.setDataSource(dataSource); 가 실제로 DB 연동하는 코드이다

4. MyBatis 환경설정 파일 Configuration.xml 은 사용되지 않으므로, 여기서도 설정하지 않음, Mapper 파일 경로만 설정한다

- 경로를 "classpath:/mapper/*.xml" 로 했으므로 Mapper 파일은 resources 폴더 하위 mapper 폴더 하위에 있어야한다

5. DTO 클래스가 저장될 패키지를 지정해야, 그 DTO 클래스에서 @Alias 로 Alias 값을 설정가능하고, 설정한 Alias 값을 Mapper 파일에서 사용 가능

6. sessionTemplate() 메소드에서 SqlSessionTemplate 객체를 생성하고 있다

 

+ application.properties 부분

 

프로젝트 sbboard: DTO 클래스

- BoardBena.java

package com.example.demo.model;

import java.util.Date;

import org.apache.ibatis.type.Alias;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Alias("board")
public class BoardBean {

	private int board_num;
	private String board_name;
	private String board_pass;
	private String board_subject; //글제목
	private String board_content; //글내용
	private int board_re_ref; //글그룹번호
	private int board_re_lev; //화면에 보이는 답변글 위치번호
	private int board_re_seq; //답변글 레벨 순서
	private int board_readcount; //조회수
	private String board_date; //글 등록날짜
	
	
}

- Lombok 라이브러리를 추가했으므로 Lombok 기능으로 Getter / Setter 메소드 대신 @Getter, @Setter 어노테이션 사용

 

static 폴더

- Spring Boot 에서는 static 폴더가 지원되고, 이 폴더 하위에 저장된 파일들은 공유된다

- 다른 폴더에서 static 폴더 하위의 폴더 순으로 경로를 설정하면 쉽게 파일을 가져올 수 있다

- 주로 static 폴더 하위에 CSS 파일, JS 파일, 이미지 등을 저장함

ex) 목록페이지 board_list.jsp 에서 CSS 파일 불러오는 부분

<head>
	<meta charset="UTF-8">
	<title>게시판 목록</title>
    <link rel="stylesheet" href="./css/bbs.css" type="text/css">
</head>

- 불러올 경로를 지정할땐 static 폴더 하위의 폴더 순으로 불러오면 쉽게 불러올 수 있다

ex) href="./css/bbs.css" 는 static 폴더 하위의, css 폴더 하위의 bbs.css 파일을 불러오라는 의미이다

+ static 폴더는 resources 폴더 하위에 있다

 

- 그 외는 Spring 프로젝트 springboard 부분을 보기

- 위의 환경설정을 제외한 나머지는 Spring 프로젝트 springboard 와 같은 내용이다

https://laker99.tistory.com/m/150

 

코딩 76 일 / 2022.10.12 / Spring MVC 회원관리 프로그램, Spring MVC 댓글 게시판 프로그램

복습 파일명 중복문제 해결 - fileupload 라이브러리 사용시 중복문제를 자동 해결해주지 않음 - UUID (java.util) 클래스는 통해 문자형태의 난수값을 만들어 준다 - 이 난수값을 String 형으로 변환하고

laker99.tistory.com


Spring Boot - MyBatis 연동 예제 3 : 프로젝트 sbmember

- Spring 으로 만들었던 예제 프로젝트 springmember 를 Spring Boot 으로 다시 만들기

- 프로젝트 springmember 설명 : https://laker99.tistory.com/m/149

- Spring Boot 에서는 인터셉터 설정, 첨부파일 업로드 방법이 달라진다, 그 부분을 보기

 

프로젝트 sbmember: 실습 준비

- Spring 실습시에 생성했던 join_member 테이블을 사용하므로 테이블 생성할 필요 없이 바로 실행해도 연동 된다

 

Spring Boot 프로젝트에서의 인터셉터(Intercepter) 설정

- servlet-context.xml 파일에서 설정했던 인터셉터 설정과 매핑을 Spring Boot 에서는 JAVA 클래스 인 WebMvcConfig. java 에서 인터셉터 설정

- JAVA 클래스인 SessionCheckInter.java 가 인터셉터 구현 클래스이다.

+ root-context.xml 파일의 내용은 JAVA 클래스인 DataAccessConfig.java 에서 설정했다

 

파일들 살펴보기 : 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.3.10.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>sbmember</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<name>sbmember</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<!-- jsp 파일을 사용하기 위한 의존 라이브러리-->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>
		
		<!-- jstl -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>	
		
		<!-- EMail -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-email</artifactId>
			<version>1.3.3</version>
		</dependency>
		
		<!-- fileupload -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.2</version>
		</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.4</version>
		</dependency>

		<dependency>
			<groupId>com.oracle.database.jdbc</groupId>
			<artifactId>ojdbc8</artifactId>
			<scope>runtime</scope>
		</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>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

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

</project>

- pom.xml 부분

		<!-- EMail -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-email</artifactId>
			<version>1.3.3</version>
		</dependency>
		
		<!-- fileupload -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.2</version>
		</dependency>

- 이메일을 보내기 위한 commons-email 과, 첨부파일 업로드를 위한 commons-fileupload 라이브러리 추가

 

파일들 살펴보기 : Mapper 파일 member.xml

- Spring 프로젝트 springboard 와 Mapper 파일 내용은 같다

 

파일들 살펴보기 : JAVA 파일들

- DataAccessConfig.java : root-context.xml 에서 bean 객체를 생성하는 내용이 이 클래스에 들어가있다


Spring Boot 의 인터셉터 처리하는 클래스

1. SessionChekInter.java : 인터셉터 구현 클래스, HandlerInterceptorAdapter 클래스를 상속

- Spring 프로젝트의 인터셉터 구현 클래스와 비슷하지만 Spring Boot 의 인터셉터 구현 클래스는 @Configuration 어노테이션이 붙는다는 점이 다르다

2. WebMvcConfig.java : servlet-context.xml 에서 인터셉터 매핑을 잡았던 내용이 이 클래스에 들어가있다

 

- SessionCheckInter.java

package com.example.demo.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

@Configuration
public class SessionCheckInter extends HandlerInterceptorAdapter {
	
	// preHandle(request,response,handler)메소드
	// 1.Controller에서 요청(*.do)을 받기 전에  preHandle()가 호출되어 가로채는 역할로 사용
	// 2.로그인 하지않고(세션이 없으면) 요청하면 로그인 폼으로 이동 하도록 해주는 역할
	public boolean preHandle(HttpServletRequest request, 
			HttpServletResponse response, Object handler) throws Exception {
		HttpSession session = request.getSession();
		String id = (String)session.getAttribute("id");
		if (id == null || id.equals(""))  {		
			response.sendRedirect("member_login.do");	// 세션이 없으면 로그인 폼으로 이동
			return false;
		}
		return true;
	}
}

- Spring Boot 프로젝트의 인터셉터 구현 클래스는 @Configuration 어노테이션이 붙는다

- 그리고 WebMvcConfig 클래스에서 인터셉터 매핑을 잡는다

 

- WebMvcConfig.java

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
	@Autowired
	private SessionCheckInter interceptor;

	// 인터셉터가 동작할 url 패턴 등록
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(interceptor)
				.addPathPatterns("/member_edit.do")
				.addPathPatterns("/member_edit_ok.do")
				.addPathPatterns("/member_del.do")
				.addPathPatterns("/member_del_ok.do")
				.addPathPatterns("/member_logout.do");
	}

}

- servlet-context.xml 에서 인터셉터 매핑을 잡았던 내용이 이 클래스에 들어가있다

1. 인터페이스 WebMvcConfigurer 를 상속받아서 구현한다

2. @Autowired 어노테이션으로 인터셉터 구현 클래스인 SessionCheckInter 객체를 주입받는다

3. addInterceptor() 메소드를 오버라이딩 함

4. addPathPatterns() 메소드로 매핑을 잡을 요청명을 추가함

- 로그인 된 경우에만 수행되어야하는 기능인 수정, 삭제, 로그아웃 에 대한 매핑을 잡아뒀다, 


Spring Boot 의 DB 연동 하는 클래스

1. DataAccessConfig.java : root-context.xml 에서 bean 객체를 생성하는 내용이 이 클래스에 들어가있다

2. application.properties : DB 연동을 위한 정보들이 있는 파일

 

- DataAccessConfig.java

package com.example.demo.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@Configuration
@PropertySource("classpath:/application.properties")          
public class DataAccessConfig {
	
	@ConfigurationProperties(prefix = "spring.datasource")    
	public DataSource dataSource() {
		return DataSourceBuilder.create().build();
	}
	
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
		SqlSessionFactoryBean factoryBean=new SqlSessionFactoryBean();
		
		factoryBean.setDataSource(dataSource);
		factoryBean.setMapperLocations(
				new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*.xml")
				);
		factoryBean.setTypeAliasesPackage("com.example.demo.model"); // DTO Alias 설정
		return factoryBean.getObject();
	}
	
	@Bean
	public SqlSessionTemplate sessionTemplate(SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

- 이 클래스에서 bean 객체를 차례로 생성하면서 DB 연결을 하고 있다

- Mapper 의 Location 을 여기서 설정 했다

 

- application.properties

# port 
server.port=80

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

# oracle
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=spring
spring.datasource.password=spring123

# mybatis
mybatis.config-location=classpath:mybatis-config.xml
mybatis.mapper-locations=classpath:mapper/*.xml

# fileupload
spring.servlet.multipart.enabled:true
#spring.servlet.multipart.maxFileSize=50MB
#spring.servlet.multipart.maxRequestSize=50MB
spring.servlet.multipart.max-request-size:10MB
spring.servlet.multipart.max-file-size:20MB

- # mybatis 아래의 두 코드는 삭제해도 된다, Mapper 파일의 경로 설정은 이미 DataAccessConfig.java 에서 했고, mabatis-config.xml 파일은 아무 기능이 없다

- # fileupload 아래의 코드에서 업로드할 파일의 크기를 제한하고 있다, 하지만 여기서만 파일크기를 제한하면 더 큰 파일을 업로드하려할때 오류를 발생시킨다

- 파일 크기 제한은 Controller 클래스에서 해야한다

- MemberController.java 부분


Spring Boot 의 Alias 설정하는 파일

1. DataAccessConfig.java 에서 DTO 가 저장된 패키지의 경로를 설정

2. 개별 DTO 클래스 위에 @Alias 사용


Spring Boot 의 기능별 설정 파일 정리

- 인터셉터 처리 파일 : SessionCheckInter.java + WebMvcConfig.java 

- DB 연동 처리 파일: application.properties + DataAccessConfig.java

- Alias 설정 파일 : DataAccessConfig.java + 개별 DTO 클래스


static 폴더

- Spring Boot 에서 지원

- static 폴더 안에 들어가는 파일은 공유가 된다

- CSS, JS, 이미지 등 View 파일에서 사용할 파일들을 여기 저장

- 절대경로로 static 폴더 하위폴더부터 순서대로 작성해서 불러올 수 있다


프로젝트 sbmember : DTO 클래스

- MemberBean.java

package com.example.demo.model;

import org.apache.ibatis.type.Alias;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Alias("member")
public class MemberBean {

	private int join_code;
	private String join_id;
	private String join_pwd;
	private String join_name;
	private String join_zip1;
	private String join_zip2;
	private String join_addr1;
	private String join_addr2;
	private String join_tel;
	private String join_phone;
	private String join_email;
	private String join_profile;
	private String join_regdate;
	private int join_state;
	private String join_delcont;
	private String join_deldate;
	
}

- @Getter, @Setter, @Alias 사용

- @Getter, @Setter 어노테이션을 쓰기 위해 pom.xml 에 lombok 라이브러리를 추가했다

- @Alias 어노테이션은 MyBatis 지원 클래스인 Alias 를 import 해야 사용가능하다

- DataAccessConfig.java 에서 DTO 경로를 설정했고, Mapper 파일도 불러오므로 여기서 설정한 @Alias("member") 를 Mapper 파일에서 사용 가능하다

 

- DataAccessConfig.java 부분


프로젝트 sbmember : 프로젝트 실행


Spring Boot 의 요청

- 요청이름값에서 확장자 (ex) .do) 는 있어도 되고 없어도 된다

- Spring Boot 에서는 Dispatcher Servlet 매핑을 하지 않으므로, 모든 요청이 Dispatcher Servlet 으로 간다

- 그래서 Spring Boot 에서는 Contorller 의 @RequestMapping 과 같은 이름값인 한 무조건 Controller 클래스까지 찾아간다


static 폴더 안의 JS 파일 불러오기

- member_join.jsp 부분

- Spring 에서는 Controller 클래스를 거치며 왔다갔다 이동하는 동안 경로가 계속해서 바뀌어서 절대경로만으로 경로를 설정했다

- Spring Boot 에서는 static 폴더에 CSS, JS, 이미지 등을 넣고, static 폴더 하위의 폴더부터 경로를 작성함으로서 쉽게 경로를 설정 가능

ex) 위 코드에서 ./js/member.js 로 static/js 하위의 member.js 파일을 불러오고 있다


- 그 외는 Spring 프로젝트 springmember 부분을 보기

- 위의 환경설정을 제외한 나머지는 Spring 프로젝트 springmember 와 같은 내용이다

https://laker99.tistory.com/m/149

 

코딩 75 일 / 2022.10.11 / Spring MVC 게시판 프로젝트, 이메일 전송하기, Spring MVC 회원관리 프로그램

게시판 직접 만들어보기 (이어서) 환경 설정 파일 작성(세팅) 순서 1) pom.xml 2) web.xml 3) servlet-context.xml 4) configuration.xml 5) board.xml 6) root-context.xml - 4), 5), 6) 은 DB 연동 관련 내용 - configuration.xml, board,x

laker99.tistory.com


 

+ Recent posts