SPRING

SPRING 설정 (JAVA Configuration)

Adev 2023. 2. 6. 00:01

1. SPRING 기본 설정

SPRING 기본설정 (XML, JAVA 공통)

 


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