Jam's story
[Spring] 스프링 5.0 의존성주입 본문
1️⃣레거시로 프로젝트를 생성
2️⃣pom.xml에서 스프링 버전을 5로 생성
<name>ex00</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.8</java-version>
<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
완료 후에 Maven Dependencies에 라이브러리들이 다운로드 잘 되었는지 확인
3️⃣pom.xml에서 maven-compiler-plugin
자바 버전 1.8로 바꾸기
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
4️⃣롬복 라이브러리 설치
https://projectlombok.org/download
설치화면이 떠서 이클립스 폴더를 잡아주면 이클립스 폴더에 lombok라이브러리가 추가되어있다.
지금까지한 레거시프로젝트는 xml 기반
Configuration 기반으로한 jex00 프로젝트를 만들어보자
1️⃣xml 파일 삭제
2️⃣ pom.xml 수정
<java-version>1.8</java-version>
<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
3️⃣RootConfig.java
package org.zerock.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RootConfig {
}
4️⃣ WebConfig.java
package org.zerock.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] {RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
// TODO Auto-generated method stub
return null;
}
@Override
protected String[] getServletMappings() {
// TODO Auto-generated method stub
return null;
}
}
5️⃣pom.xml에 롬복라이브러리 추가
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
예제 클래스 생성
@Data - > setter ,getter, toString() , 생성자등을 자동으로 생성하도록 하는 어노태이션
(@ToString , @AllArgsConstructor 자동으로 생성자추가 @Data로 한번에 다 만들 수 있다. )
@Setter는 자동으로 setChef()를 컴파일 시에 생성
@Componet 스프링에서 객체로 만들어서 관리하는 대상임을 명시
@ComponentScan을 통해서 @Component가 존재하는 클래스들을 객체로 생성해서 빈으로 관리
@Autowired 자신이 특정한 객체에 의존적이므로 자신에게 해당 타입의 빈을 주입해주라는 표시
@Configuration 수동으로 스프링 컨테이너에 빈을 등록, 설정파일이야 ~ , Bean 등록할꺼야 ~ 라는 뜻
Restaurant 객체는 Chef 객체를 필요로 하는 상황 = Chef에 의존적
1️⃣Chef.java( 원래는 인터페이스로 설정해야 좋다. )
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component
@Data
public class Chef {
}
2️⃣ Restaurant.java
package org.zerock.sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Component
@Data
/*
* @ToString
*
* @AllArgsConstructor
*
* @Getter
*
* @Setter
*/
public class Restaurant {
//setter로 자동주입받겠다는 것
@Setter(onMethod_ =@Autowired )
private Chef chef;
}
3️⃣root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="org.zerock.sample"></context:component-scan>
</beans>
component-scan으로 명시된 패키지의 하위패키지까지 @Component가 있는 곳을 스캔한다.
Restaurant에 @Component가 있고 Chef 객체가 필요하다는 @Autowired 설정이 있으므로 ,Chef 객체의 레퍼런스를 Restaurant에 주입시킨다.
✨root-context.xml에 설정하는이유 -> 부모공장- 모든 컨트롤러가 거치는곳,
이 공장에서 빈 객체가 만들어지면, 모든 곳에서 같이 쓸 수 있는 빈 객체라는것
📌Junit 테스트 해보기
package org.zerock.sample;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
//p.62
//현재 테스트 코드가 스프링을 실행하는 역할을 할 것
@RunWith(SpringJUnit4ClassRunner.class)
//스프링의 빈으로 등록
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j //로그 출력
public class SampleTests {
// @Autowired
@Setter(onMethod_ = @Autowired )
private Restaurant restaurant;
// setter
@Test
public void test() {
// Restaurant, Chef 스프링 빈 생성 + 주입 확인
assertNotNull(restaurant); //NULL이 아니어야만 테스트가 성공함
log.info(restaurant);
log.info("------------------------------");
log.info(restaurant.getChef());
}
/*
INFO : org.zerock.sample.SampleTests - Restaurant(chef=Chef())
INFO : org.zerock.sample.SampleTests - ------------------------------
INFO : org.zerock.sample.SampleTests - Chef()
*/
}
xml말고 java설정을 이용하는 의존성 주입
3️⃣-1️⃣RootConfig
package org.zerock.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages= {"org.zerock.sample"})
public class RootConfig {
}
스프링 4.3부터는 @Autowired 없이 묵시적으로 생성자 주입이 가능하다 .
만일 여러개의 인스턴스 변수들중에서 특정한 변수에 대해서만 생성자를 작성하고 싶다면 @NonNull @RequiredArgsConstrunctor
ojdbc 추가
JDBC 테스트
package org.zerock.persistence;
import static org.junit.Assert.*;
import java.sql.Connection;
import java.sql.DriverManager;
import org.junit.Test;
import lombok.extern.log4j.Log4j;
@Log4j
public class JDBCTests {
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
@Test
public void testConnection() {
try(Connection con = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe"
, "scott"
, "tiger")){
log.info( con);
// INFO : org.zerock.persistence.JDBCTests - oracle.jdbc.driver.T4CConnection@27f674d
}catch (Exception e) {
e.printStackTrace();
}
}
}
커넥션풀 설정
pom.xml
<!-- p.83 https://github.com/brettwooldridge/HiKariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.2</version>
</dependency>
root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- p 58 -->
<context:component-scan base-package="org.zerock.sample" />
<!-- p 84 -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<!-- mybatis 로그처리 -->
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:xe"></property>
<!-- p.102 log4jdbc-log4j2 설정 때문에 변경
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
-->
<property name="username" value="scott"></property>
<property name="password" value="tiger"></property>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig"></constructor-arg>
</bean>
</beans>
📌root-context.xml은 스프링이 로딩되면서 읽어 들이는 문서로 , 이미 만들어진 클래스들을 이용해서 스프링의 빈으로 등록할때 사용한다. 외부 jar파일 등으로 사용하는 클래스들은 bean 태그를 이용해서 작성하는 경우가 대부분
DataSourceTest.java
package org.zerock.persistence;
import static org.junit.Assert.fail;
import java.sql.Connection;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class DataSourceTests {
@Setter(onMethod_ = { @Autowired })
private DataSource dataSource;
@Test
public void testConnection() {
try ( Connection con = dataSource.getConnection() ){
log.info(con);
// INFO : org.zerock.persistence.DataSourceTests - HikariProxyConnection@1330400026 wrapping oracle.jdbc.driver.T4CConnection@6a8658ff
}catch(Exception e) {
fail(e.getMessage());
}
}
}
eclipse.ini
-startup
plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.400.v20211117-0650
-product
org.eclipse.epp.package.jee.product
-showsplash
org.eclipse.epp.package.common
--launcher.defaultAction
openFile
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vm
plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.1.v20211116-1657/jre/bin
-vmargs
-Dosgi.requiredJavaVersion=11
-Dosgi.instance.area.default=@user.home/eclipse-workspace
-Dsun.java.command=Eclipse
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM
-Dosgi.requiredJavaVersion=11
-Dosgi.dataAreaRequiresExplicitInit=true
-Dorg.eclipse.swt.graphics.Resource.reportNonDisposed=true
-Xms256m
-Xmx2048m
--add-modules=ALL-SYSTEM
-javaagent:C:\javadev\eclipse-jee-2021-06-R-win32-x86_64\eclipse\lombok.jar
'Spring' 카테고리의 다른 글
[게시판 프로젝트] 요구사항 (0) | 2022.08.03 |
---|---|
[Spring] MyBatis (0) | 2022.07.25 |
[Spring] Spring과 MyBatis (0) | 2022.07.22 |
[Spring] 스프링시큐리티 - 로그인 (0) | 2022.07.21 |
[Spring] 스프링 레거시 프로젝트 4.0버전 (0) | 2022.07.20 |