@Controller
public class MemberController {
}
@controller 지정시 생기는일
1. spring 시작시 spring container라는 통이 생김.
2. @Controller 어노테이션이 있으면 MemberContoller 객체를 생성해서 넣어둠.
3. 스프링이 관리
-> 스프링컨테이너에서 스프링 빈이 관리된다 라고 표현.
@Controller
public class MemberController {
private final MemberService memberService = new MemberService();
}
처음에 MemberController에서 MemberService 를 가져와서 써야됨.
new를 통해 객체를 생성해서 사용할 수 있음.
But 여러 컨트롤러에서 객체를 생성해서 사용하게 되면 별쓰잘때기없는 기능인데 메모리낭비도 하게 됨. 여러개 생성할 필요없음. 하나만 생성해서 공용으로 쓰면됨.
spring 이 관리하게 되면 container에 등록하고 spring container로부터 받아서 써야하는것으로 바꿔야함.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService){
this.memberService = memberService;
}
}
@Autowired 사용시 스프링이 MemberController 객체 생성하며 생성자를 실행해 memberService를 넣어줌.
But 오류뜸?? 왜 why?? 아직 container에 MemberService를 등록하지 않았기 때문에
@Service
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;//외부에서 넣어주게 바꿈.
}
MemberService 앞에 @Service 어노테이션을 붙어 등록. Repository앞에는 @Repository로 등록
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;//외부에서 넣어주게 바꿈.
}
마찬가지로 서비스에도 리포지토리를 연결해줘야하기때문에 @Autowired 어노테이션 추가. Dependency Injection.
스프링빈으로 등록 되는 범위
package hello.hellospring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloSpringApplication {
public static void main(String[] args) {
SpringApplication.run(HelloSpringApplication.class, args);
}
}
hello.hellospring안에 있는 패키지는 spring이 뒤져서 찾음.
but 같은 레벨에 있거나 상위 패키지는 찾지 않음.
설정하면 가능하나 기본적으로는 범위에 포함X
스프링은 스프링 빈을 컨테이너에 등록할 때 기본적으로 싱글톤으로 등록( 유일하게 하나만 등록해서 공유).
따라서 같은 스프링빈이면 모두 같은 인스턴스.
설정으로 변경할 수 있지만 특별한 경우 제외시 대부분 싱글톤사용.
스프링 빈을 등록하는 2가지 방법
1. 컴포넌트 스캔과 자동 의존관계 설정
2. 자바 코드로 직접 스프링 빈 등록하기
1. 컴포넌트 스캔
@Controller, @Service, @Repository
-> 안에 @Component 가지고 있음.
스프링이 올라올때 컴포넌트 관련 애노테이션은 다 객체 생성해서 스프링컨테이너에 등록 -> 컴포넌트 스캔
autowired 선을 연결해줌. -> 자동의존관계 설정
2. 자바 코드로 직접 스프링 빈 등록하기
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
return new MemoryMemberRepository();
}
}
1.SpringConfig class 생성
2.@Configuration 어노테이션
2. 파일 안에서 @Bean 키워드로 빈등록
스프링이 뜰때 @Configuration 읽고 Spring Bean에 등록하라는 뜻이네!
MemberService 객체 스프링 빈에 등록
MemberRepository객체 스프링빈에 등록
과거에는 자바코드로 설정하지 않고 XML문서로 설정
XML잘 사용안함.
Dependency injection
1. 필드 주입
@Controller
public class MemberController {
@Autowired private MemberService memberService;
// @Autowired//@Service된 객체를 넣어줌. Dependency Injection
// public MemberController(MemberService memberService){
// this.memberService = memberService;
// }
}
별로 좋지 않음. 바꿀 수 있는 방법이 별로 없음.
2. setter 주입
@Controller
public class MemberController {
private MemberService memberService;
@Autowired//@Service된 객체를 넣어줌. Dependency Injection
public void setMemberController(MemberService memberService){
this.memberService = memberService;
}
}
단점: set메소드가 public 접근권한을 가져야함. 그러나 중간에 memberService를 바꿀 이유가 없는데 public으로 공개되어있어서 바뀔수있음.
3. 생성자 주입
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired//@Service된 객체를 넣어줌. Dependency Injection
public MemberController(MemberService memberService){
this.memberService = memberService;
}
}
실무에서 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용.
정형화되어 있지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록.
ex) MemberRepository 설계 할때 데이터 저장소가 선정되지 않았다는 가상의 시나리오.
Interface를 설정하고 MemoryMemberRepository로 구현
나중에 다른것으로 바꿔치기 하면 기존코드를 변경하지 않는 방법이 있음.
이 때 설정을 통해 스프링 빈으로 등록하면됨.
@Autowired는 스프링 빈 등록후 관리되어야 적용가능. 등록 x시 동작하지 않음.
'Spring > 스프링입문' 카테고리의 다른 글
[스프링입문] 섹션6-1. 스프링 DB 접근 기술 - Jdbc, JdbcTemplate (0) | 2023.01.17 |
---|---|
[스프링입문] 섹션5. 회원관리 예제 - 웹MVC개발 (0) | 2023.01.17 |
[스프링입문] 섹션3.회원 관리 예제 - 웹MVC개발 (0) | 2023.01.16 |
[스프링입문] 섹션2. 스프링 웹 개발 기초 (0) | 2023.01.12 |
[스프링입문] 섹션1. 프로젝트 환경 설정 (0) | 2023.01.12 |