Spring/Spring 공부

[spring] security 1.com.myweb.www.config설정

congs 2023. 6. 22. 15:21

1.  필요한 package 생성

  1. com.myweb.www.config  : 여기서 web.xml, root-context 설정 할 예정
  2. com.myweb.www.controller ( com.myweb.www.ctrl 로도 생성多 ) : HomeController도 이 폴더안에 넣기
  3. com.myweb.www.domain
  4. com.myweb.www.repository ( com.myweb.www.dao 로도 생성多 )
  5. com.myweb.www.service

 

 


 

2. src - main - webapp - WEB-INF - spring폴더, web.xml 삭제

           (  com.myweb.www.config 폴더에서 할 예정이라 사용 X )

 

 


 

3. com.myweb.www.config폴더 안에 class들 생성

 

1 )  WebConfig  : web.xml 대신! 

  1. extends AbstractAnnotationConfigDispatcherServletInitializer
  2. 마우스 우클릭 - source - override/implement method.. 
    1. getRootConfigClasses
    2. getServletConfigClasses
    3. getServletFilters
    4. customizeRegistration
package com.myweb.www.config;

import javax.servlet.Filter;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration.Dynamic;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer { //web.xml 대신

	@Override
	protected Class<?>[] getRootConfigClasses() {
		// TODO Auto-generated method stub
		return new Class[] {RootConfig.class, SecurityConfig.class};
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		// TODO Auto-generated method stub
		return new Class[] {ServletConfiguration.class};
	}

	@Override
	protected String[] getServletMappings() {
		// TODO Auto-generated method stub
		return new String[] {"/"}; //HomeController로 이동하도록 
	}

	@Override
	protected Filter[] getServletFilters() {
		// encoding filter 설정
		CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter(); //인코딩 필터의 객체 생성
		encodingFilter.setEncoding("UTF-8");//객체가 들어오는 인코딩 설정
		encodingFilter.setForceEncoding(true);//객체가 외부로 나가는 인코딩 설정을 할까요? 네! (boolean으로 설정)
		return new Filter[] {encodingFilter};//객체 리턴
	}

	@Override
	protected void customizeRegistration(Dynamic registration) {
		// 커스터마이징하는 경우 래지스터 ( 파일 첨부관련 업로드 설정시 사용)
		//throwExceptionIfNotHandlerFound: (핸들러가 존재하지 않습니다) = 존재하지 않는 API요청에 대한 응답
		registration.setInitParameter("throwExceptionIfNotHandlerFound", "true");
		
		//파일첨부
		String uploadLocation = "D:\\_myweb\\_java\\_fileUpload";
		int maxFileSize = 1024*1024*2; //2M
		int maxReqSize = maxFileSize*5; //10M 파일요청의 최대크기
		int fileSizeThreshold = maxFileSize; //파일 전송시 만들어지는 임시 공간
		MultipartConfigElement multipartConfigElement 
			= new MultipartConfigElement(uploadLocation, maxFileSize, maxReqSize, fileSizeThreshold);
		registration.setMultipartConfig(multipartConfigElement);
		
	} 

}

 

2 ) SecurityConfig

package com.myweb.www.config;

public class SecurityConfig {

}

 

3 ) ServletConfiguration

  1.  implements WebMvcConfigurer
  2. 마우스 우클릭 - source -override/implement method..
    1. addResourceHandlers
    2. configureViewResolvers
package com.myweb.www.config;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;

import java.io.IOException;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.StandardServletMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@EnableWebMvc
@ComponentScan(basePackages = {"com.myweb.www.controller"})
public class ServletConfiguration implements WebMvcConfigurer{

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		// resource 경로 설정, 파일 upload 경로 설정
		// 화면에 나타나는 js, css, 파일등의 경로를 설정!
		registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
		registry.addResourceHandler("/upload/**").addResourceLocations("/file:///D:\\_myweb\\_java\\_fileUpload\\");
		
	}

	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		// prefix(/WEB-INF/views) / suffix(.jsp) 설정
		InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
		viewResolver.setViewClass(JstlView.class);
		viewResolver.setPrefix("/WEB-INF/views/");
		viewResolver.setSuffix(".jsp");
		registry.viewResolver(viewResolver);	
	}
	
	//MultipartResolver 설정 = file 업로드시 사용
	@Bean(name="multipartResolver")
	public MultipartResolver getMultipartResolver() throws IOException{
		StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
		return multipartResolver;
	}
	
}

 

4) RootConfig

package com.myweb.www.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@ComponentScan(basePackages = {"com.myweb.www"}) 
// (Component:사용자가 생성한) 스캔하기 위한 주소
// 패키지가 적은 경우에는 (basePackages = {"com.myweb.www.service", "com.myweb.www.controller"})으로 모두 적기도 가능
@MapperScan(basePackages = {"com.myweb.www.repository"})
public class RootConfig {

	@Autowired //inject과 동일 (inject는 내가 작성, autowired는 내가 작성x)
	ApplicationContext applicationContext;
	
	//DB설정
	//log4jdbc-log4j2 라이브러리 사용시, Driver "net.sf.log4jdbc.sql.jdbcapi.DriverSpy"
	
	@Bean //내가 작성시 comfonent (예를 들면 handler), 이미 제공되는 거라 가져오는 경우는 Bean
	public DataSource dataSource() {
		HikariConfig hikariConfig = new HikariConfig();
		
		hikariConfig.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy");
		hikariConfig.setJdbcUrl("jdbc:log4jdbc:mysql://localhost:3306/springtestdb");
		hikariConfig.setUsername("springuser");
		hikariConfig.setPassword("mysql");
		hikariConfig.setMinimumIdle(5); //DB에서 최소 유효한 커넥션의 개수
		
		hikariConfig.setConnectionTestQuery("SELECT now()"); //test쿼리문 설정
		hikariConfig.setPoolName("springHikariCP");
		
		//추가부분
		// cache 사용여부에 대한 설정
		hikariConfig.addDataSourceProperty("dataSource.cachePrepStmts", "true"); //캐시메모리를 사용O
		//mysql 드라이브가 연결당 cache할 statement의 관한 설정 (기본 25, 200-500이 권장사항)
		hikariConfig.addDataSourceProperty("dataSource.PrepStmtCacheSize", "200"); //200으로 설정
		//catch할 sql구문의 최대 길이
		hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSqlLimit", "true");
		//서버에서 지원받는 설정이 있다면 가능할지에 대한 부분 설정
		hikariConfig.addDataSourceProperty("dataSource.useServerPrepStmts", "true");
		
		HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
		return hikariDataSource;
		
		
	}
	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception {
		SqlSessionFactoryBean sqlFactoryBean = new SqlSessionFactoryBean();
		sqlFactoryBean.setDataSource(dataSource());
		//설정사항에 대한 경로 설정 (메인 리소스의 위치)
		sqlFactoryBean.setConfigLocation( 
				applicationContext.getResource("classpath:/MybatisConfig.xml")); 
		sqlFactoryBean.setMapperLocations(
				applicationContext.getResources("classpath:/mappers/*.xml"));
		return (SqlSessionFactory)sqlFactoryBean.getObject();
		
		
		
		
	}
	
	
	
	
	
	
	
	
}

 


 

4.  resource - META-INF폴더 안에 logback.xml 파일 생성

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<configuration debug="true">
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>
				%d %-5p: [%c] - %m%n
			</pattern>
		</encoder>
	</appender>
	
	<logger name="com.myweb.www" level="debug" appender-ref="STDOUT"></logger>
	<logger name="jdbc.sqlonly" level="info" appender-ref="STDOUT"></logger>
	<logger name="jdbc.resultsettable" level="info" appender-ref="STDOUT"></logger>
	<logger name="org.springframework" level="error" appender-ref="STDOUT"></logger>
	<logger name="org.springframework.jdbc" level="error" appender-ref="STDOUT"></logger>
	
	<root level="error">
		<appender-ref ref="STDOUT"/>
	</root>
</configuration>

 


 

5.  resource폴더에 mappers폴더 생성 +  MybatisConfig.xml 생성

       ( 단! MybatisConfig.xml은 mappers폴더 밖에 위치해야함!!! ) 

  • settings 생성
  • typeAliases 생성 : 바로 다음에 생성할 BoardVO 생성해놓기

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
	
	<typeAliases>
		<typeAlias type="com.myweb.www.domain.BoardVO" alias="bvo"/>
	</typeAliases>
</configuration>