SKKUNION - Autowired, Component 설정

2023. 9. 30. 14:24팀프로젝트일기/SKKUNION

Component

스프링을 배우다보니까 굉장히 여러 방식으로 의존성 주입을 해주는 경우가 많더라고요. 공부하다보니까 왜 그런 모양으로 주입을 하는지에 대해서 제 나름대로의 낮은 수준의 이해이지만 이때까지 배운 내용을 기초로 말씀을 드리겠습니다.

 

우선 어디서부터 말씀을 드려야 될 지 되게 난감하긴 해요. 저도 정확하게 모르고 내용이 한도 끝도 없거든요. 일단 Java라는 언어의 특징부터 생각을 해보시면 될 것 같아요. 자바는 자신이 만든 class함수를 인스턴스라는 형태로 실제 사용 가능한 형태로 만들어요. 그리고 해당 인스턴스가 더이상 쓸모없어졌다고 판단했을 때에 다른 c같은 언어면 free를 통해서 메모리를 할당을 해제를 프로그래머가 직접 진행을 했을 텐데 자바는 JVM의 데몬쓰레드 중 하나인 Garbage Collector(GC)가 이 역할을 해줍니다.

 

그리고 스프링은 원래 온라인 웹 서비스를 위해서 만들어진 언어입니다. 지금 당장에는 저희 밖에 쓰지 않는 그런 어플리케이션이지만 만약에 실제로 잘 됐다고 했을 때 하루에 몇 십만, 몇 백만 개의 요청이 들어올 수도 있고 그 경우에 백그라운드에서 아무리 GC가 열심히 일한다고 해도 굳이 불필요한 메모리를 만들어서 JVM 내부에 올리고 삭제하고를 반복하면 아무래도 비효율적이죠.

 

그래서 싱글톤이라는 패턴을 통해서 객체의 인스턴스를 단 한번만 실행되게 한 후 계속 재활용하는 방식으로 설계를 하면 위의 문제를 해결할 수 있습니다. Spring에서는 싱글톤 설계를 스프링 컨테이너, 스프링 빈 같은 거로 해주는데요. 

 

보통 AppConfig 같은 형태로 된 파일을 생성해서 제가 원하는 @Component를 bean에 등록을 하는 방법도 있고요. 아니면 @AutuComponent를 통해서 등록하는 방법이 있어요. 저는 후자가 일단은 편한 것 같습니다. 전자도 좋지만 저희가 개발을 하는 데에 있어서 그렇게 큰 서비스를 만들게 아니라서 상속이나 그런 것에 익숙하지도 않으시고요. 그래서 각각마다 @Component를 이용해서 Service, Repository, Controller를 만들어주면 돼요.

 

스프링 부트의 기본 설정

스프링 부트의 기본 Application 파일에 보면 @SpringBootApplication이라는 Annotation이 존재하는 것을 보실 수 있습니다. 해당 칸을 Ctrl + B(mac은 저도 몰라요.)로 들어가보면 @ComponentScan이라는 옵션이 있어요. 해당 옵션은 @Component가 붙은 모든 녀석을 다 Spring 내부 컨테이너에 등록시켜줍니다. 그래서 제가 만든 파일이 실행을 할 때에 자동으로 Spring 컨테이너 내부에 제가 만든 Service, Repository, Controller가 등록이 됩니다.

 

해당 ComponentScan은 범위를 지정해주지 않으면 Default로 해당 Annotatino의 맨 첫 줄에 있는 package 명의 하위 폴더를 싹 다 뒤져서 등록할 거리를 찾습니다. 그런데 제가 이전에 올린 부분에는 @Component가 없는데 어떻게 작동을 하느냐라는 의문을 가지실 수 있어요. 그 부분은 아래를 보시면 이해가 될 겁니다.

 

 

@Repository, @Service, @Controller를 ctrl + B로 들어가보시면 알 수 있는데요. 아래처럼 내부에 @Component가 자동으로 되어있어요. 각각마다 추가적인 기능이 있는 것도 있고 아닌 것도 있는데 우선 대충 돌아가는 흐름만 알면 될 것 같아서 말씀드렸습니다.

 

 

@Autowired

 제가 지난 번에 제대로 몰라서 생성자 부분에 @Autowired 부분이 들어간 게 잘못된 거라서 오류가 났을 것이라고 말했던 거로 기억이 나는데 제가 틀렸더라고요. 일단 해당 코드 방식은 자동으로 ComponentScan으로 등록하는 방식이 아니라 @Configuration을 따로 생성해서 의존성을 주입하는 부분을 따로 만들어주는 부분이라. 해당 부분에서 상속을 받다보면 @Autowired로 자동으로 의존성을 주입해줄 수 있는데 자동으로 찾아서 주입해주는거라 원하는 게 안 들어갈 수도 있어요. 그래서 해당 부분을 직접 생성자로 지정해서 스프링 컨테이너 내부에 있는 것으로 넣는 것입니다. 

 

아래같은 방법이 그 예시이겠네요.

 

제가 사용한 방법인 그냥 @Autowired하고 생성자를 넣지 않은 방법도 같은데 아래 이미지 참고부탁드립니다. 컨테이너 내부에서 찾아서 자동으로 넣지만 아마 상속 형태로 작성을 하면 가끔씩 복잡해지다보면 이상한 게 들어갈 수 있어요. 그 때 관리하는 방법은 따로 말씀을 드릴게요. 대충 제가 아는 범위 내에서 최대한 간단하게 설명을 드렸고 작성된 코드를 이해하시는 데에 앞으로 작성할 코드를 짤 때 어떤 방식으로 짜면 같이 알아보기 편한 지에 대해서는 도움이 됐을 것이라고 생각해서 올립니다.