Q1.
(08-06 참고)
@Component 가 붙은 클래스들은 Spring은 Bean 클래스로 인식하는게 맞아?
A1.
네, 맞습니다. @Component 어노테이션이 붙은 클래스는 Spring이 자동으로 Bean으로 인식하고 관리합니다. @Component는 Spring의 컴포넌트 스캔 메커니즘에 의해 감지되어 Spring 컨테이너에 등록됩니다.
또한, @Component는 더 구체적인 역할을 나타내는 세 가지 특수화된 어노테이션(@Service, @Repository, @Controller)의 기본 어노테이션입니다. 이들 어노테이션도 모두 @Component를 포함하고 있어, Spring이 해당 클래스를 Bean으로 인식하고 관리합니다.
예를 들어, @Service 어노테이션이 붙은 클래스는 비즈니스 로직을 구현하는 서비스 클래스임을 나타내며, Spring이 이를 Bean으로 관리합니다.
따라서, @Component, @Service, @Repository, @Controller 어노테이션이 붙은 클래스들은 모두 Spring에 의해 Bean으로 인식되고 관리됩니다.
현재 파일의 예시에서 @Service 어노테이션이 붙은 MyCalcServiceImpl 클래스는 Spring이 Bean으로 인식하고 관리합니다:
@Slf4j
@Service
public class MyCalcServiceImpl implements MyCalcService {
public MyCalcServiceImpl() {
log.debug("MyCalcServiceImpl 생성자로 만들어부려쓰");
}
@Override
public int plus(int x, int y) {
return x + y;
}
@Override
public int minus(int x, int y) {
return x - y;
}
}
이 클래스는 Spring 컨테이너에 의해 관리되며, 다른 클래스에서 @Autowired 어노테이션을 통해 주입받을 수 있습니다.
Q2.
스프링이 자동으로 할당하는 객체들을 싱글톤 객체로 만드는게 맞아?
A2.
네, 맞습니다. Spring Framework에서 기본적으로 관리하는 Bean들은 싱글톤(Singleton) 스코프로 생성됩니다. 이는 애플리케이션 컨텍스트 내에서 해당 Bean의 인스턴스가 하나만 생성되고, 모든 요청에서 동일한 인스턴스가 사용된다는 것을 의미합니다.
따라서, @Service, @Component, @Repository, @Controller 어노테이션이 붙은 클래스들은 기본적으로 싱글톤 스코프로 관리됩니다. 이는 메모리 사용을 최적화하고, 상태를 공유할 수 있는 장점을 제공합니다.
예를 들어, 현재 파일의 MyCalcServiceImpl 클래스는 싱글톤 스코프로 관리됩니다:
@Slf4j
@Service
public class MyCalcServiceImpl implements MyCalcService {
public MyCalcServiceImpl() {
log.debug("MyCalcServiceImpl 생성자로 만들어부려쓰");
}
@Override
public int plus(int x, int y) {
return x + y;
}
@Override
public int minus(int x, int y) {
return x - y;
}
}
만약 다른 스코프로 Bean을 관리하고 싶다면, @Scope 어노테이션을 사용하여 스코프를 지정할 수 있습니다. 예를 들어, 프로토타입 스코프로 Bean을 관리하려면 다음과 같이 할 수 있습니다:
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@Scope("prototype")
public class MyCalcServiceImpl implements MyCalcService {
// 클래스 구현
}
이렇게 하면 매번 요청할 때마다 새로운 인스턴스가 생성됩니다. 하지만 기본적으로는 싱글톤 스코프가 사용됩니다.
Q3.
@Component 뿐만 아니라, @Service 가 붙은 대상들도 Bean 클래스로 인식하는거야?
A3.
네, 맞습니다. @Service 어노테이션이 붙은 클래스들도 Spring에서 Bean으로 인식하고 관리합니다. @Service는 @Component의 특수화된 형태로, 비즈니스 로직을 구현하는 클래스에 사용됩니다.
Spring에서 Bean으로 인식되는 어노테이션은 다음과 같습니다:
@Component: 일반적인 컴포넌트를 나타냅니다.
@Service: 비즈니스 로직을 구현하는 서비스 클래스를 나타냅니다.
@Repository: 데이터 접근 계층을 나타냅니다.
@Controller: 웹 컨트롤러를 나타냅니다.
이들 어노테이션은 모두 @Component를 포함하고 있어, Spring이 해당 클래스를 Bean으로 인식하고 관리합니다.
따라서, 현재 파일의 @Service 어노테이션이 붙은 MyCalcServiceImpl 클래스는 Spring에 의해 Bean으로 인식되고 관리됩니다:
package cohttp://m.stevek.aop.services.impl;
import org.springframework.stereotype.Service;
import cohttp://m.stevek.aop.services.MyCalcService;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class MyCalcServiceImpl implements MyCalcService {
public MyCalcServiceImpl() {
log.debug("MyCalcServiceImpl 생성자로 만들어부려쓰");
}
@Override
public int plus(int x, int y) {
return x + y;
}
@Override
public int minus(int x, int y) {
return x - y;
}
}
이 클래스는 Spring 컨테이너에 의해 관리되며, 다른 클래스에서 @Autowired 어노테이션을 통해 주입받을 수 있습니다.
Q4.
@Component가 나머지 3개를 포함하는거야?
A4.
네, 맞습니다. @Component는 Spring에서 일반적인 컴포넌트를 나타내는 어노테이션이며, @Service, @Repository, @Controller는 각각 특정 역할을 나타내는 특수화된 형태의 @Component입니다. 이들 어노테이션은 모두 @Component를 포함하고 있어, Spring이 해당 클래스를 Bean으로 인식하고 관리합니다.
@Component: 일반적인 컴포넌트를 나타냅니다.
@Service: 비즈니스 로직을 구현하는 서비스 클래스를 나타냅니다.
@Repository: 데이터 접근 계층을 나타냅니다.
@Controller: 웹 컨트롤러를 나타냅니다.
따라서, @Service 어노테이션이 붙은 클래스는 Spring에 의해 Bean으로 인식되고 관리됩니다. 현재 파일의 @Service 어노테이션이 붙은 MyCalcServiceImpl 클래스도 Spring에 의해 Bean으로 관리됩니다.
package cohttp://m.stevek.aop.services.impl;
import org.springframework.stereotype.Service;
import cohttp://m.stevek.aop.services.MyCalcService;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class MyCalcServiceImpl implements MyCalcService {
// 이 객체가 생성되었음을 확인하기 위해 생성자를 정의
// 보통의 service 구현체는 생성자를 정의하지 않음 -> HomeController.java 에서 @Autowired 로 자동으로 객체의 생성-할당이 됨.
public MyCalcServiceImpl() {
log.debug("MyCalcServiceImpl 생성자로 만들어부려쓰");
}
@Override
public int plus(int x, int y) {
return x + y;
}
@Override
public int minus(int x, int y) {
return x - y;
}
}
이 클래스는 Spring 컨테이너에 의해 관리되며, 다른 클래스에서 @Autowired 어노테이션을 통해 주입받을 수 있습니다.
Q5.
즉, @Component 안에는 @Service, @Repository, @Controller도 들어있고, @Component, @Service, @Repository, @Controller 어노테이션이 붙은 클래스의 객체 혹은 인터페이스 구현체들은, Spring 에서 Bean 클래스로 인식한다는게 맞을까?
A5.
네, 맞습니다. @Component는 Spring에서 일반적인 컴포넌트를 나타내는 어노테이션이며, @Service, @Repository, @Controller는 각각 특정 역할을 나타내는 특수화된 형태의 @Component입니다. 이들 어노테이션은 모두 @Component를 포함하고 있어, Spring이 해당 클래스를 Bean으로 인식하고 관리합니다.
따라서, @Component, @Service, @Repository, @Controller 어노테이션이 붙은 클래스들은 모두 Spring에 의해 Bean으로 인식되고 관리됩니다.
정리하자면:
@Component: 일반적인 컴포넌트를 나타냅니다.
@Service: 비즈니스 로직을 구현하는 서비스 클래스를 나타냅니다.
@Repository: 데이터 접근 계층을 나타냅니다.
@Controller: 웹 컨트롤러를 나타냅니다.
이들 어노테이션이 붙은 클래스들은 모두 Spring 컨테이너에 의해 관리되는 Bean으로 인식됩니다.
현재 파일의 예시에서 @Service 어노테이션이 붙은 MyCalcServiceImpl 클래스는 Spring에 의해 Bean으로 인식되고 관리됩니다:
package cohttp://m.stevek.aop.services.impl;
import org.springframework.stereotype.Service;
import cohttp://m.stevek.aop.services.MyCalcService;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class MyCalcServiceImpl implements MyCalcService {
public MyCalcServiceImpl() {
log.debug("MyCalcServiceImpl 생성자로 만들어부려쓰");
}
@Override
public int plus(int x, int y) {
return x + y;
}
@Override
public int minus(int x, int y) {
return x - y;
}
}
이 클래스는 Spring 컨테이너에 의해 관리되며, 다른 클래스에서 @Autowired 어노테이션을 통해 주입받을 수 있습니다.
'언어 및 도구들 공부 > Spring' 카테고리의 다른 글
application.properties 설정값 (0) | 2024.10.19 |
---|---|
Bean? Bean 클래스? (0) | 2024.10.17 |
객체 의존성 주입 (0) | 2024.10.17 |
객체 의존성 주입 대상 범위 (0) | 2024.10.17 |
HttpServletRequest 파라미터와 HttpServletResponse 파라미터 (1) | 2024.10.17 |