1. SpringBoot의 컨테이너 관리
스프링 컨테이너는 기본적으로, 빈(Bean)을 등록하여 객체를 생성하고 관리한다.
Bean을 등록하려면 @Component이 필요하다.
@Component 어노테이션을 메타 어노테이션(다른 어노테이션을 적용하는 어노테이션, 중복 어노테이션)으로 등록하여 Bean을 등록할 수도 있다.
Bean으로 등록한 객체는 AutoWired와 같은 어노테이션을 통해 의존성 주입도 가능하다.
빈으로 등록하기 위한 2가지 대표적인 방법을 알아보겠다.
2. 구성 정보 작성
package springstudy.spring_study;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springstudy.spring_study.repository.JpaMemberRepository;
import springstudy.spring_study.repository.MemberRepository;
import springstudy.spring_study.service.MemberService;
//스프링 빈을 생성하는 다른 방법 @Service @Repository 와는 다른 방법
//직접 등록, 하위 스캔 X
//직접 작성해야하는 단점이 있지만, DB마이그레이션 측면에서 Config가 유리
//정형화된 컨트롤러, 서비스, 리포지토리 등은 오토와이어(컴포넌트 스캔)을 사용하나, 상황에 따라 변해야 할 경우 Config(설정)을 통해 스프링 빈으로 등록한다.
//나중에 db로 교체(마이그레이션)하는 경우 - 실제 운영하는 경우에
@Configuration
public class SpringConfig {
private final MemberRepository memberRepository;
@Autowired //생략가능
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService() {
return new MemberService(memberRepository);
}
// @Bean
// public MemberRepository memberRepository() {
// 이 부분만 db로 바꿔주면 됨
// return new MemberRepositoryImpl();
// return new JdbcTemplateMemberRepository(dataSource);
// return new JpaMemberRepository(em);
// }
}
@Configuration 이라는 키워드가 클래스 이름에 붙게 되고, 해당 구성 설정 클래스를 통해 @Bean이라는 키워드가 붙어있는 객체는 스프링부트가 자동으로 생성하고 관리해준다.
직접 작성해야하는 번거로움이 있지만, 마이그레이션 측면에서 (예를들면 메모리 저장소에서 DB를 옮기는 경우) 매우 편리한 효과를 가지고 있다.
하지만, 대규모 프로젝트의 경우 직접 사용하는 경우 너무 많은 객체를 수동으로 관리해야하기 때문에 효율적이지 않다.
2.컴포넌트 스캔
@Service //컴포넌트 스캔방식 @Component포함
@Transactional
public class MemberService {
//...중략
}
@Controller
@RestController
class HelloController {
//..중략
}
@Repository
public class MemberRepositoryImpl implements MemberRepository {
//..중략
}
@SpringBootApplication
@ComponentScan //이미 SpringBootApplication안에 선언되어 있음
public class SpringStudyApplication {
public static void main(String[] args) {
SpringApplication.run(SpringStudyApplication.class, args);
}
}
컴포넌트 스캔이란, @ComponentScan이라는 어노테이션으로 등록 가능하며, 특정 패키지를 스캔하여 하위 요소들을 자동으로 Bean으로 등록해주는 것이다.
@Controller, @Service 등에도 내부를 살펴보면 @Component라는 어노테이션이 메타 어노테이션으로 등록되어있는 것을 볼 수 있다. (@Configuration, @ComponentScan도 마찬가지이다.)
쉽게말해, @Component가 포함된 어노테이션 클래스들을 모두 Bean으로 등록해주는 것이다.
이 방법은 매우 편리하다는 장점이 있으며, 일일히 등록된 객체를 알기 위해 큰 수고가 들어가지만, 이러한 점은 디자인 패턴이나 모듈화 등으로 해결할 수 있는 사소한 문제이다.
SpringBootApplication의 초기 코드에는 @SpringBootApplication 이라는 어노테이션이 붙어있는데 이미 @ComponentScan을 포함하고 있다.
후에 생성자 주입도 자세히 공부해 보아야겠다.
package springstudy.spring_study.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import springstudy.spring_study.service.MemberService;
@Controller
class MemberController {
//필드 주입
//스프링이 뜰 때만, 중간에 바꿀 수 없음
//@Autowired
private MemberService memberService;
//세터주입
//누군가 호출 시 public으로 열려있어야 함, 문제 생길 가능성이 있음
//@Autowired
// public void setMemberService(MemberService memberService){
// this.memberService = memberService;
// }
//스프링 컨테이너 연결
//스프링이 컨테이너의 서비스를 컨트롤러와 연결, 순수한 자바 코드면 실패 서비스, 레포지토리 어노테이션 필요
//생성 시 스프링빈에 등록된 멤버 서비스 객체를 주입 (DI, 의존성 주입)
//@Component가 존재하면 스프링빈이 자동으로 등록됨, 패키지 기준 하위
//싱글톤으로 등록한다
//다른 방법으로는 설정으로 등록하는 방법이 있다. (spring-config)
//생성자 주입
@Autowired
public MemberController(MemberService memberService){
//호출 가능성이 열리기 때문에 세터 주입은 지양
//memberService.setMemberRepository();
this.memberService = memberService;
}
}
//DI의 종류는 필드 주입, 세터 주입, 생성자 주입이 있다.
//최대한 처음 만들어 놓은 것은 변경하지 않는 것이 좋음 -> setter 주입의 필요성
//되도록이면 생성자 주입 사용
'BackEnd' 카테고리의 다른 글
| 5/23 - 서블릿, 쿠키와 세션, 필터와 리스너, JSP (0) | 2025.06.01 |
|---|---|
| 5/22 - Servlet, 쿠키, 세션 (0) | 2025.06.01 |
| 5/21 - 서블릿 응답 처리 방법 (0) | 2025.06.01 |
| 5/20 - 톰캣, 웹 서버 프로그래밍, 서블릿 (1) | 2025.06.01 |
| springboot - 기초 (0) | 2025.03.07 |