Bean

조예빈·2024년 5월 3일
0

Spring

목록 보기
1/19
post-custom-banner

Bean

  • 콩. 객체(컨테이너가 관리하는 자바 객체를 의미)
  • 스프링 컨테이너에 의해 관리되는 재사용 가능한 SW 컴포넌트 -> new 키워드 대신 사용
  • 컨테이너에 넣었기 때문에 나중에 필요할 때 꺼내서 쓰면 됨
  • use bean : 객체를 사용하는 것. 객체를 사용하려면 생성을 시켜야 함 -> 알아서 생성시킴
  • property : 속성. field.
  • IoC(제어의 역전) : 객체의 생성과 사용자의 제어권을 스프링에게 넘겨 스프링에 의해 관리당하는 자바 객체를 사용하는 것
  • 의존성 주입(DI)을 과거에는 내가 직접 만들었는데, 내가 생성하는 것이 아니라 Spring이 알아서 해줌
  • 등록 시점 : tomcat이 실행될 때

여기서 IoC가 잘 이해가 가지 않아 예시로 공부해 보았다. 만약, @Repository 어노테이션을 사용하면 스프링 컨테이너가 Service를 생성할 때 자동으로 repository를 주입해 준다. 아래의 코드를 보면, @Autowired부분에 해당된다.

@Repository // UserRepository를 빈으로 등록
public class UserRepository {
    // UserRepository의 메서드들...
}

@Service // UserService를 빈으로 등록
public class UserService {
    private final UserRepository userRepository;

    @Autowired // UserRepository를 자동으로 주입
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

}

그러나, 다음 코드를 보면 Spring에게 의존성 주입을 명시적으로 요청하지 않았기 때문에 IoC가 발생하지 않는다.

public class UserRepository {
    
}

public class UserService {
    private final UserRepository userRepository;

    public UserService() {
        this.userRepository = new UserRepository(); // 의존성 직접 생성
    }

}

사용 이유

  • spring 간 객체가 의존관계를 관리할 수 있도록 하는 것
  • 객체가 의존관계를 등록할 때 스프링 컨테이너에서 해당 빈을 찾고 그 빈과 의존성을 만들게 하기 위함
  • 객체 간의 결합을 약하게 만들고, 유지보수가 쉽도록 하기 위함

사용 방법

  • @Bean 어노테이션을 통해 메소드로부터 반환된 객체를 스프링 컨테이너에 등록(이 때, 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 함)
    -> 빈은 클래스의 등록 정보, Getter/Setter 메소드를 포함 + 컨테이너에 사용되는 설정 메타데이터로 생성됨(설정 메타데이터 : XML, 어노테이션, 자바 코드로 표현. 컨테이너의 명령과 인스턴스화, 설정, 조립할 객체 등을 정의)
  • @Component 어노테이션이 있으면 스프링 빈으로 자동 등록됨(@Component를 포함하는 @Controller, @Service, @Repository 어노테이션도 스프링 빈으로 자동 등록)
  • 빈 이름, 타입을 알아야 등록 할 수 있음
  • 이름 : id


p1과 p2는 같은 객체를 참조하고 있으므로 같은 값이다. -> 스프링은 기본적으로 빈을 등록할 때 싱글톤으로 함

@Getter
@Setter
@ToString
@AllArgsConstructor
public class Person {
	private String name;
	private int age;
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="person" class="chapter01.Person">
		<property name="name"> <!-- name은 private라서 값을 대입할 수 없음 -> setName 메소드를 무조건 호출할 수 밖에 없음 -->
			<value>홍길동</value>
		</property>
		
		<property name="age"> 
			<value>30</value>
		</property>

	</bean>
</beans>

	}

}

@All~를 추가했는데 beans.xml에서 에러가 나는 이유 : 기본 생성자가 없기 때문 -> 현재의 bean은 기본 생성자를 통해 객체를 생성하는데, person에는 두 개의 생성자만 초기화 해 주고 있기 때문에 에러가 남
@NoArgsConstructor를 추가하면 해결이 된다.

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Person {
	private String name;
	private int age;
}


여기서 이순신과 40을 바꿔 쓰면 에러가 난다. 처음 Person class에서 String, int로 적었기 때문에 타입이 달라졌기 때문이다.

profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러
post-custom-banner

0개의 댓글