2022 01 24 - oneso123456789/2022 GitHub Wiki

Other

이제부터 http://localhost:8090/or8080포트를 사용시 이걸 프로젝트 경로라고 하겠음 너무 길어 ㅠ오ㅠ
노트북엔 톰캣 9.0버전이 80포트를 사용하지만 데톱엔 90포트를 사용함 이걸 맞춰야 하는대 변수를 좀 고려해봐야할꺼 같음

###JSP 태그 메타 태그의 속성엔 http-equiv, name, content 3가지의 속성이 있음

http-equiv="항목명"

웹 브라우저가 서버에 명령을 내리는 속성으로 name 속성을 대신하여 사용될 수 있음,
HTML 문서가 헤더와함께 웹 서버로부터 웹 브라우저에 전송되었을 때에만 의미를 갖음

content="텍스트"

name속성이나 http-equiv속성과 관련된 값(value)을 명시함

name="정보 이름"

몇 개의 meta 정보의 이름을 정할 수 있으며 지정하지 않으면 http-equiv와 같은 기능을 함

각 속성에 대한 더 많은 정보는 링크를 참고하면서 사용하자 https://webclub.tistory.com/354

Model이라는 데이터 전달자

Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정할 수 있음
Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역활을 하는 존재
이를 이용해서 JSP와 같은 뷰(View)로 전달해야 하는 데이터를 담아서 보낼 수 있음
메서드의 파라미터에 Model 타입이 지정된 경우에는 스프링은 특별하게 Model 타입의 객체를 만들어서 메서드에 주입함

Model은 모델 2 방식에서 사용하는 request.setAttribute()와 유사한 역활을 함
Servlet을 이용해 본 적이 있다면 다음과 같은 코드에 익숙할것임

  request.setAttribute("serverTime", new java.util.Date());   
  RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/home.jsp");   
  dispatcher.forward(request, response);   

위의 코드를 스프링에서는 Model을 이용해서 다음과 같이 처리함

public String home(Model model){
  model.addAttribute("serverTime", new java.util.Date());
  return "home";
}

메서드의 파라미터를 Model 타입으로 선언하게 되면 자동으로 스프링 MVC에서 Model타입의 객체를 만들어 주기 때문에 개발자의
입장에서는 필요한 데이터를 담아주는 작업만으로 모든 작업이 완료됨
Model을 사용해야 하는 경우는 주로 Controller에 전달된 데이터를 이용해서 추가적인 데이터를 가져와야 상황임
예를 들어, 다음과 같은 경우들을 생각해 볼 수 있음

  • 리스트 페이지 번호를 파라미터로 전달받고, 실제 데이터를 View로 전달해야 하는 경우
  • 파라미터들에 대한 처리 후 결과를 전달해야 하는 경우

@ModelAttribute 어노테이션

웹페이지의 구조는 Request에 전달된 데이터를 가지고 필요하다면 추가적인 데이터를 생성해서 화면으로 전달하는 방식으로 동작
Model의 경우는 파라미터로 전달된 데이터는 존재하지 않지만 화면에서 필요한 데이터를 전달하기 위해서 사용함
EX:페이지 번호(파라미터로 전달되지만, 결과 데이터를 전달하려면 Model에 담아서 전달함)

스프링 MVC의 Controller는 기본적으로 Java Beans 규칙에 맞는 객체는 다시 화면으로 객체를 전달함
좁은 의미에서 Java Beans의 규칙은 단순히 생성자가 없거나 빈 생성자를 가져야 하며,
getter/setter를 가진 클래스의 객체들을 의미함
**앞의 예제에서 파라미터로 사용된 SampleDTO의 경우는 Java Bean의 규칙에 맞기 때문에 자동으로 다시 화면까지 전달됨 ** 전달될 때에는 클래스명의 앞글자는 소문자로 처리됨
반면에 기본 자료형의 경우는 파라미터로 선언하더라도 기본적으로 화면까지 전달되지 않음

SampleController에 ex04()메소드 추가

위에서 설명한 SampleDTO와 기본 자료형의 전달차이를 확인하려고 작성하는 예제 같음
@GetMapping의 url은 "/ex04"임 log.info로 dto와 page를 로그에 출력해주고
다른 예제와 다른점은 리턴 문자열이 "/sample/ex04"인대 별로 중요한 부분은 아닌거 같음

ex04.jsp 파일 생성

경로는 src/main/webapp/WEB-INF/view/sample/ex04.jsp
html 선언 부분을 4.01버전으로 바꿔줌 기본이 html5지만 일단 예제가 4.01이니 바꿔주고 문제 없을시 다시 변경해보겠음
다음으론 를 사용해서 utf-8로 문자 인코딩을 해줌
http-equiv속성을 사용하고 값은 content-type를 사용해 문서의 문자 인코딩 방식을명시해줌
다음으로 content태그로 text/html값을 명시해준후 charset속성으로 인코딩할 문자열을 명시해줌 여기선 UTF-8

<body><h2>태그로 DTO와 PAGE 태그와 값을 넘겨받기 위해 각 파라미터로 된 변수를 삽입해줌

오류

큰건 아니고 프로젝트 경로/sample/ex04만 호출해서 값을 넘기지 않아서 http state 500 오류가 뜸 해결법은 알다싶이 값을 같이 넘겨주는것임 사실 dto는 안넘겨도 상관없지만
page는 메소드 상에서 만든 매개변수(parameter)라서 값을 넣어주지 않으면 오류가 난것임
결과는 int형으로 선언한 page는 값이 전달되지 않음
아마 이걸 해결하기 위해서 사용하는게 @ModelAttribute인거 같음

@ModelAttribute 어노테이션 특징

@ModelAttribute는 강제로 전달받은 파라미터를 Model에 담아서 전달하도록 할때 필요한 어노테이션임
@ModelAttribute가 걸린 파라미터는 타입에 관계없이 무조건 Model에 담아서 전달됨
따라서 파라미터로 전달된 데이터를 다시 화면에서 사용할때 유용함

SampleController에 ex04메소드에 @ModelAttribute 어노테이션 추가

기존의 코드에서 int 타입의 page가 화면까지 전달되지 않았으므로 앞에 @ModelAttribute("page) 메서드를 명시해보겠음

이후 서버를 다시 재시작하고 값을 넘겨보면 아까와는 다르게 page값도 잘 넘어가서 ex04.jsp에 출력되는걸 볼수있음
마지막으로 기본 자료형에 @ModelAttribute를 적용할경우 반드시 @ModelAttribute("page")와 같이 값을 지정해줘야함

⚠️ **GitHub.com Fallback** ⚠️