반응형
📌 애플리케이션의 확장성을 높이는 방법
- 자신이 사용할 객체를 자신이 결정(생성)하지 않는다.
- 인터페이스를 이용한 느슨한 결합을 유도한다.
- 의존성 주입을 통해서 외부 모듈(제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 기술로 사용자 지정하기
}
}
< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >
🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Spring-자동의존성주입-코드작성순서
'BackEnd > Spring' 카테고리의 다른 글
[Spring] JdbcTemplate의 RowMapper 구현법 - 익명객체, 람다식 (0) | 2025.01.16 |
---|---|
[Spring] Spring DB Access의 특징 (0) | 2025.01.16 |
[Spring] Maven 빌드 도구 (0) | 2025.01.16 |
[Spring] Spring Container(스프링 컨테이너) (0) | 2025.01.16 |
[Spring] IoC(제어역전, Inversion of Control) (0) | 2025.01.16 |