프로그래밍에서 의존(dependency)
이란, 한 요소가 다른 요소를 필요로 하는 관계
를 말한다.
예를 들어, 클래스 A가 클래스 B를 사용한다면, A는 B에 대해 의존
하고 있다.
객체 간의 의존 관계
를 관리하기 위해 의존성(dependency)
개념이 도입되었다.
의존성은 의존 관계를 구체화한 것으로, 일반적으로 클래스 간의 의존성이 가장 많이 사용된다.
예를 들어, 클래스 A가 클래스 B에 의존하고 있다면, A 클래스는 B 클래스에 대한 의존성을 가지고 있다고 말할 수 있다.
코드 재사용성
의 향상
올바른 의존성 관리를 통해 독립적인 컴포넌트
를 만들 수 있다. 이러한 컴포넌트는 다른 프로젝트에서도 재사용
할 수 있으며, 이는 개발 생산성을 향상
시키고 코드의 효율성을 높이는 데 큰 도움이 된다.
유지 보수성
의 향상
의존성 관리를 잘 처리하면 코드의 유지 보수성
이 향상된다. 코드의 변경 사항이 다른 컴포넌트에 미치는 영향을 줄이면서, 코드의 수정
및 업데이트
가 더욱 쉬워지기 때문.
테스트
의 용의성
의존성 관리를 잘 처리하면 단위 테스트
와 통합 테스트
를 쉽게 구현할 수 있다. 특히 의존성 주입(Dependency Injection)
과 같은 기술을 활용하면 테스트 코드를 더욱 간편하게 작성할 수 있다.
@Autowired
는 스프링 프레임워크
에서 사용되는 의존성 주입(Dependency Injection)
방법 중 하나이다.
의존성 주입
은 객체 지향 프로그래밍에서 결합도(Coupling)
를 낮추기 위해 사용된다.
의존성 주입
은 객체가 자신이 사용할 다른 객체를 직접 생성하거나 참조하지 않고, 외부에서 주입
받도록 하는 방법이다. 이를 통해 객체 간의 결합도를 낮출 수 있다.
예를 들어, A 객체가 B 객체를 사용해야 할 때, A 객체에서 직접 B 객체를 생성하거나 참조하면 A 객체와 B 객체 간의 결합도가 높아진다. 이를 의존성 주입을 사용하여 해결하면, A 객체는 B 객체를 외부에서 주입
받아 사용하므로 결합도가 낮아진다. 이렇게 구현된 코드는 유지보수하기 쉽고, 테스트하기도 용이하다.
스프링
은 @Autowired 어노테이션
을 통해 자동으로 의존성을 주입해주며, 이를 통해 개발자는 의존성 주입을 위한 별도의 코드 작성 없이도 객체 간의 의존성을 간편하게 처리할 수 있다.
@Autowired 어노테이션
을 통해 의존성을 주입받으면, 개발자는 코드 내에서 의존성을 직접 생성하거나 조작할 필요가 없으며, 스프링 컨테이너가 관리하는 객체를 자동으로 사용할 수 있다. 이를 통해 코드의 복잡도를 줄이고, 유지보수성을 향상시킬 수 있다.
DIP(Dependency Inversion Principle)
는 객체 지향 설계 원칙
중 하나로, 상위 수준 모듈은 하위 수준 모듈에 의존해서는 안 되고, 둘 모두 추상화에 의존해야 한다는 원칙이다.
이를 통해 결합도를 낮추고 유연한 코드를 작성할 수 있다.
DIP
를 적용하면, 추상화
와 의존성 주입
을 통해 객체 간의 결합도를 낮출 수 있다.
예를 들어, 인터페이스를 이용하여 추상화를 수행하고, 구체적인 구현은 DI(Dependency Injection)
를 통해 주입하면, 클라이언트 코드는 구체적인 구현에 의존하지 않고 인터페이스에만 의존한다. 이를 통해 클라이언트 코드와 구현체 사이의 결합도가 낮아지며, 유지보수성과 확장성이 높아진다.
스프링에서 관리되는 객체
를 말한다. 즉, 스프링에서 개발자가 작성한 객체가 스프링에 등록되어 스프링이 관리할 수 있는 객체
를 말한다. 이러한 스프링 빈
은 스프링 컨테이너
에서 관리된다.
스프링 빈
은 일반적으로 @Component
, @Service
, @Repository
, @Controller
등의 어노테이션
을 사용하여 등록된다. 또한, XML 설정 파일
을 이용하여 등록할 수도 있다.
스프링 컨테이너
는 스프링에서 스프링 빈
을 관리하는 컨테이너이다. 즉, 스프링에서 개발자가 작성한 객체들을 등록하고, 생성하고, 관리하는 역할
을 수행한다. 스프링 컨테이너는 스프링 빈을 생성하고, 필요한 의존성을 주입하며, 필요에 따라 스프링 빈을 제거하는 등의 역할을 수행한다.
스프링 컨테이너
는 스프링 빈을 생성하고 관리함으로써 의존성 주입(Dependency Injection)과 관련된 작업을 수행한다. 이를 통해 개발자는 객체 간의 결합도를 낮추고 유연한 코드를 작성할 수 있다.
JDBC(Java Database Connectivity)
는 자바에서 데이터베이스에 접근하기 위한 API
이다. JDBC
를 이용하면 자바 애플리케이션에서 데이터베이스에 접속
하고, SQL
을 이용하여 데이터를 조회, 수정, 삭제할 수 있다.
JDBC
는 데이터베이스에 대한 직접적인 접근 방식
으로, SQL 쿼리를 직접 작성
해야 하며, 개발자가 모든 데이터베이스 처리 작업을 수동
으로 처리해야 한다.
JPA(Java Persistence API)
는 자바에서 ORM(Object-Relational Mapping)
기술을 사용하여 데이터베이스와 상호작용하는 API
이다. JPA
를 사용하면 개발자는 객체 중심으로 데이터를 다룰 수 있으며, 객체를 데이터베이스에 저장하거나 데이터베이스에서 조회할 때 객체와 SQL 사이의 매핑 작업을 자동
으로 처리할 수 있다. JPA는 개발자가 직접 SQL을 작성하는 것이 아니라, 객체 지향적인 방식으로 데이터를 다룰 수 있도록 지원한다.
JDBC
와 JPA
는 모두 자바에서 데이터베이스와 상호작용하는 기술
이지만, 접근 방식이 다르다.
JDBC
는 데이터베이스에 대한 직접적인 접근 방식
으로, 개발자가 직접 SQL을 작성하고 모든 데이터베이스 처리 작업을 수동으로 처리해야 한다.
반면 JPA
는 ORM 기술을 사용하여 객체를 데이터베이스에 저장하거나 조회할 때 SQL과 객체 사이의 매핑 작업을 자동으로 처리
할 수 있으며, 객체 지향적인 방식
으로 데이터를 다룰 수 있다. 따라서, JPA
를 사용하면 개발자는 SQL 작성 및 데이터베이스 처리 작업을 줄일 수 있으며, 유지보수성과 생산성을 높일 수 있다.