티스토리 뷰

0. Bean 간의 관계 설정

:: 두 Bean 간의 관계를 설정하여 다른 객체 책임을 위임 가능

:: has-A 관계. Bean 간의 관계 설정

:: 두 Bean 간의 관계를 설정하여 다른 객체 책임을 위임 가능

 

:: has-A 관계(포함 관계)


0.1 Wiring

:: 객체 간의 의존성을 명시적으로 설정
:: 빈을 생성하는 메서드를 직접 노출하여 빈을 연결
:: 생성자 주입 or 세터 주입 방식 

Ex) 

더보기
// 의존하는 객체
public class MyRepository {
    public void save() {
        System.out.println("Data saved!");
    }
}

 

// 의존하는 객체를 사용하는 클래스
public class MyService {
    private MyRepository myRepository;

    // 생성자 주입 방식으로 명시적 연결
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    public void performAction() {
        myRepository.save();
    }
}

 

// 스프링 설정 파일
@Configuration
public class AppConfig {

    @Bean
    public MyRepository myRepository() {
        return new MyRepository();
    }

    @Bean
    public MyService myService() {
        return new MyService(myRepository());  // 명시적으로 연결
    }
}

 

EX) 

1.  생성자 주입 (Constructor Injection)

:: 보통 이걸로 생성

:: 생성자를 통해 의존성을 주입

:: 객체가 생성될 때, 필수적인 의존성을 강제로 주입 -> immutable object 생성에 유리
    - 장점 1) 순환 참조를 컴파일 시 방지 - 참조 여부를 객체 생성 전에 인지
    - 장점 2) Final 적용 가능 - Bean의 불변성 보장

// private final 직접 정의 
@Controller
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
    private final UserServiceInterface userService;
// @FieldDefaults로 간접 정의
@Controller
@RequestMapping("/users")
@RequiredArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public class UserController {
    UserServiceInterface userService;

0.2 Auto-Wiring

:: 스프링이 의존성을 자동으로 추론 및 주입

:: 스프링에서 제공하는메서드 매개변수를 이용하여 값을 제공하도록 활성화

:: @Autowired 어노테이션 사용 -> 순환 참조가 나타날 수 있음

더보기

@Autowired

:: 특정 필드에 부여하면 IoC컨테이너 안에 존재하는 특정 필드와 같은 타입의 Bean을 찾아 자동으로 주입


EX)

더보기
// 의존하는 객체
public class MyRepository {
    public void save() {
        System.out.println("Data saved!");
    }
}

 

// 의존하는 객체를 사용하는 클래스
public class MyService {
    private MyRepository myRepository;

    // 자동 주입 방식으로 의존성 주입
    @Autowired
    public void setMyRepository(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    public void performAction() {
        myRepository.save();
    }
}

 

// 스프링 설정 파일
@Configuration
@ComponentScan(basePackages = "com.example")  // 스캔할 패키지 지정
public class AppConfig {
    // 빈 자동 등록: @ComponentScan을 통해 클래스들 자동 스캔
}

 

Ex)

2. 필드 주입 (Property Injection)

:: @Autowired 어노테이션 사용

:: 객체가 생성 시, 모든 의존성을 넣지 않아도 될 때(선택적 의존성 주입)

@Controller
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserServiceInterface userService;

 

3. 수정자 주입 ((Setter) Method Injection)

:: @Autowired 어노테이션 사용

:: "2. 필드 주입"의 일종으로 setter 메서드를 사용하여 의존성을 주입

:: 선택적 의존성 주입을 허용 -> null 상태의 객체가 될 가능성 존재

@Controller
@RequestMapping("/users")
public class UserController {
    private UserServiceInterface userService;

    @Autowired
    public void setUserService(UserServiceInterface userService) {
        this.userService = userService;
    }

 

 


참고

ASAC 수업자료

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함