Springboot

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파일에 추가해주자.
버전에 노란줄뜨는데 9버전쓰는데 10.1.5쓸필요잇냐고 물어봄. 그냥 지우면 버전에 맞춰서 다운해줌.
근데 걍 10.1.5 다운받아주네 알수없다.
정상적으로 인식하게 되었다.

7. 사용자 공지를 위한 MVC 구현하기

사용자의 공지사항페이지 목록가져오기
HomeController에 함수를 넣으면 모든 url을 넣을 수도 있다. 규모가 작으면 괜찮은데 관리할때 나눠서 하게 될것이기 때문에 분업을 위해 나눌 필요가 있다.
customer를 한곳에 담아서 관리하는 내용이 잇다면 포장할 수잇는 큰 그릇으로 컨트롤러 클래스를 만들고 각이름이 하나의 클래스가 되는 것이다.
크래스 위쪽에 잇는것은 패키지명으로 한다. 사람마다 다르고 회사에서 정해주는데로 하는게 맞다.

static의 html을 가져와서 jsp파일을 만들것이다. 루트 디렉토리도 url에맞게 만들어주자.
결국 컨트롤러가 notice에 매핑되있는 것을 둠으로써 직관적으로 관리할 수 있게 된다.

//@RestController
@Controller
public class NoitceController {

    //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";
    }
}

@RestController 와 @Controller 차이
rest는 가지고 있는 것들을 그냥 사용자에게 문자열로 반환함. view를 가지고 경로를 리턴한다면 그냥 controller로 해야한다.
그런데 우리가 설정한 매핑과 같다면 그냥 파일이름만 적어도된다.
return "list.jsp"; / return "detail.jsp";

컨트롤러가 준비되었고 간단하게 Model도 준비해보자.
매개변수에 그냥 Model만 선언하면 알아서 참조해준다.

public String list(Model model) {
    model.addAttribute("test", "Hello~");
    return "list.jsp";
}

뷰페이지에 el로 표기해주자. <title>공지사항목록 ${test}</title>

8. Mapping, View 위치 바로 잡기

NoitceController는 notice의 것을 매핑하는 것이므로 중복이 된다.
@Controller("/customer/notice/")해주면 아래의 매핑과 연결해서 이어준다.
그리고 이 @RequestMapping이 옛날방식이라 달라져서 get요쳥은 @GetMapping("list") 으로 받아준다.
또한 view페이지가 루트파일에 잇으면 사용자가 원본 페이지를 부를 수 잇게 되어 문제가 생길수잇다. 컨트롤러가 주인이되어야하는데 우회해서 부를 수잇다면 문제가잇다.
WEB-INF파일 view파일을 만들면 특수한의미의 폴더가 된다. 디렉토리를 숨길 수 있게 된다.
다른 여러가지 설정들도 만질 수없도록 관리한다.

@Controller
@RequestMapping("/customer/notice/")
public class NoitceController {

//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단을 webinf에 두면서 내용이 길어졌다. 앞뒤를 잘라서 정리하고싶다.
resources 에 application.properties을 사용하면된다.
컨트롤러가 톰캣에 강하게 붙어있었다. 컨트롤러들을 그냥 java오브젝트로 만들고 톰캣과 소통하는 것을 서블릿하나만 두고 실행하도록 만드는 것이다.
톰캣을 사용하지 않게 되엇을때 문제가 생기지 않게 하기 위해서이다. 과거에는 스트럭쳐를 이요햇는데 스프링이 제공하는 라이브러리를 사용하는 것이다.
이 컨트롤러를 Front Controller라고 한다. 다양한 어노테이션과 리턴한값을 사용하면 잘 처리해준다. 컨트롤러가 model과 view를 전달하고 이것을 view에 모델을 전달하는게 dispathcer이다.
resource viewresolver 가 디렉토리 내에서 파일을 찾아줌.
files를 쓰면 파일을 찾아줌 등등 일을 하게 만들 수잇다.
스프링 에 Dispathcer-servlet이 일하면서 view단이 보여지게 되는 것이다.
application.properties은 단순하게 텍스트 파일인데 알아서 설정을 하게 해준다. config가 최소화되엇다.

spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
반환된 문자열에 앞뒤로 더해준다.

!!!또한 주의사항!!!
sts가 최신버전으로이니 프로젝트를 생성할때 당연히 가장 최근의 라이브러리를 넣어준다.
spring-boot-starter-parent을 가장 최근 버전 3.0이상의 버전이 들어오게 되는데 이 버전은 자바17에서만 가능하다.
자바 버전을 낮추어서 프로젝트를 생성하려고해도 자동으로 17로 맞춰진다. pom파일에서 11로 낮추면 또 자바17에서 작성된 클래스라며 오류가 발생한다.
이를 해결하기 위해서는 spring-boot-starter-parent도 버전을 같이 낮춰줘야한다.!!

10. DevTools 설정하기

기본 툴즈이다. 코드에서 뭔가 고쳣을때 부트를 다시 시작해야한다. 이게 불편하다.
폼파일에 dependecncy하나를 추가하면 알아서 인식해서 알아서 재시작한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>3.0.1</version>
</dependency>
데브툴즈를 추가해준다. 서버를 재시작 하지 않아도 알아서 재시작하고 바뀐다.

11~12. 실습 관리자 페이지를 위한 공지사항 페이지 추가해보기
알아서 관리자 페이지를 추가해봐라
/admin/board/notice/list,detail,edit,reg,del
주의사항 noticecontller 함수에 패밍될 이름들이고 이 것을 담는게 이름이 같다. 이것을 해결해봐라
이름이같으면 오류발생함
@컨트롤러옆에 이름을 붙여주면됨!

@Controller("adminNoitceController")
@RequestMapping("/admin/board/notice/")
public class NoitceController {

//list,detail,edit,reg
@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. 페이지 공통분모 집중화

스프링에서 했던 것처럼 공통 사항들을 분리할 필요가 있다.


분리후 jsp의 기본 제공하는 액션태그로 분리된 것을 가져다 쓸 수 있다.
일단 페이지를 나눠보로독하자.
header와 footer는 보통 다같이 사용한다. aside는 다르게 사용할것이다. 각자 알아서 구분해서 만들어줘야한다.
그외 visual 이나 aside는 admin과 customer이 다르다 각각 분리해주자.
틀은 layout.jsp로 만들고 main파일인 list.jsp에는 main만 남겨놓는다.
예제참조 layout.jsp / list.jsp
admin페이지도 마찬가지로 설정해준다.

14. Tiles 지시서 작성하기

페이지를 잘게 나누엇는데 합쳐서 사용하는 라이브러리를 사용하기 위해서 그런것이엇다.
원래 합치기위해서 include라는 액션태그를 사용햇다. 복사붙여넣기의 단점이 고칠때 전부다 고쳐야한다는 점이 귀찮다. 소스에서 따로 합치는게 보기 편하다.
배치정보를 layout으로 두고 똑같은 것들을 빼고 main만 하나씩 결합하면되는 것이다.
반복적인 페이지가 줄어드는 것이 좋다.
Tiles을 사용할 것이다. 이제 더이상 업데이트가 없다고 나오는데 timeleaf를 사용할수도 있기 때문이다.
spring MVC강의 참조하기

<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
  <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="/tiles/home_body.jsp" />
    <put-attribute name="footer" value="/tiles/credits.jsp" />
  </definition>
</tiles-definitions>

@GetMapping("list") 
public String list(Model model) {
    model.addAttribute("test", "Hello~");
    //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="Tiles tutorial homepage" />
    <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도 만들어 줫어야햇다.
이렇게 만들고 스프링 컨테이너에 담아줫어야한다.
이전 스프링에서 배울때는 먼저 xml에서 설정을 했는디 클래스파일로 Config로 지시서를 따로 만들어주어서 JAVA Config를 사용해보자.
@Configuration이 붙으면 @Bean이라는 설정을 뒤지게 된다. 바로 IOC컨테이너에 담아주는 역할을 하는 것이다.
https://chunpinge.tistory.com/126 17번강의
https://chunpinge.tistory.com/122 17번강의


객체를 반환해야해서 보통 객체를 반환하면 getTilesViewResolver인데 get을 빼고 그냥 bean객체로서 컨테이너에 담을거기 때문에 이름을 이해하기 위해서 그냥 짓는다.
그냥 이 이름으로 담아 달라는 것으로 이해해야한다.
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를 그냥 지원안한다. 버전낮춰주자.

@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.notice.*" template="/WEB-INF/view/customer/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/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/notice/{1}.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>
</tiles-definitions>

바뀌는 부분을 *로 하고 내용을 {1}인덱스를 지정해준다.

<definition name="customer.." template="/WEB-INF/view/customer/inc/layout.jsp">
<put-attribute name="main" value="/WEB-INF/view/customer/{1}/{2}.jsp" />
나중에 customer에 또 event가 생길 수 잇으니 *을 두개달아주고 각각 해주자.

@GetMapping("detail") 
public String detail() {
    return "customer.notice.detail";
}

리턴도 tieles에 연결되도록해주자.
"."말고 "/"로 해도되는데 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/inc/aside.jsp" />
  <put-attribute name="main" value="/WEB-INF/view/admin/{1}/{2}/{3}.jsp" />
  <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
</definition>

2023.01.21 후기

했던 내용을 한번더 복습하는 내용이다. 어렵게 xml을 작성할 필요가 없으니 정말 편하다.
오류!!! 매핑을 계속 잘못하고 잇엇다. 오류!!!
@RequestMapping("/customer/notice/") 해야되는데
@Controller("/customer/notice/")로써두고 매핑이안된다고 하고있었다. 오타류를 잘확인하자

'기초단계 > SPRING' 카테고리의 다른 글

2023.01.24-1 Spring  (0) 2023.01.24
2023.01.22 Spring  (0) 2023.01.22
2023.01.19 Spring  (0) 2023.01.20
2023.01.18 Spring  (0) 2023.01.19
2023.01.17 Spring  (0) 2023.01.17

+ Recent posts