본문 바로가기

웹개발 수업정리

7_@RequestParam, hashMap, modelMap

데이터를 받을 때 사용

HttpServletRequest. 대신에 @RequestParam을 사용.

@RequestParam을 실무에서 제일 많이 사용한다. 

 

*ReqPm

 

리퀘스트 파람이라는 어노테이션을 적고 옆에 userNm이라는 명과 화면에서 올린 키의 값이 일치하면 화면에서 올린 키의 값이 컨트롤러에 적힌 userNm에 들어간다.

sysout으로 찍어보면 바로 userNm이 찍히는 것을 볼 수 있다.

 

* HttpServletRequest와 @RequestParam의 차이점

 

 

 

 

기존의 req 는 req.getParameter로 값을 꺼내야 했지만, @RequestParam은 바로 꺼낼 필요없이 

바로 값을 찍을 수 있다.

 

 

 


 

temp.

 

화면에서는 temp를 올리고 있지 않다.

 

 

 

하지만 sysout으로 콘솔에 찍어보면 오류가 나지 않고 null값이 뜬다.

 

 

String temp앞에 @RequestParam 적어주면 에러가 발생했다고 창에 뜬다.

이때 required=false를 적어주면 에러가 사라진다.

선택적으로 받겠다는 의미이다.

 

 

리퀘스트파람어노테이션의 사용법. 

리퀘스트파람은 무조건 적어주어야 한다. 가독성이 좋아야 하기 때문.

안적혀 있다면 이 메서드는 저 탬프가 필수로 받는것인지 선택적으로 받는다는 것인지 헷갈린다.

false로 적어주면 선택적으로 받는다는 것이고,

기본값은 true이다. 그래서 true일때는 @RequestParam은 적어주어야 한다.

 

 

 

pageName에 있는 값을 temp에 전달해준다.

 

 

pageName을 값으로 넣어줘서 temp를 찍어도 pageName의 값이 나온다.

 

 

HashMap 

 

 

올라오는 모든 키의 value값을 map에 담아서 출력된다.

map은 두 개 이상을 쓸 때 map을 사용한다.

 

 

required=false를 적어주지 않으면 에러가 나고 적어주면 null이 뜬다.

 

 

 

 

 

 


welcomeWebModelVO

 

 

 

 

 

 

 

 

 

 

model.addAttribute에서 값을 가져오지 않고도 동일하게 화면에 나오게 하기 위해서는 

jsp파일에서 작업해주어야 한다.

 

 

 

그리고 해당 modelAttribute 부분을 지우고 화면을 띄워보면 그대로 선택한 tr의 userNm이 출력된다.

 

 

그대로 출력되는 이유는?

 

welcomeWebVO에서는 @ModelAttribute특징.

welcomeWebList, VO, 가 쌓이기 전에 모델어트리부트 특징 중 하나는 이 vo를 카멜케이스로 변환해서 그것을 key로 갖고 있다.

WelcomeWebVO를 카멜케이스로 변환하게 되면 welcomeWebVO가 되는데 

@ModelAttribute WelcomeWebVO welcomeWebVO 도 적고 

model.addAttribute("welcomeWebVO", welcomeWebVO.getUserNm()); 도 적으면 

똑같은 이름의 키가 2개가 된다. 그 2개 중 하나를 지운 것이기 때문에 이 부분을 지워도 문제없이 이름이 출력된다.

오히려 중복되어있는 상태이다.

 

 

 

 

 

 

welcomeWebVO를 vo로 바꿔주고 화면에서도 vo.userNm으로 변경해주면 이름이 사라졌다.

 

 

 

 

vo는 requestParam으로 못 받는다. 

@ModelAttribute로만 값을 받을 수 있다.

 

 

다시 @ModelAttribute를 적어주고 left에서도 vo로 적었던 부분을 다시 welcomeWebVO를 적어준다.

 

 

다시 이름이 화면에 나타나고 

table.jsp 에서 vo로 변경해주고 controller에서도 @modelAttribute옆에도 괄호안에 별칭을 적어준다. 

 

welcomeWebVO를 alias로 주는 방법은 아래와 같다.

 

 

 


 

CmmnVO

vo라는 것이 업무별로 사용하는 vo, 공통적으로 한꺼번에 쓰는 vo가 있다.

공통적으로 쓰는 vo는 sql-mapper-config에 등록하지 않고 다른 방식으로 사용할 수 있다.

공통으로 쓰이는 vo이므로 cmmn 폴더 하위에 생성했다.

 

 

 

 

mapper까지 mvc작업을 해주고,

 

 

sql 문을 적어주는 단계에서 welcomeWebVO를 복붙해서  id와 parameterType 부분을 알맞게 수정해준다.

여기에서 parameterType은 userNm을 가져 올 것이기 때문에 

UserCmmnVO파일에 별칭으로 적히는 userCmmnVO를 적는다.

 

 

package째로 sql-mapper-config.xml파일에 package째로 UserCmmnVO의 경로를 적어준다.

구분을 하기 위해서 각 vo클레스파일에 VO클래스 한 칸 위에 @Alias() 를 적어준다.

그리고 별칭으로 UserCmmnVO, CodeCmmnVO를 적어준다. 이것은 컨트롤러 리스트에 담아 보내는 값과 동일하다.

 

 

 

 

 

 

 


 

어노테이션 선언의 목적

어노테이션을 적는 이유 : 어노테이션의 하위 어노테이션을 사용하기 위해서.

컨트롤러 어노테이션의 하위어노테이션중하나가 리퀘스트맵핑어노테이션이다.

리퀘스트맵핑어노테이션은 컨트롤러 어노테이션이 없으면 사용하지 못한다.

 

화면 호출 -서버에 http 통신을 해서 톰켓에 가서 - dispatcher servlet 으로 가서 RequestMappingHandlerAdapter(리퀘스트맵핑핸들러어댑터) - 컨트롤러의 메서드 도착 - mvc - 2가지(model, 논리적주소)를 dispatcher-servlet파일 안에 viewResolver에게 준다 - viewResolver인 jstlview가 받아서 화면을 그리고 만나면 model을 참고한다. 다 그리면 dispatcher-servlet으로 보내고 - 최종적으로 servlet conteiner으로 가서 http통신을 해서 사람이 볼 수 있는 형태로 보이도록 변경해서 화면에 뿌린다.

 

화면 호출 - dispatcher servlet 으로 가서 RequestMappingHandlerAdapter(리퀘스트맵핑핸들러어댑터)

 

 

스프링은 어댑터 방식이다.

리퀘스트맵핑핸들러어댑터가 컨트롤러를 찾아간다고 생각하면 된다.

화면에서 올린 논리적 주소를 들고 찾아간다. 해당 메서드에 도착하게되면 mvc를 태워서 sql실행하고 

그것에 대한 결과물을 다시 컨트롤러로 갖고와서 중개역할을 해주는 디스팻처서블릿파일이 받는다.

리퀘스트맵핑핸들러어댑터가 디스팻처서블릿을 찾아갈 수 있는 이유는 @Controller안에 여러 어노테이션을 묶어놓앗는데 그 중에 @Component 안에 

 

 

@Component 없으면 bean으로 인젝션 시켜주지 않는다.

컴포넌트라는 어노테이션이 달려잇는 애들을 인젝션 시켜주는 것이 디스패쳐서블릿에 컴포넌트 스캐너이다. 

 

컨트롤러에서 mvc를 태우면 jstlview에게 2가지(model, 논리적주소)를 준다.

그것을 화면에 내린다고 표현했는데 그것을 dispatcher서블릿에 jstlview 리졸버에게 준다.

html을 그리다가 jstl을 만나면 (welcomeWebList를 만나면)model을 참고한다.

다 그려진 아이를 서블릿컨테이너에게 준다.

서블릿컨테이너는 http통신으로 사람이 볼 수 있는 형태로 보이도록 변경해서 화면에 뿌린다

 

 

 

내용 총정리

화면에서 트랜젝션을 마우스로 일으키면 http요청으로 톰캣을 거치고 

디스패쳐서블릿에서 리퀘스트맵핑핸들러어댑터를 호출하고 컨트롤러에 리퀘스트맵핑을 찾아간다. 찾아가는 기준은 컴포넌트 어노테이션이 있는 애들만 찾아간다. 컴포넌트어노테이션은 컴포넌트스캔이 읽어들인다.  그리고 mvc를 거쳐서 그것을 model.addAttribute로 모델에 담아서 논리적 주소를 찾아가서 뷰리졸버(jstl)에게 가고 서블릿컨테이너로 가고 화면으로 간다.

 

 

화면에서 트렌젝션 > 서버에 http통신해서 톰캣 > dispatcher-servlet 파일로 가서 > 리퀘스트맵핑핸들러어댑터로 가면 컨트롤러 메서드로 가서 mvc 과정 거치고 2가지(model, 논리적주소) 가져가고 > dispatcher-servlet에 viewResolver에게 가면

jstlView가 화면을 그리고 다 그리고 나면 dispatcher-servlet으로 보내서 

서블릿 컨테이너로 보내면 http통신을 해서 사람이 볼 수 있는 화면으로 보이게 화면에 나타내준다.

 

스프링부트 

전자정부와 다른점만 집고 넘어간다.

 

gradle이 더 좋다. maven 보다.

gradle 은 간단하다

1.

2.

 

3.

 

 

devtools : java에서의 라이브 리로드쪽과 같다. 톰캣을 내렸다 올리는 역할.

devtools, web ~, mySQL, mybatis 추가하고 finish.

 

 

여기서 build.gradle이 java에서의 pom.xml 이라고 생각하면 된다.

pom.xml은 타일즈 설정이나 mysql이나 oracle DB 설정하는 내용이 있다.

 

 

pom.xml파일에 있는 property와 같은 역할을 한다.

 

Gradle.

 

jsp를 이용하기 위해서 mvnrepository.com 에서  파일을  다운받는다.

  1. tomcat-embed-jasper (9.0.22) 에서 Gradle탭에서 태그를 복사해서 depenencies 안에 적어준다.

  2. jstl 검색, 1.2 버전 똑같이 Gradle탭에서 태그를 복사해서 depenencies 안에 적어준다.

  3. Tiles Servlet Support (3.0.8)

  4. Tiles Extras(3.0.8)

  5. Tiles Jsp Support (3.0.8)

 

    

 

gradle tasks, gradle executions 탭이 생성된다.

 

 

아래에 있는 현재 해당되는 파일에 우클릭 > run default gradle tasks 선택

 

 

 

그럼 gradle execution 탭에 처리되는 내용을 보여준다.

 

 

이클립스에 있던 webapp을 가져온다.

 

 

src > main > resource >  application.properties 파일 안을 열어서 

스프링 관련 내용을 적어준다.

context-datasource에 있던 내용들이 application.properties파일에 적혀있다.

 

 

이 내용은 전자정부프레임워크에서dispatcher-servlet.xml 파일에 있는 내용과 같다.

 

 

 

 

추가로 내용을 더 적어준다.

 

 

TilesConfig 파일안에 @Configuration 을 적어주고 

@Bean 어노테이션을 적어줌과 과 동시에 내용을 적어준다.

 

 

안에 내용은 두가지이다. 

맨처음 메서드는 dispatcher-servlet.xml 파일에 타일즈 설정되있던 내용이 들어간다.

 

 

 

아래는 타일즈 설정 부분이다.

 

 

mainController 파일에 가서 requestMapping 옆에 논리적주소에 {}와 "/"를 추가해준다.

 

 

spring부트는 

 

 

Ctrl  + shift + t 누르면 해당 파일을 찾을 수 있다.

 

 

스트링부트 시작점

 

스트링부트는 톰캣이 내장되어 있다.

 

과제

util폴더에 hanqMap이라는 파일이 있는데 demo> cmmn > util > HanqMap.java 파일을 넣어준다.

hanqMap파일을 열어주고 alias 부분과 return쪽 부분.

convertCamelCase 소스 낱낱이 해석해서 제출할 것.

 

 


 

convertCamelCase 소스 분석

 

 

 

 

 

 

 

'웹개발 수업정리' 카테고리의 다른 글

6_컨트롤러에서 데이터 넘기는 방식 4가지(Map, EgovMap, String, VO)  (1) 2020.05.03
5_sql  (0) 2020.04.30
3_form 태그  (0) 2020.04.30
2_타일즈2(tiles)  (0) 2020.04.13
1_타일즈1(tiles)  (0) 2020.04.07