@Controller 어노테이션
@Component 어노테이션을 상속받은 어노테이션들이 있다.
- @Repository - DAO
- @Service - Service
- @Controller - Controller
Controller 파일에 @Controller 어노테이션을 달아준다.
그럼 컴파일러가 이 어노테이션을 보고 Controller이라고 인식을 한다.
기존에 Controller 인터페이스 파일이 필요 없게 되고,
이를 상속받기 위해 implement Controller를 삭제해 주면 된다.
import org.springframework.stereotype.Controller;
@Controller("login")
public class LoginController {
또한 import가 기존에는 web.servlet.mvc.Controller를 하고 있는데,
해당 내용을 지워주고 다시 import를 하면? stereotype.Controller를 import 하여 @Controller를 사용할 수 있게 된다.
@Controller
- 인터페이스를 쓰면 자유도 제한, 개발자 편함
- 어노테이션 쓰면 자유도 높아지지만 개발자 불편 >> 하지만 성능은 좋아진다.
컨트롤러 통합
LoginController 안에는 로그인 로직이 존재한다.
로그인 로직이 있다면 당연히 같이 따라오는 로직에는 로그아웃이 있다.
이 로그아웃 로직을 로그인 메서드 아래에 추가한다면 LoginController에 메서드가 2개가 된다.
이러한 경우에는 로그인 객체를 어떤 메서드에 맵핑시켜야 하는지 잘 모른다.
인터페이스를 사용했을 땐 핸들러맵퍼가 있었기 때문에 말하지 않아도 알 수 있었지만,
현재는 메서드가 여러 개 있기 때문에 핸들러맵퍼 대신에
@RequestMapping("/login.do") 어노테이션을 사용한다.
그럼 ds-servlet.xml에 있는 bean 핸들러맵핑은 사용하지 않으므로 없어지게 된다.
간혹 @RequestMapping(value="/login.do") 라고 쓰라고도 하는데,
value= 는 생략해도 무방하다.
// LoginController
package com.koreait.app.view.member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.koreait.app.biz.member.MemberDAO;
import com.koreait.app.biz.member.MemberDTO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
@Controller("login")
public class LoginController {
@RequestMapping(value="/login.do")
public String login(HttpSession session, MemberDAO memberDAO, MemberDTO memberDTO) throws Exception {
// 커맨드 객체
/*
// 1. 사용자(클라이언트,브라우저)가 보낸 파라미터에서 값 추출
String mid=request.getParameter("mid");
String password=request.getParameter("password");
// 2. DB 연동
memberDTO.setMid(mid);
memberDTO.setPassword(password);
*/
memberDTO = memberDAO.selectOne(memberDTO);
// 3. 페이지 이동 == 네비게이션
if(memberDTO != null) {
session.setAttribute("userName", memberDTO.getName());
return "main";
}
return "redirect:login.jsp";
}
@RequestMapping("/logout.do")
public String logout(HttpSession session) {
session.removeAttribute("userName");
return "redirect:login.jsp";
}
@RequestMapping("/main.do")
public String mainPage() {
return "main";
}
}
어떠한 웹 페이지에 이와 같이 서로 관계가 있는 로직을 하나로 묶어 관리할 수 있는데,
이렇게 하면 응집도를 높일 수 있다!
응집도를 높인다 == 서로 연관 있는 것만 관리를 하겠다는 뜻
이러한 작업을 컨트롤러 통합이라고 한다.
핸들러맵퍼에 의해 맵핑된 메서드 인자는 (HttpServletRequest, request)이다.
request를 보면 알 수 있겠지만, new 하지 않았는데 데이터를 받아올 수 있다.
따라서 인자로 DTO 객체를 받아온다면?
코드에 new를 사용하지 않게 된다.
session이 필요한 경우 인자로 request가 필요한 것이 아니라 Session이 필요한 것이므로
HttpSession session을 넣어주면 된다.
🍀정리
- 원래 request만 썼는데, 필요한 것들만 인자로 적으면 Spring 컨테이너가 new 해준다.
- 이때 인자로 DTO를 반영해서 DTO 맵핑을 자동으로 해주기 때문에 request가 필요가 없어지고,
이 때문에 완전한 POJO에 가까워지게 된다.
- DAO 또한 멤버변수로 빼서 사용하고 있는데, 인자로 반영해 준다면 의존성 또한 사라진다.
- 관리를 스프링 컨테이너에서 해주는 객체 == 커맨드 객체라고 한다.
: 특별히 DTO류에게 이렇게 많이 불린다.
'Spring' 카테고리의 다른 글
[Spring] 게시판 로직 Spring으로 구현하기 (0) | 2024.10.10 |
---|---|
[Spring] Controller 요청 줄이기와 Model 객체 (0) | 2024.10.10 |
[Spring] ViewResolver 사용과 Spring 흐름 정리 (0) | 2024.10.08 |
[Spring] Spring에서 사용하는 ViewResolver (0) | 2024.10.08 |
[Spring] Spring에서 제공하는 DispatcherServlet과 Controller (7) | 2024.10.08 |