반응형
<Tiles 기본>
  1.  tiles 란?
-  반복적으로 사용되는 header, footer와 같은 정보를 한곳에 모아둔 프레임 워크

  1.   tiles3로 오면서 설정이 더욱 간단해 졌다. tiles3는 spring3.2 버전 이상부터 쓰일 수 있으니 참고바람.

  1.     pom.xml에 3가지 dependency를 추가한다.

pom.xml

<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-extras</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-jsp</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-servlet</artifactId>
    <version>3.0.0</version>
</dependency></p>


  1.    tiles를 유동적으로 사용하고 싶다면 다음과 같이 설정한다.  우선 모든 view들은 tiles를 정의한 tiles 설정 파일의  definition들에서
binding될 jsp 등의 view 파일들을 찾게됩니다. 만약 각 views.xml에서 view 파일을 못찾게 되면 우선순위가 2인 InternalResourceViewResolver 에서 해당 view 파일을 찾게 됩니다.

참고 >> 
view resolver
- View Resolver는 Spring의 DispatcherServlet이 Controller의 응답 결과를 가져올 때, 어떤 방식으로 view 객체를 가져올지 정하고 해당 객체를 생성한다.
- View Resolver를 구현한 클래스는 InternalResourceViewResolver, BeanNameViewResolver, XmlViewResolver, UrlBasedViewResolver 등이 있다.
- DispatcherServlet은 여러개의 ViewResolver를 가질 수 있는데, 'order' property에 따라 어떤 ViewResolver를 결정할지 우선순위를 정할 수 있다. 우선순위를 명시하지 않으면 가장 낮은 우선순위를 가진다.
- 우선순위가 높은 ViewResolver에게 View 객체를 요청하는데, 만약 null을 리턴한다면 그 다음 우선순위의 ViewResolver에게 객체를 요청하게 된다.
- InternalResourceViewResolver는 항상 mapping되는 view 객체를 리턴하고, 없다고 null을 반환하지 않으므로 항상 가장 낮은 우선순위로 두어야한다.



dispatcher-servlet.xml

<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />
  <property name="order" value="1" />
</bean>

// tiles의 우선순위를 1로 설정해둔다.

 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/views/"/>
  <property name="suffix" value=".jsp"/>
  <property name="order" value="2"></property>
 </bean>

//기존에 써있던 view resolver 에서 우선순위만 바꿔줬다.


<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
  <property name="definitions">
  <list>
  <value>/WEB-INF/tiles/tiles.xml</value>
  </list>
  </property>
</bean>

//tiles관련 설정파일 
//만약 여러개 하고 싶다면 list의 value를 추가해주면 된다.


  1. 다음은 tiles 설정파일 tills.xml

<!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="default" template="/WEB-INF/views/layout/layout.jsp">
  <put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
  <put-attribute name="body" value=""/>
  <put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
  </definition>

//기본적인 defiinition 태그를 하나 만들어둔다.

  <definition name="tiles" extends="default">
<put-attribute name="body" value="/WEB-INF/views/layout/mainTest.jsp" />
</definition>

//  defiinition 을 상속받아 여러 타일즈를 만들수 있다.

</tiles-definitions>


빨간색으로 표시한 definition name="tiles" <- 이부분이 중요하다.  이부분때문에 오류가 많이난다.

  1. layout.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
  pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
</head>

<body>
  <div id="wrap">
  <div >
  <div>
  <div>
  <tiles:insertAttribute name="header" />
  </div>
  </div>
  <div>
  <div>
  <tiles:insertAttribute name="body" />
  </div>
  </div>
  <div>
  <div>
  <tiles:insertAttribute name="footer" />
  </div>
  </div>
  </div>
  </div>
</body>
</html>



기본적으로 만들고 싶은 틀을 html 형식으로 만들어 준다.    <tiles:insertAttribute name="footer" /> 의 name은 tiles.xml에서 설정한 name과 같아야 한다. 

  1. Controller mapping 추가

@RequestMapping(value = "/test", method = RequestMethod.GET)
  public String hello(Locale locale, Model model) {

  Date date = new Date();
  DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

  String formattedDate = dateFormat.format(date);

  model.addAttribute("serverTime", formattedDate );
  return "tiles";
  }


return 값과 definition에서 정의한 name이 반드시 일치하게 해야 404 에러가 안난다. 기본적인 설정은 완료하였다. 
응용버전은 추후 추가하도록 하겠다.

  1. 기본적인 부분 완성!  - header.jsp , footer.jsp, mainTest.jsp 는 커밋해놓았으니 각자 코드를 확인해보기 바란다!



<Tiles 응용>
앞서 소개한 tiles 를 우리 프로젝트에 응용할 수 있도록 해보겠다.





우리가 앞서 소개한 부분은 defulat이다. 근데 나는 left 메뉴가 있는화면도 필요하다면 tiles.xml에 <definition>을 추가할 수 있다.


<!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="default" template="/WEB-INF/views/layout/layout.jsp">
<put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
  </definition>

<1>
  <definition name="withLeft" template="/WEB-INF/views/layout/layout_left.jsp">
<put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
<put-attribute name="left" value=""/>
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
  </definition>  

  <definition name="tiles" extends="default">
<put-attribute name="body" value="/WEB-INF/views/layout/mainTest.jsp" />
</definition>

<2>
<definition name="user/*/*" extends="withLeft">
<put-attribute name="left" value="/WEB-INF/views/layout/left.jsp"/>
<put-attribute name="body" value="/WEB-INF/views/{1}/{2}.jsp" />
</definition>



</tiles-definitions>


<1>  template을 다르게 해서  definition을 추가했다. 이를 상속받아 <2>를 추가했다.

여기서 중요한것은 <2>번이다. 다들 이를 응용하여 개발하면 된다.
definition name="/" -- > controller mapping 형태를 말한다. 

참고>>>
definition name 형식 -
- ? : 한 글자, * : 아무글자나, [abc] : abc로 시작

IssueController.java
@RequestMapping(value={"/issue/list"} , method=RequestMethod.GET)
public String showIssueList(HttpServletRequest request) {
return "issue/issueList";
}
}


/issue/list를 매핑하여  issue/issueList를 return 한다.
그러면  issue가 {1}  issueList가 {2}가 된다.
즉 issue 폴더 아래에 있는 issueList에 적용한다는 것이다.


http://localhost:8081/toyProject/issue/list  를 호출하면 다음과 같은 화면이 나온다. 




layout_left.jsp 가 적용된 화면이니 이를 응용하여 프로젝트에 활용하면 된다 . 끝!







출처: http://creator1022.tistory.com/176 [무한도전]







반응형

'개발공부 > Spring' 카테고리의 다른 글

예외처리(1)  (0) 2020.10.01
Spring에서 Bean을 주입하는 방식  (0) 2020.03.16
SPRING AOP  (0) 2018.07.02
SLF4J와 Logback  (1) 2018.06.26
반응형

웹개발 경력 2년, 면접을 볼 때 그동안 나왔던 질문과 예상 질문들을 정리해보려 한다.

먼저, 이번은 웹과 데이터베이스에 대한 문제이다.





1. JSPServlet 차이?

- 이건 그 회사 잡플래닛에 있길래 정리해봄

- 정답 : 


JSP와 서블릿은 자바 기반으로 만들어진 웹 프로그래밍 언어


JSP는 페이지 요청이 있을 시에는 최초로 한번 자바 코드로 컴파일 된다.

서블릿과 JSP는 상호 연계되어 JSP에서 정적인 부분을 담당하고, 

서블릿은 보다 동적은 처리를 위한 부분으로 사용되어 보다 효율적으로 작성할 수 있다.


Servlet

servlet은 톰캣 위에서 동작하는 java 프로그램입니다.
WAS 를 통해 컴파일 된 후 메모리에 적재되어 클라이언트의 HTTP Get, Post 등의요청을 처리하는 자바 프로그램임.

JSP

HTML을 코딩하기 너무 불편해서, HTML 내부에 Java 코드를 삽입하는 형식
JSP 라는 새로운 개발 방법이 나왔지만, 사실 이 JSP 도 내부적으로는 Tomcat 이 Servlet 으로 바꾸어서 돌립니다

단순히 JSP 만 사용하거나, Servlet만 사용하는 것이 아니라 두개의 장단점을 모두 취해 View 는 JSP로, Controller 는 Servlet 을 사용한 것이 바로 Model2 지요. 보여지는 부분은 HTML이 중심이 되는 JSP, 다른 자바 클래스에게 데이터를 넘겨주는 부분은 Java 코드가 중심이 되는 Servlet 이 담당하게 됩니다. 그리고 Model 영역 에서는 DTO, DAO를 통해 Mysql 과 같은 Data Storage 에 접근합니다.



출처: http://anster.tistory.com/128 [Old Lisper]


2. ajax?

- 실제로 면접에서 나온 질문이다.

문법 


$.ajax({

url: , //주소

type:, //get방식, post방식

data:, // 파라미터

dataType:, // 받을때 데이터 형식

Async:,    //비동기 통신 플래그


true가 비동기, false가 동기  - 동기는 모든 처리가 끝난 후 다음 처리로 넘어간다.

비동기는 동시에 한다.


sucssess:function(response){

}, // 성공적으로 통신이 이루어졌을 때 처리하고 싶은 함수

error:function(error){

} //  에러가 발생하였을 때 처리하고 싶은 함수

});


결과를 바꾸기 위해서 ajax에서 해야할일?

suncess:function(response) {

$().html("xx); // 바꾼다.

}


3. html doctype?

이 소스를 읽을때 이 웹 문서가 html5로 작성되었음을 알려준다.

웹페이지 문서 종류를 알려주는 선언문

웹페이지 제일 처음에 선언되어야 하는 것

어떤 버전의 html 문서로 작성했는지 브라우저에게 알려줌 - 브라우저가 내용을 올바르게 출력하도록 도와준다.



4. get방식과 post 방식?

1) GET

URL 뒤에 ?를 붙여 구분하는 방식, 여러개일 경우 &로 구분한다.

현재, IE를 제외하고 GET방식으로 데이터를 보내는데 제한이 없다고 한다.

민감한 정보를 전송하면 문제가 발생할 여지가 크다.


2) POST

get과 달리 사용자에게 데이터가 그대로 노출되지 않으며, 전송량에 제한이 없다.

http body에 포함되어 전달됨으로서 파라미터 노출이 안된다.


5. Spring framework?


1) 경량 컨테이너로 자바 객체를 직접 관리한다.

각자의 객체 생성 소멸과 같은 라이프 사이클을 관리하며, 스프링으로부터 필요한 객체를 얻어올 수 있다.


2) 스프링은 POJO 방식의 프레임워크

- 특정한 인터페이스를 구현하거나 상속받을 필요가 없어 기존에 존재하는 라이브러리를 지원하기에 용이하고 객체가 가볍다


3) 제어반전 - 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.


4) 스프링은 의존성 주입을 지원한다. - 각각의 계층이나 서비스들간에 의존성이 존재할 경우 프레임워크가 서로 연결


5) AOP - 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.



Framework : 개발할 때 설계 기본이 되는 뼈대나 구조 / 환경 (문제 영역을 해결한 재사용, 확장 가능한 라이브러리.)

MODEL 1 - REQUEST 요청에 대한 처리, 비지니스 로직 핸들링이 모두 JSP단에서 처리됨


MVC MODEL2 - MVC 구조를 웹에 적용하여 개발하는 방식


SPRING MVC - 


1) DispactherServlet: 모든 requeset를 받는 관문이다. request를 실제로 처리할 controller에게 전달하고 그 결과값을 받아서

view에게 전달하여 적절한 응답을 생성할 수 있도록 흐름을 제어한다.


2) Handler Mapping: request url을 각각 어떤 controller가 실제로 처리할 것인지 찾아주는 역할을 한다.


3) controller - request를 처리한 후 그 결과를 다시 DispactherServlet에게 돌려준다.


4) ModelAndView: controller 처리 결과와 그 결과를 보여줄 view에 관한 정보를 담고 있는 객체이다


5) viewResolver: view 관련 정보를 갖고 실제 view를 찾아주는 역할을 한다.


6) view : controller가 처리한 결과값을 보여줄 view를 생성한다.




출처: http://k9e4h.tistory.com/51 [Kim's :D]


6. Oracle 클러스터 인덱스와 넌 클러스터 인덱스의 차이 

클러스터드 인덱스 : 

실제 DB의 데이터 파일에 정렬되어 있는 상태로 디스크에 저장이 됨

테이블당 한개 


넌클러스터드 인덱스 : 

실제 DB의 데이터 파일에 정렬되지 않는 상태로 디스크에 저장이 됨

테이블당 여러개(249개)


출처: https://m.blog.naver.com/PostView.nhn?blogId=islove8587&logNo=220431192221&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


7. JOIN의 종류

- 카티션 곱(Cartesian Product) 

두 개 이상의 테이블에 대해 연결 가능한 행을 모두 결합하는 조인 방법이며, WHERE 절에서 조인 조건절을 생략하거나 조인 조건을 잘못 설정하여 양쪽 테이블을 연결하여 조건에 만족하 는 행이 하나도 없는 경우에 발생 합니다. 

 예) SELECT * FROM DEPT A, EMP B 


- EQUI JOIN 

 SQL 문에서 가장 많이 사용되는 조인으로 조인 대상 테이블에서 공통 칼럼을 ‘=’ 비교를 통해 같은 값을 갖는 행에 대해서 연결하여 결과를 생성하는 조인 방법입니다. 

 예) SELECT A.name FROM DEPT A, EMP B WHERE A.code = B.code 


- NON-EQUI JOIN 

 조인 조건에서 ‘<’,’>’, BETWEEN a AND b’와 같이 ‘=’ 조건이 아닌 다른 종류의 연산자를 사용 하는 조인 방법입니다.

  예) SELECT A.name FROM DEPT A, EMP B WHERE A.code > B.code


 - OUTER JOIN 

 두 개 이상의 테이블 조인 시 한쪽 테이블의 행에 대해 다른 쪽 테이블에 일치하는 행이 없더 라도 다른 쪽 테이블의 행을 NULL로 하여 행을 Return하는 것이 OUTER JOIN 입니다.연산자 로는 (+)기호를 사용합니다. 

 예) SELECT A.name FROM DEPT A, EMP B WHERE A.code = B.code(+)


 - SELF JOIN 

 하나의 테이블에서 두 개의 칼럼을 연결하여 EQUI JOIN을 하는 방법



반응형

'개발공부[면접]' 카테고리의 다른 글

개발자 면접 대비  (0) 2018.05.25

+ Recent posts