주니 개발 도서관

Spring

[ MVC 패턴 ] Spring으로 표현하기 (2)

주니홍 2022. 9. 21. 12:21

https://hongjuni.tistory.com/66

 

[ MVC 패턴 ] Spring으로 표현하기

기존에 배웠던 MVC 패턴을 Spring으로 표현한다면 어떤 장점이 있는가? 기존의 MVC 패턴실행 순서 사용자의 요청 >> *.do >> FrontController 서블릿 에서 C 호출 >> 경로정보 반환 >> 사용자에게 화면제공 Fro

hongjuni.tistory.com

기초부터 시작하여 이해할 수 있도록 공부하고 있습니다

이전 글들을 참조하여 글을 읽으시면 더욱 이해하기 쉽습니다

ex) Mapping xml설정 >> @RequestMapping으로 바뀌는 과정

 

기존에 있는 스프링컨테이너.xml(디스패처서블릿)의 설정을 어노테이션(@)으로 바꿔보도록 하자

 

어노테이션으로 바꾸기위해선 .xml 설정 중 네임스페이스를 설정해야한다!

 

context를 체크하고

 

어노테이션 패키지 적용범위를 설정해주어야 한다

 

 


 

어노테이션을 이용해 바꿔볼 것

1. Controller 객체 등록

2. HandlerMapping 키값과 객체 설정

+ Command 객체 설명

 

 

1. Controller 객체 등록

Controller도 마찬가지로

@Component가 아닌 컨트롤러 전용 어노테이션이 있다

 

@Controller를 사용한다
DispacherServlet이 인식하는 C 객체로 설정해줌

기존에 있던 implements Controller 가 필요없어진다
>> 오버라이딩을 강제 할 필요가 없음 ( 완전한 POJO 된다 )
>> 메서드 시그니쳐 변경가능 ( 아웃풋, 메소드명, 인자 )

 

완전한 POJO가 되었기때문에 하나의 클래스로 로직들을 보관할 수 있다

하나의 메소드를 굳이 하나의 클래스에 저장할 필요가없어졌음

Member와 관련된 메소드를 모아두는 MemberController 와

Board와 관련된 메소드를 모아두는 BoardController를 생성하여

관리할 수 있게 된다 ( = Pointcut을 보관하는 방식과 같다 )

 

( Member 관련 로직을 보관하는 Membercontroller클래스 )

 


2. HandlerMapping 키값과 객체 설정

HandlerMapping의 전용 어노테이션

@RequestMapping("요청이름") 어노테이션이다

 

메소드 위에 작성하여

어떠한 요청에 반응할 메소드인지 @RequestMapping 인자로 넣는다

selectOneMemeber는 로그인 메소드이므로 /login.do의 요청에 반응하도록 설정

 

 

 

같은 요청 /login.do에 반응하지만

요청방식 GET or POST를 통해 사용할 메소드를 분리시킬 수 있다

ex) index.jsp 요청하는 login 페이지 보여줘 (GET 방식)

login.jsp 요청하는 로그인할거야 (POST 방식)

으로 나눠본 상태이다

 

요청만 인자로 넣게되면 ** value 속성이 자동으로 설정되지만

method 속성을 사용하기위해선 value를 기입해주어야 한다

 


 

3. Command 객체 ★ 스프링의 꽃

스프링 컨테이너가 Command 객체를 생성
+ 사용자가 입력한 값들을 setter 주입으로 Command 객체에 세팅함
즉, new Member / vo.set 를 작성하지 않아도 됨

 

설정 방법

객체를 인자로 넣어주기만해도 아래의 메서드를 줄일 수 있게된다

 

이러한 인자객체를 Command객체 라고 부른다

 

Spring에서 Command 객체를 이용해 해주는 것

1. 객체화를 자동으로 해준다

 

2. setProperty 하여 set을 자동으로 해준다

>> ** 멤버변수명과 Parameter값이 동일해야한다

 

 

+ 추가 내용

String값 return하는 값을 경로나 요청에 맞게 수행해 준다

>> redirect: 붙여주면 리다이렉트 / 적지않는다면 forward가 디폴트이다

>> 만약 값을 저장해야할 ModelAndView를 사용해야한다면 아웃을을 mav로 해야한다

 

 

 

줄어드는 코드의 양 비교

위 사진을 아래 사진처럼 줄일 수 있게 된것이다.

 

insertMember 즉, 회원가입이 실패할 수 있기때문에 ( return boolean 타입 )

if 문으로 성공실패를 만들어 결과에 맞는 return을 설정하면 된다

>> ** 획기적으로 줄일 수 있다는 것을 보여주기위해 넣지 않았다

>> if 문으로 성공 실패여부를 나눠주는 것이 올바르다

 


리다이렉트 vs 포워드

로그인후에 main을 가는것은 [새로운 요청] 이기때문에 리다이렉트 한것
main에서 게시글을 보여줘야하기때문에 forward 처리인 것

1로직 >> 2로직(저장데이터있음) >> 페이지
1로직은 2로직에 리다이렉트
2로직에서 페이지 라면 forward 처리

 

간단하게 리다이렉트 vs 포워드를 정리 ( 확실한 정의는 아님 )

>> 다음에 의미를 확인하기위해 메모로 남겼습니다