본문 바로가기

카테고리 없음

[2025 1학기 스프링부트 스터디] 오세웅 #4주차

반응형

 

이 전 강의에서 회원 관리 예제를 만들었다.

이를 컨트롤러와 연결하고 서비스와 리포지토리에 의존관계를 만드는 방법을 이번주에 배웠다.

컴포넌트 스캔과 자동 의존관계 설정

우리가 이 전에 만들었던 MemberService나 MemoryMemberRepository는 순수한 자바 파일이다.

그래서 우리가 의존성을 만들어주기 위해서 @Component 애너테이션이 포함된 애너테이션들을 활용한다.

@Controller
public class MemberController {

    private MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

 

스프링 컨테이너에서 등록하고 관리하기 위해서는 객체를 new를 통해서 선언하는게 아니라 생성자를 이용한다.

생성자를 이용하는 이유는 뒷 내용에서 설명한다.

컨트롤러 파일에는 @Controller 애너테이션을 추가해주어서 스프링 컨테이너에 빈으로 등록하고 관리하는 것이다.

서비스 파일과 리포지토리에도 각각 @Service와 @Repository 애너테이션을 추가한다.

@Controller, @Service, @Repository를 통해 스프링 컨테이너가 각각의 파일들이 컨트롤러, 서비스, 리포지토리 파일임을 알수 있다.

그리고 생성자에 @Autowired를 통해 연결해준다.

이와 같이 연결되게 된다.

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

컴포넌트 스캔을 이용해서 자동으로 스프링 빈을 등록하는 것이 아닌 자바 코드를 통해 직접 스프링 빈을 등록할 수 있다.

 

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

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

위처럼 따로 파일을 생성해서 @Configuration 애너테이션을 통해 관리하고 내부에 @Bean을 통해 직접 빈을 등록할 수 있다.

하지만 컨트롤러에는 컴포넌트 스캔에서 했던 방법과 같이 @Controller 애너테이션을 사용해주어야 한다.

 

DI에는 필드 주입, setter주입, 생성자 주입 3가지 방법이 있다.

필드 주입은 한번 선언하면 변경이 어려워 권장되지 않고, setter는 실행중에 동적으로 변경할 수 있게 하기 때문에 권장하지 않는다.

그래서 생성자 방법이 권장이 된다.

 

그렇다면 언제 컴포넌트 스캔을 사용하고, 언제 자바 코드를 이용한 방법을 사용할까.

만약 컨트롤러, 서비스, 리포지토리가 정형화 되어있다면 컴포넌트 스캔을 사용하고 구현 클래스 변경이 필요하면 자바 코드를 사용한다.

회원 관리 예재를 구현했을 때 처럼 구현 클래스를 변경해야 할 때 기존 코드를 변경하지 않고 @ Configuration 코드만 변경하면 된다.

 

 

반응형