이전 내용
[Java] Spring Boot - 기본 구조, "Hello World" 띄워보기
이전 내용 [Java] 인텔리제이 새 프로젝트 생성하기이전 내용 [Java] 스프링부트를 위한 인텔리 제이(커뮤니티) 다운로드이전 내용 스프링 부트(Spring Boot) 인텔리 제이(IntelliJ) 란? 인텔리 제이 다운
puppy-foot-it.tistory.com
제어 역전(Inversion of Control, IoC)
제어 역전은 프로그램의 제어 흐름을 제어하는 방식이 전통적인 방식에서 반대 방향으로 전환되는 것을 의미한다. 즉, 프로그래머가 객체의 생성과 관리를 직접 수행하는 대신, 프레임워크(예: 스프링)가 이를 대신 관리한다.
[제어 역전 특징]
- 선언적 설정: 객체의 생성 및 생명주기를 프레임워크에 위임함으로써 설정 및 구성을 선언적으로 수행.
- 유연성 향상: 제어의 분리를 통해 코드의 결합도를 낮추고, 모듈 간 독립성을 높이며 소프트웨어의 유지보수성을 증가시킴.
스프링 프레임워크에서는 스프링 컨테이너가 애플리케이션의 컴포넌트(빈)를 관리한다. 개발자는 공통적인 의존성 로직을 자신이 아닌 스프링 컨테이너에 맡김으로써 애플리케이션을 설계하게 된다.
◆ 빈(Bean)
- 스프링 컨테이너가 관리하는 자바 객체
- 일반적으로 @Component, @Service, @Repository, @Controller와 같은 어노테이션을 사용하여 빈으로 등록
◆ 스프링 컨테이너
- 스프링 프레임워크의 핵심 부분으로, 빈을 생성하고 관리 ▶ 빈이 생성되고 소멸되기까지의 생명주기 관리
- 스프링 컨테이너는 애플리케이션 시작 시 빈을 생성하고, 필요할 때마다 주입
◆ 관점 지향 프로그래밍(AOP, Aspect Oriented Programming)
- 프로그램의 핵심 로직과 부가적인 관심사를 분리하여 개발하는 프로그래밍 패러다임. 주로 중복 코드를 줄이고, 코드의 가독성과 유지 보수성을 향상시키기 위해 사용한다.
- 여러 클래스에서 공통적으로 사용하는 기능을 중앙에서 관리할 수 있어 중복 코드를 줄일 수 있다.
- 비즈니스 로직과 부가적 작업을 분리하여 각 모듈의 가독성과 유지 보수성을 높일 수 있다
- 활용 예시
- 로깅: 메서드 호출 전후에 로그를 기록하는 기능.
- 트랜잭션 관리: 데이터베이스 트랜잭션의 시작과 종료를 관리하는 기능.
- 보안 체크: 특정 메서드에 접근하기 전 사용자 권한을 검사하는 기능.
의존성 주입(Dependency Injection, DI)
의존성 주입은 객체가 자신의 의존성을 스스로 생성하거나 관리하는 것이 아니라, 외부에서 주입받는 방식으로 IoC의 한 형태로 볼 수 있다. 의존성 주입은 객체 간의 의존 관계를 자동으로 설정해주는 중요한 개념으로, 이를 통해 코드의 결합도를 낮추고, 테스트 용이성과 유지보수성을 높일 수 있다.
결합도가 낮아지면, 한 클래스의 변경이 다른 클래스에 미치는 영향을 줄일 수 있다. 이는 코드의 유지보수성과 확장성을 높이는 데 중요한 역할을 한다.
[의존성 주입 유형]
- Constructor Injection: 클래스의 생성자를 통해 의존성을 주입. ▶ 최근에 권장되고 있음.
- Setter Injection: setter 메서드를 통해 의존성을 주입.
- Field Injection: 필드에 직접 주입하는 방식. (스프링에서는 @Autowired 애너테이션 사용.)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class UserService {
private final UserRepository userRepository;
// Constructor Injection
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void saveUser(User user) {
userRepository.save(user);
}
}
@Component
public class UserRepository {
public void save(User user) {
// 저장 로직
}
}
◆ 애너테이션 기반 설정
- 의존성 주입을 설정할 때 주로 사용되는 애너테이션 @Autowired, @Inject, @Resource
※ @Autowired
Spring에서 @Autowired 애너테이션은 의존성 주입을 간편하게 해주는 기능이다. 이를 통해 스프링 프레임워크가 자동으로 필요한 의존성을 주입해 준다.
[ @Autowired 원리]
- IoC 컨테이너: 스프링 IoC (Inversion of Control) 컨테이너는 애플리케이션의 빈(bean)을 관리한다. 빈은 스프링 컨테이너에 의해 생성되고 관리되는 객체다.
빈 정의 방법
1. XML 파일
2. 자바 설정 클래스 (@Configuration, @Bean)
3. 컴포넌트 스캔 (@Component, @Service, @Repository, @Controller)
- 빈 생성 및 주입: 애플리케이션이 시작될 때 스프링 컨테이너는 빈 정의를 로드하고 인스턴스를 생성한다. 그런 다음 @Autowired 애너테이션이 붙은 필드, 생성자, 또는 세터 메서드를 찾아서 주입한다.
- 타입 매칭: @Autowired는 기본적으로 타입 매칭을 사용한다. 스프링 컨테이너는 해당 타입의 빈을 검색하여 주입하며, 만약 동일한 타입의 빈이 여러 개 있을 경우 @Qualifier 애너테이션을 사용하여 특정 빈 이름을 지정할 수 있다.
[@Autowired 작동 방식]
- 필드 주입: 필드에 @Autowired가 붙어 있으면, 스프링은 해당 필드 타입을 확인하고, 컨테이너에서 찾아 주입.
- 생성자 주입: 생성자에 @Autowired가 붙어 있으면, 스프링은 해당 생성자를 사용하여 빈을 생성하고 의존성을 주입.
- 세터 메서드 주입: 세터 메서드에 @Autowired가 붙어 있을 경우, 스프링은 세터 메서드를 통해 의존성을 주입.
★ Spring 4.3 이후, 클래스에 생성자가 하나만 있고, 해당 생성자가 파라미터를 요구하는 경우에는 @Autowired를 명시적으로 붙이지 않아도 스프링이 자동으로 이 생성자를 사용하여 의존성을 주입한다. 그러나 클래스에 여러 생성자가 있거나 기본 생성자와 의존성 생성자가 동시에 존재하는 경우에는 @Autowired 어노테이션을 명시적으로 사용하는 것이 좋다.
[@Autowired 작동]
- 유연한 코드 구조: 의존성을 외부에서 주입받음으로써 코드의 결합도를 줄이고, 모듈 간 독립성을 높인다.
- 유지 보수 용이: 모듈화, 테스트 용이성, 재사용성을 높여 소프트웨어 개발의 효율성을 증가시킨다.
- 테스트 용이: DI를 통해 Mock 객체를 사용하여 단위 테스트를 쉽게 수행할 수 있다. 이는 테스트의 독립성을 보장하고, 안정적인 테스트 환경을 구축하는 데 도움을 준다.
자바 애너테이션
자바 애너테이션: 자바로 작성한 코드에 추가하는 표식으로, 보통 @ 기호를 사용한다.
애너테이션은 주석과 비슷한 형식을 갖추고 있지만, 코드 실행이나 컴파일러의 처리를 위한 추가 정보를 제공하며, 주로 메타 데이터로 사용하는 경우가 많다.
애너테이션 이름 | 설명 |
@Override | 선언된 메서드가 오버라이드 됨 |
@Deprecated | 더 이상 사용되지 않음 |
@SuppressWarnings | 컴파일 경고 무시 |
[참고]
https://lincoding.tistory.com/76
다음 내용
[Java] 스프링부트: Spring Initializr - Dependencies
이전 내용 [Java] Spring Boot: 제어 역전, 의존성 주입이전 내용 [Java] Spring Boot - 기본 구조, "Hello World" 띄워보기이전 내용 [Java] 인텔리제이 새 프로젝트 생성하기이전 내용 [Java] 스프링부트를 위한
puppy-foot-it.tistory.com
'[Java] > Spring Boot' 카테고리의 다른 글
[Java] Spring Boot: Maven Repository (1) | 2025.04.15 |
---|---|
[Java] Spring Boot: Spring Initializr - Dependencies (0) | 2025.04.15 |
[Java] Spring Boot - 기본 구조, "Hello World" 띄워보기 (1) | 2025.04.14 |
[Java] Spring Boot: 인텔리제이 새 프로젝트 생성하기 (0) | 2025.04.14 |
[Java] Spring Boot: 인텔리제이(커뮤니티) 다운로드 (0) | 2025.04.14 |