Jam's story

[Spring] 스프링 5.0 의존성주입 본문

Spring

[Spring] 스프링 5.0 의존성주입

애플쩀 2022. 7. 24. 18:28

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에 라이브러리들이 다운로드 잘 되었는지 확인

5.0.7 에 맞게 다운로드 되어있다.

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
Comments