newlec Springboot
1. 스프링 부트란?
https://youtu.be/4-0scAf5tpU
스프링을 사용하기 위해서는 was 서블릿/jsp 그위에 스프링 di트랜잭션 mvc등을 하면서 설정을 햇다.
라이브러리도 여러개가 잇어서 사용하기 위한 사전작업을 많이햇다.
어플리케이션을 쾌적하게 만들기위해 어려움을 겪던것을 합쳐버려서 스프링 부트로 만들어버렷다.
톰캣 다운받지 않고 서블릿jsp알아서 해주고 루트 알아서 만들겟다 등등
스프링 어플리케이션을 만들때 그냥 만들어라. 전부 통합시켜놧다. war로 할필요없고 그냥 배포하면된다.
dependencies많은데 스타터로 알아서 넣어준다.
configure알아서 설정해주겟다. 최대한 구조설정을 해주겟다는 것이다.
자바프로그램처럼 만들고 알아서 설정하게 하겟다.
2. 학습개요
고전적인 방식 1대1로 매핑햇다
-> 어노테이션으로 매핑햇다.
-> 버전올라가며 java config를 사용햇다.
-> 부트에서는 이것도 사용하지 말라는 것이다.
4. Spring Boot Starter 프로젝트 만들기
스프링을 만들면서 필요한 것을 추가할 수있다.
라이브러리도 선택하여 추가할 수 있다.
신기한점은 메인함수가 존재하게 된다.
웹하면서 메인을 사용하지 않앗었는데 서블릿에서는 메인이 없엇다.
메인은 톰캣이 가지고 잇엇기때문이다.
톰캣도 스프링부트 밑에 들어가게 되는 것이다.
스프링을 능력 di등등을 이용해서 콘솔프로그램, 웹을 만들 수도 있다.
pom.xml을 가도 별로없는데 수많은 라이브러리들이 알아서 들어가잇다.
HomeController를만들어보자.
@RestController는 문자열만 출력하는 컨트롤러이다.
@RestController
public class HomeController {
@RequestMapping("/index")
public String adf() {
return "Hello Spring Boot";
}
}SpringWebApplication 메인함수이니 그냥 여기서 실행하면된다.
http://localhost:8080/index
매핑된곳으로 가보면 출력된다.
5. 수업용 HTML 파일 준비하기
원래는 여기다 햇다. main- webapp 만들어주자.
스프링MVC에서 정적페이지들을 저장하기 위해서 webapp에 static을 만들엇엇다.
스프링부트는 resources/static이라는 폴더가 이미 잇다.
스프링 부트에서는 정적인 페이지 디렉토리와 동적인 페이지가 나뉘어져잇다.
이제 홈디렉토리가 두가지가 된다. 기본과 static으로 두가지로 나뉘는 것이다.
jsp를 추가할때는 webapp에 정적파일은 static에 넣으면된다.
6. View를 인식시키는 Jasper 라이브러리 추가하기
jsp파일을 만들어서 실행하면 톰캣 서버가 jsp파일을 처리할 수 없어서 그냥 다운로드 되게된다.
소스코드는 가는데 실행이안된다.
재스퍼 라이브러리를 추가해야한다.
1.메인함수 실행 2.프로젝트 우클릭 - run as - spring boot app
3.boot dashbood
http://localhost:8080/index.jsp하면 소스코드를 다운한다.
https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper
라이브러리가 없다면 파일을 그대로 불러주게 되는 것이다.
Tomcat Embed Jasper다운받아야한다.
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>10.1.5</version>
</dependency>pom파일에 추가해주자.
7. 사용자 공지를 위한 MVC 구현하기
사용자의 공지사항페이지 목록가져오기
HomeController에 함수를 넣으면 모든 url을 넣을 수도 있다.
규모가 작으면 괜찮은데 관리할때 나눠서 하게 될것이기 때문에 분업을 위해 나눌 필요가 있다.
customer를 한곳에 담아서 관리하는 내용이 잇다면 포장할 수 잇는
큰 그릇으로 컨트롤러 클래스를 만들고 각이름이 하나의 클래스가 되는 것이다.
클래스 위쪽에 잇는것은 패키지명으로 한다.
사람마다 다르고 회사에서 정해주는데로 하는게 맞다.
static의 html을 가져와서 jsp파일을 만들것이다.
루트 디렉토리도 url에맞게 만들어주자.
결국 컨트롤러가 notice에 매핑되있는 것을 둠으로써 직관적으로 관리할 수 있게 된다.
@Controller
public class NoticeController {
//list,detaili,edit,reg
@RequestMapping("/customer/notice/list")
public String list() {
return "/customer/notice/list.jsp";
}
@RequestMapping("/customer/notice/detail") //list,detaili,edit,reg
public String detail() {
return "/customer/notice/detail.jsp";
}
}rest는 가지고 있는 것들을 그냥 사용자에게 문자열로 반환한다.
view를 가지고 경로를 리턴한다면 그냥 controller로 해야한다.
우리가 설정한 매핑과 같다면 그냥 파일이름만 적어도된다.
return "list.jsp"; / return "detail.jsp";
컨트롤러가 준비되었고 간단하게 Model도 준비해보자.
매개변수에 그냥 Model만 선언하면 알아서 참조해준다.
public String list(Model model) {
model.addAttribute("test", "Hello~");
return "list.jsp";
}8. Mapping, View 위치 바로 잡기
NoitceController는 notice의 것을 매핑하는 것이므로 중복이 된다.
@Controller("/customer/notice/")해주면 아래의 매핑과 연결해서 이어준다.
이 @RequestMapping이 옛날방식이라 달라져서 get요청은 @GetMapping어노테이션을 사용한다.
따라서 @GetMapping("list") 으로 받아주자.
또한 view페이지가 루트파일에 잇으면 사용자가 원본 페이지를 부를 수 잇게 되어 문제가 생길수잇다.
컨트롤러가 주인이되어야하는데 우회해서 부를 수잇다면 문제가잇다.
WEB-INF파일 view파일을 만들면 특수한의미의 폴더가 된다.
디렉토리를 숨겨 다른 여러가지 설정들도 만질 수없도록 관리한다.
@Controller
@RequestMapping("/customer/notice/")
public class NoticeController {
// list,detaili,edit,reg
@GetMapping("list")
public String list(Model model) {
model.addAttribute("test", "Hello~");
return "/WEB-INF/view/customer/notice/list.jsp";
}
@GetMapping("detail")
public String detail() {
return "/WEB-INF/view/customer/notice/detail.jsp";
}
}9. Resource View Resolver 설정하기
view단을 WEB-INF에 두면서 리턴문이 길어졌다.
앞뒤를 잘라서 정리하고싶다.
resources 에 application.properties을 사용하면된다.
컨트롤러가 톰캣에 강하게 붙어있었다.
컨트롤러들을 그냥 java오브젝트로 만들고 톰캣과 소통하는 것을 서블릿하나만 두고 실행하도록 만드는 것이다.
톰캣을 사용하지 않게 되엇을때 문제가 생기지 않게 하기 위해서이다.
과거에는 스트럭쳐를 이용햇는데 스프링이 제공하는 라이브러리를 사용하는 것이다.
이 컨트롤러를 Front Controller라고 한다.
다양한 어노테이션과 리턴한값을 사용하면 잘 처리해준다.
컨트롤러가 model과 view를 전달하고 이것을 view에 모델을 전달하는게 dispathcer이다.
view를 찾는 viewresolver이다.
resource viewresolver 가 디렉토리 내에서 파일을 찾아준다.
files를 쓰면 파일을 찾아주기 등등 일을 하게 만들 수잇다.
스프링에 Dispathcer-servlet이 일하면서 view단이 보여지게 되는 것이다.
application.properties은 단순하게 텍스트 파일인데 알아서 설정을 하게 해준다.
config가 최소화되는 것이다
스프링이 편집기능을 지원하는 것이다.
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
반환된 문자열에 앞뒤로 더해준다.
@Controller
@RequestMapping("/customer/notice/")
public class NoticeController {
// list,detaili,edit,reg
@GetMapping("list")
public String list(Model model) {
model.addAttribute("test", "Hello~");
return "/customer/notice/list";
}
@GetMapping("detail")
public String detail() {
return "/customer/notice/detail";
}
}10. DevTools 설정하기
기본 툴즈이다. 코드에서 뭔가 고쳣을때 부트를 다시 시작해야한다.
이 불편한것을 알아서 재시작 하게 해주는 것이다.
폼파일에 dependecncy하나를 추가하면 알아서 인식해서 알아서 재시작한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>3.0.1</version>
</dependency>디브툴즈를 추가해준다. 서버를 재시작 하지 않아도 알아서 재시작하고 바뀐다.
11. 실습 : 관리자 페이지를 위한 공지사항 페이지 추가해보기
알아서 관리자 페이지를 추가해봐라
/admin/board/notice/list,detail,edit,reg,del
주의사항 NoticeController 함수에 파밍될 이름들인데
customer의 NoticeController와 admin의 NoticeController가 이름이 겹친다.
스프링 ioc컨테이너에 setNoticeController하는데 이름이 겹치는 문제인것이다.
@컨트롤러옆에 이름을 붙여주면 다르게 매핑될 수 있다
12. 설명 : 관리자 페이지를 위한 공지사항 페이지 추가해보기
@Controller("adminNoticeController")
@RequestMapping("/admin/board/notice/")
public class NoticeController {
@GetMapping("list")
public String list(Model model) {
return "/admin/board/notice/list";
}
@GetMapping("detail")
public String detail() {
return "/admin/board/notice/detail";
}
@GetMapping("reg")
public String reg() {
return "/admin/board/notice/reg";
}
}13. 페이지 공통분모 집중화
스프링 MVC에서 했던 것처럼 공통 사항들을 분리할 필요가 있다.
분리후 jsp의 기본 제공하는 액션태그로 분리된 것을 가져다 쓸 수 있다.
일단 페이지를 나눠보도록하자.
header와 footer는 보통 다같이 사용한다.
aside는 다르게 사용할것이다. 각자 알아서 구분해서 만들어줘야한다.
그외 visual 이나 aside는 admin과 customer이 다르다 각각 분리해주자.
틀은 layout.jsp로 만들고 main파일인 list.jsp에는 main만 남겨놓는다.
admin페이지도 마찬가지로 설정해준다.
14. Tiles 지시서 작성하기
페이지를 잘게 나누엇는데 합쳐서 사용하는 라이브러리를 사용하기 위해서 그런것이엇다.
원래 합치기위해서 include라는 액션태그를 사용하는데
복사붙여넣기의 단점이 고칠때 전부다 고쳐야한다는 점이 귀찮다.
소스에서 따로 합치는게 보기 편하다.
배치정보를 layout으로 두고 똑같은 것들을 빼고 main만 하나씩 결합하면되는 것이다.
반복적인 페이지가 줄어드는 것이 좋다.
Tiles을 사용할 것이다.
이제 더이상 업데이트가 없다고 나온다.
TimeLeaf를 사용할수도 있기 때문이다.
spring MVC강의 참조하기
@GetMapping("list")
public String list(Model model) {
//return "/customer/notice/list";
return "customer.notice.list";
}ResourceViewResolver로 앞뒤에 루트와 .jsp 붙여줘서 불럿엇다.
이제 이것을 합치기 위해 다른 이름이라는 것을 알 수 잇도록 해준다.
이러면 TilesViewResolver로 반환되는 값을 설정값을 보도록 해준다.
<tiles-definitions>
<definition name="customer.notice.list" template="/WEB-INF/view/customer/inc/layout.jsp">
<put-attribute name="title" value="공지사항" />
<put-attribute name="header" value="/WEB-INF/view/inc/header.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" />
<put-attribute name="body" value="/WEB-INF/view/customer/notice/list.jsp" />
<put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
</definition>
</tiles-definitions>각 경로에 맞게 설정을 해준다.
이제 이것을 설정하면 이것을 조립할 수 있도록 타일 지시서를 만들어줘야한다.
15. Tiles View Resolver 생성하기
지시서에 잇는지 알아보고 맞다면 조립해서 보여준다.
사용하려면 Tiles View Resolver객체를 생성하고
이 지시서가 어디잇는지 아는 TilesConfigurer도 만들어줘야한다.
이렇게 만들고 스프링 컨테이너에 담아줘야한다.
이전 스프링 MVC에서 배울때는 먼저 xml에서 설정을 했는데
클래스파일로 Config로 지시서를 따로 만들어서 담을 수 있다.
JAVA Config를 사용해보자.
@Configuration이 붙으면 @Bean이라는 설정을 뒤지게 된다.
바로 IOC컨테이너에 담아주는 역할을 하게 된다.
https://chunpinge.tistory.com/126 17번강의 Tiles View Resolver
https://chunpinge.tistory.com/122 17번강의 Java Configuration
객체를 반환해야해서 보통 객체를 반환하면 getTilesViewResolver인데
get을 빼고 그냥 bean객체로서 컨테이너에 담는다.
IOC가 이해하기 위해서 함수이름으로 지어 담으면 된다.
com.newlecture.web.config 패키지를 만들고 TilesConfig클래스를 만들어주자.
Tiles를 사용하기 위해 tiles와 tiles가 사용하는 라이브러리인 jstl도 넣어주자.
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>3.0.8</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>-> 스프링부트 3.0이상버전부터는 tiles를 그냥 지원안한다.
2.7.8으로 버전낮춰주자.
@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;
}
}레이아웃에가서 타일즈 태그를 활용하여 설정을 하나씩 넣어줘야한다.
<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>태그를 사용하기 위해 taglib를 넣어주고 하나씩 설정해줘야한다..
속성을 넣는 다는 것이고 이름은 tiles.xml에 설정한 것을 의미한다.
<tiles:insertAttribute name="header"/>16. Tiles 패턴 사용하기
다른페이지에 넣는다고 생각하면 하나씩 모두 다 넣어주는 것은 매우 귀찮다.
detail의 이름을 또만들어주고 또 하나씩 넣는 것은 불편하다 내용이 같기때문이고 코드수만 늘어나게 되는 것이기때문임.
적절하게 패턴만 만들면된다.
<tiles-definitions>
<definition name="customer.*.*" template="/WEB-INF/view/customer/inc/layout.jsp">
<put-attribute name="title" value="공지사항" />
<put-attribute name="header" value="/WEB-INF/view/inc/header.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" />
<put-attribute name="body" value="/WEB-INF/view/customer/{1}/{2}.jsp" />
<put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
</definition>
</tiles-definitions>바뀌는 부분을 *로 하고 내용을 {1}인덱스를 지정해준다.
나중에 customer에 또 event가 생길 수 잇으니 *을 두개달아주고 각각 해주자.
"."말고 "/"로 해도되는데 ResourceViewResolver와 혼동이 올 수 있기 때문에 다르게 해주는게 좋다.
admin도 설정만 추가 해두자.
<definition name="admin.*.*.*" template="/WEB-INF/view/admin/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="visual" value="/WEB-INF/view/admin/inc/visual.jsp" />
<put-attribute name="aside" value="/WEB-INF/view/admin/board/inc/aside.jsp" />
<put-attribute name="body" value="/WEB-INF/view/admin/{1}/{2}/{3}.jsp" />
<put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
</definition>17. Admin을 위한 Layout 페이지 만들기
customer처럼 admin페이지를 각각 잘라서 나눈다.
@GetMapping("list")
public String list(Model model) {
return "admin.board.notice.list";
}
@GetMapping("detail")
public String detail() {
return "admin.board.notice.detail";
}
@GetMapping("reg")
public String reg() {
return "admin.board.notice.reg";
}잊지 않고 리턴 값도 바꿔주자.
index페이지도 해주자.
<definition name="*" template="/WEB-INF/view/admin/inc/layout.jsp">
이렇게하면 모두가 걸리게 되서 문제가 된다. 폴더명이 없으니 가상으로 하나를 만들어주자.
약속만 지키는 것 이기때문에 가상의 폴더를 만들어준다고 생각하면된다.
<definition name="home.*" 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="body" value="/WEB-INF/view/{1}.jsp" />
<put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
</definition>@Controller
@RequestMapping("/")
public class HomeController {
@RequestMapping("index")
public String index() {
return "home.index";
}
}18. Tiles의 추가 기능들
https://tiles.apache.org/framework/tutorial/index.html 가면 기능이 잇다..
Tiles Advanced Topics
정의된 layout을 중첩할수잇다.
<put-attribute name="body" value="myapp.homepage.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 name="one" value="/tiles/headlines.jsp" cascade="true" />
<put-attribute name="two" value="/tiles/topics.jsp" cascade="true" />
<put-attribute name="one" value="/tiles/comments.jsp" cascade="true" />중첩할때 중간에 끼어넣거나 아예따로빼서 작성할 수도 잇다.
또한 레이아웃을 상속할 수도잇다.
우리는 3가지를 정의햇는데 3가지 내용이 다르기 때문이엇음. 근데 정의하니 똑같은 부분이 잇다.
header footer같은 부분 extends 상속할 타일 하면된다.
주소가 아예같다면 그냥 상속만 적어도된다.
<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="title" value="Tiles tutorial homepage" />
<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="title" value="Tiles tutorial homepage" />
<put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />
<put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />
<put-attribute name="main" value="/WEB-INF/view/customer/{1}/{2}.jsp" />
</definition>
<definition name="admin.*.*.*" template="/WEB-INF/view/admin/inc/layout.jsp" extends="layout.common">
<put-attribute name="title" value="Tiles tutorial homepage" />
<put-attribute name="visual" value="/WEB-INF/view/admin/inc/visual.jsp" />
<put-attribute name="aside" value="/WEB-INF/view/admin/inc/aside.jsp" />
<put-attribute name="main" value="/WEB-INF/view/admin/{1}/{2}/{3}.jsp" />
</definition>
</tiles-definitions>
<definition name="myapp.homepage.body" template="/layouts/variable_rows.jsp">
<put-list-attribute name="items">
<add-attribute value="/tiles/banner.jsp" />
<add-attribute value="/tiles/common_menu.jsp" />
<add-attribute value="/tiles/credits.jsp" />
</put-list-attribute>
</definition>
<c:forEach var="item" items="${list}">
<tiles:insertAttribute value="${item}" flush="true" />
<br/>
</c:forEach>foreach로 반복적이라면 리스트로 담아서 할 수도 잇다. 이 리스트도 상속이 가능하다. 정적으로 햇엇는데 api를 담을 수도 잇다.
이외에도 와일드카드(*)찍은것 el태그 등을 할수도잇다.
나중엔 View Preparers같은것도 사용한다.
2023.04.25
스프링부트 간단하게 보기
'기초단계 > SPRING' 카테고리의 다른 글
| 2023.04.28 Spring (0) | 2023.04.28 |
|---|---|
| 2023.04.27 Spring (0) | 2023.04.28 |
| 2023.04.22 Spring (0) | 2023.04.24 |
| 2023.04.20 Spring (0) | 2023.04.20 |
| 2023.04.18 Spring (0) | 2023.04.18 |