1. SPRING 기본 설정
2. JAVA Configuration 설정 파일 생성
1) xml설정 파일 삭제
1.1) web.xml과 WEB-INF - spring폴더(servlet-context.xml, root-context.xml) 삭제
1.2) pom.xml에 web.xml이 없다는 설정 추가
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
2) RootConfig.java 생성 (root-context.xml을 대신함)
: 객체(Bean)를 설정하는 파일이다.
Spring Framework가 실행되면 스프링이 사용하는 메모리 영역인 Context를 만들고, ApplicationContext라는 객체가 만들어진다.
root- context의 ComponentScan 파일 위치를 scan하고, @Component가 존재하는 클래스의 인스턴스를 생성한다. SPRING 의존성 주입 설정
src/main/java - config패키지 생성 - RootConfig.java 클래스 생성
package com.toy.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RootConfig {
}
3) WebConfig.java 생성 및 RootConfig.class 사용 설정 + spring 기본 경로 지정
: WebConfig는 스프링 구동과 관련된 파일이다. (web.xml를 대신함)
3.1) src/main/java - config - WebConfig.java 생성 - 추상 클래스 AbstractAnnotationConfigDispatcherServletInitializer 상속
package com.toy.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
// TODO Auto-generated method stub
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
// TODO Auto-generated method stub
return null;
}
@Override
protected String[] getServletMappings() {
// TODO Auto-generated method stub
return null;
}
}
3.2) RootConfig.class 사용 설정
WebConfig.java - getRootConfigClasses() 수정
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {RootConfig.class};
}
3.3) springMVC 기본 경로 설정
WebConfig.java - getServletMappings() 수정
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
+ 프로젝트 경로 설정
server - tomcat 더블클릭 - Modules - edit - path 수정
4) ServletConfig.java 생성 (servlet-context.xml을 대신함)
: 여기서는 @EnableWebMvc와 WebMvcConfigurer 인터페이스를 구현하는 방식을 사용한다.
src/main/java - config - ServletConfig.java 생성
package com.toy.config;
import org.springframework.context.annotation.ComponentScan;
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.toy.controller" })
public class ServletConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver bean = new InternalResourceViewResolver();
bean.setViewClass(JstlView.class);
bean.setPrefix("/WEB-INF/views/");
bean.setSuffix(".jsp");
registry.viewResolver(bean);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
}
5) ServletConfig.class 사용 설정
WebConfig.java - getServletMappings() 변경
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {ServletConfig.class};
}
3. 오라클 db 연동
3.1. JDBC연결
1) pom.xml에 jdbc 라이브러리 추가
Oracle
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.1.0.0</version>
</dependency>
MySQL
<!-- mySQL jdbc연결 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
+ JDBC 드라이버를 프로젝트 경로에 포함되도록 설정
Java Build Path - add external library - sqldeveloper - product - lib - ojdbc jar 파일
Java Build Path - add external library - MySQL - Connector J - mysql-connector-j jar 파일
3.2 커넥션풀 설정
1) pom.xml에 hikari 라이브러리 추가
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.7.4</version>
</dependency>
2) DataSource설정
RootContig.java에 코드 추가
package com.toy.config;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
@Configuration
@ComponentScan(basePackages= {"com.toy.sample"})
public class RootConfig {
@Bean
public DataSource dataSource() {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName("oracle.jdbc.driver.OracleDriver");
hikariConfig.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
hikariConfig.setUsername("book_ex");
hikariConfig.setPassword("book_ex");
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
return dataSource;
}
}
4. mybatis와 스프링 연동
4.1 mybatis
: SQL mapping Framework이다.
JDBC의 PreparedStatement를 활용하며 파라미터를 처리하는 '?'는 '#{속성}'을 이용한다.
JDBC 코드의 복잡한 작업을 줄이고 기존의 SQL을 그대로 활용할 수 있어 진입장벽이 낮다.
1) mybatis 관련 라이브러리 추가
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
2) SQLSessionFactory 설정
: 내부적으로 SQLSession을 만들어내고 이를 통해 Connection을 생성하거나 SQL을 전달하고 결과를 리턴 받는 구조로 작성한다.
RootConfig.java에 추가
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource());
return (SqlSessionFactory) sqlSessionFactory.getObject();
}
4.2 스프링 연동
: SQLSessionFactory로 직접 JDBC코딩이 가능하지만, MyBatis의 Mapper를 통해 SQL을 설정하고 자동으로 처리되도록 하는 방식이 더 편리하다.
: Mapper interface(@Select("쿼리문"))만 사용하는 방법과 Mapper interface(메소드선언)+XML(쿼리문작성)을 함께 쓰는 방법이 있다.
1) Mapper 인터페이스만 사용
src/main/java - mapper 패키지 생성 - 인터페이스 생성 - 어노테이션 및 쿼리문 작성
package com.toy.mapper;
import org.apache.ibatis.annotations.Select;
public interface TimeMapper {
@Select("SELECT sysdate FROM dual")
public String getTime();
}
- Mapper인식 설정
: Mybatis가 동작할 때 자동으로 해당 패키지를 인식해 Mapper를 인식하도록 한다.
RootConfig.java에 @MapperScan 추가
@Configuration
@ComponentScan(basePackages= {"com.toy.sample"})
@MapperScan(basePackages= {"com.toy.mapper"})
public class RootConfig {
2) Mapper 인터페이스와 XML 매퍼 같이 쓰기
: SQL이 복잡할 경우 어노테이션보다 XML을 이용하는 방식이 선호된다.
: Mapper 인터페이스에 메소드를 선언하고, XML에서 SQL을 처리한다.
2.1) Mapper 인터페이스 - 메소드 선언
package com.toy.mapper;
import org.apache.ibatis.annotations.Select;
public interface TimeMapper {
public String getTime2();
}
2.2) XML - SQL처리
: myBatis 태그를 추가하고 <mapper>태그 내에 sql문을 작성한다.
: Mapper인터페이스와 동일한 이름의 namespace가 존재하면 둘을 병합처리한다.
Mapper 인터페이스가 위치한 곳 또는 src/main/resources - 인터페이스 폴더명 생성(상위 폴더부터 각각 만들기. com폴더 -> toy폴더 -> mapper폴더) - XML파일 생성 - myBatis 태그를 추가 - <mapper> 태그안에 sql문 작성
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.toy.mapper.TimeMapper">
<select id="getTime2" resultType="string">
SELECT sysdate FROM dual
</select>
</mapper>
4) log4jdbc-log4j2 설정
: JDBC의 PreparedStatement에 사용된 '?'가 어떤 값으로 처리됐는지 확인한다.
: 쿼리를 더 자세하게 SQL log로 보여준다.
4.1) pom.xml에 라이브러리 추가
<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
4.2) 로그 설정 파일 추가
src/main/resources - log4jdbc.log4j2.properties 생성
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
4.3) JDBC연결 정보 수정 (JDBC드라이버와 URL 변경)
RootConfig.java 수정 - oracle
@Bean
public DataSource dataSource() {
HikariConfig hikariConfig = new HikariConfig();
// hikariConfig.setDriverClassName("oracle.jdbc.driver.OracleDriver");
// hikariConfig.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
hikariConfig.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy");
hikariConfig.setJdbcUrl("jdbc:log4jdbc:oracle:thin:@localhost:1521:XE");
hikariConfig.setUsername("book_ex");
hikariConfig.setPassword("book_ex");
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
return dataSource;
}
RootConfig.java 수정 - MySQL
@Bean
public DataSource dataSource() {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy");
hikariConfig.setJdbcUrl("jdbc:log4jdbc:mysql://127.0.0.1:3306/toy");
hikariConfig.setUsername("toy");
hikariConfig.setPassword("toy");
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
return dataSource;
}
4.4) 로그 경로 및 레벨 확인
src/test/resources - log4j.xml
<!-- Application Loggers -->
<logger name="com.toy">
<level value="info" />
</logger>
5. 추가
+ UTF-8 필터 (브라우저 한글 문제 발생 시)
: WebConfig.java에 추가
import javax.servlet.Filter;
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
return new Filter[] {encodingFilter};
}
+ 파일 업로드 commons-fileupload라이브러리 (servlet2.5) (servlet3.0, tomcat7.0이상은 필요X)
1) pom.xml에 dependency 추가
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
2) ServletConfig.java에 코드 추가
@Bean(name="multipartResolver")
public CommonsMultipartResolver getResolver() throws Exception{
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
// 10MB
resolver.setMaxUploadSize(1024*1024*10);
// 2MB
resolver.setMaxUploadSizePerFile(1024*1024*2);
// 1MB
resolver.setMaxInMemorySize(1024*1024);
// temp upload
resolver.setUploadTempDir(new FileSystemResource("C:\\upload\\temp"));
resolver.setDefaultEncoding("UTF-8");
return resolver;
}
ex)
@GetMapping("/exUploadForm")
public void exUploadForm() {
log.info("/exUpload...");
}
//name = files로 여러 파일을 다중 업로드했기때문에 MultipartFile타입 배열로 처리한다.
//예시에는 없지만 추가로 byte[]처리를 해야 업로드가 완료된다
@GetMapping("exUploadPost")
public void exUploadPost(ArrayList<MultipartFile> files) {
files.forEach(file -> {
log.info("--");
log.info("name:" + file.getOriginalFilename());
log.info("size:" + file.getSize());
});
}
'SPRING' 카테고리의 다른 글
SPRING 의존성 주입 (0) | 2023.02.08 |
---|---|
SPRING 테스트 코드 작성 (0) | 2023.02.07 |
SPRING 설정 (XML) (0) | 2023.02.04 |
SPRING 파일 업로드 다운로드 (0) | 2023.01.17 |
SPRING 페이징 처리 (pagination) (0) | 2022.11.30 |