newlecture: spring boot (1) : boot 생성, properties, Tiles설정
Spring Boot
- 본 강의는 멤버쉽 강의이므로.. 영상에 제공되는 이미지는 사용하지 않겠습니다 !
- 기존 spring 강의와 겹치는 내용은 생략하겠습니다 ! !
- 반복적 설정 간소화
Spring DI/Transaction/MVC/.. + Servlet/JSP + WAS(Tomcat, Jetty) 를 통합해주었다
- 혼자 독립가능한 App이다
- 부트 가지고 바로 생성가능
- Tomcat 등의 lib 포함.. War배포 필요 없다
starter
라는 lib로 통합
- 최소한의 내용으로 config 하게끔 하였다
- XML 등의 구성 설정도 필요 없음 (와)
- 최소한의 내용으로 config 하게끔 하였다
설정의 진화 과정
- XML -> Annotation + Javaconfig > properties/yaml
Boot Starter 프로젝트 만들기
1. 이클립스 IDE로 생성 : newlec쌤 방법
Spring Starter Project
생성
(중간에 잘못 캡쳐하여 수정함..)
이 화면에서 finish를 누른다
참고로 이 뒤 화면에
위와 같은 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
위 주소로 요청하면
위 같이 프로젝트를 다운받을 수 있다
2. spring initializr 웹사이트로 생성
URL : https://start.spring.io/
- 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함수가 있는 것을 알 수 있다
기존은 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";
}
}
샘플 코드추가후 실행해 보자
기본적으로 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 로 적어도 된다
- 예) 매핑 : /customer/notice/list
톰캣에서 자원을 직접 요청할 수 없게 하는 특수한 디렉터리가 있다
- 바로
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에 이 이름으로 부여되기 때문이다
ResourceViewResolver
와TilesViewResolver
- 위 설정에서
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을 해 보았는데.. 정상적으로 되는 것을 확인하였다.. ㅠ