본문 바로가기
Programming/Spring Boot

의존성 설정

by yoon9i 2024. 7. 2.

7. 의존성 설정

- 구조

  DeptService
  @Service                                     @Repository
  DeptServiceImpl ---------------------------> DeptDAO

  DeptDAO dao;
  public DeptServiceImpl(DeptDAO dao) {
    this.dao = dao;
  }


1> 묵시적으로 설정방법
가. 생성자 이용(권장)

  DeptDAO dao;
  public DeptServiceImpl(DeptDAO dao) {
    this.dao = dao;
  }

  - 권장하는 방법임.
    권장하는 이유는 하나의 블럭에서 모든 주입이 완료됨.
            또한 주입받는 시점이 생성시점이기 때문에 @Autowired 보다 훨씬 빠름.
  - 기본생성자는 반드시 없어야 됨.

 

<생성자 이용1>

package com.exam;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import com.exam.service.DeptServiceImpl;

@SpringBootApplication
public class Application implements CommandLineRunner {
	
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	
	// IoC Container 참조
	Logger logger = LoggerFactory.getLogger(getClass());
	
	ApplicationContext ctx;
	
	// 생성자 주입
	public Application(ApplicationContext ctx) {
		logger.info("logger:ApplicationContext:{}", "Application 생성");
		this.ctx = ctx;
	}

	@Override
	public void run(String... args) throws Exception {
		// TODO Auto-generated method stub
		logger.info("logger:ApplicationContext:{}", ctx);
		
		// 빈참조
		DeptServiceImpl service = ctx.getBean("xxx",DeptServiceImpl.class);
		
		List<String> list = service.list();
		logger.info("list:{}", list);
	}

}
package com.exam.dao;

import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

// Spring Bean
// @Configuration // 생성됨
// @Component // 생성됨
// @Repository // 생성됨
//@Service // 생성됨
// @Controller // 생성됨

//@Repository
//DeptDAO 변수명 = new DeptDAO();
//@Component("dao")
@Repository("dao")
public class DeptDAO {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	public DeptDAO() {
		logger.info("logger: {}", "DeptDAO 생성자");
	}
	
	public List<String> list() {
		return Arrays.asList("홍길동","이순신");
	}
	
	
}
package com.exam.service;

import java.util.List;

public interface DeptService {
	public List<String> list();
}
package com.exam.service;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.exam.dao.DeptDAO;

@Service("xxx")
public class DeptServiceImpl implements DeptService {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	DeptDAO deptDAO;
	
//	public DeptServiceImpl() {
//		logger.info("logger: {}", "DeptServiceImpl 기본생성자");
//	} 
	// 생성자 주입시 기본생성자를 만들면 사용해야할 
	// 생성자가 아닌 기본생성자로 주입하기때문에 주의할것.
	// 반드시 기본생성자는 없어야 된다.
	
	// 의존성 주입
	/*
	 * public DeptServiceImpl(DeptDAO deptDAO) {
	 * 	...
	 * 	this.deptDAO = deptDAO;
	 * }
	 */
	// 생성자 주입
	public DeptServiceImpl(DeptDAO deptDAO) {
		logger.info("logger: {}", "DeptServiceImpl 생성자");
		this.deptDAO = deptDAO;
	}

	@Override
	public List<String> list() {
		// TODO Auto-generated method stub
		return deptDAO.list();
	}
}
# application.properties
logging.level.org.springframework=info
<?xml version="1.0" encoding="UTF-8"?>
<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 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.18</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.exam</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 

<생성자 이용2 - multi>

package com.exam;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import com.exam.service.DeptServiceImpl;

@SpringBootApplication
public class Application implements CommandLineRunner {
	
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	
	// IoC Container 참조
	Logger logger = LoggerFactory.getLogger(getClass());
	
	ApplicationContext ctx;
	
	// 생성자 주입
	public Application(ApplicationContext ctx) {
		logger.info("logger:ApplicationContext:{}", "Application 생성");
		this.ctx = ctx;
	}

	@Override
	public void run(String... args) throws Exception {
		// TODO Auto-generated method stub
		logger.info("logger:ApplicationContext:{}", ctx);
		
		// 빈참조
		DeptServiceImpl service = ctx.getBean("xxx",DeptServiceImpl.class);
		
		List<String> list = service.list();
		logger.info("list:{}", list);
	}

}
package com.exam.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//DeptDAO 변수명 = new DeptDAO();
//@Component("dao")
@Repository("deptDAO")
public class DeptDAO {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	public DeptDAO() {
		logger.info("logger: {}", "DeptDAO 생성자");
	}
	
	public List<String> list() {
//		return Arrays.asList("홍길동","이순신"); // 크기변경이 안되는 list(고정길이 list)
		return new ArrayList( Arrays.asList("홍길동","이순신")); // 크기 변경이 되는 list 로 변경
	}
	
	
}
package com.exam.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//DeptDAO 변수명 = new DeptDAO();
//@Component("dao")
@Repository("empDAO")
public class EmpDAO {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	public EmpDAO() {
		logger.info("logger: {}", "EmpDAO 생성자");
	}
	
	public List<String> list() {
//		return Arrays.asList("유관순","강감찬"); // 크기변경이 안되는 list(고정길이 list)
		return new ArrayList( Arrays.asList("유관순","강감찬")); // 크기 변경이 되는 list 로 변경
	}
	
	
}
package com.exam.service;

import java.util.List;

public interface DeptService {
	public List<String> list();
}
package com.exam.service;

import java.util.ArrayList;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.exam.dao.DeptDAO;
import com.exam.dao.EmpDAO;

@Service("xxx")
public class DeptServiceImpl implements DeptService {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	DeptDAO deptDAO;
	EmpDAO empDAO;

	// 생성자 주입
	public DeptServiceImpl(DeptDAO deptDAO, EmpDAO empDAO) {
		logger.info("logger: {}", "DeptServiceImpl 생성자");
		this.deptDAO = deptDAO;
		this.empDAO = empDAO;
	}

	@Override
	public List<String> list() {
		// TODO Auto-generated method stub
		List<String> deptList = deptDAO.list();
		List<String> empList = empDAO.list();
		boolean result = deptList.addAll((ArrayList<String>)empList); // 크기변경시도
		
		return deptList;
	}
}
# application.properties
logging.level.org.springframework=info
<?xml version="1.0" encoding="UTF-8"?>
<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 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.18</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.exam</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>



나. 어노테이션 이용
- @AutoWired

  ex>
       @Autowired
      DeptDAO deptDAO;

        @Autowired
      EmpDAO dao2;

 

<@Autowired 이용 1>

package com.exam;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import com.exam.service.DeptServiceImpl;

@SpringBootApplication
public class Application implements CommandLineRunner {
	
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	
	// IoC Container 참조
	Logger logger = LoggerFactory.getLogger(getClass());
	
	ApplicationContext ctx;
	
	// 생성자 주입
	public Application(ApplicationContext ctx) {
		logger.info("logger:ApplicationContext:{}", "Application 생성");
		this.ctx = ctx;
	}

	@Override
	public void run(String... args) throws Exception {
		// TODO Auto-generated method stub
		logger.info("logger:ApplicationContext:{}", ctx);
		
		// 빈참조
		DeptServiceImpl service = ctx.getBean("xxx",DeptServiceImpl.class);
		
		List<String> list = service.list();
		logger.info("list:{}", list);
	}

}
package com.exam.dao;

import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//DeptDAO 변수명 = new DeptDAO();
//@Component("dao")
@Repository("dao")
public class DeptDAO {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	public DeptDAO() {
		logger.info("logger: {}", "DeptDAO 생성자");
	}
	
	public List<String> list() {
		return Arrays.asList("홍길동","이순신");
	}
	
	
}
package com.exam.service;

import java.util.List;

public interface DeptService {
	public List<String> list();
}
package com.exam.service;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.exam.dao.DeptDAO;

@Service("xxx")
public class DeptServiceImpl implements DeptService {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	@Autowired
	DeptDAO deptDAO;
	
	@Override
	public List<String> list() {
		// TODO Auto-generated method stub
		return deptDAO.list();
	}
}
# application.properties
logging.level.org.springframework=info
<?xml version="1.0" encoding="UTF-8"?>
<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 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.18</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.exam</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 

<@Autowired 이용 2 - multi>

package com.exam;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import com.exam.service.DeptServiceImpl;

@SpringBootApplication
public class Application implements CommandLineRunner {
	
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	
	// IoC Container 참조
	Logger logger = LoggerFactory.getLogger(getClass());
	
	ApplicationContext ctx;
	
	// 생성자 주입
	public Application(ApplicationContext ctx) {
		logger.info("logger:ApplicationContext:{}", "Application 생성");
		this.ctx = ctx;
	}

	@Override
	public void run(String... args) throws Exception {
		// TODO Auto-generated method stub
		logger.info("logger:ApplicationContext:{}", ctx);
		
		// 빈참조
		DeptServiceImpl service = ctx.getBean("xxx",DeptServiceImpl.class);
		
		List<String> list = service.list();
		logger.info("list:{}", list);
	}

}
package com.exam.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//DeptDAO 변수명 = new DeptDAO();
//@Component("dao")
@Repository("deptDAO")
public class DeptDAO {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	public DeptDAO() {
		logger.info("logger: {}", "DeptDAO 생성자");
	}
	
	public List<String> list() {
//		return Arrays.asList("홍길동","이순신"); // 크기변경이 안되는 list(고정길이 list)
		return new ArrayList( Arrays.asList("홍길동","이순신")); // 크기 변경이 되는 list 로 변경
	}
	
	
}
package com.exam.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//DeptDAO 변수명 = new DeptDAO();
//@Component("dao")
@Repository("empDAO")
public class EmpDAO {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	public EmpDAO() {
		logger.info("logger: {}", "EmpDAO 생성자");
	}
	
	public List<String> list() {
//		return Arrays.asList("유관순","강감찬"); // 크기변경이 안되는 list(고정길이 list)
		return new ArrayList( Arrays.asList("유관순","강감찬")); // 크기 변경이 되는 list 로 변경
	}
	
	
}
package com.exam.service;

import java.util.List;

public interface DeptService {
	public List<String> list();
}
package com.exam.service;

import java.util.ArrayList;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.exam.dao.DeptDAO;
import com.exam.dao.EmpDAO;

@Service("xxx")
public class DeptServiceImpl implements DeptService {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	@Autowired
	DeptDAO deptDAO;
	
	@Autowired
	EmpDAO empDAO;

	// 생성자 주입
	public DeptServiceImpl(DeptDAO deptDAO, EmpDAO empDAO) {
		logger.info("logger: {}", "DeptServiceImpl 생성자");
		this.deptDAO = deptDAO;
		this.empDAO = empDAO;
	}

	@Override
	public List<String> list() {
		// TODO Auto-generated method stub
		List<String> deptList = deptDAO.list();
		List<String> empList = empDAO.list();
		boolean result = deptList.addAll((ArrayList<String>)empList); // 크기변경시도
		
		return deptList;
	}
}
# application.properties
logging.level.org.springframework=info
<?xml version="1.0" encoding="UTF-8"?>
<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 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.18</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.exam</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>


2> 명시적 설정 방법
- skip

3> 주입 가능한 타입이 여러개인 경우
- 기본적으로 에러발생됨(설정안할시).
- 해결:
  @Primary 또는 @Qualifier("빈이름")
  ex> @Primary 는 DAO 에

        @Primary // 우선권 부여 (방법1: DAO 에서 @Primary 어노테이션을 사용해서 우선권부여)
        public class EmpDAO implements CommonDAO {...}

      @Qualifier 는 Service 에

        public DeptServiceImpl(@Qualifier("deptDAO") CommonDAO commonDAO) {...}

      // 생성자 주입 이용
      public DeptServiceImpl(@Qualifier("deptDAO") CommonDAO commonDAO) {...}

      // @Autowired 이용
      @Autowired
      @Qualifier("empDAO")
      CommonDAO commonDAO;

 

<생성자 이용 3 - @Primary & @Qualifier >

package com.exam;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import com.exam.service.DeptServiceImpl;

@SpringBootApplication
public class Application implements CommandLineRunner {
	
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	
	// IoC Container 참조
	Logger logger = LoggerFactory.getLogger(getClass());
	
	ApplicationContext ctx;
	
	// 생성자 주입
	public Application(ApplicationContext ctx) {
		logger.info("logger:ApplicationContext:{}", "Application 생성");
		this.ctx = ctx;
	}

	@Override
	public void run(String... args) throws Exception {
		// TODO Auto-generated method stub
		logger.info("logger:ApplicationContext:{}", ctx);
		
		// 빈참조
		DeptServiceImpl service = ctx.getBean("xxx",DeptServiceImpl.class);
		
		List<String> list = service.list();
		logger.info("list:{}", list);
	}

}
package com.exam.dao;

import java.util.List;

// DeptDAO 와 EmpDAO 의 상위개념의 interface
public interface CommonDAO {
	public List<String> list();
}
package com.exam.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//DeptDAO 변수명 = new DeptDAO();
//@Component("dao")
@Repository("deptDAO")

public class DeptDAO implements CommonDAO {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	public DeptDAO() {
		logger.info("logger: {}", "DeptDAO 생성자");
	}
	
	@Override
	public List<String> list() {
//		return Arrays.asList("홍길동","이순신"); // 크기변경이 안되는 list(고정길이 list)
		return new ArrayList( Arrays.asList("홍길동","이순신")); // 크기 변경이 되는 list 로 변경
	}
	
	
}
package com.exam.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//DeptDAO 변수명 = new DeptDAO();
//@Component("dao")
@Repository("empDAO")
// @Primary // 우선권 부여 (방법1: DAO 에서 @Primary 어노테이션을 사용해서 우선권부여)
public class EmpDAO implements CommonDAO {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	public EmpDAO() {
		logger.info("logger: {}", "EmpDAO 생성자");
	}
	
	@Override
	public List<String> list() {
//		return Arrays.asList("유관순","강감찬"); // 크기변경이 안되는 list(고정길이 list)
		return new ArrayList( Arrays.asList("유관순","강감찬")); // 크기 변경이 되는 list 로 변경
	}
	
	
}
package com.exam.service;

import java.util.List;

public interface DeptService {
	public List<String> list();
}
package com.exam.service;

import java.util.ArrayList;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.exam.dao.CommonDAO;
import com.exam.dao.DeptDAO;
import com.exam.dao.EmpDAO;

@Service("xxx")
public class DeptServiceImpl implements DeptService {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	CommonDAO commonDAO;

	// 생성자 주입
	// 우선권 부여 (방법2: Service 에서 @Qualifier 어노테이션 사용해서 우선권 부여)
	public DeptServiceImpl(@Qualifier("deptDAO") 
						   CommonDAO commonDAO) {
		logger.info("logger: {}", "DeptServiceImpl 생성자");
		this.commonDAO = commonDAO;
	}

	@Override
	public List<String> list() {
		return commonDAO.list();
	}
}
# application.properties
logging.level.org.springframework=info
<?xml version="1.0" encoding="UTF-8"?>
<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 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.18</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.exam</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 

<@Autowired 이용 3 - @Primary & @Qualifier >

package com.exam;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import com.exam.service.DeptServiceImpl;

@SpringBootApplication
public class Application implements CommandLineRunner {
	
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	
	// IoC Container 참조
	Logger logger = LoggerFactory.getLogger(getClass());
	
	ApplicationContext ctx;
	
	// 생성자 주입
	public Application(ApplicationContext ctx) {
		logger.info("logger:ApplicationContext:{}", "Application 생성");
		this.ctx = ctx;
	}

	@Override
	public void run(String... args) throws Exception {
		// TODO Auto-generated method stub
		logger.info("logger:ApplicationContext:{}", ctx);
		
		// 빈참조
		DeptServiceImpl service = ctx.getBean("xxx",DeptServiceImpl.class);
		
		List<String> list = service.list();
		logger.info("list:{}", list);
	}

}
package com.exam.dao;

import java.util.List;

// DeptDAO 와 EmpDAO 의 상위개념의 interface
public interface CommonDAO {
	public List<String> list();
}
package com.exam.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//DeptDAO 변수명 = new DeptDAO();
//@Component("dao")
@Repository("deptDAO")
@Primary // CommonDAO 에 @Autowired 를 부여후 @Primary 를 dao 에 우선권 부여
public class DeptDAO implements CommonDAO {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	public DeptDAO() {
		logger.info("logger: {}", "DeptDAO 생성자");
	}
	
	@Override
	public List<String> list() {
//		return Arrays.asList("홍길동","이순신"); // 크기변경이 안되는 list(고정길이 list)
		return new ArrayList( Arrays.asList("홍길동","이순신")); // 크기 변경이 되는 list 로 변경
	}
	
	
}
package com.exam.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//DeptDAO 변수명 = new DeptDAO();
//@Component("dao")
@Repository("empDAO")
// @Primary // CommonDAO 에 @Autowired 를 부여후 @Primary 를 dao 에 우선권 부여 
public class EmpDAO implements CommonDAO {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	public EmpDAO() {
		logger.info("logger: {}", "EmpDAO 생성자");
	}
	
	@Override
	public List<String> list() {
//		return Arrays.asList("유관순","강감찬"); // 크기변경이 안되는 list(고정길이 list)
		return new ArrayList( Arrays.asList("유관순","강감찬")); // 크기 변경이 되는 list 로 변경
	}
	
	
}
package com.exam.service;

import java.util.List;

public interface DeptService {
	public List<String> list();
}
package com.exam.service;

import java.util.ArrayList;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.exam.dao.CommonDAO;
import com.exam.dao.DeptDAO;
import com.exam.dao.EmpDAO;

@Service("xxx")
public class DeptServiceImpl implements DeptService {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	@Autowired
	@Qualifier("empDAO")
	CommonDAO commonDAO;

	@Override
	public List<String> list() {
		return commonDAO.list();
	}
}
# application.properties
logging.level.org.springframework=info
<?xml version="1.0" encoding="UTF-8"?>
<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 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.18</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.exam</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>



  
4> 생성자 주입과 @Autowired 혼합 가능

package com.exam;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import com.exam.service.DeptServiceImpl;

@SpringBootApplication
public class Application implements CommandLineRunner{

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	
	//IoC Container 참조
    Logger logger = LoggerFactory.getLogger(getClass());
	
    // IoC Container
	ApplicationContext ctx;
	// 생성자 주입
	public Application(ApplicationContext ctx) {
		logger.info("logger:ApplicationContext:{}","Application 생성");
		this.ctx = ctx;
	}

	@Override
	public void run(String... args) throws Exception {
		logger.info("logger:ApplicationContext:{}",ctx);	
		
		// 빈참조
		DeptServiceImpl service 
		   = ctx.getBean("xxx", DeptServiceImpl.class);
		
		List<String> list = service.list();
		logger.info("list:{}", list);
		
	}

}
package com.exam.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

// DeptDAO  변수명 = new DeptDAO();
//@Component("dao")
@Repository("deptDAO")
public class DeptDAO {

	Logger logger = LoggerFactory.getLogger(getClass());
	public DeptDAO() {
		logger.info("logger:{}","DeptDAO 생성자");
	}
	public List<String> list(){
		return new ArrayList(Arrays.asList("홍길동","이순신"));
//		return Arrays.asList("홍길동","이순신"); // 고정길이 list. 크기변경이 불가
	}
	
}
package com.exam.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

// DeptDAO  변수명 = new DeptDAO();
//@Component("dao")
@Repository("empDAO")
public class EmpDAO {

	Logger logger = LoggerFactory.getLogger(getClass());
	public EmpDAO() {
		logger.info("logger:{}","EmpDAO 생성자");
	}
	public List<String> list(){
		return new ArrayList(Arrays.asList("유관순","강감찬"));
//		return Arrays.asList("유관순","강감찬"); // 고정길이 list. 크기변경이 불가
	}
	
}
package com.exam.service;

import java.util.List;

public interface DeptService {
	public List<String> list();
}
package com.exam.service;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import com.exam.dao.DeptDAO;
import com.exam.dao.EmpDAO;

//@Component("xxx")
@Service("xxx")
public class DeptServiceImpl implements DeptService{
	Logger logger = LoggerFactory.getLogger(getClass());
	
	// @Autowired 이용
	@Autowired  
	DeptDAO deptDAO;
	
	EmpDAO empDAO;
	// 생성자 주입이용
	public DeptServiceImpl(EmpDAO empDAO) {
		this.empDAO = empDAO;
	}


	@Override
	public List<String> list() {
		List<String> deptList = deptDAO.list();
		List<String> empList = empDAO.list();
		boolean result = 
		deptList.addAll((ArrayList<String>)empList);
		return deptList;
	}
}
# application.properties
logging.level.org.springframework=info
<?xml version="1.0" encoding="UTF-8"?>
<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 
	http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.18</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.exam</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

'Programming > Spring Boot' 카테고리의 다른 글

빈의 scope  (0) 2024.07.02
생성된 빈 접근방법  (0) 2024.07.02
빈(Bean) 생성  (0) 2024.07.02
로깅처리  (0) 2024.07.02
개요  (0) 2024.07.02