MemberController가 MemberService를 통해서 회원가입, 데이터 조회
-> 서로 의존 관계가 있다
@Controller
public class MemberController {
}
@Controller
public class MemberController {
private final MemberService memberService;
// 새로운 인스턴스 생성할 필요 X
@Autowired // 생성자가 1개만 있으면 생략 가능
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Autowired
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired // 생성자 주입
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
@Repository
public class MemoryMemberRepository implements MemberRepository {}
이 MemberService를 스프링이 생성할 때 스프링 컨테이너에 등록을 하면서 이 생성자를 호출 -> 또 @Autowired가 있으면 MemberRepository가 필요함을 알고 스프링 컨테이너에 MemoryMemberRepository를 넣어줌
그럼 그림과 같이 연결됨
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록(유일하게 하나만 등록해서 공유) -> 같은 스프링 빈이면 모두 같은 인스턴스
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
참고
Dependency Injection
1. 필드 주입
@Autowired private MemberService memberService;
2. setter 주입
@Autowired // public으로 노출
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
3. 생성자 주입⭐ <- 권장
Q&A
1. 다음 빈칸에 들어갈 단어는?
- `static/_____.html`을 올려두면 `http://localhost:8080` 실행 시 Welcome page 기능을 제공한다.
답: index
2. 다음은 Controller 코드이다. `http://localhost:8080/hi` 실행 시 `resources/templates/hello.html`을 보여주기 위해 빈칸에 들어갈 단어는 무엇인가?
@Controller
public class HelloController {
@GetMapping("hi")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "_____";
}
}
답: hello
3. 다음 빈칸에 들어갈 단어는?
컨트롤러에서 리턴 값으로 문자를 반환하면 ( )가 화면을 찾아서 처리한다.
답 : viewResolver 뷰 리졸버
4. MVC가 가리키는 각 단어는?
답 : Model, View, Controller
5. 다음 코드 빈칸에 들어갈 json 형식의 객체를 반환하는 애노테이션 이름은?
@Controller
public class HelloController {
@GetMapping("hello-api")
@___________
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
답 : @ResponseBody
6. 이 애노테이션은 각 테스트 실행 전에 호출되며, 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고 의존관계도 새로 맺어준다. 이 애노테이션의 이름은?
답 : @BeforeEach
7. 생성자에 ( ) 애노테이션이 있으면 스프링이 연관된 객체를 스프링 컨테이너에 찾아서 넣어준다. 이렇게 객체 의존관계를 외부에서 넣어주는 것을 Dependency Injection, 의존성 주입이라 한다. 빈칸에 들어갈 단어는?
답 : @Autowired
8. 스프링 빈을 등록하는 2가지 방법은?
답 : 1. 컴포넌트 스캔과 자동 의존관계 설정 2. 자바 코드로 직접 스프링 빈 등록하기
9. 이 애노테이션이 있으면 스프링 빈으로 자동 등록된다. 이 애노테이션 이름은?
답 : @Component
10. 다음 괄호 안에 들어갈, 회원 컨트롤러에 생성자 주입을 통해 의존관계를 추가하는 코드를 작성해주세요.
@Controller
public class MemberController {
private final MemberService memberService;
(
)
}
답 :
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
11. 자바 코드로 직접 MemberService와 MemberRepository 스프링 빈을 등록하는 SpringConfig 클래스 코드를 작성해보세요.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
[출처] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 (기술 섹션 0. 강의소개 ~ 섹션 4. 스프링 빈과 의존관계), 김영한 https://inf.run/WzVy
ⓒ 머핀
[스프링3] 5장. API를 작성하는 다양한 방법 (0) | 2023.11.03 |
---|---|
[스프링3] 4장. 스프링 부트 애플리케이션 개발하기 (1) | 2023.10.13 |
[스프링3] 3장 개발 환경 구성 (0) | 2023.10.13 |
[스프링 3팀] 01-02 스프링 부트&개발 전 기초 지식 (0) | 2023.10.13 |
[스프링3] 섹션6. 스프링 DB 접근 기술 JPA (0) | 2023.10.06 |