스프링이 지원하는
컨트롤러에서 스프링이 지원하는
어노테이션으로 변경하게 되면서
@Controller
인터페이스가 아니므로
메서드 시그니쳐 강제성이 사라졌다
output을 다시 String를 사용할 수 있게되었다
그리고 컨트롤러 에서 과거에 req,res를 인자로 가졌는데
HttpServletResponse,HttpServletRequest 때문에
완전한 POJO는 아니었다
그래서
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
를 제거해야했는데
사용자의 입력한 값들을 보관하는 역할의 req는 꼭 필요했다
이를 대신할 방법은 DTO로 받아올 수 있는 방법이 있다
이러한 류를 Command객체라고 한다
Spring컨테이너
1) DTO (Command 객체)를 new
DTO new 안해줘도 된다
MemberDTO mDTO=new MemberDTO();
2) req에 저장된 정보중에
DTO멤버변수와 같은 파라미터명이 있다면
해당 값 자동추출 해준다
3) 추출한 값을 DTO 멤버변수에 set 가능 : setter활용
추출해서 삽입해주기 때문에 set 이 사라진다
Command객체를 사용했다고 한다면 보통 DTO다 set은 자동으로 된다
mDTO.setMid(request.getParameter("mid"));
mDTO.setPassword(request.getParameter("password"));
내부변수가 다르면 안됨 -> 완전 같아야한다
결론
한번에 받아줄 인자값을 bDTO값을 넣어준다
인자를 바꿈으로서 완전한 POJO로 만들 수 있다
Command객체가 DTO만 되는것은 아니다
DAO,ModelAndView,JSP내장 객체(session)도 Command객체가 될 수 있다
하지만 위의 방법은 두가지의 문제가 있다
첫번째
ModelAndView는 Controller를 인터페이스로 가져왔을때 오버라이딩 때문에 사용했었다
ModelAndView의 view는 필요없어서 메모리상 더 가벼운 model로 변경한다
위 처럼 변경할 수 있다
두번째
스트링 컨테이너가 관리해주는 컨트롤러 인자 DAO는
현업에서 가장 많이 바뀌는 클래스중 하나입니다
만약
버전1 DAO를 사용하는데 성능 이슈로 버전2 를 사용하게 되었을때
Conterller 일일이 다 바꿔줘야합니다
↓
결합도가 높은 코드다! 라고 볼 수 있습니다
그래서 결합도를 낮추기 위해 의존 관계를 활용!
멤버변수를 만들어서 의존 주입(DI)를 해줍니다
멤버번수를 과거에 만들었던 MemberService 로 변수를 생성하고 @Autowired로 의존주입을 해줍니다
만약 모델 부분에 변경이 발생하였을 때 impl만 변경하면 되어 결합도가 낮아진다
주의점
session 활용시 저장된 attrubute명과 멤버변수명이 같은지 확인해야합니다
만약 다르면 직접주입하게된다(보통다르다)