모도리는 공부중

21.03.02. SPRING - 본문

K-디지털 빅데이터 분석서비스 개발자과정 20.11.02~21.04.12/JAVA

21.03.02. SPRING -

공부하는 모도리 2021. 3. 2. 16:20
728x90
반응형

여러분이 지금까지 배운 MVC가 SPRING으로 변환되는 과정을 이해할겁니다.

CONTROLLER가 어떻게 변환되느냐에 따라 달라진다. 데이터베이스도 어떻게 바꾸느냐도 공부해야하며 JSP도 JSTL과 EL을 사용할 줄도 알아야한다. 실제로는 방금 말한 3가지는 현업에서 사용하지 않는다. 10년 전 기술이지만 이 부분을 알아야 최신 기술(프레임워크)을 익힐 때 어렵지 않게 배울 수 있을 것이다. 그리고 제이쿼리와 AJAX도 사용할 줄 알아야한다.

 

여러분의 취업 확률은 모든 프로젝트의 기반기술인 웹이 가장 중요하므로 자바를 사용하는 회사로 가게 될 확률이 가장 높습니다. 지금까지 배운 웹단이 다 어려웠다고 하더라도 이 수업은 취업과 직결되는 부분이므로 꼭 집중해서 내것으로 만들기를 바랍니다.

 

SPRING이 중요한게 아니고 MVC FRAMEWORK가 중요한겁니다 여러분!

 

다이나믹 프로젝트를 만들때 평소처럼 이름 입력하고 바로 finish를 누르지 말고 next를 눌러서 위의 xml 부분을 꼭 체크해준 후 만들도록 한다.

 

window - preferences - server - runtime environments 를 타고 들어가서 아래 그림과 같이 웹 환경설정을 먼저 해주도록 한다. 우리가 기존에 사용하고 있는 아파치톰캣 7버전을 그대로 사용할 것이며 수업하는 선생님의 편의성을 위해 오늘 만들어준 워크스페이스가 위치한 폴더에 아파치를 옮겨주었다.

 

다음은 서버에 아파치톰캣을 연결하는 과정이다.

설정하는 방법과 그에 대한 선생님의 설명 캡처

 

server.xml파일에 들어가서 133 line에 해당 코드가 있는 것을 확인하였다면 정상적으로 연결되었음을 알 수 있다.

 

컨트롤러는 프론트컨트롤러와 컨트롤러로 나뉜다. 그리고 frontcontroller가 해야할 일을 대신 해주는 녀석이 바로 controller이다. 이렇게 되면 controller가 2개나 되니 헷갈릴 것이다. 그냥 controller를 pojo라고 부른다. 그럼 이 pojo는 무엇인가?

Plain Old Java Object. 이전에 우리가 사용했던 자바 객체를 POJO라고 부른다. 이 POJO는 서블릿으로 만들지 않고 자바형태로 만들게 된다. 자, 다시 정리하면 froncontroller가 할 일을 대신 해주는 controller는 앞으로 pojo라고 부른다.

+ JAVA API + 다른회사에서 만들어주는 API 등등도 다 사용할 수 있어야 한다.

각 역할을 가지고 있으면서 객체단위로 만들어주는 것이 바로 모델의 역할. 우리는 이제 VO와 DAO모델을 만들어줄 것이다.

 

 

웹단을 만들어주도록 합시다.

mvc는 클라이언트가 컨트롤러를 무조건 요청해야하므로 원천적으로 view를 요청하지 못하도록 웹단을 web-inf에 넣는 것이 원천적이다. 다시 정리하면, html, jsp파일을 web-inf 폴더에 넣는 이유는 클라이언트가 html이나 view에 접근하는 것을 막기 위함이다.

톰캣을 먼저 만들고 프로젝트를 만든 것이 아니라 프로젝트를 먼저 만들고 톰캣을 했기 때문에 이처럼 오류가 난다. 이 오류를 잡아주기 위해서 빌드패스를 잡아주도록 한다.

우리가 만들어준 MVC 작업 폴더 위에서 마우스 오른쪽 단추를 클릭 - build path - configure buildpath 클릭,

library를 선택하여 add library를 클릭, server runtime - tomcat v7.0 선택하여 적용한다.

 

jsp는 스크립트적인 요소를 가지고 있다. 우리는 이렇게 jsp를 이용하면 웹과 jave\a 부분을 같이 사용할 수 있기 때문에 서블릿이 아닌 jsp를 주로 많이 사용하게 된다. 이제 이걸 실행하려고 하면 아래와 같은 팝업이 뜬다.

8080은 java가 사용하는 포트. 그러므로 우리는 8081로 바꿔서 사용해주도록 한다.

그리고 아까 만들어둔 jsp를 실행하면 이제 잘 실행되는 것을 볼 수 있다.

하지만 여기서 바로 단점이 드러나는데, 우리가 만들어준 jsp의 경로가 사용자에게 드러난다는 것이다. 사용자는 이 경로를 알면 안되므로 jsp에 직접적으로 접근할 수 없게 숨겨주는 작업을 해주도록 한다. web-inf폴더에 마우스 오른쪽 단추를 눌러서 view라는 폴더를 생성해준다. 그리고 test.jsp를 방금 만들어준 폴더로 이동한다. 다시 jsp를 실행해보면 해당 파일을 찾을 수 없다고 뜰 것이다. '엇 선생님, 그러면 web-inf에서 해당 폴더를 찾아가서 실행하도록 주소를 직접 입력해주면 되나요?'라는 질문이 나올 것이다. 안된다. 우리는 이 경로를 숨겨주기 위해서 이런 작업을 거치는 중이다.

사용자가 이 jsp를 요청하면 우리는 컨트롤러를 통해서 해당 jsp를 이용할 수 있도록 경로를 우회해준다.

servlet을 만들어줄 것이다. url매핑은 calc.do로 설정한다.

필요없는 주석같은 코드들은 지워주고 아래와 같이 코드를 작성한다.

package kr.smhrd.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/calc.do")
public class CalcController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 1~10=? : 비즈니스로직(처리로직) ==> Model
		int sum = 0;
		for (int i=1; i<=10; i++) {
			sum+=i;
		}

이제 우리가 작성한 이 코드의 결과를 받아볼 곳을 연결해주는데, 아까 view라는 폴더에 숨겨준 test.jsp에서 출력되도록 만들 것이다.

package kr.smhrd.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/calc.do")
public class CalcController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 1~10=? : 비즈니스로직(처리로직) ==> Model
		int sum = 0;
		for (int i=1; i<=10; i++) {
			sum+=i;
		}
		// 결과를 test.jsp에서 출력(forward)*****
		RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/view/test.jsp");
		rd.forward(request, response);
	}

}

 

포워딩은 실행될 페이지를 전환시켜주는 작업이다.

'포워드'를 다시 정리하자면, 클라이언트가 calc.do를 들어왔을 때 사용자에게는 브라우저에서 해당 경로가 보이지 않지만 우리가 포워딩해준 경로로 서버내에서 연결해주는 작업이다.

특정 객체의 객체를 특정메모리에 저장하고 연결(바인딩)해주는 기술을 바로 객체바인딩이라고 부른다. 어떤 객체를 연결해주는 것이 좋을까? request객체에 setAttribute를 하고 reponse객체로 넘겨주는 작업은 request바인딩이라고 부른다.

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
			// Object --> Integer : unboxing
	int sum = (Integer) request.getAttribute("sum");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%= sum %>
</body>
</html>

※ redirect와 forward의 차이점※
- redirect: 경로가 웹페이지 자체에 표시됨(WEB-INF도 포함: 오류발생!!)
- forward: 경로가 웹페이지가 표시되지 않음(서버 자체에서 수행되기 때문)

 

jsp를 우리는 기존에 자바코드를 잘 활용하기 위해 사용했다. 하지만 이 <% %>를 가급적 사용하지 않는 것이 좋다.

왜냐면 jsp는 디자이너에게 맞춰져 있는 화면이기 때문이다. 그럼 개발자는 어떻게 해야 코드를 입력할 수 있을까?

${ }를 이용하면 한 방에 해결이 된다. 대체 이게 뭐길래? → EL

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
${sum }
</body>
</html>

 

이번엔 ArrayList를 이용하여 출력하는 실습을 해본다.

package kr.smhrd.controller;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/calc.do")
public class CalcController extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		ArrayList<String> list = new ArrayList<String>();
		list.add("사과");
		list.add("바나나");
		list.add("귤");
		list.add("포도");
		
		request.setAttribute("list", list); // int(Integer, String) - Object
		// 이 상태는 sum이 int타입인데 오류가 발생하지 않고 있다. 왜? java의 boxing이 이루어졌기 때문.
		// boxing : int -> Integer
		// java가 최신버전이다보니 int를 Integer로 자동 바꿔주는 기능 덕분에 에러가 나지 않고 있다.
		
		// 결과를 test.jsp에서 출력(forward)*****
		RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/view/test.jsp");
		rd.forward(request, response);
	}

}
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
${list }
</body>
</html>

리스트형식 그대로 다 나와버렸다. 이렇게 나오지 않게 하려면 그럼 어떻게 해야할까?

원래 정석대로라면 아래처럼 코딩을 해주어야할 것이다.

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%
	ArrayList<String> list = (ArrayList<String>) request.getAttribute("list");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<table border="1">
	<tr>
		<td>과일종류</td>
	</tr>
	<% for (String str : list){ %>
	<tr>
		<td><%= str %></td>
	</tr>
	<% } %>
</table>
</body>
</html>

결과가 잘 나오는 것을 알 수 있다. 하지만 spring을 배우는 우리는 이제 이렇게 작성하면 안된다.

JSTL과 EL을 활용하여 <% %>가 등장하지 않고도 활용하는 방법을 배워봅시다.

그럼 for문을 어떻게 태그적인 요소로 바꿔줄 수 있을까? for문은 <% %>안에 들어가므로 곧 프로그래밍적인 요소이다. JSTL을 이용하여 프로그래밍적인 요소를 태그적인 요소로 바꿔주는 기능을 이용할 것이다.

나중에는 메이븐을 활용하여 좀 더 쉽게 활용할 수 있을겁니다. 일단은 JAR파일을 LIB에 넣어줍시다.

 

그럼 이제 for문을 사용해야하는데 어떻게 하면 될까? 다음의 코드를 추가해준다.

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

그 후 반복문을 사용할 위치에서 이렇게 입력한다.

<c:forEach>
</c:forEach>

for(){ }까지 완성된 상태. 이 코드를 사용하면 굉장히 직관적인 언어로 디자이너도 쉽게 이해하고 사용할 수 있도록 만들어져있다. i=1; i<=10; i++라는 코드가 영어만 알면 사용할 수 있도록 바뀐다.

 

테스트 삼아서 '사과'라는 글씨만 출력되도록 해봅시다.

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<table border="1">
	<tr>
		<td>과일종류</td>
	</tr>
	<c:forEach var="i" begin="1" end="10" step="1">
		<tr>
			<td>사과</td>
		</tr>
	</c:forEach>
</table>
</body>
</html>

아주 잘 나옵니다. 그럼 i값을 출력하고 싶다면? <%= i %>를 사용하면? 안된다. ${i}를 사용하면 된다.

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<table border="1">
	<tr>
		<td>과일종류</td>
	</tr>
	<c:forEach var="i" begin="1" end="10" step="1">
		<tr>
			<td>${i}</td>
		</tr>
	</c:forEach>
</table>
</body>
</html>

숫자가 아주 정상적으로 출력되는 것을 확인할 수 있다. 이제 과일이 잘 출력되도록 코딩해보자.

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<table border="1">
	<tr>
		<td>과일종류</td>
	</tr>
	<c:forEach var="str" items="${list }">
		<tr>
			<td>${str}</td>
		</tr>
	</c:forEach>
</table>
</body>
</html>

이제 과일이 아니고 회원정보를 웹에 뿌린다고 해봅시다.

 

728x90
반응형
Comments