스프링 기초 : 스프링과 빈의 의존관계

Stella·2022년 5월 6일
0

Java

목록 보기
9/18

스프링과 빈의 의존관계

기본적으로 @springBootApplication이 포함된 package와 하위 package만 spring bean으로 등록.

Spring은 spring container에 spring bean을 등록할때, 기본적으로 singleton으로 등록한다.(유일하게 하나만 등록해서 공유한다) ex) memberService 하나만, memeberRepository 하나만. 같은 스프링 빈이면 모두 같은 인스턴스. 메모리 절약. 설정으로 다르게 설정할수 있지만, 특수한 케이스 빼고는 singleton사용.

서비스를 통해 멤버를 가입해서 repo에 저장

화면 만들기
controller, view template 필요
회원가입하고 회원가입된 정보를 html로 뿌림
controller는 member serivce를 통해서 회원가입하고 데이터 조회 가능. controlle가 service를 의존한다. 서로 의존관계가 있다.

@Controller :

spring이 시작할때 spring container가 생긴다. 거기에 @controller annotaion이 있으면 memberController를 객체를 만들어서 Spring에 넣어주고 spring이 관리한다. spring container에서 spring bean이 관리된다.

@Autowried:

Spring이 spring container에 있는 memberService를 가져다 연결 시켜준다. Dependency injection(DI) 의존관계를 주입해준다.

@Service

@Repository

스프링빈을 등록하는 2가지 방법

  • 컴포넌트 스캔 방식과 자동의존관계설정 ex)@service, @controller
    왜 component scan?
    @Component라고 사용해도 됨, @service 안에 @componenet가 포함.
  • @autowired

자바코드로 직접 스프링 빈 등록하기
@Configuration
@Bean

xml 설정방식은 최근에는 잘 사용하지 않음.

DI Injection

1. field 주입

생성자를 빼고 필드에 바로 주입. 좋지않음. 변경할 수 있는 방법이 없다. 스프링 뜰때만 넣어주고 중간에 바꿀수 있는 방법이 없다. 
@Autowired private final MemberService memeberService;

2. setter 주입

누군가가 memberController를 호출했을 때, public으로 되어있어야함. 한번 setting이 되면 변경 할 일이 없지만, public으로 노출됨.

@Autowired 
    public setMemberService(MemberService memeberService) {
        this.memeberService = memeberService;
    }

3. constructor 주입

의존관계가 실행 중에 동적으로 변하는 경우(서버가 떠있는데 중간중간 바뀌는)는 거의 없으므로 생성자 주입을 권장.

@Autowired //생성자를 통해서 들어옴
    public MemberController(MemberService memeberService) {
        this.memeberService = memeberService;
    }

실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 일반적으로 작성하는 컨트롤러, 서비스, 리포지토리.

정형화 되지 않거나, 상황에 따라 구현클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다. ex)MemoryMemberRepository를 db로 실제연결하는 repository로 바꾼다면, 기존의 연결된 memberservice나 나머지 코드에 손 안대고 변경 가능.

@Autowired를 통한 DI는 스프링이 관리하는 객체에서만 동작한다. 스프링에 등록되어있지않으면 @autowired가 붙어있어도 동작하지 않는다. 스프링빈으로 등록하지않고, 직접 생성한 객체에서는 동작하지 않는다.

public class MemberService {

    private final MemberRespository memberRespository;

@Autowired //스프링 컨테이너에 등록되어있지 않아서 동작하지 않는다.
    public MemberService(MemberRespository memberRespository) {
        this.memberRespository = memberRespository; 
    }
    
    public static void main(String[] args){
      MemberService memberService = new MemberService(); // 여기서도 동작하지않음. 내가 직접 생성했기 때문에. 스프링 컨테이너에 올라가는 것들만 동작

Ref:
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

profile
Hello!

0개의 댓글