newlecture: spring boot (1) : boot 생성, properties, Tiles설정

Spring Boot

  • 본 강의는 멤버쉽 강의이므로.. 영상에 제공되는 이미지는 사용하지 않겠습니다 !
  • 기존 spring 강의와 겹치는 내용은 생략하겠습니다 ! !
  • 반복적 설정 간소화
  • Spring DI/Transaction/MVC/.. + Servlet/JSP + WAS(Tomcat, Jetty) 를 통합해주었다

    1. 혼자 독립가능한 App이다
    • 부트 가지고 바로 생성가능
    • Tomcat 등의 lib 포함.. War배포 필요 없다
    1. starter 라는 lib로 통합
    1. 최소한의 내용으로 config 하게끔 하였다
      • XML 등의 구성 설정도 필요 없음 (와)

설정의 진화 과정

  • XML -> Annotation + Javaconfig > properties/yaml

Boot Starter 프로젝트 만들기


1. 이클립스 IDE로 생성 : newlec쌤 방법

  • Spring Starter Project 생성

image

(중간에 잘못 캡쳐하여 수정함..)

image

이 화면에서 finish를 누른다

참고로 이 뒤 화면에

image

위와 같은 Full URL이 나오는데

https://start.spring.io/starter.zip?name=newlec-boot&groupId=com.newlecture&artifactId=newlec-boot&version=0.0.1-SNAPSHOT&description=Newlecture+Spring+Boot+Project&packageName=com.newlecture.web&type=maven-project&packaging=jar&javaVersion=1.8&language=java&bootVersion=2.5.3&dependencies=web

위 내용을 좀 더 풀어 써보자

https://start.spring.io/starter.zip
?name=newlec-boot
&groupId=com.newlecture
&artifactId=newlec-boot
&version=0.0.1-SNAPSHOT
&description=Newlecture+Spring+Boot+Project
&packageName=com.newlecture.web
&type=maven-project
&packaging=jar
&javaVersion=1.8
&language=java
&bootVersion=2.5.3
&dependencies=web

위 주소로 요청하면

image

위 같이 프로젝트를 다운받을 수 있다

2. spring initializr 웹사이트로 생성


URL : https://start.spring.io/

image

  • Generate 를 누르면 된다

Boot Import, Export


Import

Boot를 Import를 할 때는 (starter io 홈피에서 받아왔으면 압축 해제 -> 이 폴더가 프로젝트 폴더가 된다)

  • Import > Existing Maven Project 를 하면 된다
    • Projects from Folder or Archive 도 가능하다 (확인됨)

여러 삽질을 해보았지만.. IntelliJ 에서 build.gradle파일로 open할 떄 처럼 빌드관련 단어가 찍힌걸로 여는 것이 수월한 것 같다..

이상하게 io 사이트에서 가져온 프로젝트가 import도 되고 pom 도 정상인것 처럼 보이는데 특정 Annotaion을 사용할 수가 없다… (RestController 나 *Mapping 등) -> 죄송합니다 Spring Web 의존성을 추가하지 않아서 그랬습니다 ㅠㅠㅠ 이런..

Export

  • Export > Archive File

  • archive : 압축형식
  • file system : 파일형식

JAR Export를 하면.. 배포할때처럼 class파일만이 있다

참고


https://mjn5027.tistory.com/44

부트 실행해보기


프로젝트가 열리면 아래와 같은 main함수가 있는 것을 알 수 있다

image

기존은 spring은 main을 톰캣이 가지고 있었지만

부트는 톰캣이 부트의 하위에 있기 때문에 main을 부트가 가지고 있다

package com.newlecture.web.controller;
..
@RestController
public class HomeController {

    @RequestMapping("/index")
    public String foo() {
	return "Hello Spring Boot";
    }

    @RequestMapping("/boo")
    public String boo() {
	return "nothing";
    }

}

샘플 코드추가후 실행해 보자

image

image

기본적으로 Context Path가 /로 잡혀있다

부트 실행법

  • Ctrl + F11 (Run)
  • 프로젝트우클릭 > Run As > Spring Web App
  • Boot Dashboard view > (Re) Start

서버 포트 변경

application.properties 에 아래 문장 추가

server.port=8090

html jsp 경로


웹 루트는 2개가 있다고 생각하면 된다

  • 정적파일 : src/main/resources/static
  • 동적파일 : src/main/webapp

jsp lib 추가


index.jsp 를 생성만 하면은 다운이 된다..

jsp를 처리할 수 있는 lib가 없기 때문에 요청이 오면 그 소스파일을 돌려준다

아래를 추가하면 된다

<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <version>9.0.50</version>
</dependency>

리눅스에 배포를 해보았는데… 동일 8090 포트라 가정할때..포트포워딩을 멈춘후 로컬실행/혹은 리눅스 실행후에 포트포워딩을 열 수가 있다. 이말은 “같은포트를 2개 사용중일수도 있다” 가 되는 걸까… ?!..

jsp 작업 중 스프링 강의와 안겹치는 부분 메모 !


  • 만일 RequestMapping의 경로와 return하는 view 경로가 같으면..
    view는 논리명만 적으면 된다

    • 예) 매핑 : /customer/notice/list
      view : /customer/notice/list.jsp 이경우 view 는 list.jsp 로 적어도 된다
  • 톰캣에서 자원을 직접 요청할 수 없게 하는 특수한 디렉터리가 있다

    • 바로 INFO 계열의 디렉터리이다 (WEB-INFO, META-INFO 등..)
    • 홈 디렉터리(src/main/webapp) 밑에 두도록 하자
  • viewResolver 설정하기

    • spring.mvc.view.prefix=/WEB-INF/view/
      spring.mvc.view.suffix=.jsp
      
    • … 정말 눈물 날뻔했다
  • devtools 설정

    • 자바 코드 수정 후 저장시 자동 재시작
    •   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <!-- <version>2.5.3</version> -->
            <optional>true</optional>
        </dependency>
      
    • 근데 난 안됀다 ㅠ
  • Tiles 객체화하기

    •     @Configuration
        public class TilesConfig {
      
          @Bean
          public TilesConfigurer tilesConfigurer() {
            TilesConfigurer tilesConfigurer = new TilesConfigurer();
            tilesConfigurer.setDefinitions(new String[] {"/WEB-INF/tiles.xml"});
            tilesConfigurer.setCheckRefresh(true);
      
            return tilesConfigurer;
          }
      
          @Bean
          public TilesViewResolver tilesViewResolver() {
            TilesViewResolver viewResolver = new TilesViewResolver();
            viewResolver.setViewClass(TilesView.class);
            viewResolver.setOrder(1);
      
            return viewResolver;
          }
        }
      
    • 반환타입 메서드명으로 정의되어있는데 이때 이 메서드명이 객체명스러운 것은 IoC에 이 이름으로 부여되기 때문이다
  • ResourceViewResolverTilesViewResolver

    • 위 설정에서 TilesViewResolver의 Order를 1로 했기 때문에 더 높은 우선순위로 호출이 된다
    • 꼭 customer.notice로 호출을 하지 않고 / 로 구분을 지어도 되나, ResourceViewResolver 와 혼선을 피하기 위해 이렇게 . 으로 구분을 했다

Tiles Advanced : 추가 기능들

https://tiles.apache.org/framework/tutorial/advanced/index.html
https://tiles.apache.org/framework/tutorial/advanced/nesting-extending.html

Nesting Definitions

  • 중첩하여 사용 가능

Named subdefinition

  • 이름을 지정하고 중첩하여 사용할 수 있다
<definition name="myapp.homepage.body" template="/layouts/three_rows.jsp">
  <put-attribute name="one" value="/tiles/headlines.jsp" />
  <put-attribute name="two" value="/tiles/topics.jsp" />
  <put-attribute name="one" value="/tiles/comments.jsp" />
</definition>

<definition name="myapp.homepage" template="/layouts/classic.jsp">
  <put-attribute name="title" value="Tiles tutorial homepage" />
  <put-attribute name="header" value="/tiles/banner.jsp" />
  <put-attribute name="menu" value="/tiles/common_menu.jsp" />
  <put-attribute name="body" value="myapp.homepage.body" />
  <put-attribute name="footer" value="/tiles/credits.jsp" />
</definition>

Anonymous nested definitions

  • 이름을 지정하지 않고도 중첩 사용 가능
<definition name="myapp.homepage.body" template="/layouts/three_rows.jsp">
  <put-attribute name="one" value="/tiles/headlines.jsp" />
  <put-attribute name="two" value="/tiles/topics.jsp" />
  <put-attribute name="one" value="/tiles/comments.jsp" />
</definition>

<definition name="myapp.homepage" template="/layouts/classic.jsp">
  <put-attribute name="title" value="Tiles tutorial homepage" />
  <put-attribute name="header" value="/tiles/banner.jsp" />
  <put-attribute name="menu" value="/tiles/common_menu.jsp" />
  <put-attribute name="body">
    <definition template="/layouts/three_rows.jsp">
      <put-attribute name="one" value="/tiles/headlines.jsp" />
      <put-attribute name="two" value="/tiles/topics.jsp" />
      <put-attribute name="one" value="/tiles/comments.jsp" />
    </definition>
  </put-attribute>
  <put-attribute name="footer" value="/tiles/credits.jsp" />
</definition>

Extending Definitions

  • 상속 가능
    • 자바의 추상(abstract)클래스처럼 상속하여 사용이 가능합니다
    • 상속되지 않아야 할 속성은 오버라이드 가능
<definition name="myapp.homepage.customer" extends="myapp.homepage">
  <put-attribute name="menu" value="/tiles/common_menu_for_customers.jsp" />
</definition>

tiles.xml 리펙터링

  • 리펙터링 전
<tiles-definitions>

  <definition name="home.*" template="/WEB-INF/view/inc/layout.jsp">
    <put-attribute name="title" value="Tiles tutorial homepage" />
    <put-attribute name="main" value="/WEB-INF/view/{1}.jsp" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>

  <definition name="customer.*.*" template="/WEB-INF/view/customer/inc/layout.jsp">
    <put-attribute name="title" value="Tiles tutorial homepage" />
    <put-attribute name="main" value="/WEB-INF/view/customer/{1}/{2}.jsp" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
    <put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />
  </definition>

  <definition name="admin.*.*.*" template="/WEB-INF/view/admin/inc/layout.jsp">
    <put-attribute name="title" value="Tiles tutorial homepage" />
    <put-attribute name="main" value="/WEB-INF/view/admin/{1}/{2}/{3}.jsp" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
    <put-attribute name="visual" value="/WEB-INF/view/admin/inc/visual.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/admin/inc/aside.jsp" />
  </definition>

</tiles-definitions>
  • 리펙터링 후
<tiles-definitions>

  <definition name="layout.common" template="/WEB-INF/view/inc/layout.jsp">
    <put-attribute name="title" value="Tiles tutorial homepage" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>

  <definition name="home.*" extends="layout.common">
    <put-attribute name="main" value="/WEB-INF/view/{1}.jsp" />
  </definition>

  <definition name="customer.*.*" template="/WEB-INF/view/customer/inc/layout.jsp" extends="layout.common">
    <put-attribute name="main" value="/WEB-INF/view/customer/{1}/{2}.jsp" />
    <put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />
  </definition>

  <definition name="admin.*.*.*" template="/WEB-INF/view/admin/inc/layout.jsp" extends="layout.common">
    <put-attribute name="main" value="/WEB-INF/view/admin/{1}/{2}/{3}.jsp" />
    <put-attribute name="visual" value="/WEB-INF/view/admin/inc/visual.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/admin/inc/aside.jsp" />
  </definition>

</tiles-definitions>
  • layout.common 을 상속하여 사용
  • layout이 다른 것은 오버라이드 가능하다

현제 12:51분.. 커밋이 안되고 있다.. 왜이럴까 ㅠ 약 5일 뒤에 캐시 지우고 다른 포스트를 commi한 후에 commit을 해 보았는데.. 정상적으로 되는 것을 확인하였다.. ㅠ





© 2020.12. by 따라쟁이

Powered by philz