✔️ Spring에서는 내부적으로 중앙 요청 처리 서블릿(DispatcherServlet)이 존재함
👉🏻 모든 요청은 DispatcherServlet에 의해 분배되는 구조
👉🏻 기존의 방식처럼 매 요청마다 직접적으로 Servlet을 만들 필요가 없음
(일반 클래스로 Controller 만들어서 하나의 요청당 하나의 메소드로 처리)
✔️ DispatcherServlet에 의해 MemberController 클래스의 어느 메소드가 호출
👉🏻 MemberController 객체가 필요함
👉🏻 Spring이 MemberController 객체를 만들 수 있게끔 bean 등록을 해 줘야 함!
⌨️ 잘 실행되는지 확인 ver.
@Controller // Controller 타입의 어노테이션을 붙여 주면 빈 스캐닝을 통해 자동으로 bean으로 등록
public class MemberController {
@RequestMapping(value="login.me")
public void loginMember() {
System.out.println("잘 실행되나");
}
}
⌨️ bean이 등록되었는지 확인
👉🏻 Spring의 창고를 확인할 수 있는 Spring Explorer 탭을 클릭하면 방금 어노테이션으로 등록한 bean이 잘 등록되었음을 알 수 있음!
👉🏻 만약 어노테이션을 지우고 다시 저장한다면 해당 탭에서 깜빡거리면서 memberController가 사라짐
@Controller 와 @Component의 차이점
@Controller : bean 스캐닝을 통해 자동으로 bean 등록
👉🏻 가독성과 특정성 때문에 Component보다는 Controller를 권장
@Component : 타입에 상관없이 bean으로 등록
🙋🏻♀️ @RequestMapping(value="login.me"): 밸류값을 왜 이렇게 지정해야 하나요?
👉🏻 jsp에서 DispatcherController를 거쳐 MemberController의 메소드를 지정할 때, RequestMapping 어노테이션의 밸류값(=url) 기준으로 연결 지어 주기 때문에 이것은 jsp의 url 값과 일치해야 함!
✔️ Controller 클래스 내부에 메소드를 만들어서 요청에 대한 처리 내용을 작성
👉🏻 접근제한자는 무조건 public으로 지정함
👉🏻 메소드 상단에 url 매핑값을 지정해야 함
👉🏻 메소드명은 의미를 부여해서 적당히 지어야 함
👉🏻 매개변수는 있어도 되고, 없어도 됨 (단, 매개변수가 있는 경우 DispatcherServlet이 알아서 값을 전달해 줄 것)
👉🏻 리턴 타입은 String 타입으로 응답페이지를 지정할 수 있고, ModelAndView 타입으로도 지정 가능함
✔️ 기존 객체 생성 방식(new 구문 사용하여 객체 생성)
👉🏻 객체 간의 결합도가 높아짐 (소스코드가 수정될 경우 일일이 다 바꾸어 주어야 함)
👉🏻 서비스가 동시에 매우 많은 횟수가 요청될 경우 그만큼 객체가 생성됨
✔️ Spring의 DI(Dependency Injection)라는 특성을 활용한 방식
👉🏻 필요할 때마다 Spring에 의해서 객체가 만들어진 후 주입시켜 줌 (내가 직접 생성하는 것이 아니기 때문에 결합도를 낮춰 줌)
👉🏻 new라는 키워드 없이 선언문만 써 줘도 되지만 선언 구문 위에 @Autowired라는 어노테이션을 반드시 붙여야 함!
@Controller // Controller 타입의 어노테이션을 붙여 주면 빈 스캐닝을 통해 자동으로 bean으로 등록
public class MemberController {
// 기존 방식
// private MemberService memberService = new MemberServiceImpl();
// 스프링 방식
@Autowired // @Autowired 어노테이션 기재해 주고
private MemberService memberService; // 선언만 해 주면 됨!
@RequestMapping("login.me")
public void loginMember(Member m) {
// System.out.println("userId: " + m.getUserId());
// System.out.println(("userPwd: " + m.getUserPwd()));
// Service단에 m을 전달하면서 요청
// 기존 프로그래밍 방식 => MemberService 객체를 직접 생성해서 호출
// MemberService mService = new MemberServiceImpl();
// mService.loginMember(m);
// 스프링 방식 => MemberServiceImpl 클래스도 bean으로 등록
// 스프링에 의해 객체가 생성되게끔
Member loginUser = memberService.loginMember(m);
// 결과에 따른 응답 화면 조회
}
}