jongviet

May 28, 2021 - Spring, JSP 각종 용어 개념(학습내용 + 찾은 내용 필기 본문

Spring legacy

May 28, 2021 - Spring, JSP 각종 용어 개념(학습내용 + 찾은 내용 필기

jongviet 2021. 5. 28. 22:58

*5월 28일

-JSP 수업이 한창이다. 대략적으로 남은 학원 스케쥴을 정리해보자면, 6월 초 JSP 수업을 마친 후, 2주 정도 간단한 프로젝트를 진행하고 리눅스 서버 수업이 예정되어있다. 그 후 6월 24일 경부터 스프링 과정 1주일 + 스프링 프로젝트 3주가 진행되면 전체 과정이 종결된다.

-학원 과정보다는 한 스탭 정도 빠르게 학습하고 있기 때문에, Spring 및 JSP 관련 각종 용어 및 개념에 대해 다시 & 미리 정리해보고자 한다.

 

 

1)MVC model 1 & 2

-MVC model 1은 java beans로 구성된 VO의 Model, JSP 내에서 처리하는 Controller 그리고 JSP 페이지 내에서 스크립틀릿(<% %>)을 활용하여 자바 코드와 뷰를 동시에 처리하는 View가 있다. 과거의 방식으로 백엔드와 프론트 엔드의 경계선이 모호한 방식이다. 따라서 유지 보수 및 리팩토링이 힘들어 현재는 사용되고 있지 않은 방식이다.

-하단 이미지와 같이 자바 코드와 HTML이 여기저기 섞여있어 매우 가독성이 떨어진다. If문 하나만 들어가도...... 

 

Model 1

 

-MVC model2는 JSTL과 EL을 활용하여 java 코드 없이 View를 구성하고, Servlet을 통해 Controller를 처리한다. 하단 이미지와 같이 중간 중간에 들어오던 자바 코드가 사라져서 가독성이 좋다.

-model2 M(VO, DAO, DB manager), V(jsp), C(servlet).

 

JSTL & EL 표기법을 활용하여 처리한 View

 

2)JSTL과 EL

-JSTL은 JSP standard Tag Library의 약자로 custom tag 사용이 가능한 JSP의 강점이자 약점을 보완하기 위해 만들어졌다. <c:forEach>, <c:choose>, <c:when>, <c:otherwise> 등이 있음.

-taglib를 상단에 선언하고 자유롭게 사용 가능하다.

 

 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions"  prefix="fn" %>

 

-EL(expression language)를 이용하여 <% %>, <%= %>와 같은 스크립틀릿을 ${ }와 같이 변경하여 사용할 수 있다. 

-스크립틀릿 -> JSTL과 EL로 변경한 예시는 하기와 같다.

 

 

(1)getAttribute, getParam

 

<%
 EmpVO evo = (EmpVO) request.getAttribute("evo");
%>

 

<c:set var="evo" value="${evo }" />//attribute에 담겨온 객체 evo를 evo라고 명시하고 value로 받아오는 JSTL 형태

 

 

<%
String fileType = evo.getFiletype();

%>

 

<c:set var="fileType" value="${evo.filetype}" />

 

 

(2)advanced for, forEach

 

<%
for (EmpVO evo : list) {
%>

<%
}
%>

 

<c:forEach items="${list }" var="evo">

</c:forEach>

 

 

(3)<%= %>, ${ }

 

<td><a href="detail.em?empno=<%=evo.getEmpno()%>"><%=evo.getEname()%></a></td>

 

<td><a href="detail.em?empno=${evo.empno}">${evo.ename}</a></td>

 

(4)if, <c:if>

 

<%!
String lang1 = "python";
%>

<%
if(lang1.equals("python")) {
%>

<p>파이썬입니다</p>

<%
}
%>

<c:set var="lang1" value="python"/>

<c:if test="${lang1 eq 'python'}">
     <p>파이썬입니다</p>
</c:if>

 

 

(5)if, else, <c:choose>~<c:when>~<c:otherwise>

 

<%!
    String lang="python";
%>
<%
    if("java".equals(lang)) {
%>
<p>java입니다</p>
<%
    } else if("python".equals(lang)){
%>
<p>python입니다</p>
<%
    }else{
%>
<p>그 외 언어입니다</p>
<%
    }
%>

 

<c:set var="lang" value="javascript" />
<c:choose>
<c:when test="${lang eq 'java'}">
         java입니다.
     </c:when>
<c:when test="${lang eq 'python'}">
         python입니다.
     </c:when>
<c:otherwise>
그외 언어입니다.
</c:otherwise>
</c:choose>

 

(6)nested if

 

<c:set var="lang" value="javascript" />
<c:choose>
<c:when test="${lang eq 'javascript'}">
<p>자바스크립트입니다.</p>
         <c:if test="${fn:length(lang)} eq 10"/>
         <p>10자리 이상입니다</p>
     </c:when>
<c:when test="${lang eq 'python'}">
         python입니다.
     </c:when>
<c:otherwise>
그외 언어입니다.
</c:otherwise>
</c:choose>

 

(7)기타

 

<c:set var="fileType" value="${evo.filetype}"/> //뒤를 축약형으로 
eq 같은, ne 다른

$(fn:contain("abcdef", "c")} // true

$(fn:length("abcdef")} // 6

 

 

3)Servlet

-servlet은 .java 파일로 controller라고도 불림. HttpServlet을 상속받아서 사용하는 자바 클래스라고 보면 됨!

->Servlet을 통해서 웹을 만들 경우 화면 인터페이스 구현이 워낙 까다로움... 이러한 단점을 보완하기 위해 만든 언어가 JSP임!!

-JSP -> Servlet(.java)로 변환 -> 컴파일을 통해 .class -> HTML로 최종 사용자에게 응답됨.. 처음에는 변환 과정때문에 느리지만 첫 구동 때 .class파일이 생성되면 변환 및 컴파일 과정이 생략되기 때문에 서블릿과 거의 동일한 속도로 작동함!!

->프로젝트 내 build에 있는건 .class 파일(이 파일을 배포 하는것!!) / src에 있는건 .java 파일

 

 

-web.xml 서블릿 지정

     <servlet>

           <servlet-name>EmpController</servlet-name>

          <servlet-class>controller.EmpController</servlet-class> //패키지명.클래스명

     </servlet>

     <servlet-mapping>

           <servlet-name>EmpController</servlet-name>

           <url-pattern>*.em</url-pattern> //패턴설정

     </servlet-mapping>

 

-Servlet만으로 구현한 HTML....

    writer.println("<div>");

    writer.println("<h1>"); 

    writer.println("</h1>"); 

    writer.println("</div>");

 

4)WAS, Web server

-WASweb application server로 웹서버와 DBMS(database management system) 사이에서 동작하는 미들웨어(미들웨어는 양쪽을 연결하여 데이터를 주고 받을 수 있도록 중간에서 매개 역할을 하는 소프트웨어를 말함) 컨테이너 기반으로 동작.

-Web server정적인컨텐츠(HTML, CSS, Image) 등을 요청받아 처리하고, WAS(JSP, PHP) 등 동적인 요청을 받아 처리함.

-Web 서버가 request & response를 통해서 Client side와 만난다면, WAS는 Webserver 뒤에 위치하여 로직을 수행하고 DBMS에서 데이터를 요청하고 받아오는 역할을 함. 따라서 WAS는 Client side와 접할 일이 없기에 보안이 확보됨.

-WAS에는 대표적으로 apache tomcat이 있고, redhat사의 jBoss 등이 있음.

 

*Request -> response process

-Client side에서 request 객체를 통해 web server로 요청 -> web server는 request를 받아 가능하면 바로 처리하여 response를 날려주고, 처리할 수 없다면 WAS로 넘겨서 응답을 받음(WAS는 DB접근 or 자체 연산하여 반환값 리턴) -> web server가 WAS로부터 받은 값을 client side에 전달!

 

5)JSP 내장 객체

-request & response 요청에 대한 회신주면서 바로 사라짐.

-session은 브라우저가 완전히 꺼질 때 까지 유효함! (로그인)

-application은 프로젝트 단위 내 모든 JSP와 servlet에서 공유되는 객체!

-Config는 JSP/Servlet이 메모리에 로드되는 시점에 실제 생성되는 객체, 동일한 JSP/Servlet은 딱 하나의 Config 객체를 가짐. 각자 하나씩 가진 고유값?

 

6)프레임워크와 라이브러리의 차이

-프레임워크는 프로그램이 동작하는 기본 뼈대를 제공, IOC(제어의 역전), 라이브러리, 디자인 패턴을 구현. 

-단순히 생각해보면 인터페이스 개념이 확장된 것. (일반적인 협업 시 인터페이스를 활용하여 인터페이스 구조대로 로직을 짜게 됨. DB 연결과 같이 공통적인 것은 미리 작성해둠....)

-프로그램 전체의 동작 흐름과 일련의 기준, 공통적으로 적용할 로직을 미리 만들어둔 것이 프레임워크!! 마치 자바에서 main method가 중심이 되는 것과 같다고 봄..

-제어의 역전이라는 것도, 결국엔 프레임워크에서 전반적인 동작 구조를 미리 완성해놨기 때문에 개발자가 굳이 신경쓰지 않아도 될 부분을 프레임워크가 대신 제어해준다는 의미로 해석하면 됨.

 

-라이브러리는 특정 기능(알고리즘)을 미리 구현한 소스 코드의 집합

-자바가 짜둔 기본 라이브러리(API)부터 open API까지 다양함!!

->결론적으로 개발자는 making with tools! MS word 프로그램도 하나의 프레임워크임. 문서작성 코어 기능부터 다양한 기능(도형삽입, 텍스트 정렬 등 = 라이브러리);

 

6)build tools (Maven, Gradle)

-빌드란 작업한 모든 파일과 코드들을 배포 준비 상태 시키는 것!

-규모가 크고 구조가 복잡한 프로젝트에서는 이 구조를 자동으로 관리해줄 수 있는 빌드툴을 사용해 프로젝트를 진행. 자바 또는 스프링 프로젝트의 빌트툴로 가장 많이 쓰이는 것이 maven이고 요즘은 gradle이라는 빌드툴이 떠오르고 있음!

-maven이나 gradle을 사용하지 않을 경우, 일련의 작동 방식과 구조를 모두 수동으로 해야함... 또한 모든 라이브러리 따로 다운받아서 관리해야함(maven central을 나두고?!)

-빌드툴을 사용할 경우, mavencentral, gradle 저장소를 이용하여 필요한 라이브러리를 모두 자동으로 다운 받아서 개발자가 사용할 수 있게 내부 환경 세팅을 해줌. 를 의존성 관리(dependency) 라고 부름!

 

7)객체지향 프로그래밍이란?(OOP)

->OOP : 서비스단과 DAO 클래스를 서로 영향을 주고 받지 않도록 분리해서 만듬! 즉, DB 종류가 바뀌더라도 DAO 클래스만 수정해주면 동작에는 문제가 없음!! 고객이 커스터마이징 할 수 있도록 허용하는 서비스라면 본래의 코드는 숨겨서 수정하지 못하게 해두고, 사용자가 선택적으로 확장만 가능하게 구현.

->Controller 입장에서는 서비스 클래스의 비즈니스 로직에는 관심이 없음. 그냥 인터페이스에 있는 메소드를 이용해 로직을 구성할 뿐이기에 서비스 클래스의 내부 로직이 어떻게 변하던 영향을 받지 않음. 즉 변화에 닫혀있음. 반대로 서비스 클래스는 인터페이스에서 규정된 규칙만 잘 지키면 언제든 로직을 변경할 수 있고 인터페이스를 구현한 새로운 클래스를 만들어 기존 클래스를 대체할 수 있음. 즉 확장에 열려있음 (OCP(open closed prnciple) 개방 패쇄 원칙 : 확장에는 열려있고 변화에는 닫혀있다고 볼 수 있음.)

 

8)IOC(inversion of Control) 제어의 역전

-객체의 생성부터 소멸까지 객체의 모든 생명주기를 개발자가 아닌 컨테이너(객체관리 프로그램)가 담당하는 것이라고 볼 수 있음. 개발자가 가져야할 객체의 생명주기 제어권이 컨테이너에게 넘어갔다는 의미에서 제어가 역전되었다고 함.

-Servlet container인 톰캣 또한 IOC 컨테이너라고 볼 수 있음 / 스프링 컨테이너를 IOC 컨테이너라고 부르기도 함.

-스프링 컨테이너는 singleton pattern의 객체 생성을 지향함. 이는 별도로 설정하지 않으면 모든 컨테이너 안의 Bean 객체는 딱 하나만 생성되어 계속 재사용됨. (여러개 계속 생성되면 자원의 낭비!!)

 

9)DI(dependency injection 의존성 주입)

-컨테이너에서 관리할 객체를 모두 지정해주고, 프로그래머는 컨테이너에서 객체를 받아 사용하는 방식임.

-bean을 정의할 때 객체간 의존 관계를 명시해 코드에서 사용시 자동으로 주입 받도록 함.

-예를들어, 클래스A에서 클래스B의 객체를 new로 만들어서 사용하고 있다면, 클래스 A가 클래스 B에 의존하고 있다고 표현함(클래스 A의 입장에서는 클래스 B가 필요하기 때문, 의존!)

->개발자는 원래 코드에서 "A"를 생성해 사용하기 위해 "B"도 생성해서 "A"에게 주입해줘야 하는데, 이 의존관계를 미리 빈(Bean)이라는 것으로 정의해서 컨테이너에게 위임하는 것이라고 볼 수 있다. 그러면 개발자가 컨테이너에게 "A"의 객체를 요청하면 컨테이너에서 자동으로 "B"의 객체도 생성해 "A"에 주입한 뒤, 개발자에게 전달해주는 것이라고 볼 수 있음!!

 

10)ORM(object relational mapping)

-객체와 DB를 매핑 해주는 역할을 한다. 객체는 클래스이고, DB 테이블을 사용함. 따라서 객체와 DB간의 불일치가 존재한다. ORM은 SQL을 자동으로 생성하여 이 불일치를 해결해주는 역할을 한다. 그 중 많이 사용되는 것이 바로 Mybatis!

 

 

 

*Source 1 : https://codevang.tistory.com

*Source 2 : 금주 수업 내용 및 위키피디아

Comments