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>
'[study]이론정리 > Spring Boot' 카테고리의 다른 글
빈의 scope (0) | 2024.07.02 |
---|---|
생성된 빈 접근방법 (0) | 2024.07.02 |
빈(Bean) 생성 (0) | 2024.07.02 |
로깅처리 (0) | 2024.07.02 |
개요 (0) | 2024.07.02 |