반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
11-07 11:40
관리 메뉴

ImJay

[Java Spring] 1-14. 자바 코드로 직접 스프링 빈 등록하기 본문

Java Spring/스프링 입문

[Java Spring] 1-14. 자바 코드로 직접 스프링 빈 등록하기

ImJay 2023. 1. 30. 13:06
반응형

[Java Spring] 1-14. 자바 코드로 직접 스프링 빈 등록하기


1. 컴포넌트 스캔 방법과 직접 등록하는 방법 두가지 다 알아야한다.

 

2. 기존에 등록했던 어노테이션들을 삭제한다 (컨트롤러 제외)

 

3. src > main > java > hello.hellospring > 새로 만들기 > java 클래스

 

4. SpringConfig 클래스 생성

 

5.  코드 작성

package hello.hellospring;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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

 

6. 빌드 후 확인

 

7. 위 코드를 통해 해당 의존관계가 성립된 모습이다.

 

8. 각각의 장단점이 존재한다.

8-1. 과거에는 코드가 아닌 XML로 생성하였다.

8-2. DI(의존성 주입)에는 세가지 방법이 존재한다.

8-2-1. 생성자 주입

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

장점 : 건들 수 있고 수정할 수도 없다. 권장되는 방법

 

8-2-2. 필드 주입

@Autowired private MemberService memberService;

단점 : 한번 선언하면 건들 수가 없다.

 

8-2-3. setter 주입

private MemberService memberService;

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

단점 : 수정할 필요가 없는데 사용을 위해 public 으로 사용되어야 하는 위험성이 존재한다.

 

- 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.

 

8-3. 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용한다. 그리고 정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록한다.

8-3-1. 지금 우리가 처한 상황이 구현 클래스를 변경해야 되는 상황이다.

8-3-2. 우리는 처음에 상황을 데이터 저장소가 선정되지 않아서, 인터페이스로 구현 클래스를 변경할 수 있도록 설계했다.

8-3-3. 이 때 구현 클래스가 변경되게 된다면, 다른 코드를 전혀 손 볼 필요 없이, Bean 부분의 생성자만 변경해주면 된다.

8-3-4. 실제 구현 클래스가 MemoryMemberRepository() 에서 DbMemoryMemberRepository 로 변경된다고 가정하자.

8-3-5. 변경되는 부분 (SpringConfig.java)

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

 

8-4. 스프링 컨테이너에 올라가는 것들만 Autowired 어노테이션이 동작한다.

 

반응형
Comments