Adventure Time - Finn 3
본문 바로가기
카테고리 없음

Controller Command객체

by hyun9_9 2024. 3. 22.

스프링이 지원하는

컨트롤러에서 스프링이 지원하는

어노테이션으로 변경하게 되면서

@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명과 멤버변수명이 같은지 확인해야합니다

만약 다르면 직접주입하게된다(보통다르다)