화면을 붙이기 위해서는 (HTML로 뿌려주기 위해서) 컨트롤러와 뷰 템플릿이 필요 이 때 회원 컨트롤러 (MemberController) 는 회원 서비스 (MemberService) 를 통해서 회원 가입 , 조회를 할 수 있어야 함 이러한 관계를 의존 관계가 있다고 표현 → MemberController가 MemeberService를 의존
회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비하자.
회원 컨트롤러에 의존관계 추가
// main/java/hello/hellospring/controller/MemberController.java@Controller// 스프링 컨테이너가 처음에 스프링을 뜰 때, @Controller 어노테이션으로 인해 MemberController 객체를 생성해서 스프링에 넣어두고 관리 됨// 스프링 빈이 관리된다고 표현publicclassMemberController {
// private final MemberService memberService = new MemberService();// 위처럼이 객체를 new 해서 사용하지 말고, 하나만 생성해서 같이 쓰도록 하기 위해// 스프링 컨테이너로부터 MemberService를 가져다 쓰도록 코드 변경 (스프링 컨테이너에게 등록을 하고 사용)// Constructor 단축키 Alt + Insertprivatefinal MemberService memberService;
@Autowired// @Autowired 어노테이션으로 인해 스프링이 컨테이너에 있는 MemberService를 가져다가 연결 시켜줌 (연관된 객체를 찾아 넣어줌)// 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입publicMemberController(MemberService memberService) {
this.memberService = memberService;
}
}
스프링 컨테이너가 처음에 스프링을 뜰 때, @Controller 어노테이션으로 인해 MemberController 객체를 생성해서 스프링에 넣어두고 관리하게 되고, 이를 스프링 빈이 관리된다고 표현하며, 생성자에 @Autowired 를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입 (DI)
예시) 스프링 컨테이너 속 helloController이 스프링 빈
만약 오류가 발생한다면, MemberService가 스프링 빈으로 등록되어 있지 않았기 때문이므로 스프링 빈을 등록해야 함 스프링 빈을 등록하는 방법 1) 컴포넌트 스캔과 자동 의존관계 설정 스프링 빈을 등록하는 방법 2) 자바 코드로 직접 스프링 빈 등록
오류 발생
컴포넌트 스캔 원리 @Controller 어노테이션이 있으면 스프링 빈으로 자동 등록 @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문 @Controller 어노테이션이외에도 @Service, @Repository 어노테이션도 스프링 빈으로 자동 등록 MemberService와 MemoryMemberRepository 스프링 빈 등록
실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용 그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록 → 여기서는 향후 메모리 리포지토리를 다른 리포지토리로 변경할 예정이므로, (아직 데이터 저장소가 선정되지 않았으므로) 컴포넌트 스캔 방식 대신에 자바 코드로 스프링 빈을 설정
@Autowired 를 통한 DI는 helloConroller , memberService 등과 같이 스프링이 관리하는 객체에서만 동작 스프링 빈으로 등록하지 않고 내가 직접 new로 생성한 객체에서는 동작하지 않음
화면을 붙이기 위해서는 (HTML로 뿌려주기 위해서) 컨트롤러와 뷰 템플릿이 필요 이 때 회원 컨트롤러 (MemberController) 는 회원 서비스 (MemberService) 를 통해서 회원 가입 , 조회를 할 수 있어야 함 이러한 관계를 의존 관계가 있다고 표현 → MemberController가 MemeberService를 의존
회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비하자.
회원 컨트롤러에 의존관계 추가
// main/java/hello/hellospring/controller/MemberController.java@Controller// 스프링 컨테이너가 처음에 스프링을 뜰 때, @Controller 어노테이션으로 인해 MemberController 객체를 생성해서 스프링에 넣어두고 관리 됨// 스프링 빈이 관리된다고 표현publicclassMemberController {
// private final MemberService memberService = new MemberService();// 위처럼이 객체를 new 해서 사용하지 말고, 하나만 생성해서 같이 쓰도록 하기 위해// 스프링 컨테이너로부터 MemberService를 가져다 쓰도록 코드 변경 (스프링 컨테이너에게 등록을 하고 사용)// Constructor 단축키 Alt + Insertprivatefinal MemberService memberService;
@Autowired// @Autowired 어노테이션으로 인해 스프링이 컨테이너에 있는 MemberService를 가져다가 연결 시켜줌 (연관된 객체를 찾아 넣어줌)// 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입publicMemberController(MemberService memberService) {
this.memberService = memberService;
}
}
스프링 컨테이너가 처음에 스프링을 뜰 때, @Controller 어노테이션으로 인해 MemberController 객체를 생성해서 스프링에 넣어두고 관리하게 되고, 이를 스프링 빈이 관리된다고 표현하며, 생성자에 @Autowired 를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입 (DI)
예시) 스프링 컨테이너 속 helloController이 스프링 빈
만약 오류가 발생한다면, MemberService가 스프링 빈으로 등록되어 있지 않았기 때문이므로 스프링 빈을 등록해야 함 스프링 빈을 등록하는 방법 1) 컴포넌트 스캔과 자동 의존관계 설정 스프링 빈을 등록하는 방법 2) 자바 코드로 직접 스프링 빈 등록
오류 발생
컴포넌트 스캔 원리 @Controller 어노테이션이 있으면 스프링 빈으로 자동 등록 @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문 @Controller 어노테이션이외에도 @Service, @Repository 어노테이션도 스프링 빈으로 자동 등록 MemberService와 MemoryMemberRepository 스프링 빈 등록
실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용 그리고 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록 → 여기서는 향후 메모리 리포지토리를 다른 리포지토리로 변경할 예정이므로, (아직 데이터 저장소가 선정되지 않았으므로) 컴포넌트 스캔 방식 대신에 자바 코드로 스프링 빈을 설정
@Autowired 를 통한 DI는 helloConroller , memberService 등과 같이 스프링이 관리하는 객체에서만 동작 스프링 빈으로 등록하지 않고 내가 직접 new로 생성한 객체에서는 동작하지 않음