1. 필요한 package 생성
- com.myweb.www.config : 여기서 web.xml, root-context 설정 할 예정
- com.myweb.www.controller ( com.myweb.www.ctrl 로도 생성多 ) : HomeController도 이 폴더안에 넣기
- com.myweb.www.domain
- com.myweb.www.repository ( com.myweb.www.dao 로도 생성多 )
- 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 대신!
- extends AbstractAnnotationConfigDispatcherServletInitializer
- 마우스 우클릭 - source - override/implement method..
- getRootConfigClasses
- getServletConfigClasses
- getServletFilters
- 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
- implements WebMvcConfigurer
- 마우스 우클릭 - source -override/implement method..
- addResourceHandlers
- 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>
'Spring > Spring-eclipse' 카테고리의 다른 글
[spring] security 2. Board list 게시판 리스트 (2) | 2023.06.23 |
---|---|
[spring] security 2. Board register 게시판 작성 + 저장 (0) | 2023.06.22 |
[spring] security 0. DB생성, pom.xml작성 (0) | 2023.06.22 |
[spring] 파일 입출력 (0) | 2023.06.13 |
[spring] 댓글 2. 댓글 출력 (0) | 2023.06.12 |