개발/Spring

Spring-IOC

Ridiss 2022. 3. 1. 07:44

스프링 처음배울때 부터 설명은 들었는데 전혀 제대로 써먹지 못했었으나 경력이 조금 쌓이고 여러가지 프로젝트를 하다보니 왜 이런 개념을 배우고 써야하는지 이해가 조금은 되는것 같아서 정리해봄.

 

Inversion of Control (제어의 역전)

"내가 이거 쓸건데 매번 관리하기 너무 귀찮다. Spring이 관리좀 해줘 난 그냥쓰기만 할게"로 이해했다.

 

spring-petclinic프로젝트 OwnerController에 가면 

private final OwnerRepository owners;

public OwnerController(OwnerRepository clinicService) {
    this.owners = clinicService;
}

이런 부분이 보일것이다. 

 

원래대로 OwnerRepository를 사용하려면 아래와 같이 선언해서 사용해야하지만 

private OwnerRepository owners = new OwnerRepository();

이럴경우 매번 사용할때마다 생성을 해줘야 할 뿐만아니라 의존성이 매우 커지기때문에 OwnerRepository하나 수정하면 new로 생성해서 사용중인 메서드를 모두 체크를 해줘야한다는 불편함이 생긴다.

 

또한 테스트시

class OwnerControllerTest {
	@Test
    public void create() {
    	OwnerRepository owners = new OwnerRepository();
        OwnerController cont = new OwnerController(owners); //owners의 의존성을 주입
    }
}

주입으로 편리하게 테스트가 가능하게 할수있다.

 

이전에는 IOC컨테이너를 사용할때 ApplicationContext 파일에서 Bean설정을 해주었으나

SpringBoot를 사용하면서 부터는 저 파일을 볼일은 거의 없는듯함.

얘가 빈인지 아닌지는 인텔리j에서는 쉽게 파악이 가능하다.

빈으로 등록된경우
빈으로 등록되지 않은 경우

빨간색 표시부분처럼 저런 표시가 있으면 Bean으로 처리되어 IOC컨테이너에 등록됨.

 

빈은 스프링 IOC컨테이너가 관리하는 객체이며

Component Scanning을 통해 

@Component가 선언되어 있는것을 빈으로 등록한다.

또한 

@Repository

@Service

@Controller

경우에도 해당 어노테이션을 들어가보면 아래와 같이 @Component가 이미 선언되어있음을 알수 있다.

 

 

빈을 사용하는 방법은 아래처럼 PetClinicApplication 파일에서 @Bean을 등록 한 후

@SpringBootApplication
public class PetClinicApplication {

	// bean이라는 메서드를 정의할때는 @Configuration이라는 어노테이션 하위에서 작성을 해야한다.
	// @SpriingBootApplication의 경우 @Configuration을 가지고있다.
	@Bean
	public String ridiss() {
		return "ridiss";
	}

	public static void main(String[] args) {
		SpringApplication.run(PetClinicApplication.class, args);
	}

}

SampleController클래스를 생성해서

@RestController
public class SampleController {

	@Autowired
	String ridiss;

	@GetMapping("/context")
	public String context() {
		return "hello " + ridiss;
	}
}

 

localhost:8080/context를 호출하면 

이렇게 호출된 것을 확인할 수 있다.

 

현재는 @Autowired는 거의 쓰지 않는 추세이며 생성자를 통해 주입하거나 

lombok에 있는 @RequiredArgsConstructor 통해 사용을 많이한다.

'개발 > Spring' 카테고리의 다른 글

Spring Security 6 변경점  (0) 2023.01.25
SPRING-Security SessionManagement(세션 관리 기능)  (0) 2023.01.23
@Component, @Configuration 차이  (0) 2021.08.04
[JPA] Page, nativeQuery사용  (0) 2021.07.13
JPA 양방향 매핑시 주의점  (0) 2021.05.24