[Spring] Spring을 통한 자동 의존성 주입(코드 작성 순서)

류넹·2024년 2월 20일
1

Spring

목록 보기
7/50

📌 애플리케이션의 확장성을 높이는 방법

  1. 자신이 사용할 객체를 자신이 결정(생성)하지 않는다.
  2. 인터페이스를 이용한 느슨한 결합을 유도한다.
  3. 의존성 주입을 통해서 외부 모듈(제3자)로부터 자신이 사용할 객체를 주입받는다.
* 클래스가 클래스를 의존하는 경우 : 결합이 높다.
* 클래스가 인터페이스를 의존하는 경우 : 결합이 낮다.





자동 의존성 주입

  • 스프링 컨테이너가 객체를 생성할 클래스를 자동으로 감지하도록 하기
    @Component
    @Controller
    @RestController
    @ControllerAdvice
    @RestControllerAdvice
    @Service
    @Repository




1. Dao 생성 - @Repository

  • 1) Service에서 선언할 인터페이스 생성
  • 2) 위의 인터페이스를 구현할 Class를 생성 - @Repository
// 1. 인터페이스 생성 (확장성을 위해서는 인터페이스 필수)
public interface UserDao {

	void insertUser();
	void updateUser();
	void getUser();
}

// 2. 인터페이스를 구현할 Class
@Repository
public class UserJdbcDao implements UserDao {

	@Override
	public void insertUser() {
		System.out.println("jdbc 기술로 사용자 지정하기");
	}
	
	@Override
	public void updateUser() {
		System.out.println("jdbc 기술로 사용자 수정하기");
	}
	
	@Override
	public void getUser() {
		System.out.println("jdbc 기술로 사용자 조회하기");
	}
}

2. Service 생성 - @Service, @Autowired

@Service
public class UserService {
	
	// 1. 조립하고 싶은 Dao 타입 지정 및 멤버변수 선언
	@Autowired
	private UserDao userDao;
	
	// 2. 조립할 준비 (Setter 메소드 생성)
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	
	// 3. 사용할 메소드 정의
	public void 회원가입() {
		userDao.getUser();
		userDao.insertUser();
	}
}

3. pom.xml - 환경설정 정의

  • 1) 프로젝트 정보 정의
  • 2) 프로젝트 관련 속성값 정의
  • 3) 프로젝트의 라이브러리 의존성 정의
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

	<!--
		프로젝트 정보
			groupId : 프로젝트를 생성한 그룹명. 주로 회사나 단체의 URL을 사용
			artifactId : 실제 프로젝트의 이름
			version : 프로젝트의 버전정보
			packaging : 프로젝트를 어떤 식으로 패키징할지 지정(jar, war, zip 등)
	-->
    <groupId>kr.co.jhta</groupId>
    <artifactId>spring-ioc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	
	<!-- 
		프로젝트 관련 속성값 정의
			프로젝트의 자바 버전 설정
			pom.xml 파일 내에서 사용하는 속성값을 정의
	-->
	<properties>
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.source>11</maven.compiler.source>
    </properties>

	<!-- 
		프로젝트의 라이브러리 의존성을 정의
	-->
	<dependencies>
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-context</artifactId>
		    <version>5.3.31</version>
		</dependency>
	</dependencies>
</project>

4. context-autowired.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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    
    <!-- 
    	스프링 컨테이너가 클래스를 스캔해서 자동으로 객체 생성시키기
    	
    	<context:component-scan />
    		- 위의 태그를 스프링 설정파일에 추가하면 스프링 컨테이너는 클래스를 자동으로 감지해서 객체를 생성한다.
    		- 위의 태그를 스프링 설정파일에 추가하면 @Component, @Service, @Repository, @Controller, @RestController 등의
    		  어노테이션이 부착된 클래스를 스캔해서 객체를 생성한다.
    		  
    		base-package : 클래스를 스캔할 패키지명을 지정한다. 패키지가 여러 개일 때는 ,로 구분해서 여러개를 적을 수 있다.
     -->
	<context:component-scan base-package="autowired" />
    
</beans>

5. App에서 사용

public class App {

	public static void main(String[] args) {
		
		// ClassPathXmlApplicationContext() : 스프링 컨테이너에게 context-autowired.xml라는 환경설정파일을 알려줌
		ApplicationContext ctx = new ClassPathXmlApplicationContext("context-autowired.xml");
		
		// getBean : 객체 꺼내옴
		UserDao userDao = ctx.getBean(UserDao.class);
		UserService userService = ctx.getBean(UserService.class);
		
		System.out.println(userDao);
		System.out.println(userService);
		
		userService.회원가입();
        // 출력 결과
        // autowired.UserJdbcDao@72035809
		// autowired.UserService@909217e
		// jdbc 기술로 사용자 조회하기
		// jdbc 기술로 사용자 지정하기
	}
}
profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글