MemberController가 MemberService를 통해서 회원가입, 데이터 조회
-> 서로 의존 관계가 있다
@Controller
public class MemberController {
}
@Controller
애노테이션이 있으면 MemberController 객체를 생성해서 Spring에 넣어두고 Spring이 관리 -> 스프링 컨테이너에서 스프링 빈이 관리된다
@Controller
애노테이션이 있으면 스프링 빈으로 자동 등록
@Component
애노테이션이 있으면 스프링 빈으로 자동 등록된다@Controller
컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문@Controller
, @Service
, @Repository
도 @Component
를 포함하고 있어 스프링 빈으로 자동 등록된다@Controller
public class MemberController {
private final MemberService memberService;
// 새로운 인스턴스 생성할 필요 X
@Autowired // 생성자가 1개만 있으면 생략 가능
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@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();
}
}
참고
@Autowired private MemberService memberService;
@Autowired // public으로 노출
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
static/_____.html
을 올려두면 http://localhost:8080
실행 시 Welcome page 기능을 제공한다.
답: index
다음은 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
다음 빈칸에 들어갈 단어는?
컨트롤러에서 리턴 값으로 문자를 반환하면 ( )가 화면을 찾아서 처리한다.
답 : viewResolver 뷰 리졸버
MVC가 가리키는 각 단어는?
답 : Model, View, Controller
다음 코드 빈칸에 들어갈 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
이 애노테이션은 각 테스트 실행 전에 호출되며, 테스트가 서로 영향이 없도록 항상 새로운 객체를 생성하고 의존관계도 새로 맺어준다. 이 애노테이션의 이름은?
답 : @BeforeEach
생성자에 ( ) 애노테이션이 있으면 스프링이 연관된 객체를 스프링 컨테이너에 찾아서 넣어준다. 이렇게 객체 의존관계를 외부에서 넣어주는 것을 Dependency Injection, 의존성 주입이라 한다. 빈칸에 들어갈 단어는?
답 : @Autowired
스프링 빈을 등록하는 2가지 방법은?
답 : 1. 컴포넌트 스캔과 자동 의존관계 설정 2. 자바 코드로 직접 스프링 빈 등록하기
이 애노테이션이 있으면 스프링 빈으로 자동 등록된다. 이 애노테이션 이름은?
답 : @Component
다음 괄호 안에 들어갈, 회원 컨트롤러에 생성자 주입을 통해 의존관계를 추가하는 코드를 작성해주세요.
@Controller
public class MemberController {
private final MemberService memberService;
(
)
}
답 :
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
자바 코드로 직접 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