본문 바로가기
  • 시 쓰는 개발자
1일 1개념정리 (24년 8월~)/Spring

1일1개 (15) - Bean

by poetDeveloper 2024. 8. 24.

1일 1개념정리 24.08.09.금 ~ 

 

큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.

무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!


#15. 스프링 Bean 🫛

망했다 !!!!!! 어제 블로그를 못올렸다.... 경진대회 떨어짐에 아쉬워서 약간 쒸익쒸익 하다가 친구랑 밤에 노느라 까먹고 못썼다 ...... 어째 이런일이 ... 하지만 꾸준히 공부하면 된다. 큰 상관없다.

 

 

Bean

오늘은 Bean에 대해 알아보자. 스프링에서 맨날 나오는 콩인데 대체 뭘까 ? 정의는 "스프링 IoC 컨테이너가 관리하는 재사용 가능한 컴포넌트"인데, 뭔소린지 하나도 모르겠다. 쉽게 말하면, 스프링이 대신 관리해주는 자바 객체이다. 왜 대신 관리할까?

 

예를 들어, 우리가 프로그래밍을 할 때 객체를 직접 만들고, 필요할 때마다 사용하다가, 다 쓰면 지우는 과정을 반복하는데 이걸 직접 하면 귀찮으니까 스프링이 관리하도록 만든 것이다. 그래서 스프링에게 "이 객체좀 관리해줘!!" 부탁하는거고, 스프링이 그 객체를 만들어서 빈이라는 이름을 붙인거고, 필요할 때 우리가 가져다가 쓸 수 있게 해주는 것이다.

 

만약 우리가 UserService라는 클래스를 만들었고 여기 회원관리를 담당하는 기능이 있다고 해보자. 원래같으면 클래스를 직접 객체로 만들어서 사용해야하는데 스프링에게 "UserService를 빈으로 만들어줘!"라고 하면 알아서 객체를 만들어서 관리해준다. (빈은 new로 생성하는게 아님)

 

스프링 컨테이너에서 빈을 관리해주고, 컨테이너는 내가 필요할 때마다 물건을 꺼내 쓸 수 있는 창고이다. 창고 물건 하나하나가 스프링 빈이고. 우린 그냥 꺼내서 쓰기만 하면 된다.

 

Bean 왜 쓸까 ?

  1. 자동 관리 : 스프링이 객체를 대신 만들어주고, 관리해주기 때문에 직접 신경 쓸 일이 줄어듦
  2. 재사용성, 싱글톤패턴 : 기본적으로 스프링은 하나의 빈 객체를 여러 곳에서 사용할 수 있게 관리한다. (여러번 생성 X)
  3. 의존관계 자동 주입 : 만약 UserService가 다른 객체가 필요하면, 스프링이 필요한 객체들도 자동으로 연결해준다.

여기서 나오는 어려운 말들만 다시 살펴보자.

 

1) 의존관계란 ?

의존관계(Dependency)는 하나의 객체가 다른 객체를 필요로 하는 관계를 의미한다. 즉, 어떤 객체가 자신의 기능을 수행하기 위해 다른 객체를 필요로 하는 것이 바로 의존관계이다.

public class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void saveUser(User user) {
        userRepository.save(user);
    }
}

이런 서비스가 있을 때 난 UserService를 사용하지만, 서비스는 UserRepository를 필요로 하므로 UserService가 UserRepository에 의존한다고 할 수 있다. (UserRepository 없으면 유저 저장 못하니까) 나중에 더 자세히 정리해보도록 하자 !

 

2) 싱글톤이란 ?

빈은 기본적으로 싱글톤으로 관리된다. 싱글톤이란, 하나의 클래스에 대해 단 하나의 객체만 생성된다는 의미이다. UserService가 빈으로 등록되면 애플리케이션 전체에서 단 하나의 UserService 객체만 만들어지고, 여기저기서 이 하나의 객체를 공유해서 사용하는 것이다. 즉, 여러 클래스에서 UserService를 사용해도 동일한 객체를 사용하는 것이고 새로운 객체를 만드는 것이 아니다. 그래서 만약 저기 Z클래스에서 내가 UserService의 필드값을 바꾸면, A클래스에서도 같은 객체를 사용하므로 바뀐 값이 보이게 된다.

 

Bean으로 관리하는 방법

빈으로 관리하는 여러 방법이 있는데, 보통 3번이 추천되고 2번도 가끔 쓰인다고 한다. 3번은 아마 많은 사람들이 사용하고 있는 키워드일 것이다.

 

1. XML에 직접 등록하는 방법

스프링의 초기 버전에서는 XML 설정 파일을 사용해 빈을 등록하는 것이 일반적이었다. XML 파일에 <bean> 태그를 사용하여 빈을 정의하고 설정할 수 있다.

<beans>
    <bean id="userService" class="com.example.UserService">
        <property name="userRepository" ref="userRepository"/>
    </bean>

    <bean id="userRepository" class="com.example.UserRepository"/>
</beans>
  • 장점 : XML 파일에 모든 설정이 모여 있어, 설정이 한눈에 보임.
  • 단점 : 설정이 많아질수록 관리가 복잡하고 어려워짐.

 

2. @Bean 어노테이션을 이용

스프링 3.0 이후부터는 XML을 대체하기 위해 자바 설정 파일을 사용하는 방식이 도입되었는데, 자바 클래스에 @Configuration 어노테이션을 붙인 후, 메소드에 @Bean 어노테이션을 사용해 빈을 등록할 수 있다.

@Configuration
public class AppConfig {

    @Bean
    public UserService userService() {
        return new UserService(userRepository());
    }

    @Bean
    public UserRepository userRepository() {
        return new UserRepository();
    }
}
  • 장점 : 코드와 설정이 동일한 파일에 있어 가독성이 높다.
  • 단점 : 클래스나 메소드가 많아지면 관리가 복잡해지고, 특정 상황에서만 사용되는 빈이나 복잡한 설정에 대해서는 적합하지 않다.

 

3. @Component, @Service, @Controller, @Repository .... 등등 어노테이션을 이용

가장 널리 사용되는 방법으로, 클래스에 직접 어노테이션을 붙여 빈으로 등록한다. 가장 널리 쓰이는 방식이고, 추천하는 방식이다.

  • @Component : 일반적인 빈을 등록
  • @Controller :  웹 MVC에서 컨트롤러로 사용되는 클래스를 등록
  • @Service : 서비스 계층의 빈을 등록
  • @Repository : 데이터 접근 계층의 빈을 등록
@Service
public class UserService {
}

@Repository
public class UserRepository {
}

...
  • 장점 : 클래스에 어노테이션만 붙이면 되므로 매우 간단하고 직관적이다. 어노테이션만 붙여놓으면 스프링의 컴포넌트 스캔 기능을 통해 자동으로 빈이 등록된다. 코드의 가독성과 유지보수성이 높아진다.
  • 단점 : 모든 빈이 자동으로 등록되므로, 필요한 경우에만 특정 빈을 설정하고 싶을 때는 유연성이 떨어질 수 있다.