일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Java
- 자바
- Flutter
- 최단 경로
- php
- 스프링
- 한정 분기
- 파이썬
- C
- 백준
- 플러터
- php 프로그래밍 입문 연습문제
- spring
- 페이코 초대코드
- SWEA
- 플러터 개발환경 설정
- php 프로그래밍 입문 3판
- C언어
- php 프로그래밍
- php 프로그래밍 입문 솔루션
- php 프로그래밍 입문 문제풀이
- programmers
- 페이코 친구코드
- 배열
- 페이코 추천인코드
- 자바 스프링
- JAVA SPRING
- 페이코 추천인
- php 프로그래밍 입문
- php 프로그래밍 입문 예제
- Today
- Total
ImJay
[Java Spring] 1-14. 자바 코드로 직접 스프링 빈 등록하기 본문
[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 어노테이션이 동작한다.
'Java Spring > 스프링 입문' 카테고리의 다른 글
[Java Spring] 1-16. 화면 웹 기능 - 등록 (0) | 2023.01.30 |
---|---|
[Java Spring] 1-15. 화면 웹 기능 - 홈 화면 추가 (0) | 2023.01.30 |
[Java Spring] 1-13. 컴포넌트 스캔과 자동 의존관계 설정 (0) | 2023.01.30 |
[Java Spring] 1-12. 회원 서비스 테스트 (1) | 2023.01.30 |
[Java Spring] 1-11. 회원 서비스 개발 (0) | 2023.01.30 |