ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC 패턴으로 작성하기 전 설정 및 세부 내용 알아보기
    SpringFrameWork 2021. 12. 15. 01:18

    1. dynamicweb에서 만든 jsp파일들 즉 webapp 밑에  board, include, member 폴더와 index.jsp 파일을 spring-legacy에 옮겨준다. 이때 Spring에서 MVC 디자인 패턴을 이용하게 되는데 dynamicweb에서는 jsp 파일을 바로 요청해서 화면에 출력을 하였지만 Spring MVC패턴에서는 Controller에서 요청이 있을 때 jsp파일을 화면에 뛰워준다. 그래서 jsp파일들을 views 폴더에 넣어서 사용하지만 WEB-INF 밑에 있기 때문에 외부에서 경로에 맞게 실행을 시켜도 숨어 있는 꼴이 되기 때문에 실행이 되지 않는다. Spring에서는 서버 내부적으로 Controller를 통해서만 실행을 하게 된다.

    ※ spring-lagacy에 views로 파일을 옮기면 빨간표시 에러가 발생하는데 이것은 각각 jsp 파일 경로가 바뀌어서 생긴 것이다. jsp:include 태그의 경로를 바꿔주면 된다. <jsp:include page="/include/head.jsp" /> 경로에서 제일 앞에 있는 / 는 공개폴더 webapp을 기준으로 한다. 따라서 "/WEB-INF/views/include/head.jsp 경로로 바꿔줘야 한다. 기존 설정되어 있는 경로에서 /WEB-INF/views를 붙여주면 된다.

    2. resources 파일도 dynamicweb -> spring-legacy로 옮겨준다. resources는 webapp 밑에 있는 것을 알 수 있는데 resources는 정적자원들을 그냥 달라고 하면 주는 것이기 때문에 공개폴더 안에 있다.  

    3.옮긴 파일들이 잘 작동이 되는지 확인하기 위해서 기본으로 제공되는 HomeController.java 를 이용한다. 밑에 화면과 같이 @GetMapping을 할려고 하는데 No Default Proposals라고 뜨는건 Maven 설정이 제대로 안되어 있기 때문이다. Maven 설정은 따로 글을 올리는데서 참고 할 수 있도록 하겠다.

     

    ※@GetMapping은 @Controller 안에 get방식 요청이면서 url주소를 mapping 해주는 것이다.

     

    4. Maven 설정 변경 후 옛날 스프링에는 안되던 애노테이션 @GetMapping을 쓸 수 있다. 애노테이션 중에 원하는 동작에 필요한 값 있다. @GetMapping(value = "") ""안에 문자열 가능한데 기본 속성이라는 것이 있어서 value를 생략하고  @GetMapping("") 을 써도 된다.

     

    ※dynamicweb에서 spring-regacy로 파일 다 옮겼을 때 Servers 탭에 Tomcat v9.0 Server ... 란에 마우스 오른쪽 클릭 후 Add and Remove를 클릭하고 dynamicweb 내리고 spring-regacy를 올린다. 

    5. GetMapping 애노테이션에 값을 "/" 로 하고 서버가 호출 되는지 System.out.println("home() 호출됨..."); 이라는 코드로 콘솔 창에 입력한 문구가 뜨는지 확인을 하는 것이다.  서버를 실행시켰을 때 콘솔 창에 home() 호출됨... 문구가 생긴 것을 볼 수 있다.  그 다음 웹 페이지가 뜨지만 404에러가 발생하는 것을 볼 수 있는데 이것은 주소가 WEB-INF 밑에 classes/com... 되어 있기 때문이다. 

     

    ※ 프레임워크를 사용하는 이유는 전부 규칙기반이기 때문에 프레임워크가 지정한 규칙대로 안정한 상태로 생산성있게 작업하기 위한 것이다. 

    6. GetMapping("/") url 주소를 "/" 넣어줬기 때문에 localhost:8090만 입력을 해도 요청한 페이지를 가져오게 할려고 하는 것이다. 밑에 그림의 404에러 내용은 응답을 안줬기 때문에 브라우저는 반응이 없고 콘솔에 보면 서버는 잘 연결 된것을 알 수 있다.

    7.  index.jsp를 호출하기 위해서는 home() 메소드를 void -> string 수정해서 문자열로 return값을 받게 하고 return할 문자열은 "" 안에 실행할 jsp 뷰 이름을 넣어주면 된다.

    8. WEB-INF 밑에 spring이라는 폴더가 있는데 스프링이 사용하는 설정 파일이다. root-context.xml 웹 프로그램과 관계없는 공통 설정을 servlet-context.xml는 웹과 관련된 부분을 설정하는 파일이다. servlet-context.xml 파일에 보면 beans 태그 부분이 있는데 InternalResourceViewResolver 모듈이 미리 등록 된 것을 볼 수 있고 class 이름이 뜻하는 것은 스프링이 사용하는 객체 즉 스프링이 같이 연동되는 클래스 이름이다. 

    <beans:property> 에 prefix, suffix value값이 각각 있는데 url 주소에 /WEB-INF/views/는 요청하는 jsp 파일 접두사로 자동으로 설정이 되는 것이고 .jsp는 접미사로 자동으로 설정이 되어 있기 때문에 url 주소를 입력할 때는 접두사와 접미사를 쓸 필요가 없다.

     

    예를 들면 home() 메소드에 return할 값의 원래 경로는 return "/WEB-INF/views/index.jsp"; 이다. /WEB-INF/views/ 와 .jsp 부분은 공통적으로 계속 들어가기 때문에 servlert-context.xml파일에서 prefix와 suffix에 설정을 하면 return "index"; 코드 처럼 jsp 파일 이름만 return값에 넣어주면 브라우저에 요청이 된다. 

    9. 기본적으로 controller에서 웹 페이지를 불러오는 방식은 getmapping 값으로 / 로 되어 있는데 home() 메소드(메소드 이름은 작업할 때마다 필요에 맞게 고치면 된다.) 에서는 기본 주소 http://localhost:8090 뒤 / 붙이고 url주소로 입력(기본적으로 http://localhost:8090이라고 입력해도 /가 없어도 요청이 된다.)하면 return 값이 index이므로 index.jsp 파일을 웹 브라우저로 요청을 하게 되어 스프링에서 index.jsp파일을 불러오는 것이다.  

    10. tomcat과 같은 기반으로 개발한다는 것은 WAS 기반으로 개발한다는 것인데 WAS기반으로 개발 할 때는 java는 Servelt이 필요하다. maven 설정할 때 servlet 버전을 최신인 4.0.1로 수정하였었다. 이때 버전을 높이면 servlet 실행 플랫폼인 tomcat이 사용하는 web.xml에 wep-app 선언문에 version값에 영향이 간다. web-app version이 2.5로 되어 있는 것을 4.0으로 수정하고 xsi:schemaLocation에 https://java.sun.com/xml/ns/javee/web-app_4_0.xsd부분도 수정한다. 그리고나면 error가 발생하는데 xsi:schemaLocation에 http로 시작하는 url 주소가 두개가 있는데 첫번째 http url 주소 뒤에 ; 를 붙여주면 해결된다.(오류가 발생하는 이유가 자동완성 되어 있는 web-app 태그를 수정하면서 프로그램이 http주소를 구분을 안지어주면 인식에 오류가 생기는 것 같다.)

    servlet 버전과 web-app 버전 이슈는 자주 있기 때문에 잘 확인해야한다.!!!

     

    <artifactId> artifact는 산출물이라는 뜻으로 라이브러리 이름을 뜻한다.

     

    ★<listener> 내 <listener-class>에 ContextLoadListener라는 객체가 <context-param> 내 있는 자기의 contextConfigLocation 메서드를 root_context.xml 에서 호출하는 것이다. 

    listener class는 약속되어 있는 이벤트에 따라서 동작하는 코드를 제공해주는 것 

    ContextLoadListener는 tomcat이 최초 기동될 때 spring 모듈이기 때문에 스프링이 사용하는 설정파일을 읽어 들이는 것이다. 즉 contextConfigLocation 메서드를 통해 root-context.xml(spring의 공통 설정 정보)을 읽어 들인다.

    <param-name>,<param-value> 파라미터네임과 파라미터벨류는 내부적으로 자바코드로 변환되는 메서드 호출로 바뀌는 것 파라미터네임은 setter라고 보면 된다.

    ★root-context 는 웹과 관련이 없는 스프링에 공통된 설정을 하는 곳

    ★servlet-context 은 web과 관련된 설정 하는 곳이다. 스프링이 제공하는 DispatcherServlet에서는 전면에 모든 요청을 받아서 알맞은 응답을 하는 것이다. 자동차로 예를들면 핵심엔진이 되는 것이다. DispatcherServlet 역활은 frontcontroller 즉 해당되는 메서드를 호출하고 spring web모듈을 뜻한다. 그리고 DispatherServlet은 요청에 따른 처리뿐만 아니라 다양한 부가 기능 포함되어 있다. 부가기능을 제공하기 위해서 미리 알아야 하는 설정 정보는 servlet-context.xml에 있다. 

    <load-on-startup>1</load-on-startup>은 서블릿도 여러개 등록할 수 있는데 이 태그에 1로 지정하면 해당 서블릿이 우선순위를 1로 지정한 것이다. 웹 페이지를 제일 처음 요청을 하는 사람은 객체가 생성될 때까지 딜레이가 생기는데 이 설정으로 인해 미리 웹 서버가 객체를 만들어서 딜레이가 생기지 않게 제공하는 것이다.  

    ★DispatherServlet이 frontcontroller이고 호출할 수 있는 것으로 등록이 될려면 @controller 애노테이션으로 마킹이 되어 있으면 된다.

    <annotation-driven>은 스프링 웹 모듈을 애노테이션 기반으로 동작시킨다는 내용이다. 

    ★<resources>는 정적 자원을 요청을 어떻게 받아들일지 디폴트 설정이다. mapping은 외부에서 요청이 올 때 경로 예를들면 /resources/** 이면 /resources/images/aa.png Asterisck(*)가 두개이면 직계자손 밑에 후손들까지 다 포함 되는 것이고 /resources/* 이면 /resources/aa.png 처럼 직계자손만 포함된다. 

    ★root-context는 웹과 관련없는 스프링에서 공통으로 사용하는 정보를 설정하는 곳인데 주로 데이터베이스 관련 정보를 설정하는 곳이다. 

    Spring MVC에 애노테이션 컨트롤러 사용

    @Controller가 붙으면 해당 class는 frontcontroller 역할을 하는 스프링에서 제공해주는 DispatcherServlet을 사용할 수 있다.

    @Controller 가 없으면 class를 객체로 인식하지 않는다. 

    <resources> 태그는 정적 자원을 어떻게 받을지 mapping 외부에서 요청이 올 때 location 값 기준으로 찾아라

    &amp;amp;amp;nbsp;

    return 값으로 index 라는 이름만 주었는데 이것은 규칙이 정해져 있다. 이때 스프링을 사용할 때 return값이 String일 때는 특별한 접두사가 없으면 " " 사이 값이 경로가 된다. 여기서는 index만 입력해도 경로가 된다. (servlet-context.xml에서 prefix, suffix값이 앞 뒤로 index에 붙어서 경로가 되는 것이다.)

    <dependencies>는 사용할 라이브러리들을 명시하는 곳이다. spring-context는 spring을 쓰기 위한 가장 기본 모듈(라이브러리)이다. 또 가장 기본적인 라이브러니는 DI(Dependency Injection) 객체간 의존관계를 자동으로 관리하는 기능이다.

    spring-webmvc는 스프링에서 제공하는 프론트컨트롤러인 dispacherservlet을 사용할 수 있다.

    spring 기반으로 test를 하는 메이븐라이브러리 메이븐repository에서 검색해서 webmvc라이브러리 밑에 넣어준다.

    자바와 데이터베이스를 연결해주는 connectivity이다.

    jdbc만 있어도 연동은 되지만 데이터베이스에는 Transaction 처리도 중요하다. table의 데이터를 변경하는 insert, update, delete 문을 사용하는 것을 의미한다.

    mybatis는 spring과 관련이 없는 별개의 라이브러리인데 JAVA 진영에서 워낙 많이 쓰기 때문에 spring과 긴밀하게 연동되는 spring 버전으로 라이브러리를 제공 

    필요한 라이브러리들을 다 넣고 난 후 vesrsion을 <properties> 변수 값 설정 부분에 version이 5.2.16.RELEASE로 되어있기 때문에 추가한 라이브러리 버전들을 ${org.springframework-version}으로 바꿔서 관리하기 쉽게 한다. 

    mysql과 java를 연동하게 하는 라이브러리 추가(오라클을 위한 라이브러리는 따로 있다.)

    데이터베이스에 미리 연결하게 하는 라이브러리(CP = Connection Pool)

Designed by Tistory.