스프링 입문 - 섹션4 스프링 빈과 의존관계

2023. 6. 27. 21:00·CS/김영한 스프링 강의

일단 의존관계가 뭐고 왜 나오는지 부터 생각하자.

 

public class MemberService {

    MemberService memberService = new MemberService();
    MemoryMemberRepository memberRepository = new MemoryMemberRepository();

    // ...
}

서비스에서 레퍼지토리 객체를 직접 만드는 식으로 하면, 다른 서비스에서도 새로 만들면 서로 다른 데이터베이스(레퍼지토리)를 볼 수 있는 일이 생긴다. 그래서 꼬일 수 있으니 하나만 보게 하기 위함. 또 어차피 같은 일을 하니 하나만 만들어서 계속 쓰는 의미도 있음. 이를 싱글톤이라고 함.

 

 

의존관계는 해당 기능을 원하는 클래스가 그 클래스의 인스턴스를 주입 받아서 사용하는 것으로 설계됨. 이래야 다른 서비스에도 그 클래스의 하나의 인스턴스를 받아서 같은 인스턴스 가지고 할 수 있도록 조절할 수 있으니까. 처음 실행해서 만들어진 뒤에 변경이 일어나지 않게끔(변수 없애기) 생성자에서 받도록 만드는게 보통이다. 생성자 말고도 세터로 등록하는 방법, 변수에서 @Autowired로 등록하는 방법이 있는데, 다른곳에서 변형시킬 수 있고, 내가 원하는대로 못 바꿔서 거의 안사용함.

public class MemberService {

    MemberService memberService = new MemberService();

    private final MemoryMemberRepository memberRepository;
    public MemberService() {
        memberRepository = new MemoryMemberRepository();
    }

    // ...
}

 

이렇게 이어받는걸 다음과 같이 다이어그램으로 그릴 수 있음(이래서 4학년때 배운다.).

 

이 의존관계 주입을 @Autowired를 사용하면 스프링이 알아서 해주는 것. 그럼 스프링 컨테이너 안에 Bean으로 등록된 객체를 찾아 스프링이 알아서 넣어준다. 넣는다는 것은 스프링 컨테이너 안에 넣어준다는 것이고, 스프링 빈으로 등록한다고 함.

@Controller
public class MemberController {
    private final MemberService memberService;
    
    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

 

내가 원하는 객체를 스프링 컨테이너 안에 넣는 방법 즉, 빈으로 등록하는 방법은 2가지가 있는데, 컴포넌트 스캔과 자동 의존관계 설정, 자바 코드로 직접 등록하는 방법임. 둘 다 @SpringBootApplication가 포함되어 있는 패키지에 포함되어야 함.

 

컴포넌트 스캔은 저 @SpringBootApplication가 포함되어 있는 클래스들을 다 돌면서 annotation으로 @Component가 등록되어 있는지 보는거다. @Controller, @Service, @Repository는 @Component들이 이미 정의가 되어있는 특이 케이스들.

직접 등록은 @SpringBootApplication가 포함되어 있는 패키지 위치 아무데나 config 클래스를 만들어 @Bean으로 원하는 클래스를 직접 넣어주면 된다. 직접 등록하면 나중에 독립적으로 수정하기 쉽다는 장점이 있음.

@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }
    
    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

 

 

'CS > 김영한 스프링 강의' 카테고리의 다른 글

스프링 기본 - 섹션2,3. 스프링 핵심 원리 이해 - 예제 만들기, 객체 지향 원리 적용  (0) 2023.07.02
스프링 기본 - 섹션1 객체 지향 설계와 스프링  (0) 2023.06.30
스프링 입문 - 섹션7 AOP  (0) 2023.06.29
스프링 입문 - 섹션6 스프링 DB 접근 기술  (0) 2023.06.28
만든 이유  (0) 2023.06.25
'CS/김영한 스프링 강의' 카테고리의 다른 글
  • 스프링 기본 - 섹션1 객체 지향 설계와 스프링
  • 스프링 입문 - 섹션7 AOP
  • 스프링 입문 - 섹션6 스프링 DB 접근 기술
  • 만든 이유
용나리
용나리
  • 용나리
    티스토리 블로그
    용나리
  • 전체
    오늘
    어제
    • 분류 전체보기 (333)
      • 과거의 것들 (93)
        • AI Tech boostcamp (92)
      • 생각정리(고찰) (2)
      • 기술 글 (0)
      • 코딩테스트 (4)
        • C++ (0)
        • Python (4)
      • CS (121)
        • 컴퓨터 시스템 (4)
        • 코틀린 인 액션 (13)
        • 김영한 스프링 강의 (104)
      • 일지 남기기용 (11)
        • 운동 (10)
      • 개발 배포 해보기 (1)
      • 프로그래밍 언어 및 기타 (32)
        • Spring Boot (9)
        • Python (9)
        • Kotlin (1)
        • Flutter (2)
        • SQL (4)
        • Docker (3)
        • 공통 (4)
      • os (4)
        • Linux (4)
      • 기술 (17)
        • PyTorch (6)
        • Computer Vision (6)
        • NLP (1)
        • 기타 (4)
      • 제품 후기 (0)
      • 게임 (0)
        • Human Resource Machine (0)
      • 강의 (26)
        • fullstackdeeplearning_sprin.. (9)
        • 부캠 안드로이드 학습정리 (17)
      • 개인 메모 (10)
      • IT 기타 (5)
      • 논문 읽기 연습 (5)
        • Computer Vision (1)
        • NLP (0)
        • 공통 (2)
        • 그냥 메모 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    pip install killed
    파이썬 실행경로
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
용나리
스프링 입문 - 섹션4 스프링 빈과 의존관계
상단으로

티스토리툴바